A campaign template is JSON on POST /campaigns/engage, not a Template Studio master.
{
"baseSlug": "static-ads",
"prompt": "Packshot of {{title}} — {{price}}. Clean seamless background.",
"formatIds": ["square_11", "story_916"],
"styleId": "ims_example"
}
Or video:
{
"baseSlug": "ads-catalog-video",
"prompt": "UGC-style clip of {{title}} on a kitchen counter. {{description}}",
"aspectRatio": "9:16"
}
baseSlug is one of:
| Leaf | Output | Extra fields |
|---|---|---|
static-ads | Catalog stills (Images Ad) | formatIds (≤4; one variant each) |
ads-catalog-video | Catalog video (Gemini→Kling) | aspectRatio: 16:9 / 9:16 / 1:1 |
Optional styleId pins a Discover style (ims_*) on stills.
Slots
Tokens in prompt resolve at engage to literals on the stamped graph (self-contained members — no live feed lookup later).
| Token | Source |
|---|---|
{{id}} | SKU |
{{title}} | title |
{{description}} | description (empty if omitted) |
{{price}} | verbatim price string |
{{custom_label_0}} … {{custom_label_4}} | custom labels |
Unknown tokens → campaign_unknown_slots (fail closed). There is no {?sale_price} conditional language, spoken formatter, or hook-variant rotation on this path.
Seeds
Members diversify Seedream/image seeds (FANOUT_SEED_STRIDE) so variants do not share one seed.
What is not here
AI Template Studio pitches, automatic slot extraction, robustness probes, hook variants, and template versioning were legacy kernel DCO. They are not on platform-api. Pick a Discover leaf and write the prompt template yourself — or generate one SKU in chat and copy the working brief into prompt with slots.