Skip to main content

Retail, Recipe 1.0.0

TemplateRetail, tpl_5bbd0ae3e79a
VariantRecipe
Version1.0.0, the newest: what a channel following this variant draws
Shapes9x16, 4x5, 1x1, 16x9, 2x3
Length16 seconds

Example video​

The 1x1 cut of this version, drawn from its own worked example. Open the video on its own.

What it accepts​

A recipe from the shop: the dish with its picture, how long it takes and for how many, the shopping list with the shop's prices and the basket total, one to six steps, and a call to action. The clip is as long as the steps need. metaData is the post's title, descriptions and hashtags and is never drawn.

FieldTypeRequiredLimitWhat it is
clipDatagroupyesClip data: Everything drawn in the clip: the dish, the shopping list, the steps and the call to action.
clipData.kickertextup to 32 charactersKicker: A short line above the dish, such as Recipe of the week.
clipData.headlinetextyesup to 60 charactersDish: What the dish is called.
clipData.sublinetextup to 80 charactersLine under the dish: One line about it: what makes it good, when to cook it.
clipData.timetextup to 16 charactersTime: How long it takes, as it should be read, such as 25 min.
clipData.servingstextup to 16 charactersServings: For how many, as it should be read, such as Serves 4.
clipData.pictureimagemedia:// file from the media library, alt text up to 120 charactersPicture: The dish. A photo from above works best with the round plate; any shape works with the frame.
clipData.iconenumcheck, circle-check, x, arrow-right, arrow-up-right, plus, star, heart, thumbs-up, sparkles, zap, clock, calendar, map-pin, info, triangle-alert, lightbulb, target, award, crown, gem, flame, timer, list-checks, clipboard-check, badge-check, hand-heart, rocket, trophy, megaphone, bell, qr-code, ticket, gift, key-round, book-open, graduation-cap, house, phone, mail, globe, users, user, shopping-cart, shopping-bag, tag, truck, store, apple, coffee, croissant, carrot, fish, wine, pizza, utensils, baby, shirt, scissors, package, circle-percent, sprout, cake-sliceIcon: Drawn in place of the picture when there is none.
clipData.ingredientsTitletextup to 32 charactersShopping list heading: A heading over the ingredients, such as Your shopping list. Left out, the list stands on its own.
clipData.ingredientslistat least 1, up to 10Ingredients: One to ten ingredients, ticked off one by one. A price is the shop's price for the pack; leave it out for what most kitchens have.
clipData.ingredients[]groupIngredient
clipData.ingredients[].nametextyesup to 32 charactersIngredient: What it is.
clipData.ingredients[].amounttextup to 16 charactersAmount: How much the recipe takes, such as 300 g or 2 tbsp.
clipData.ingredients[].pricenumberfrom 0, 2 decimalsPrice: The shop's price for it.
clipData.currencytextup to 3 charactersCurrency: The ISO code prices are in, such as EUR, GBP, USD or CHF.
clipData.totalnumberfrom 0, 2 decimalsBasket total: What the shopping list costs in the shop, as you want it shown. Shown only when sent.
clipData.totalLabeltextup to 24 charactersBasket total label: Words beside the basket total, such as Your basket.
clipData.stepsTitletextup to 32 charactersSteps heading: A heading over the steps, such as How to cook it. Left out, the steps stand on their own.
clipData.stepslistyesat least 1, up to 6Steps: One to six steps, shown one after another; the clip gets almost two seconds longer for each.
clipData.steps[]groupStep
clipData.steps[].texttextyesup to 80 charactersWhat to do: The step, short enough to read in two seconds.
clipData.steps[].timetextup to 12 charactersTime: How long this step takes, such as 8 min.
clipData.steps[].pictureimagemedia:// file from the media library, alt text up to 120 charactersPicture: A picture of this step, any shape. Left out, the step number takes its place.
clipData.ctagroupCall to action: The button at the end and the line under it, such as a web address, a handle or a phone number.
clipData.cta.labeltextyesup to 28 charactersButton: What the button says.
clipData.cta.detailtextup to 48 charactersLine under it: An address, a handle, a phone number.
clipData.disclaimertextup to 120 charactersSmall print: Terms that must be shown with the prices.
clipData.lookgroupLook: How the clip looks and moves. The same five switches in every format (theme, pace, corners, alignment, logo), plus this format's own. Leave any out for the format's default.
clipData.look.themeenumbrand, light, dark, boldTheme: Brand: your brand's own colours and background. Light or dark: a page tinted with your brand colour. Bold: your brand colour as the page.
clipData.look.paceenumcalm, standard, punchyPace: How things arrive: calm fades, a standard rhythm, or punchy slams and hard cuts.
clipData.look.cornersenumsquare, soft, roundCorners: The shape of cards, pictures and buttons.
clipData.look.alignenumstart, centreText alignment: Where the text lines up.
clipData.look.dishenumround, frameDish picture: Round: a plate seen from above, turning slowly. Frame: the picture as it is, in a frame of the card's shape.
clipData.look.stepsLayoutenumcards, listSteps: Cards: one large step at a time. List: the method builds up, every step stays on screen.
clipData.look.logoenumauto, freeLogo: The style's own: the logo on the style's plate (a card, a disc, a badge) so it reads on any page. As it is: the logo whole, with no plate, frame or crop, for a logo made to stand on the page, such as one with a transparent background. As it is, make sure your logo reads on the page of the theme you choose.
metaDatagroupMeta data: Everything about the post that is never drawn in the clip: its title, its description in four lengths, one per kind of platform, and its hashtags. Reelwire adds the brand's description, link and hashtags after it. Left out, the post text is generated from the clip data.
metaData.titletextup to 100 charactersTitle: Used where the platform has a title of its own: Facebook Feed, LinkedIn, Pinterest and YouTube. Up to 100 characters, which every one of them takes.
metaData.captionTinytextup to 200 charactersTiny description (Pinterest, Threads, X): Up to 200 characters. The brand's description, link and hashtags follow it within the platform's limit.
metaData.captionShorttextup to 500 charactersShort description (Telegram, Threema, WeChat, WhatsApp): Up to 500 characters. The brand's description, link and hashtags follow it within the platform's limit.
metaData.captionMediumtextup to 1500 charactersMedium description (Discord, Facebook Reels, Instagram, LinkedIn, Signal, Slack, TikTok): Up to 1500 characters. The brand's description, link and hashtags follow it within the platform's limit.
metaData.captionLongtextup to 4000 charactersLong description (Facebook Feed, YouTube): Up to 4000 characters. The brand's description, link and hashtags follow it within the platform's limit.
metaData.hashtagslistup to 15Hashtags: Written without the #. Up to 15, which every platform takes.
metaData.hashtags[]textup to 60 charactersHashtag

