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.
Presets that cost nothing
Assembly is deterministic CPU work, not a model call. A preset built only from compositor steps produces a finished video or a set of cards without spending a credit — typography and stitching are not worth paying a diffusion model for.
Quote carousel
quote-carousel0 creditsOne text card per line, rendered deterministically. Zero generation: typography is not something worth paying a diffusion model for.
Clip reel
clip-reel0 creditsCaller-supplied clips conformed, titled, captioned and stitched. Zero generation -- the compositor does all of it.
Presets that render
These call a model, so they bill like any other render: once, on success, at the price on Models & prices. A preset that fans out — six stills and a narration — bills each generation step and nothing for putting them together.
Infographic
infographicA vertical infographic explaining a topic with icons and short labels.
Quote card
quote-cardA single square quote/statement card with bold typography.
Slideshow / carousel
slideshowA set of matching square slides for a carousel post (returns image_urls).
AI video (landscape)
ai-video-landscapeA short 16:9 AI-generated video clip for YouTube-style placements.
AI video (vertical)
ai-video-verticalA short 9:16 AI-generated video clip for Reels/Shorts/TikTok-style placements.
Slideshow video
slideshow-videoN AI stills, narrated and captioned, assembled into one vertical video longer than any single video model can render.
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.