Status lifecycle
cancelled applies to Render state only. It is not client-triggerable — there is no cancel operation — but a Render can still reach it on its own; treat it as terminal when you see it. Poll every 3–5 seconds while a resource is queued or processing. Stop polling for ready, failed, or cancelled.
Polling example
GET /v1/renders/{render_id} is retired (405); poll GET /v1/videos/{video_id} instead, which also accepts vid_-prefixed H3 text-to-video generation IDs. See Get Video and List Videos.
Watching instead of polling
GET /v1/renders/{render_id}/events streams the same lifecycle over Server-Sent Events: a snapshot on connect, one event per state change, a heartbeat every 10–15 seconds, and stream closure on a terminal state. It removes polling latency and load; reconnect with Last-Event-ID if the connection drops. See Watch Render. Characters and Motions have no equivalent stream — poll those.
Render progress
Render responses can include:progress: an integer from 0 to 100, when availablestage: a coarse hint —analyzing,rendering,finishingfrom the direct multipart pipeline;queued,preparing,generating,finalizingfrom the draft-based pipeline. Treat an unrecognized value as “in progress” rather than failing. On a video fetched fromGET /v1/videos/{video_id},stageis populated only whilestatusisprocessing, and only for a Render-sourced ID — it is alwaysnullfor an H3 (vid_) video.video_url: available only when the Render is readyalpha_url: available with transparent outputlinks:{self, events, download}on the object returned byPOST /v1/renders— absent on renders served by the legacy migration proxy, and absent entirely from theGET /v1/videos/{video_id}response
Download promptly
Export and download URLs (video_url, alpha_url, vsplat_url, thumbnail_url, glb_url) are short-lived and re-signed on every read of their endpoint. Persist output in your own storage if it is needed later, and re-request the export/download endpoint rather than caching a URL.
Recover safely
- For
failed, inspecterror.code,error.retryable, anderror.remediation, and follow the suggested recovery path — see Errors and recovery. - The JSON draft form of
POST /v1/rendersrequiresIdempotency-Keyand is safe to retry after a network timeout with the same key and body. Themultipart/form-dataform ofPOST /v1/renders, and Character/Motion creation, have no idempotency key: if a create response was received, query its known resource ID; otherwise resolve the outcome with your request logs andX-Request-Idbefore submitting again. - Include
X-Request-Idin support requests.