locales carries other languages: under each language code, the parts of clipData and metaData that differ, laid over the default, so a language with no copy still renders.

A picture is always a file from your media library: media:// followed by its id or its name. Anything the table does not list is refused, and so is anything over its limit, with a 422 that names the field.

The JSON Schema
{
"type": "object",
"properties": {
"clipData": {
"type": "object",
"properties": {
"kicker": {
"type": "string",
"maxLength": 32,
"title": "Kicker",
"description": "A short line above the dish, such as Recipe of the week."
},
"headline": {
"type": "string",
"maxLength": 60,
"title": "Dish",
"description": "What the dish is called."
},
"subline": {
"type": "string",
"maxLength": 80,
"title": "Line under the dish",
"description": "One line about it: what makes it good, when to cook it."
},
"time": {
"type": "string",
"maxLength": 16,
"title": "Time",
"description": "How long it takes, as it should be read, such as 25 min."
},
"servings": {
"type": "string",
"maxLength": 16,
"title": "Servings",
"description": "For how many, as it should be read, such as Serves 4."
},
"picture": {
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"pattern": "^media:\\/\\/[^\\s/\\\\\\u0000-\\u001f][^/\\\\\\u0000-\\u001f]{0,254}$",
"title": "Picture",
"description": "A file from the workspace's media library, written media:// and the file's id or name. A web address is refused."
},
"alt": {
"type": "string",
"maxLength": 120,
"title": "Alt text",
"description": "What the picture shows, for anyone who cannot see it."
}
},
"required": [
"url"
],
"additionalProperties": false,
"title": "Picture",
"description": "The dish. A photo from above works best with the round plate; any shape works with the frame."
},
"icon": {
"type": "string",
"enum": [
"check",
"circle-check",
"x",
"arrow-right",
"arrow-up-right",
"plus",
"star",
"heart",
"thumbs-up",
"sparkles",
"zap",
"clock",
"calendar",
"map-pin",
"info",
"triangle-alert",
"lightbulb",
"target",
"award",
"crown",
"gem",
"flame",
"timer",
"list-checks",
"clipboard-check",
"badge-check",
"hand-heart",
"rocket",
"trophy",
"megaphone",
"bell",
"qr-code",
"ticket",
"gift",
"key-round",
"book-open",
"graduation-cap",
"house",
"phone",
"mail",
"globe",
"users",
"user",
"shopping-cart",
"shopping-bag",
"tag",
"truck",
"store",
"apple",
"coffee",
"croissant",
"carrot",
"fish",
"wine",
"pizza",
"utensils",
"baby",
"shirt",
"scissors",
"package",
"circle-percent",
"sprout",
"cake-slice"
],
"title": "Icon",
"description": "Drawn in place of the picture when there is none.",
"enumNames": [
"Check",
"Circle check",
"X",
"Arrow right",
"Arrow up right",
"Plus",
"Star",
"Heart",
"Thumbs up",
"Sparkles",
"Zap",
"Clock",
"Calendar",
"Map pin",
"Info",
"Triangle alert",
"Lightbulb",
"Target",
"Award",
"Crown",
"Gem",
"Flame",
"Timer",
"List checks",
"Clipboard check",
"Badge check",
"Hand heart",
"Rocket",
"Trophy",
"Megaphone",
"Bell",
"Qr code",
"Ticket",
"Gift",
"Key round",
"Book open",
"Graduation cap",
"House",
"Phone",
"Mail",
"Globe",
"Users",
"User",
"Shopping cart",
"Shopping bag",
"Tag",
"Truck",
"Store",
"Apple",
"Coffee",
"Croissant",
"Carrot",
"Fish",
"Wine",
"Pizza",
"Utensils",
"Baby",
"Shirt",
"Scissors",
"Package",
"Circle percent",
"Sprout",
"Cake slice"
]
},
"ingredientsTitle": {
"type": "string",
"maxLength": 32,
"title": "Shopping list heading",
"description": "A heading over the ingredients, such as Your shopping list. Left out, the list stands on its own."
},
"ingredients": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 32,
"title": "Ingredient",
"description": "What it is."
},
"amount": {
"type": "string",
"maxLength": 16,
"title": "Amount",
"description": "How much the recipe takes, such as 300 g or 2 tbsp."
},
"price": {
"type": "number",
"minimum": 0,
"title": "Price",
"description": "The shop's price for it."
}
},
"required": [
"name"
],
"additionalProperties": false,
"title": "Ingredient"
},
"minItems": 1,
"maxItems": 10,
"title": "Ingredients",
"description": "One to ten ingredients, ticked off one by one. A price is the shop's price for the pack; leave it out for what most kitchens have."
},
"currency": {
"type": "string",
"maxLength": 3,
"title": "Currency",
"description": "The ISO code prices are in, such as EUR, GBP, USD or CHF."
},
"total": {
"type": "number",
"minimum": 0,
"title": "Basket total",
"description": "What the shopping list costs in the shop, as you want it shown. Shown only when sent."
},
"totalLabel": {
"type": "string",
"maxLength": 24,
"title": "Basket total label",
"description": "Words beside the basket total, such as Your basket."
},
"stepsTitle": {
"type": "string",
"maxLength": 32,
"title": "Steps heading",
"description": "A heading over the steps, such as How to cook it. Left out, the steps stand on their own."
},
"steps": {
"type": "array",
"items": {
"type": "object",
"properties": {
"text": {
"type": "string",
"maxLength": 80,
"title": "What to do",
"description": "The step, short enough to read in two seconds."
},
"time": {
"type": "string",
"maxLength": 12,
"title": "Time",
"description": "How long this step takes, such as 8 min."
},
"picture": {
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"pattern": "^media:\\/\\/[^\\s/\\\\\\u0000-\\u001f][^/\\\\\\u0000-\\u001f]{0,254}$",
"title": "Picture",
"description": "A file from the workspace's media library, written media:// and the file's id or name. A web address is refused."
},
"alt": {
"type": "string",
"maxLength": 120,
"title": "Alt text",
"description": "What the picture shows, for anyone who cannot see it."
}
},
"required": [
"url"
],
"additionalProperties": false,
"title": "Picture",
"description": "A picture of this step, any shape. Left out, the step number takes its place."
}
},
"required": [
"text"
],
"additionalProperties": false,
"title": "Step"
},
"minItems": 1,
"maxItems": 6,
"title": "Steps",
"description": "One to six steps, shown one after another; the clip gets almost two seconds longer for each."
},
"cta": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 28,
"title": "Button",
"description": "What the button says."
},
"detail": {
"type": "string",
"maxLength": 48,
"title": "Line under it",
"description": "An address, a handle, a phone number."
}
},
"required": [
"label"
],
"additionalProperties": false,
"title": "Call to action",
"description": "The button at the end and the line under it, such as a web address, a handle or a phone number."
},
"disclaimer": {
"type": "string",
"maxLength": 120,
"title": "Small print",
"description": "Terms that must be shown with the prices."
},
"look": {
"type": "object",
"properties": {
"theme": {
"type": "string",
"enum": [
"brand",
"light",
"dark",
"bold"
],
"title": "Theme",
"description": "Brand: your brand's own colours and background. Light or dark: a page tinted with your brand colour. Bold: your brand colour as the page.",
"enumNames": [
"Brand colours",
"Light",
"Dark",
"Bold brand colour"
]
},
"pace": {
"type": "string",
"enum": [
"calm",
"standard",
"punchy"
],
"title": "Pace",
"description": "How things arrive: calm fades, a standard rhythm, or punchy slams and hard cuts.",
"enumNames": [
"Calm",
"Standard",
"Punchy"
]
},
"corners": {
"type": "string",
"enum": [
"square",
"soft",
"round"
],
"title": "Corners",
"description": "The shape of cards, pictures and buttons.",
"enumNames": [
"Square",
"Softly rounded",
"Round"
]
},
"align": {
"type": "string",
"enum": [
"start",
"centre"
],
"title": "Text alignment",
"description": "Where the text lines up.",
"enumNames": [
"At the start of the line",
"Centred"
]
},
"dish": {
"type": "string",
"enum": [
"round",
"frame"
],
"title": "Dish picture",
"description": "Round: a plate seen from above, turning slowly. Frame: the picture as it is, in a frame of the card's shape.",
"enumNames": [
"Round plate",
"Framed picture"
]
},
"stepsLayout": {
"type": "string",
"enum": [
"cards",
"list"
],
"title": "Steps",
"description": "Cards: one large step at a time. List: the method builds up, every step stays on screen.",
"enumNames": [
"One step at a time",
"The whole method"
]
},
"logo": {
"type": "string",
"enum": [
"auto",
"free"
],
"title": "Logo",
"description": "The style's own: the logo on the style's plate (a card, a disc, a badge) so it reads on any page. As it is: the logo whole, with no plate, frame or crop, for a logo made to stand on the page, such as one with a transparent background. As it is, make sure your logo reads on the page of the theme you choose.",
"enumNames": [
"The style's own",
"As it is, no plate or crop"
]
}
},
"additionalProperties": false,
"title": "Look",
"description": "How the clip looks and moves. The same five switches in every format (theme, pace, corners, alignment, logo), plus this format's own. Leave any out for the format's default."
}
},
"required": [
"headline",
"steps"
],
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the dish, the shopping list, the steps and the call to action."
},
"metaData": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 100,
"title": "Title",
"description": "Used where the platform has a title of its own: Facebook Feed, LinkedIn, Pinterest and YouTube. Up to 100 characters, which every one of them takes."
},
"captionTiny": {
"type": "string",
"maxLength": 200,
"title": "Tiny description (Pinterest, Threads, X)",
"description": "Up to 200 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"captionShort": {
"type": "string",
"maxLength": 500,
"title": "Short description (Telegram, Threema, WeChat, WhatsApp)",
"description": "Up to 500 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"captionMedium": {
"type": "string",
"maxLength": 1500,
"title": "Medium description (Discord, Facebook Reels, Instagram, LinkedIn, Signal, Slack, TikTok)",
"description": "Up to 1500 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"captionLong": {
"type": "string",
"maxLength": 4000,
"title": "Long description (Facebook Feed, YouTube)",
"description": "Up to 4000 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"hashtags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60,
"title": "Hashtag"
},
"maxItems": 15,
"title": "Hashtags",
"description": "Written without the #. Up to 15, which every platform takes."
}
},
"additionalProperties": false,
"title": "Meta data",
"description": "Everything about the post that is never drawn in the clip: its title, its description in four lengths, one per kind of platform, and its hashtags. Reelwire adds the brand's description, link and hashtags after it. Left out, the post text is generated from the clip data."
},
"locales": {
"type": "object",
"additionalProperties": {
"type": "object",
"properties": {
"clipData": {
"type": "object",
"properties": {
"kicker": {
"type": "string",
"maxLength": 32,
"title": "Kicker",
"description": "A short line above the dish, such as Recipe of the week."
},
"headline": {
"type": "string",
"maxLength": 60,
"title": "Dish",
"description": "What the dish is called."
},
"subline": {
"type": "string",
"maxLength": 80,
"title": "Line under the dish",
"description": "One line about it: what makes it good, when to cook it."
},
"time": {
"type": "string",
"maxLength": 16,
"title": "Time",
"description": "How long it takes, as it should be read, such as 25 min."
},
"servings": {
"type": "string",
"maxLength": 16,
"title": "Servings",
"description": "For how many, as it should be read, such as Serves 4."
},
"picture": {
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"pattern": "^media:\\/\\/[^\\s/\\\\\\u0000-\\u001f][^/\\\\\\u0000-\\u001f]{0,254}$",
"title": "Picture",
"description": "A file from the workspace's media library, written media:// and the file's id or name. A web address is refused."
},
"alt": {
"type": "string",
"maxLength": 120,
"title": "Alt text",
"description": "What the picture shows, for anyone who cannot see it."
}
},
"required": [
"url"
],
"additionalProperties": false,
"title": "Picture",
"description": "The dish. A photo from above works best with the round plate; any shape works with the frame."
},
"icon": {
"type": "string",
"enum": [
"check",
"circle-check",
"x",
"arrow-right",
"arrow-up-right",
"plus",
"star",
"heart",
"thumbs-up",
"sparkles",
"zap",
"clock",
"calendar",
"map-pin",
"info",
"triangle-alert",
"lightbulb",
"target",
"award",
"crown",
"gem",
"flame",
"timer",
"list-checks",
"clipboard-check",
"badge-check",
"hand-heart",
"rocket",
"trophy",
"megaphone",
"bell",
"qr-code",
"ticket",
"gift",
"key-round",
"book-open",
"graduation-cap",
"house",
"phone",
"mail",
"globe",
"users",
"user",
"shopping-cart",
"shopping-bag",
"tag",
"truck",
"store",
"apple",
"coffee",
"croissant",
"carrot",
"fish",
"wine",
"pizza",
"utensils",
"baby",
"shirt",
"scissors",
"package",
"circle-percent",
"sprout",
"cake-slice"
],
"title": "Icon",
"description": "Drawn in place of the picture when there is none.",
"enumNames": [
"Check",
"Circle check",
"X",
"Arrow right",
"Arrow up right",
"Plus",
"Star",
"Heart",
"Thumbs up",
"Sparkles",
"Zap",
"Clock",
"Calendar",
"Map pin",
"Info",
"Triangle alert",
"Lightbulb",
"Target",
"Award",
"Crown",
"Gem",
"Flame",
"Timer",
"List checks",
"Clipboard check",
"Badge check",
"Hand heart",
"Rocket",
"Trophy",
"Megaphone",
"Bell",
"Qr code",
"Ticket",
"Gift",
"Key round",
"Book open",
"Graduation cap",
"House",
"Phone",
"Mail",
"Globe",
"Users",
"User",
"Shopping cart",
"Shopping bag",
"Tag",
"Truck",
"Store",
"Apple",
"Coffee",
"Croissant",
"Carrot",
"Fish",
"Wine",
"Pizza",
"Utensils",
"Baby",
"Shirt",
"Scissors",
"Package",
"Circle percent",
"Sprout",
"Cake slice"
]
},
"ingredientsTitle": {
"type": "string",
"maxLength": 32,
"title": "Shopping list heading",
"description": "A heading over the ingredients, such as Your shopping list. Left out, the list stands on its own."
},
"ingredients": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 32,
"title": "Ingredient",
"description": "What it is."
},
"amount": {
"type": "string",
"maxLength": 16,
"title": "Amount",
"description": "How much the recipe takes, such as 300 g or 2 tbsp."
},
"price": {
"type": "number",
"minimum": 0,
"title": "Price",
"description": "The shop's price for it."
}
},
"required": [
"name"
],
"additionalProperties": false,
"title": "Ingredient"
},
"minItems": 1,
"maxItems": 10,
"title": "Ingredients",
"description": "One to ten ingredients, ticked off one by one. A price is the shop's price for the pack; leave it out for what most kitchens have."
},
"currency": {
"type": "string",
"maxLength": 3,
"title": "Currency",
"description": "The ISO code prices are in, such as EUR, GBP, USD or CHF."
},
"total": {
"type": "number",
"minimum": 0,
"title": "Basket total",
"description": "What the shopping list costs in the shop, as you want it shown. Shown only when sent."
},
"totalLabel": {
"type": "string",
"maxLength": 24,
"title": "Basket total label",
"description": "Words beside the basket total, such as Your basket."
},
"stepsTitle": {
"type": "string",
"maxLength": 32,
"title": "Steps heading",
"description": "A heading over the steps, such as How to cook it. Left out, the steps stand on their own."
},
"steps": {
"type": "array",
"items": {
"type": "object",
"properties": {
"text": {
"type": "string",
"maxLength": 80,
"title": "What to do",
"description": "The step, short enough to read in two seconds."
},
"time": {
"type": "string",
"maxLength": 12,
"title": "Time",
"description": "How long this step takes, such as 8 min."
},
"picture": {
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"pattern": "^media:\\/\\/[^\\s/\\\\\\u0000-\\u001f][^/\\\\\\u0000-\\u001f]{0,254}$",
"title": "Picture",
"description": "A file from the workspace's media library, written media:// and the file's id or name. A web address is refused."
},
"alt": {
"type": "string",
"maxLength": 120,
"title": "Alt text",
"description": "What the picture shows, for anyone who cannot see it."
}
},
"required": [
"url"
],
"additionalProperties": false,
"title": "Picture",
"description": "A picture of this step, any shape. Left out, the step number takes its place."
}
},
"required": [
"text"
],
"additionalProperties": false,
"title": "Step"
},
"minItems": 1,
"maxItems": 6,
"title": "Steps",
"description": "One to six steps, shown one after another; the clip gets almost two seconds longer for each."
},
"cta": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 28,
"title": "Button",
"description": "What the button says."
},
"detail": {
"type": "string",
"maxLength": 48,
"title": "Line under it",
"description": "An address, a handle, a phone number."
}
},
"additionalProperties": false,
"title": "Call to action",
"description": "The button at the end and the line under it, such as a web address, a handle or a phone number."
},
"disclaimer": {
"type": "string",
"maxLength": 120,
"title": "Small print",
"description": "Terms that must be shown with the prices."
},
"look": {
"type": "object",
"properties": {
"theme": {
"type": "string",
"enum": [
"brand",
"light",
"dark",
"bold"
],
"title": "Theme",
"description": "Brand: your brand's own colours and background. Light or dark: a page tinted with your brand colour. Bold: your brand colour as the page.",
"enumNames": [
"Brand colours",
"Light",
"Dark",
"Bold brand colour"
]
},
"pace": {
"type": "string",
"enum": [
"calm",
"standard",
"punchy"
],
"title": "Pace",
"description": "How things arrive: calm fades, a standard rhythm, or punchy slams and hard cuts.",
"enumNames": [
"Calm",
"Standard",
"Punchy"
]
},
"corners": {
"type": "string",
"enum": [
"square",
"soft",
"round"
],
"title": "Corners",
"description": "The shape of cards, pictures and buttons.",
"enumNames": [
"Square",
"Softly rounded",
"Round"
]
},
"align": {
"type": "string",
"enum": [
"start",
"centre"
],
"title": "Text alignment",
"description": "Where the text lines up.",
"enumNames": [
"At the start of the line",
"Centred"
]
},
"dish": {
"type": "string",
"enum": [
"round",
"frame"
],
"title": "Dish picture",
"description": "Round: a plate seen from above, turning slowly. Frame: the picture as it is, in a frame of the card's shape.",
"enumNames": [
"Round plate",
"Framed picture"
]
},
"stepsLayout": {
"type": "string",
"enum": [
"cards",
"list"
],
"title": "Steps",
"description": "Cards: one large step at a time. List: the method builds up, every step stays on screen.",
"enumNames": [
"One step at a time",
"The whole method"
]
},
"logo": {
"type": "string",
"enum": [
"auto",
"free"
],
"title": "Logo",
"description": "The style's own: the logo on the style's plate (a card, a disc, a badge) so it reads on any page. As it is: the logo whole, with no plate, frame or crop, for a logo made to stand on the page, such as one with a transparent background. As it is, make sure your logo reads on the page of the theme you choose.",
"enumNames": [
"The style's own",
"As it is, no plate or crop"
]
}
},
"additionalProperties": false,
"title": "Look",
"description": "How the clip looks and moves. The same five switches in every format (theme, pace, corners, alignment, logo), plus this format's own. Leave any out for the format's default."
}
},
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the dish, the shopping list, the steps and the call to action."
},
"metaData": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 100,
"title": "Title",
"description": "Used where the platform has a title of its own: Facebook Feed, LinkedIn, Pinterest and YouTube. Up to 100 characters, which every one of them takes."
},
"captionTiny": {
"type": "string",
"maxLength": 200,
"title": "Tiny description (Pinterest, Threads, X)",
"description": "Up to 200 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"captionShort": {
"type": "string",
"maxLength": 500,
"title": "Short description (Telegram, Threema, WeChat, WhatsApp)",
"description": "Up to 500 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"captionMedium": {
"type": "string",
"maxLength": 1500,
"title": "Medium description (Discord, Facebook Reels, Instagram, LinkedIn, Signal, Slack, TikTok)",
"description": "Up to 1500 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"captionLong": {
"type": "string",
"maxLength": 4000,
"title": "Long description (Facebook Feed, YouTube)",
"description": "Up to 4000 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"hashtags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60,
"title": "Hashtag"
},
"maxItems": 15,
"title": "Hashtags",
"description": "Written without the #. Up to 15, which every platform takes."
}
},
"additionalProperties": false,
"title": "Meta data",
"description": "Everything about the post that is never drawn in the clip: its title, its description in four lengths, one per kind of platform, and its hashtags. Reelwire adds the brand's description, link and hashtags after it. Left out, the post text is generated from the clip data."
}
},
"additionalProperties": false
},
"propertyNames": {
"enum": [
"aa",
"ab",
"ae",
"af",
"ak",
"am",
"an",
"ar",
"as",
"av",
"ay",
"az",
"ba",
"be",
"bg",
"bi",
"bm",
"bn",
"bo",
"br",
"bs",
"ca",
"ce",
"ch",
"co",
"cr",
"cs",
"cu",
"cv",
"cy",
"da",
"de",
"dv",
"dz",
"ee",
"el",
"en",
"eo",
"es",
"et",
"eu",
"fa",
"ff",
"fi",
"fj",
"fo",
"fr",
"fy",
"ga",
"gd",
"gl",
"gn",
"gu",
"gv",
"ha",
"he",
"hi",
"ho",
"hr",
"ht",
"hu",
"hy",
"hz",
"ia",
"id",
"ie",
"ig",
"ii",
"ik",
"io",
"is",
"it",
"iu",
"ja",
"jv",
"ka",
"kg",
"ki",
"kj",
"kk",
"kl",
"km",
"kn",
"ko",
"kr",
"ks",
"ku",
"kv",
"kw",
"ky",
"la",
"lb",
"lg",
"li",
"ln",
"lo",
"lt",
"lu",
"lv",
"mg",
"mh",
"mi",
"mk",
"ml",
"mn",
"mr",
"ms",
"mt",
"my",
"na",
"nb",
"nd",
"ne",
"ng",
"nl",
"nn",
"no",
"nr",
"nv",
"ny",
"oc",
"oj",
"om",
"or",
"os",
"pa",
"pi",
"pl",
"ps",
"pt",
"qu",
"rm",
"rn",
"ro",
"ru",
"rw",
"sa",
"sc",
"sd",
"se",
"sg",
"si",
"sk",
"sl",
"sm",
"sn",
"so",
"sq",
"sr",
"ss",
"st",
"su",
"sv",
"sw",
"ta",
"te",
"tg",
"th",
"ti",
"tk",
"tl",
"tn",
"to",
"tr",
"ts",
"tt",
"tw",
"ty",
"ug",
"uk",
"ur",
"uz",
"ve",
"vi",
"vo",
"wa",
"wo",
"xh",
"yi",
"yo",
"za",
"zh",
"zu",
"zh-CN",
"zh-TW",
"pt-BR"
]
}
}
},
"required": [
"clipData"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}

