Developers · Partner API v1

API for virtual staging, floor plans, CAD and architecture renders

One REST API for real-estate photographers, house-plan sellers, prefab builders and proptech platforms: stage and fix listing photos, redraw floor plans, turn sketches and briefs into DXF/DWG/PDF, render sketches and preview remodels. Async jobs, signed webhooks, free sandbox, white-label output.

Base URL https://api.20.vision/v1Auth Authorization: Bearer sk_live_…100 credits per image · CAD by usage

Real outputs

Inputs on the left, API results on the right. Same models and prompts as the AI Architectures apps.

Virtual staging: inputVirtual staging: API output

Virtual staging

POST /v1/virtual-staging

Day to twilight: inputDay to twilight: API output

Day to twilight

POST /v1/photo-edits task=day_to_twilight

Window glare: inputWindow glare: API output

Window glare

POST /v1/photo-edits task=window_glare

Sketch to render: inputSketch to render: API output

Sketch to render

POST /v1/renders

Remodel preview: inputRemodel preview: API output

Remodel preview

POST /v1/remodels "add a pergola"

Floor plan redraw: inputFloor plan redraw: API output

Floor plan redraw

POST /v1/floor-plans/redraw

Endpoints

EndpointWhat it doesCreditsTime
POST /v1/virtual-stagingVirtual staging. Furnish an empty room photo in a style (modern, scandinavian, farmhouse, coastal, japandi, ... or your own words). Walls, windows, floor and camera stay exactly as photographed.100 (4K: 1,000)~30 s
POST /v1/photo-editsListing photo edits. remove_furniture, declutter, brighten, window_glare, day_to_twilight, blue_sky, green_lawn, lot_lines (drone photos).100 (4K: 1,000)~30 s
POST /v1/rendersRender from sketch. Sketch, elevation, massing model or CAD view to a photoreal (or watercolor, line-work, massing) image; form, openings and viewpoint kept.100 (4K: 1,000)~30 s
POST /v1/remodelsRemodel preview. Change one thing on a photo of a real building (siding, pergola, open kitchen, roof) and keep the rest.100 (4K: 1,000)~30 s
POST /v1/floor-plans/redrawFloor plan redraw. Hand sketch, photo or scan of a plan to a clean, labeled 2D floor plan image.100 (4K: 1,000)~30 s
POST /v1/cadSketch / brief to CAD. An AI drafter draws a dimensioned, layered floor plan from a text brief and/or sketch: DXF, DWG, A3 PDF sheet, PNG.300-2,500 (typ. 300-1,500)2-6 min
POST /v1/cad/{job_id}/reviseRevise CAD by instruction. "Make the kitchen 1 m wider", "add a garage": a new version of a finished drawing. "Customize this plan by chat" for your buyers.60-1,2001-4 min
GET /v1/jobs/{job_id}Job status. Status, credits charged, and signed download links (24 h; fetch again for fresh links).free
GET /v1/files/{job_id}/{name}Download. result.jpg / .png / .webp, preview.jpg; plan.dxf / .dwg / .pdf / .png.free
GET /v1/jobsList jobs. Newest first, filter by status and type, paginate with starting_after.free
POST /v1/webhooksWebhook endpoints. Receive signed job.succeeded / job.failed events (also used by Zapier and Make).free
GET /v1/accountAccount. Credit balance, key, limits and pricing.free

Image inputs: image_url (public https) or image (base64), JPEG/PNG/WebP/HEIC up to 15 MB. Options for every endpoint: resolution 2k|4k, aspect_ratio (auto keeps the photo's), webhook_url, metadata. Full schema: openapi.json; option lists: /v1/options.

Quickstart

1. Sign in and create a key at developers/dashboard. Start with a sandbox key (sk_test_…): same API, sample outputs, no credits. 2. Create a job. 3. Poll it or receive a webhook. 4. Download the files.

# 1. Create a job (sandbox key: free sample output; live key: real result)
curl https://api.20.vision/v1/virtual-staging \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: listing-4711-photo-3" \
  -d '{
    "image_url": "https://example.com/listing/empty-living-room.jpg",
    "style": "scandinavian",
    "room_type": "living room"
  }'
