Skip to main content

Pharmacies (Pharmacy groups and cooperatives), Campaign of the month 1.0.0

TemplatePharmacies (Pharmacy groups and cooperatives), tpl_582d4bae23ad
VariantCampaign of the month
Version1.0.0, the newest: what a channel following this variant draws
Shapes9x16, 4x5, 1x1, 16x9, 2x3
Length17 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 pharmacy group's campaign of the month in a Bauhaus look: the month in the circle, the campaign, the topic, a line about it and where it runs, complete on the first frame; then up to four points read in turn, up to three offers with prices as sent, the button and the pharmacist. The mandatory text stays at the foot throughout. 12 seconds, 1.5 more per point. metaData is never drawn.

FieldTypeRequiredLimitWhat it is
clipDatagroupyesClip data: Everything drawn in the clip: the campaign, the month, the topic, the line about it, where it runs, the points, the offers, the labels, the call to action and the mandatory text.
clipData.campaigntextyesup to 40 charactersCampaign: What this post is, over the topic beside a square of your colour, such as Campaign of the month or Health topic of the month.
clipData.monthdatetimeyesMonth: Any day of the campaign's month. The month and its year are written in the circle in the channel's language.
clipData.monthTexttextup to 16 charactersMonth, as written: The circle's word in your own words, shown instead of the month and year, such as November or Winter. Short words fill the circle best.
clipData.topictextyesup to 64 charactersTopic: This month's health topic, the headline, such as Ready for the cold season. Say only what you can stand behind: no promise of a cure or of protection.
clipData.introtextup to 160 charactersAbout the topic: A sentence about the topic and what the pharmacies do this month.
clipData.wheretextup to 80 charactersWhere it runs: Where the campaign runs, under the topic with a shop pictogram, such as In all 412 member pharmacies. A count is shown exactly as you write it.
clipData.pointslistat least 1, up to 4Points: One to four points of the topic, each read in turn with its number on a square, or its pictogram where you choose one; about one and a half seconds each. Advice only, in plain words, never a promise.
clipData.points[]groupPoint
clipData.points[].texttextyesup to 90 charactersPoint: One piece of advice, in a short sentence.
clipData.points[].iconenumheart-pulse, stethoscope, thermometer, droplets, sun, snowflake, wind, cloud-rain, moon, apple, carrot, fish, coffee, utensils, dumbbell, footprints, bike, baby, users, user, accessibility, hand-helping, hand-heart, shield-check, clipboard-check, list-checks, calendar, clock, timer, info, triangle-alert, lightbulb, phone, smartphone, store, house, leaf, flower-2, eye, glasses, check, pill, capsule, tablets, bottle, syringe, plaster, mortar, virus, lungs, bed, pharmacyPictogram: The pictogram on the point's square. Left out, the square holds the point's number.
clipData.offerslistup to 3What members offer: Up to three things the member pharmacies offer for the topic this month, a card each: a service or a product, a line about it and its price exactly as you write it (currency included). An old price is struck through, only where you send one beside a price. Naming a medicine needs the mandatory text.
clipData.offers[]groupOffer
clipData.offers[].nametextyesup to 56 charactersName: The service or the product, with its pack size where it is one.
clipData.offers[].detailtextup to 90 charactersAbout it: A line about it: what it is, until when, for whom.
clipData.offers[].pricetextup to 20 charactersPrice: The price exactly as it should be shown, such as €6.95, From €4.50 or Free.
clipData.offers[].oldPricetextup to 20 charactersOld price: The price before, struck through, shown only beside a price.
clipData.labelsgroupLabels: The words over the scenes, in your language. A label left out is not drawn.
clipData.labels.pointstextup to 40 charactersPoints: Over the points.
clipData.labels.offerstextup to 40 charactersOffers: Over what the members offer.
clipData.ctagroupCall to action: The button at the end and the line under it, such as a web address, the app or a phone number.
clipData.cta.labeltextyesup to 28 charactersButton: What the button says.
clipData.cta.detailtextup to 48 charactersLine under it: A web address, the app, a phone number.
clipData.mandatorytextup to 320 charactersMandatory text: The mandatory text your country's law asks for wherever a medicine is named or shown, an offer of one included, such as "Always read the label." in the UK or the Pflichttext in Germany. Shown whole at the foot of every frame, set smaller and then on more lines, never cut. Leave it out only where no medicine is named.
clipData.lookgroupLook: How the clip looks and moves. The same six switches in every format (theme, pace, corners, alignment, logo, logo size). Leave any out for the package's default: the brand's colours, the standard pace, square corners, text at the start.
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.logoenumauto, freeLogo: The style's own: the logo on a small plate 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.
clipData.look.logoSizeenumauto, small, largeLogo size: Standard is the style's own size. Small draws the logo a fifth smaller, with its plate. Large draws it a quarter larger wherever the style has room for it, and at the standard size where it has none.
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 400 schema_validation error that names the field.

