Colossyan dynamicVariables vs Sume: fill placeholders yourself
Colossyan swaps {name} placeholders from dynamicVariables. Sume's avatar endpoint has no such field: fill the script yourself, one idempotent job per recipient.

In Colossyan you type a variable such as {name} in a scene script and send values in dynamicVariables when you generate; the API replaces the placeholders. The Sume avatar-video docs describe no equivalent field, so with Sume you substitute the text in your own code and submit one job per recipient.
Colossyan facts are from its script template variables page; Sume facts from Generate avatar video, both read 2026-10-01.
How does Colossyan fill the variables?
Its page says you can create dynamic variables in the script of any scene by typing a name between curly braces, and that you replace them by sending values in the request body when generating a video. Its example script has three variables: name, cool_stuff_1 and cool_stuff_2.
What does a Sume request take instead?
Sume's POST /v1/avatar-1.0/talking-video takes a script or ordered video_inputs. A spoken scene uses voice.type: "text" with exactly one of script or input_text. The text you send is the text that is spoken, so personalisation is a string step before the request.
| Need | Colossyan page | Sume avatar-video docs |
|---|---|---|
| Placeholder syntax | Curly braces in the scene script | None documented; send final text |
| Where values go | dynamicVariables in the request body | Already inside script or input_text |
| Per-scene text | Script on any scene | voice.script or voice.input_text per video_inputs item |
| Duration window | Not covered on this page | Estimated 4-60 seconds inclusive |
How do I personalise at scale?
Keep the template in your code, replace each placeholder per recipient, and send one request with its own Idempotency-Key (the docs example uses avatar-video-multi-001). A retry of the same recipient then reuses the key instead of creating a second paid job; see idempotency keys for AI video APIs.
const template = "Dear {name}, we shipped {feature}. Want a quick catch-up?";
function fill(t, values) {
return t.replace(/\{(\w+)\}/g, function (m, k) {
if (!(k in values)) throw new Error("missing value for " + k);
return values[k];
});
}
const script = fill(template, { name: "John", feature: "Slack sync" });
console.log(script);What limits apply to each personalised video?
Scripts and multi-scene plans are accepted when Sume estimates the duration at 4-60 seconds inclusive, so a long name or feature list can push a script out of the window. The docs say to shorten longer scripts or split them into multiple jobs. Check the filled text, not the template, against that window.
Sources
Related posts
More in Developers
- Creatify custom avatar lipsync_input and consent video, explained
Creatify custom avatars are built from a lipsync_input MP4 plus a consent video. On Sume, a photo input with an image_url creates a reusable avatar handle.
- Cursor custom mode with a pinned skill: install the Sume skill
Cursor lets any skill be a custom mode pinned in the chat. Install the Sume skill with sume skills install; the mode cannot waive idempotency_key or MCP scope.
- Cursor /goal with paid Sume calls: what actually caps spend
Cursor /goal keeps an agent on one objective. The goal text is no budget: bound Sume spend with generation_spend_cap_usd, max_paid_calls and dry_run.
- D-ID translation result URL: valid 24 hours, then re-fetch
D-ID's translation result_url is valid for 24 hours, so store the file or re-fetch it. Sume media.sume.com URLs do not expire. What to save and when.
Written by Sume