# -> 202 {"id":"job_5f2c...","status":"queued", ...}

# 2. Poll it (or use a webhook, below)
curl https://api.20.vision/v1/jobs/job_5f2c... -H "Authorization: Bearer $API_KEY"
# -> {"status":"succeeded","credits_charged":100,
#     "output":{"images":[{"url":"https://api.20.vision/v1/files/job_5f2c.../result.jpg?expires=...&signature=...", ...}]}}

# Short jobs in one call: wait up to 90 s for the result
curl "https://api.20.vision/v1/renders?wait=90" -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" -d '{"image_url":"https://example.com/sketch.png","lighting":"golden_hour"}'

Jobs, idempotency and limits

  • Every POST answers 202 with a job: queued → running → succeeded | failed. Add ?wait=90 (or Prefer: wait=90) to get the finished job in the same response when it is done in time.
  • Send an Idempotency-Key header on every POST. A retry with the same key and body returns the original job and is never charged twice; the same key with another body answers 409.
  • Credits are checked before a job starts (402 insufficient_credits) and charged only for succeeded work. credits_charged is on every job.
  • Rate limits per key: 300 requests and 60 job creations per minute (sandbox 120 / 30). Headers X-RateLimit-*; a 429 carries Retry-After. Up to 8 image and 4 CAD jobs run at once per account; more wait in the queue.
  • Download links are signed for 24 hours; GET /v1/jobs/{id} returns fresh ones. Images come as JPEG, PNG or WebP; CAD as DXF, DWG, PDF and PNG.

Webhooks

Add endpoints in the dashboard or with POST /v1/webhooks (https only). Each finished job sends job.succeeded or job.failed with the full job; a job's own webhook_url receives it too. Signatures follow the Standard Webhooks spec (headers webhook-id, webhook-timestamp, webhook-signature; secret whsec_… per account and mode). Failed deliveries are retried after 5 s, 30 s and 2 min.

// Express: verify the signature on the raw body (Standard Webhooks)
import crypto from 'node:crypto';
app.post('/hooks/ai', express.raw({ type: 'application/json' }), (req, res) => {
  const id = req.header('webhook-id'), ts = req.header('webhook-timestamp');
  const key = Buffer.from(process.env.WEBHOOK_SECRET.replace(/^whsec_/, ''), 'base64');
  const expected = 'v1,' + crypto.createHmac('sha256', key).update(`${id}.${ts}.${req.body}`).digest('base64');
  const ok = req.header('webhook-signature').split(' ').some((s) => s === expected);
  if (!ok || Math.abs(Date.now() / 1000 - Number(ts)) > 300) return res.sendStatus(400);
  const event = JSON.parse(req.body);         // { id, type: 'job.succeeded' | 'job.failed', data: job }
  res.sendStatus(200);                         // answer fast, then process
});

Sandbox

Sandbox keys run the whole flow (validation, queue, webhooks, signed files, rate limits) and return sample outputs without spending credits. The job shows credits_estimate: what it would cost live. Force outcomes with "simulate": "failed" or "insufficient_credits" to test your error handling.

Pricing

The API uses the credits of your AI Architectures account, at the same rates as the apps. Any plan works; failed jobs are free.

CallCreditsat Plus ($49/mo)at Business ($129/mo)at Studio ($199/mo)
Image job, 2K (staging, edit, render, remodel, plan redraw)100$0.49$0.32$0.20
Image job, 4K1,000$4.90$3.23$1.99
CAD drawing (typical)800$3.92$2.58$1.59
CAD revision (typical)300$1.47$0.97$0.60

CAD jobs cost their real usage, minimum 300 and at most 2,500 credits (revisions 60-1,200). Plans: pricing. Volume API plans with lower per-call prices and invoicing: email [email protected].

