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
| Field | Type | Description | Default |
|---|---|---|---|
composition_url | string | URL to composition HTML | required |
width | number | Output width in pixels | from composition |
height | number | Output height in pixels | from composition |
fps | number | Frames per second | 30 |
format | string | mp4 | mp4 |
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
| Status | Description |
|---|---|
pending | Job queued, not yet started |
rendering | Frames being captured and encoded |
completed | Render finished, download available |
failed | Render 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.