The JSON Schema
{
"type": "object",
"properties": {
"clipData": {
"type": "object",
"properties": {
"campaign": {
"type": "string",
"maxLength": 40,
"title": "Campaign",
"description": "What this post is, over the topic beside a square of your colour, such as Campaign of the month or Health topic of the month."
},
"month": {
"type": "string",
"format": "date-time",
"title": "Month",
"description": "Any day of the campaign's month. The month and its year are written in the circle in the channel's language."
},
"monthText": {
"type": "string",
"maxLength": 16,
"title": "Month, as written",
"description": "The circle's word in your own words, shown instead of the month and year, such as November or Winter. Short words fill the circle best."
},
"topic": {
"type": "string",
"maxLength": 64,
"title": "Topic",
"description": "This month's health topic, the headline, such as Ready for the cold season. Say only what you can stand behind: no promise of a cure or of protection."
},
"intro": {
"type": "string",
"maxLength": 160,
"title": "About the topic",
"description": "A sentence about the topic and what the pharmacies do this month."
},
"where": {
"type": "string",
"maxLength": 80,
"title": "Where it runs",
"description": "Where the campaign runs, under the topic with a shop pictogram, such as In all 412 member pharmacies. A count is shown exactly as you write it."
},
"points": {
"type": "array",
"items": {
"type": "object",
"properties": {
"text": {
"type": "string",
"maxLength": 90,
"title": "Point",
"description": "One piece of advice, in a short sentence."
},
"icon": {
"type": "string",
"enum": [
"heart-pulse",
"stethoscope",
"thermometer",
"droplets",
"sun",
"snowflake",
"wind",
"cloud-rain",
"moon",
"apple",
"carrot",
"fish",
"coffee",
"utensils",
"dumbbell",
"footprints",
"bike",
"baby",
"users",
"user",
"accessibility",
"hand-helping",
"hand-heart",
"shield-check",
"clipboard-check",
"list-checks",
"calendar",
"clock",
"timer",
"info",
"triangle-alert",
"lightbulb",
"phone",
"smartphone",
"store",
"house",
"leaf",
"flower-2",
"eye",
"glasses",
"check",
"pill",
"capsule",
"tablets",
"bottle",
"syringe",
"plaster",
"mortar",
"virus",
"lungs",
"bed",
"pharmacy"
],
"title": "Pictogram",
"description": "The pictogram on the point's square. Left out, the square holds the point's number.",
"enumNames": [
"Heart pulse",
"Stethoscope",
"Thermometer",
"Droplets",
"Sun",
"Snowflake",
"Wind",
"Cloud rain",
"Moon",
"Apple",
"Carrot",
"Fish",
"Coffee",
"Utensils",
"Dumbbell",
"Footprints",
"Bike",
"Baby",
"Users",
"User",
"Accessibility",
"Hand helping",
"Hand heart",
"Shield check",
"Clipboard check",
"List checks",
"Calendar",
"Clock",
"Timer",
"Info",
"Triangle alert",
"Lightbulb",
"Phone",
"Smartphone",
"Store",
"House",
"Leaf",
"Flower 2",
"Eye",
"Glasses",
"Check",
"Pill",
"Capsule",
"Tablets",
"Medicine bottle",
"Syringe",
"Plaster",
"Mortar",
"Virus",
"Lungs",
"Bed",
"Pharmacy"
]
}
},
"required": [
"text"
],
"additionalProperties": false,
"title": "Point"
},
"minItems": 1,
"maxItems": 4,
"title": "Points",
"description": "One to four points of the topic, each read in turn with its number on a square, or its pictogram where you choose one; about one and a half seconds each. Advice only, in plain words, never a promise."
},
"offers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 56,
"title": "Name",
"description": "The service or the product, with its pack size where it is one."
},
"detail": {
"type": "string",
"maxLength": 90,
"title": "About it",
"description": "A line about it: what it is, until when, for whom."
},
"price": {
"type": "string",
"maxLength": 20,
"title": "Price",
"description": "The price exactly as it should be shown, such as €6.95, From €4.50 or Free."
},
"oldPrice": {
"type": "string",
"maxLength": 20,
"title": "Old price",
"description": "The price before, struck through, shown only beside a price."
}
},
"required": [
"name"
],
"additionalProperties": false,
"title": "Offer"
},
"maxItems": 3,
"title": "What members offer",
"description": "Up to three things the member pharmacies offer for the topic this month, a card each: a service or a product, a line about it and its price exactly as you write it (currency included). An old price is struck through, only where you send one beside a price. Naming a medicine needs the mandatory text."
},
"labels": {
"type": "object",
"properties": {
"points": {
"type": "string",
"maxLength": 40,
"title": "Points",
"description": "Over the points."
},
"offers": {
"type": "string",
"maxLength": 40,
"title": "Offers",
"description": "Over what the members offer."
}
},
"additionalProperties": false,
"title": "Labels",
"description": "The words over the scenes, in your language. A label left out is not drawn."
},
"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": "A web address, the app, 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, the app or a phone number."
},
"mandatory": {
"type": "string",
"maxLength": 320,
"title": "Mandatory text",
"description": "The mandatory text your country's law asks for wherever a medicine is named or shown, an offer of one included, such as \"Always read the label.\" in the UK or the Pflichttext in Germany. Shown whole at the foot of every frame, set smaller and then on more lines, never cut. Leave it out only where no medicine is named."
},
"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"
]
},
"logo": {
"type": "string",
"enum": [
"auto",
"free"
],
"title": "Logo",
"description": "The style's own: the logo on a small plate 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"
]
},
"logoSize": {
"type": "string",
"enum": [
"auto",
"small",
"large"
],
"title": "Logo size",
"description": "Standard is the style's own size. Small draws the logo a fifth smaller, with its plate. Large draws it a quarter larger wherever the style has room for it, and at the standard size where it has none.",
"enumNames": [
"Standard",
"Small",
"Large"
]
}
},
"additionalProperties": false,
"title": "Look",
"description": "How the clip looks and moves. The same six switches in every format (theme, pace, corners, alignment, logo, logo size). Leave any out for the package's default: the brand's colours, the standard pace, square corners, text at the start."
}
},
"required": [
"campaign",
"month",
"topic"
],
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the campaign, the month, the topic, the line about it, where it runs, the points, the offers, the labels, the call to action and the mandatory text."
},
"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": {
"campaign": {
"type": "string",
"maxLength": 40,
"title": "Campaign",
"description": "What this post is, over the topic beside a square of your colour, such as Campaign of the month or Health topic of the month."
},
"month": {
"type": "string",
"format": "date-time",
"title": "Month",
"description": "Any day of the campaign's month. The month and its year are written in the circle in the channel's language."
},
"monthText": {
"type": "string",
"maxLength": 16,
"title": "Month, as written",
"description": "The circle's word in your own words, shown instead of the month and year, such as November or Winter. Short words fill the circle best."
},
"topic": {
"type": "string",
"maxLength": 64,
"title": "Topic",
"description": "This month's health topic, the headline, such as Ready for the cold season. Say only what you can stand behind: no promise of a cure or of protection."
},
"intro": {
"type": "string",
"maxLength": 160,
"title": "About the topic",
"description": "A sentence about the topic and what the pharmacies do this month."
},
"where": {
"type": "string",
"maxLength": 80,
"title": "Where it runs",
"description": "Where the campaign runs, under the topic with a shop pictogram, such as In all 412 member pharmacies. A count is shown exactly as you write it."
},
"points": {
"type": "array",
"items": {
"type": "object",
"properties": {
"text": {
"type": "string",
"maxLength": 90,
"title": "Point",
"description": "One piece of advice, in a short sentence."
},
"icon": {
"type": "string",
"enum": [
"heart-pulse",
"stethoscope",
"thermometer",
"droplets",
"sun",
"snowflake",
"wind",
"cloud-rain",
"moon",
"apple",
"carrot",
"fish",
"coffee",
"utensils",
"dumbbell",
"footprints",
"bike",
"baby",
"users",
"user",
"accessibility",
"hand-helping",
"hand-heart",
"shield-check",
"clipboard-check",
"list-checks",
"calendar",
"clock",
"timer",
"info",
"triangle-alert",
"lightbulb",
"phone",
"smartphone",
"store",
"house",
"leaf",
"flower-2",
"eye",
"glasses",
"check",
"pill",
"capsule",
"tablets",
"bottle",
"syringe",
"plaster",
"mortar",
"virus",
"lungs",
"bed",
"pharmacy"
],
"title": "Pictogram",
"description": "The pictogram on the point's square. Left out, the square holds the point's number.",
"enumNames": [
"Heart pulse",
"Stethoscope",
"Thermometer",
"Droplets",
"Sun",
"Snowflake",
"Wind",
"Cloud rain",
"Moon",
"Apple",
"Carrot",
"Fish",
"Coffee",
"Utensils",
"Dumbbell",
"Footprints",
"Bike",
"Baby",
"Users",
"User",
"Accessibility",
"Hand helping",
"Hand heart",
"Shield check",
"Clipboard check",
"List checks",
"Calendar",
"Clock",
"Timer",
"Info",
"Triangle alert",
"Lightbulb",
"Phone",
"Smartphone",
"Store",
"House",
"Leaf",
"Flower 2",
"Eye",
"Glasses",
"Check",
"Pill",
"Capsule",
"Tablets",
"Medicine bottle",
"Syringe",
"Plaster",
"Mortar",
"Virus",
"Lungs",
"Bed",
"Pharmacy"
]
}
},
"required": [
"text"
],
"additionalProperties": false,
"title": "Point"
},
"minItems": 1,
"maxItems": 4,
"title": "Points",
"description": "One to four points of the topic, each read in turn with its number on a square, or its pictogram where you choose one; about one and a half seconds each. Advice only, in plain words, never a promise."
},
"offers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 56,
"title": "Name",
"description": "The service or the product, with its pack size where it is one."
},
"detail": {
"type": "string",
"maxLength": 90,
"title": "About it",
"description": "A line about it: what it is, until when, for whom."
},
"price": {
"type": "string",
"maxLength": 20,
"title": "Price",
"description": "The price exactly as it should be shown, such as €6.95, From €4.50 or Free."
},
"oldPrice": {
"type": "string",
"maxLength": 20,
"title": "Old price",
"description": "The price before, struck through, shown only beside a price."
}
},
"required": [
"name"
],
"additionalProperties": false,
"title": "Offer"
},
"maxItems": 3,
"title": "What members offer",
"description": "Up to three things the member pharmacies offer for the topic this month, a card each: a service or a product, a line about it and its price exactly as you write it (currency included). An old price is struck through, only where you send one beside a price. Naming a medicine needs the mandatory text."
},
"labels": {
"type": "object",
"properties": {
"points": {
"type": "string",
"maxLength": 40,
"title": "Points",
"description": "Over the points."
},
"offers": {
"type": "string",
"maxLength": 40,
"title": "Offers",
"description": "Over what the members offer."
}
},
"additionalProperties": false,
"title": "Labels",
"description": "The words over the scenes, in your language. A label left out is not drawn."
},
"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": "A web address, the app, 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, the app or a phone number."
},
"mandatory": {
"type": "string",
"maxLength": 320,
"title": "Mandatory text",
"description": "The mandatory text your country's law asks for wherever a medicine is named or shown, an offer of one included, such as \"Always read the label.\" in the UK or the Pflichttext in Germany. Shown whole at the foot of every frame, set smaller and then on more lines, never cut. Leave it out only where no medicine is named."
},
"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"
]
},
"logo": {
"type": "string",
"enum": [
"auto",
"free"
],
"title": "Logo",
"description": "The style's own: the logo on a small plate 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"
]
},
"logoSize": {
"type": "string",
"enum": [
"auto",
"small",
"large"
],
"title": "Logo size",
"description": "Standard is the style's own size. Small draws the logo a fifth smaller, with its plate. Large draws it a quarter larger wherever the style has room for it, and at the standard size where it has none.",
"enumNames": [
"Standard",
"Small",
"Large"
]
}
},
"additionalProperties": false,
"title": "Look",
"description": "How the clip looks and moves. The same six switches in every format (theme, pace, corners, alignment, logo, logo size). Leave any out for the package's default: the brand's colours, the standard pace, square corners, text at the start."
}
},
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the campaign, the month, the topic, the line about it, where it runs, the points, the offers, the labels, the call to action and the mandatory text."
},
"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_582d4bae23ad?variant=Campaign%20of%20the%20month&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": {
"campaign": "Campaign of the month",
"month": "2026-11-01T00:00:00+00:00",
"monthText": "",
"topic": "Ready for the cold season",
"intro": "All through November our pharmacists take time for your questions about colds, flu and keeping well.",
"where": "In all 412 Lindenhof pharmacies",
"points": [
{
"text": "Wash your hands often, for twenty seconds"
},
{
"text": "Air your rooms a few minutes every hour"
},
{
"text": "Sleep seven to eight hours a night"
},
{
"text": "Ask us about this season's flu jab"
}
],
"offers": [
{
"name": "Cold and flu advice",
"price": "Free",
"detail": "Ten minutes with a pharmacist, no appointment needed"
},
{
"name": "Zinc lozenges, 20 pieces",
"price": "€6.95",
"detail": "While stocks last, until 30 November",
"oldPrice": "€8.49"
},
{
"name": "Flu jab for adults",
"price": "€14.90",
"detail": "Book a time in your pharmacy or in the app"
}
],
"labels": {
"offers": "In your pharmacy this month",
"points": "What helps now"
},
"cta": {
"label": "Find your pharmacy",
"detail": "lindenhof-apotheken.example"
},
"mandatory": "Zinc lozenges contain zinc gluconate. Always read the label. Ask your pharmacist for advice.",
"look": {
"logo": "auto",
"pace": "standard",
"align": "start",
"theme": "brand",
"corners": "square",
"logoSize": "auto"
}
},
"metaData": {
"title": "Campaign of the month: ready for the cold season",
"captionTiny": "Ready for the cold season: this November our pharmacists take time for your questions about colds, flu and keeping well. In all 412 Lindenhof pharmacies.",
"captionShort": "Our campaign of the month: ready for the cold season. All through November, the pharmacists in all 412 Lindenhof pharmacies take time for your questions about colds, flu and keeping well. What helps now: wash your hands often, air your rooms, sleep well, and ask us about this season's flu jab. Free cold and flu advice, no appointment needed.",
"captionMedium": "Our campaign of the month: ready for the cold season. All through November, the pharmacists in all 412 Lindenhof pharmacies take time for your questions about colds, flu and keeping well. What helps now: wash your hands often, for twenty seconds; air your rooms a few minutes every hour; sleep seven to eight hours a night; and ask us about this season's flu jab. In your pharmacy this month: free cold and flu advice, ten minutes with a pharmacist and no appointment needed; zinc lozenges, 20 pieces, for €6.95 instead of €8.49 while stocks last, until 30 November; and the flu jab for adults for €14.90, booked in your pharmacy or in the app. Find your pharmacy at lindenhof-apotheken.example. Zinc lozenges contain zinc gluconate. Always read the label. Ask your pharmacist for advice.",
"captionLong": "Our campaign of the month: ready for the cold season. As the days get shorter, colds and flu come round again, and the questions with them: is it a cold or the flu, what can I take alongside my other medicines, and who should have the flu jab this year? All through November, the pharmacists in all 412 Lindenhof pharmacies take time for exactly those questions, with no appointment needed. What helps now is simple and worth repeating: wash your hands often, for twenty seconds, especially after travelling and before eating; air your rooms for a few minutes every hour, even when it is cold outside; sleep seven to eight hours a night; and ask us about this season's flu jab, which many of our pharmacies give on the spot. In your pharmacy this month: free cold and flu advice, ten minutes with a pharmacist; zinc lozenges, 20 pieces, for €6.95 instead of €8.49, while stocks last and until 30 November; and the flu jab for adults for €14.90, booked in your pharmacy or in the app. If you look after somebody older, or a small child, bring your questions about them too. Find your nearest member pharmacy, its opening hours and the dates for the flu jab at lindenhof-apotheken.example. Zinc lozenges contain zinc gluconate. Always read the label. Ask your pharmacist for advice.",
"hashtags": [
"pharmacy",
"coldseason",
"flujab",
"health",
"campaignofthemonth"
]
}
}
}

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.