White-label terms

  • Outputs carry no AI Architectures name, logo or watermark; CAD sheets have no third-party credit line; download links are on the neutral domain api.20.vision.
  • You may use, edit and resell outputs under your own brand, and offer the features in your product without naming us.
  • Images keep a neutral machine-readable "AI-generated" EXIF marking (EU AI Act Art. 50). Where listing rules require disclosure of virtually staged or edited photos (for example California AB 723), disclosure is your and your customer's responsibility.
  • Do not use the API to mislead buyers about a property's condition, for unlawful content, or to resell raw API access as a competing API.
  • Images and drawings are concepts, not construction documents, and need professional review before anything is built. Your use is governed by the Terms of Service.

Service levels

  • Availability target: 99.5% per calendar month for job creation, job status and file downloads, measured at api.20.vision, excluding announced maintenance and third-party outages beyond our control.
  • Jobs that fail are not charged. A job that has not finished within 24 hours is marked failed and refunded.
  • Support: email [email protected], reply within one business day (CET). Incidents and changes that break compatibility are announced by email to key owners; v1 stays backward compatible (new fields may be added).
  • A contractual SLA with service credits, a dedicated contact and custom limits is available on volume API plans.

Errors

Errors are JSON: {"error":{"code":"insufficient_credits","message":"…","status":402}}.

400invalid_request, invalid_image, invalid_urlFix the request (message says what).
401missing_api_key, invalid_api_key, key_revokedCheck the Authorization header.
402insufficient_credits, key_limit_reachedTop up credits or raise the key's monthly limit.
404not_foundUnknown job, or a job of the other mode (live vs sandbox).
409idempotency_conflict, not_ready, supersededIdempotency-Key reused with another body; file not ready; newer CAD version exists.
413image_too_largeImages up to 15 MB.
429rate_limitedWait for Retry-After seconds.
5xxinternal_errorRetry with the same Idempotency-Key. Failed jobs are never charged.

Tools and integrations

  • OpenAPI 3.1 spec: import into Postman, Insomnia or an SDK generator. Ready-made Postman collection (set apiKey to your sandbox key).
  • No-code: Zapier and Make connect through POST /v1/webhooks (job finished) and the create endpoints.
  • Questions or a custom workflow (MLS export, brand style presets, bulk import): [email protected].

FAQ

Is there a free tier or sandbox?

Every account gets sandbox keys (sk_test_...). Sandbox jobs run the full flow (queue, webhooks, files, errors) with sample outputs and cost nothing. Live keys (sk_live_...) use your account's credits.

Are outputs white-label?

Yes. Files carry no AI Architectures name, logo or watermark, and download links are on api.20.vision. Images keep a neutral machine-readable "AI-generated" EXIF tag, which EU law (AI Act Art. 50) asks for; you may resell outputs under your own brand.

How is usage billed?

In credits from the same account as the web apps: 100 credits per 2K image, 1,000 per 4K image; CAD drawings by real usage (typically 300-1,500 credits, never more than 2,500). Failed jobs cost nothing. Each key can have its own monthly credit limit.

How fast is it?

Image jobs take about 30 seconds; CAD drawings 2-6 minutes. Up to 8 image jobs and 4 CAD jobs run at once per account; more are queued automatically, not rejected.

What input formats work?

JPEG, PNG, WebP and HEIC (iPhone) up to 15 MB, as a public https image_url or base64 in the JSON body. Images are re-encoded; EXIF location data is not kept.

Can my customers edit a CAD plan by chat?

Yes: POST /v1/cad/{job_id}/revise with an instruction ("add a 6 x 6 m garage on the east side") makes a new version with new DXF, DWG and PDF. House-plan sellers use this for "customize this plan".

Are the drawings permit-ready?

No. Drawings and images are concepts for listings, sales and design discussions. Plans need review by a licensed professional before anything is built.

Do you train on my images?

No. Inputs and outputs are used to run your jobs only. You can delete your account and its data at any time.

Start in the sandbox in two minutes

Create a free sandbox key, run the quickstart, switch to a live key when it works.

Get API keys