Your video product.
Our render cloud.
Post composition HTML from your server. Editframe renders it on GPU workers and calls your webhook when the MP4 is ready.
Film outline
- One request per customer. Daybreak Coffee has 12,480 customers. Its server loops over them and calls createRender once per customer, sending that customer's HTML to POST /api/v1/renders.
- Cut into 15-second slices. Editframe cuts each video's timeline into 15-second slices plus an init segment, so a 60-second video becomes five render jobs. Jobs from every video share one queue.
- Rendered on GPU workers. Each GPU worker renders eight slices at once, and more workers start as the queue grows. Timing in this scene is conceptual.
- Joined without re-encoding. The finished CMAF fragments are joined byte for byte into one MP4. Nothing is re-encoded.
- Your app hears back. Editframe posts render.completed to your webhook with the render ID, your metadata and a download URL. A progress stream reports each render while it runs.
- A video for every customer. 12,480 personalized videos, and no render servers of your own.
Create a render, then read its result.
Send one request per video with its composition HTML. Add metadata to tie the render to a record in your system; it comes back when you read the render and in every webhook.
Create the render and keep its ID
The response includes the ID your application uses for progress, final status and download.
import { Client, createRender } from "@editframe/api"
const client = new Client(process.env.EDITFRAME_API_KEY)
const render = await createRender(client, {
html: "<ef-timegroup mode=\"contain\">...</ef-timegroup>",
metadata: { projectId: "project_123" },
})Check the final status before delivery
A render starts as created and ends as complete or failed. Follow the progress stream while someone is waiting, or read the render when your webhook fires.
import { downloadRender, getRenderInfo } from "@editframe/api"
const finalRender = await getRenderInfo(client, render.id)
if (finalRender.status === "complete") {
const file = await downloadRender(client, render.id)
// Attach the MP4 response to your product record.
} else if (finalRender.status === "failed") {
reportFailure(finalRender.error?.message)
}Webhooks report each finished render.
Subscribe an endpoint to render.completed and render.failed. Verify the raw request body against the X-Webhook-Signature HMAC before you use the payload, then update your record from data.metadata and data.download_url.
{
"topic": "render.completed",
"data": {
"id": "3b8e…c104",
"status": "complete",
"metadata": { "customer_id": "cus_00001" },
"download_url": "https://…/api/v1/renders/3b8e…c104.mp4"
}
}Start from a study in the motion catalog.
Browse all studies ↗Automate your
first render.
Connect your server to the Renders API.