Ask Reelwire for the same document yourself, without signing in:

curl "http://localhost:4000/v1/formats/template/tpl_5bbd0ae3e79a?variant=Recipe&version=1.0.0"

Delivery JSON​

Your own system sends this to one of your streams, POST /v1/stream, and every channel listening to that stream draws it with its template. data is the document described above; a stream with an empty field map passes it to the template unchanged. Try it first on POST /v1/stream/validate, which answers the same without publishing anything. Streams and feeds explains the rest, including how to map a document of your own shape instead.

{
"streamId": "st_your_stream_id",
"eventId": "01M2SQMKK3G1NVFXV31DCBVB95",
"occurredAt": "2026-09-23T07:00:00Z",
"locale": "en",
"data": {
"clipData": {
"kicker": "Recipe of the week",
"headline": "Miso ramen with soft eggs and crisp spring onions",
"subline": "A warming bowl from one pot, on the table on a weeknight",
"time": "25 min",
"servings": "Serves 2",
"picture": {
"alt": "Soft waves of blue, violet and orange",
"url": "media://example-image.jpg"
},
"icon": "utensils",
"ingredientsTitle": "Your shopping list",
"ingredients": [
{
"name": "Fresh ramen noodles",
"price": 1.99,
"amount": "2 x 150 g"
},
{
"name": "White miso paste",
"price": 2.49,
"amount": "3 tbsp"
},
{
"name": "Free-range eggs",
"price": 2.29,
"amount": "2 eggs"
},
{
"name": "Vegetable stock",
"price": 0.89,
"amount": "800 ml"
},
{
"name": "Shiitake mushrooms",
"price": 2.19,
"amount": "150 g"
},
{
"name": "Baby spinach",
"price": 1.29,
"amount": "2 handfuls"
},
{
"name": "Spring onions",
"price": 0.69,
"amount": "1 bunch"
},
{
"name": "Toasted sesame oil",
"amount": "1 tsp"
}
],
"currency": "EUR",
"total": 11.83,
"totalLabel": "Your basket",
"stepsTitle": "How to cook it",
"steps": [
{
"text": "Simmer the stock with the miso paste and the sliced mushrooms.",
"time": "8 min"
},
{
"text": "Boil the eggs for six and a half minutes, cool and peel them.",
"time": "7 min"
},
{
"text": "Cook the noodles, adding the spinach for the last minute.",
"time": "3 min"
},
{
"text": "Fill two bowls, pour over the broth and top with eggs and onions."
}
],
"cta": {
"label": "Get the ingredients",
"detail": "greenleaf.example/recipes"
},
"disclaimer": "Prices of 2 October in Greenleaf Market stores, while stocks last.",
"look": {
"theme": "brand",
"pace": "standard",
"corners": "round",
"align": "start",
"dish": "round",
"stepsLayout": "cards",
"logo": "auto"
}
},
"metaData": {
"title": "Miso ramen in 25 minutes, with everything from Greenleaf Market",
"captionTiny": "Recipe of the week: miso ramen with soft eggs, ready in 25 minutes. Everything you need costs under 12 euros at Greenleaf Market.",
"captionShort": "Recipe of the week: miso ramen with soft eggs and crisp spring onions, from one pot in 25 minutes. Simmer the broth with miso and shiitake, boil the eggs, cook the noodles with spinach and fill two bowls. The whole shopping list is 11.83 euros at Greenleaf Market.",
"captionMedium": "Recipe of the week: miso ramen with soft eggs and crisp spring onions, a warming bowl from one pot that is on the table on a weeknight. Simmer vegetable stock with white miso paste and sliced shiitake mushrooms. Boil two eggs for six and a half minutes, cool and peel them. Cook fresh ramen noodles and add baby spinach for the last minute. Fill two bowls, pour over the broth and top with the halved eggs and spring onions. Everything on the shopping list costs 11.83 euros at Greenleaf Market. Prices of 2 October, while stocks last.",
"captionLong": "Recipe of the week: miso ramen with soft eggs and crisp spring onions, a warming bowl from one pot that is on the table on a weeknight and serves two. You need fresh ramen noodles, white miso paste, two free-range eggs, vegetable stock, shiitake mushrooms, baby spinach, spring onions and a teaspoon of toasted sesame oil. Simmer the stock with the miso paste and the sliced mushrooms for eight minutes. Boil the eggs for six and a half minutes, cool them in cold water and peel them. Cook the noodles and add the spinach for the last minute. Fill two bowls, pour over the broth, top with the halved eggs and the spring onions and finish with a drop of sesame oil. Everything on the shopping list costs 11.83 euros at Greenleaf Market. Prices of 2 October, while stocks last. Find more recipes on our website.",
"hashtags": [
"recipeoftheweek",
"ramen",
"weeknightdinner",
"greenleafmarket"
]
}
}
}

The delivery names no version: which build draws it is the channel's choice, the newest of its variant or the one it is pinned to. eventId is a ULID you make once per event: sending the same one again changes nothing. occurredAt is when the thing happened, not when you sent it. locale is the language of the text in data, and data.locales carries other languages beside it.