Presets & recipes
A preset is a scaffold your agent can name instead of describing a whole render: create_visual(template_id="…"). Some fan out several generations and assemble one deliverable; some call no model at all and cost nothing. Unknown inputs are rejected rather than ignored, so a typo fails loudly instead of quietly rendering a default.
The preset list is read from the running server and it is not reachable right now. Rather than show a list that may have fallen behind, this page waits — try again shortly, or ask your agent for list_visual_templates.
Recipes
You do not type these. You say the sentence; this is what your agent does with it — useful for knowing what to expect, and for telling it to do something slightly different.
A reel from your own clips
“Turn these five clips into a vertical reel with a title card.”
No model runs, so this bills nothing. Conforming, titling, captioning and stitching are deterministic ffmpeg work.
create_visual(
template_id="clip-reel",
inputs={
"clip_urls": ["https://…/a.mp4", "https://…/b.mp4"],
"title": "Three days in Lisbon",
"captions": ["Day one", "Day two", "Day three"],
},
)
→ {"visual_id": "vis_9f31", "status": "queued"}
get_visual_status("vis_9f31")
→ {"status": "succeeded", "media_url": "https://…/reel.mp4"}A narrated explainer, longer than a model will render
“Make a narrated explainer about our pricing change, vertical, about half a minute.”
Longer than any single video model will render. The preset fans out stills, narrates the script, and assembles them — you are billed for the stills and the narration, not the assembly.
create_visual(
template_id="slideshow-video",
prompt="a calm office desk, morning light",
inputs={
"script": "From August, credits roll over…",
"num_slides": 6,
"per_slide_s": 5,
},
)One render, every account, tomorrow morning
“Post this to everywhere I’m connected, tomorrow at 9.”
One call per account. Scheduling runs on our side, so the agent does not have to stay awake until nine — and publishing bills nothing, the render already did.
list_accounts()
→ {"accounts": [{"account_id": "acct_x", "platform": "instagram"}, …]}
# then, per account:
create_post(
account_id="acct_x",
media_urls=["https://…/reel.mp4"],
scheduled_time="2026-08-01T09:00Z",
)A publish that a retry cannot duplicate
“Publish the video you just made, and don’t double-post if you retry.”
Hand the job id over rather than its URL: publishing is deduplicated on the (job, account) pair, so a retried call returns the first post instead of putting a second one out. A create_post built from media_urls has no job to dedup on.
post_video( job_id="job_ab12", account_id="acct_x", ) # calling it again with the same pair returns the same post_ id
Which preset actually worked
“What did last month’s posts do, and which preset was behind the good ones?”
Renders carry the preset that made them, so performance can be read back per preset rather than per post. Reading analytics is free.
list_top_posts(group_by="template_id", since="2026-06-01")
Adding your own
Presets are data, not code paths — a new one is visible to list_visual_templates, and on this page, without a deploy. Brand kits are the same idea for colour and type: set one up once and pass brand_id so every render comes back in it.