POST /api/v1/facade/generate can render two ways, chosen by operation:
This guide covers the async path.
Step 1 — submit the job
Submit a normal generate request with"operation": "render":
Step 2A — subscribe to webhooks (preferred)
Register a webhook once and Kynva delivers arender.completed (or render.failed) event when any of
your jobs finishes — no polling at all:
Step 2B — poll for status
statusis the coarse lifecycle:queued → processing → completed | failed.stageis the granular pipeline step while processing (QUEUED,ASSET_DOWNLOADING,ASSET_READY,RENDERING_SCENES,UPLOADING,COMPLETING) — useful for progress UIs.
Step 2C — live progress over SSE
For a progress bar without polling, open the server-sent-events stream:job_status (progress updates), job_complete, job_failed. The
stream times out after 5 minutes; the poll endpoint above is the durable
fallback.
Step 3 — fetch the results
Oncestatus is "completed", outputs holds the rendered files:
Cache-Control: immutable) — safe to store and hot-link. Because rendering is
deterministic, the same job re-run from the same request produces the same
bytes.
How long is job status available?
Store
design_id if you want a permanent handle — the design (and its outputs)
outlives the job record.