Renders
Start a video, check on it, and download it when it's ready.
A render is one video: a template filled in for a brand, at one size.
Start a render
POST /renders with:
brand: the brand'sid.template: the template'sid.ratio:9x16,1x1or16x9. Leave it out for the template's own size (tall).modifications: the template's names and what fills them. Text names take text (or a number), image names take a photo'sname, andpalette.<name>takes a color like#1a73e8.
curl https://sitebrite.app/api/v1/renders \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"brand": "cm9x2brand0001",
"template": "quote-reel",
"ratio": "9x16",
"modifications": {
"tag": "Google review",
"quote": "The best sourdough in town. We drive 40 minutes for it.",
"count": 1200,
"label": "loaves a week",
"palette.bg": "#1f2937"
}
}'
The answer is 201 with the render:
{
"render": {
"id": "cm9x2render001",
"status": "rendering",
"brand": "cm9x2brand0001",
"template": "quote-reel",
"ratio": "9x16",
"seconds": 8,
"cents": 0,
"url": null,
"bytes": null,
"error": null,
"createdAt": "2026-10-29T18:00:00.000Z",
"finishedAt": null
}
}
seconds: the video's length, as counted against your minutes.cents: what it takes from credits past your minutes.0while your plan's minutes cover it.
Before it starts, the request is checked: the names must be the template's, and your minutes and credits must cover the video. If something's wrong, nothing starts and nothing is charged. See Errors and limits.
Check on it
Ask for the render every 5 seconds until its status changes:
curl https://sitebrite.app/api/v1/renders/cm9x2render001 \
-H "Authorization: Bearer $API_KEY"
status | What it means |
|---|---|
rendering | Being made. Most videos take a minute or two. |
ready | Done. url is the MP4 and bytes its size. |
failed | It couldn't be made. Nothing was charged; try again. |
In JavaScript
const api = 'https://sitebrite.app/api/v1';
const headers = { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' };
const started = await fetch(`${api}/renders`, {
method: 'POST',
headers,
body: JSON.stringify({ brand: 'cm9x2brand0001', template: 'quote-reel', modifications: { quote: 'Honest people.', count: 214, label: 'happy clients' } }),
});
if (!started.ok) throw new Error((await started.json()).statusMessage);
let { render } = await started.json();
while (render.status === 'rendering') {
await new Promise((r) => setTimeout(r, 5000));
({ render } = await (await fetch(`${api}/renders/${render.id}`, { headers })).json());
}
if (render.status === 'failed') throw new Error(render.error);
console.log(render.url);
The video
- The
urlis an MP4 (H.264), 1080 pixels on its shorter side, 30 frames a second, with no sound. - Anyone with the address can watch it, so share it only where you mean to. Download it if you want your own copy.
- The video is kept with the brand's files.