How renders work
- Provide your media (if needed) — pass a
source_urlyou already host on a CDN, upload local files withPOST /v1/uploads, or have Framelane copy a public URL or cloud share link into storage for you by settingingest_external: trueon the render. See Uploading media. - Submit a
POST /v1/rendersrequest with your composition — canvas and output settings,elements[],transitions[], and the composition-level extras:groups[](transform groups with optional stack layout),custom_animations(your own keyframe definitions),motion_blur,background_gradient,watermark_url,alpha. - Job accepted — the API returns
202 Acceptedwith arender_*job ID andstatus: queued. When the render copies in external files (ingest_external), it starts asingestingand transitions toqueuedautomatically once every file is ready. The202also carries an advisoryok+violations[]lint of the composition — see Preview & validate; it never blocks the render, and the freedry_runis the check to gate on. - GPU engine processes — the Framelane Renderer runs on dedicated GPU hardware.
- Wait for completion — poll
GET /v1/renders/{id}untilstatusis terminal, or receive arender.completed/render.failedwebhook. - Download — use
output.urlfrom the job response, orGET /v1/renders/{id}/downloadfor a fresh signed redirect.
GET /v1/capabilities is unauthenticated and machine-readable: element_schemas carries the per-type JSON Schema, request_schema the composition-level one, and motions[] / effects / transitions / easings / blend_modes the full flagged catalogs.
Job lifecycle
Idempotency
Every render submission should include anIdempotency-Key header to safely retry without double-submitting:
Idempotency-Key stays bound to the job it created — there is no expiry window. If you resubmit the same key:
- Same body →
200 OKwith the existing job (no new render, no new charge) - Different body →
409 Conflict
my-project-render-v3 across sessions.
Endpoints
Minimal example
The correct field names are
time (start on the output timeline), duration (how long the element is visible), and text_color (not color). Using wrong field names results in a 422 validation error.
