Renders

Create render jobs, track progress, and download the output.

Create a render

POST https://api.editframe.com/api/v1/renders
Authorization: Bearer <EDITFRAME_API_KEY>
Content-Type: application/json
{
  "composition_url": "https://your-host.com/composition.html",
  "width": 1920,
  "height": 1080,
  "fps": 30,
  "format": "mp4"
}

composition_url must be a publicly accessible URL. Use the cloud-render CLI command to package and upload local compositions automatically.

Request body

FieldTypeDescriptionDefault
composition_urlstringURL to composition HTMLrequired
widthnumberOutput width in pixelsfrom composition
heightnumberOutput height in pixelsfrom composition
fpsnumberFrames per second30
formatstringmp4mp4

Response: { "id": "rnd_abc123", "status": "pending", "progress": 0 }

Track progress

Poll GET /api/v1/renders/:id. Wrap it in an async generator to consume progress events cleanly:

async function* renderProgress(id, { intervalMs = 1000 } = {}) {
  while (true) {
    const res = await fetch(`https://api.editframe.com/api/v1/renders/${id}`, {
      headers: { Authorization: `Bearer ${API_KEY}` },
    });
    const render = await res.json();
    yield render;
    if (render.status === "completed" || render.status === "failed") break;
    await new Promise((r) => setTimeout(r, intervalMs));
  }
}

for await (const render of renderProgress("rnd_abc123")) {
  console.log(`${render.status} — ${render.progress}%`);
}

Status values

StatusDescription
pendingJob queued, not yet started
renderingFrames being captured and encoded
completedRender finished, download available
failedRender failed

Download the output

GET https://api.editframe.com/api/v1/renders/:id.mp4

Webhooks

For long jobs, use webhooks to receive a completed event instead of polling.