Skip to main content

1. Get your API key

Sign up at console.framelane.io and copy your API key from Settings → API Keys.

2. Upload your input file

If your video is already hosted at a public HTTPS URL you control, skip to step 3 and use that URL as source_url. To copy a file from a remote URL (Dropbox, Google Drive, another CDN, or YouTube), use POST /v1/imports instead of upload — see Importing remote media. For a local file, request an upload slot and PUT the bytes to GCS:
curl -X POST https://api.framelane.io/v1/uploads \
  -H "Authorization: Bearer $FRAMELANE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"content_type": "video/mp4", "filename": "input.mp4"}'
You will use source_url from the upload response in the render request. See Uploading media for supported MIME types and error codes.

3. Submit a render

Send a POST /v1/renders request with your composition. Replace source_url with your upload URL or any public HTTPS URL:
curl -X POST https://api.framelane.io/v1/renders \
  -H "Authorization: Bearer $FRAMELANE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: quickstart-render-1" \
  -d '{
    "width": 1920,
    "height": 1080,
    "duration": 5.0,
    "frame_rate": 30,
    "output_format": "mp4",
    "elements": [
      {
        "type": "video",
        "id": "clip1",
        "source_url": "https://cdn-user.framelane.io/uploads/ws_01J.../input.mp4",
        "time": 0,
        "in_point": 0,
        "out_point": 5
      }
    ]
  }'
The API returns 202 Accepted immediately with a job object:
{
  "id": "render_01J8QR2K5VKDGN2T4FBM3CZYX7",
  "kind": "render",
  "status": "queued",
  "progress_percent": 0,
  "created_at": "2026-05-21T07:00:00Z",
  "updated_at": "2026-05-21T07:00:00Z"
}
Save the id — you need it to poll status or download the result.

4. Wait for completion

Option A — Poll job status (simplest for scripts)

Call GET /v1/renders/{id} until status is terminal (completed, failed, or cancelled):
curl https://api.framelane.io/v1/renders/render_01J8QR2K5VKDGN2T4FBM3CZYX7 \
  -H "Authorization: Bearer $FRAMELANE_API_KEY"
While processing, status is queued or processing and progress_percent updates over time. When status is completed, the response includes output.url:
{
  "id": "render_01J8QR2K5VKDGN2T4FBM3CZYX7",
  "status": "completed",
  "progress_percent": 100,
  "output": {
    "url": "https://cdn-user.framelane.io/render_01J.../output.mp4",
    "width": 1920,
    "height": 1080,
    "duration": 5.0,
    "size_bytes": 8388608
  }
}
Poll every few seconds in a loop, or use the SDK helper:
const completed = await client.renders.waitForCompletion(render.id);
completed = client.renders.wait_for_completion(render.id)
The same polling pattern applies to tasks via GET /v1/tasks/{id}. Register a webhook endpoint and Framelane calls it when the render completes:
curl -X POST https://api.framelane.io/v1/webhooks \
  -H "Authorization: Bearer $FRAMELANE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://yourapp.com/webhooks/framelane",
    "events": ["render.completed", "render.failed"]
  }'
When complete, you’ll receive:
{
  "type": "render.completed",
  "data": {
    "id": "render_01J8QR2K5VKDGN2T4FBM3CZYX7",
    "status": "completed",
    "output": {
      "url": "https://cdn-user.framelane.io/render_01J.../output.mp4",
      "width": 1920,
      "height": 1080,
      "duration": 5.0,
      "size_bytes": 8388608
    }
  }
}

5. Download the artifact

The output.url in the job response or webhook is a signed CDN URL. You can also request a fresh download redirect:
curl -L https://api.framelane.io/v1/renders/render_01J.../download \
  -H "Authorization: Bearer $FRAMELANE_API_KEY" \
  -o output.mp4

Next steps

Uploading media

Local files — signed GCS upload and metadata extraction.

Importing media

Remote URLs, cloud share links, and YouTube via Oxylabs direct-to-GCS.

Run an AI task

Transcribe audio, remove backgrounds, or upscale video.

Verify webhook signatures

Validate HMAC signatures to ensure payloads come from Framelane.

API Reference

Browse all endpoints generated from the OpenAPI spec.