create_campaign
Create a Siren campaign from a plain-language brief — the full pipeline: plan, on-brand copy, deterministic render, verify. Returns the run; poll get_run until it finishes. Spends credits (image 10, video 25; voice or music-only is the same 25). Pass output_type to pin a film (list_films has the catalog); omit it and Siren picks. Optional scheduled_at (ISO-8601) queues a sequential post (X → Instagram → TikTok, or platforms you pass) when the render succeeds — requires Allow posting. Fails with a 402 upgrade message if the plan or balance can't cover it.
FILM KNOBS: voiceover (true narrated / false music only), direction (mood, pace, motion, music in one line), music (a bed id), media (upload_media URLs the film shows). Images ignore the film knobs: Siren writes and paints them from the brief and Brand DNA.
ANY BRAND: pass brand to make it for a brand that is not this
workspace's own, e.g. brand={"name": "Acme", "site": "acme.com",
"logo_url": "https://acme.com/logo.png", "primary": "#FF4400"}.
Nothing of this workspace's identity leaks in.
The exact same request within 24 hours returns the run it already started, as it is now, with replayed=true and no new charge. Change the brief to make another.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| brand | No | Make it for ANOTHER brand instead of this workspace's own (a client, a brand people recognise, a side project). Object: {name (required), site, logo_url (https PNG/SVG/JPG of the brand's MARK or app icon, e.g. Duolingo's owl, not the wordmark: the film sets the name in type), accent (hex: the brand's signature colour, the one films are painted in), primary (hex: its dark or ink colour), secondary, tagline, font (the brand's typeface name, e.g. Nunito), x_handle, sells (one line: what they make)}. Clean slate: none of this workspace's logo, colours, mascot, font, handle, screenshots or memory is used; only what you send. YOU look the brand up first: their site, their logo file (the image in their site header, or their /brand or /press page, or the app icon) and their colours as hex. A missing, dead or damaged logo is refused (brand_logo_required / brand_logo_unreachable / brand_logo_unreadable) because a film with no mark is a generic video; one colour for both primary and accent is refused too. Never invent a logo URL and never pass a screenshot of their page as the logo. Omit to use this workspace's Brand DNA. | |
| brief | Yes | Plain-language request for the post, e.g. "announce the new export feature, use the dashboard screenshot". | |
| media | No | Films: URLs from upload_media (images and videos) for the film to show. Omit and the film shows the brand's recent work. Images: not used; add pictures to Brand DNA with upload_product_screen instead. | |
| music | No | Films: a music bed track_id. Omit and the bed follows the film and the direction. | |
| caption | No | Optional caption for the post this run becomes. Your words are kept; omit and Siren writes the caption. | |
| channel | No | Target channel for the render: twitter, instagram, linkedin, tiktok, or youtube. Sets the default aspect (X square, Instagram 4:5, TikTok 9:16) and copy length. A shape named in the brief wins: square, vertical, portrait, story, wide, landscape, 4:5, 9:16, 16:9. | |
| timezone | No | IANA timezone name for scheduled_at, e.g. Africa/Lagos or America/New_York. | UTC |
| direction | No | Films: one free line on mood, pace, motion and music, e.g. "emotional, slow, soft piano" or "dark, club energy, fast cuts". | |
| platforms | No | Where to post: any of x, instagram, tiktok, linkedin, youtube, or ["everything"] for every connected channel. | |
| voiceover | No | Films: true = narrated in the brand voice, false = motion + music only. Omit and the brief decides; if the human never said, ask them once. | |
| asset_type | No | What to make: card (still image) or video. | card |
| output_type | No | Optional film to pin, e.g. "story" or "pitch". Call list_films to browse; describe_film for the contract. Omit and Siren picks the format from the brief. | |
| scheduled_at | No | ISO-8601 time to post, e.g. 2026-09-12T09:00:00. Interpreted in the given timezone. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||