Skip to main content
Prefer to see it first? The Playground lays your composition out in the browser with WebGPU, so you can build and copy the exact POST /v1/renders request before spending a render. And before every submit, POST /v1/preview with dry_run: true validates the whole composition for free — see Preview.

How renders work

  1. Provide your media (if needed) — pass a source_url you already host on a CDN, upload local files with POST /v1/uploads, or have Framelane copy a public URL or cloud share link into storage for you by setting ingest_external: true on the render. See Uploading media.
  2. Submit a POST /v1/renders request 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.
  3. Job accepted — the API returns 202 Accepted with a render_* job ID and status: queued. When the render copies in external files (ingest_external), it starts as ingesting and transitions to queued automatically once every file is ready. The 202 also carries an advisory ok + violations[] lint of the composition — see Preview & validate; it never blocks the render, and the free dry_run is the check to gate on.
  4. GPU engine processes — the Framelane Renderer runs on dedicated GPU hardware.
  5. Wait for completion — poll GET /v1/renders/{id} until status is terminal, or receive a render.completed / render.failed webhook.
  6. Download — use output.url from the job response, or GET /v1/renders/{id}/download for 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 an Idempotency-Key header to safely retry without double-submitting:
An Idempotency-Key stays bound to the job it created — there is no expiry window. If you resubmit the same key:
  • Same body200 OK with the existing job (no new render, no new charge)
  • Different body409 Conflict
Use a fresh key whenever you want a fresh render — do not reuse a stable name like 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.