All pages

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 credits

One text card per line, rendered deterministically. Zero generation: typography is not something worth paying a diffusion model for.

image1:1assembly onlylines, background

Clip reel

clip-reel0 credits

Caller-supplied clips conformed, titled, captioned and stitched. Zero generation -- the compositor does all of it.

video9:16assembly onlyclip_urls, title, captions

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

infographic

A vertical infographic explaining a topic with icons and short labels.

image4:51 billed stepstyle, accent_color

Quote card

quote-card

A single square quote/statement card with bold typography.

image1:11 billed stepstyle

Slideshow / carousel

slideshow

A set of matching square slides for a carousel post (returns image_urls).

image1:11 billed stepnum_slides, style

AI video (landscape)

ai-video-landscape

A short 16:9 AI-generated video clip for YouTube-style placements.

video16:91 billed stepstyle

AI video (vertical)

ai-video-vertical

A short 9:16 AI-generated video clip for Reels/Shorts/TikTok-style placements.

video9:161 billed stepstyle

Slideshow video

slideshow-video

N AI stills, narrated and captioned, assembled into one vertical video longer than any single video model can render.

video9:162 billed stepsscript, num_slides, style, per_slide_s

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.

Next
Platforms
The nine destinations, how each one is connected, and what it needs.