Skip to main content

Tech, Case study 1.0.0

TemplateTech, tpl_46549cf45b15
VariantCase study
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 customer story: who the customer is, with their logo, the challenge they had, the solution, one to four results that count up to exactly the values sent, and a quote from one of their people. metaData is the post's title, descriptions and hashtags and is never drawn.

FieldTypeRequiredLimitWhat it is
clipDatagroupyesClip data: Everything drawn in the clip: the customer, the story in three parts, the results, the quote and the call to action.
clipData.kickertextup to 32 charactersKicker: A short line above the headline, such as Customer story.
clipData.headlinetextyesup to 72 charactersHeadline: The story in a line.
clipData.customergroupyesCustomer: Who the story is about.
clipData.customer.nametextyesup to 40 charactersName: The customer's name.
clipData.customer.detailtextup to 48 charactersDetail: What they do or how large they are.
clipData.customer.logoimagemedia:// file from the media library, alt text up to 120 charactersLogo: The customer's logo; it is shown on a light plate, so a logo for light backgrounds works best.
clipData.pictureimagemedia:// file from the media library, alt text up to 120 charactersPicture: A picture of the customer's world: their site, their team, the product in use. Any shape works.
clipData.challengetextup to 160 charactersChallenge: What was hard before.
clipData.solutiontextup to 160 charactersSolution: What changed, and how.
clipData.figureslistat least 1, up to 4Results: One to four results, each counting up to exactly the value sent; the clip gets a little over a second longer for each.
clipData.figures[]groupResult
clipData.figures[].valuenumberyes3 decimalsValue: The number, exactly as it should land, such as 9, 70 or 2.5.
clipData.figures[].unittextup to 12 charactersUnit: What follows the number, such as %, x, h or days.
clipData.figures[].prefixtextup to 4 charactersBefore the number: A sign or symbol in front of the number, such as +, $ or a currency.
clipData.figures[].labeltextyesup to 48 charactersLabel: What the number says.
clipData.quotegroupQuote: What one of the customer's people says about it.
clipData.quote.texttextyesup to 180 charactersQuote: Their words, without quotation marks: the clip draws its own.
clipData.quote.nametextup to 40 charactersName: Who said it.
clipData.quote.roletextup to 48 charactersRole: Their role, and where.
clipData.quote.pictureimagemedia:// file from the media library, alt text up to 120 charactersPicture: Their portrait; without one, their initials are shown.
clipData.labelsgroupWords for the parts: The heading over each part of the story, in the clip's language. Leave one out and that part shows its icon alone.
clipData.labels.challengetextup to 24 charactersChallenge: The heading over the challenge.
clipData.labels.solutiontextup to 24 charactersSolution: The heading over the solution.
clipData.labels.resultstextup to 24 charactersResults: The heading over the results.
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: A note that must go with the results, such as where they come from.
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.openingenumheadline, resultOpening: What the clip opens on: the headline, or the first result already counted, with the headline under it.
clipData.look.pictureStyleenumbackdrop, framedPicture: Backdrop: the picture fills the frame behind the story, veiled. Framed: it stands in a card beside the headline at the start and the end.
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 headline, such as Customer story."
},
"headline": {
"type": "string",
"maxLength": 72,
"title": "Headline",
"description": "The story in a line."
},
"customer": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 40,
"title": "Name",
"description": "The customer's name."
},
"detail": {
"type": "string",
"maxLength": 48,
"title": "Detail",
"description": "What they do or how large they are."
},
"logo": {
"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": "Logo",
"description": "The customer's logo; it is shown on a light plate, so a logo for light backgrounds works best."
}
},
"required": [
"name"
],
"additionalProperties": false,
"title": "Customer",
"description": "Who the story is about."
},
"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 the customer's world: their site, their team, the product in use. Any shape works."
},
"challenge": {
"type": "string",
"maxLength": 160,
"title": "Challenge",
"description": "What was hard before."
},
"solution": {
"type": "string",
"maxLength": 160,
"title": "Solution",
"description": "What changed, and how."
},
"figures": {
"type": "array",
"items": {
"type": "object",
"properties": {
"value": {
"type": "number",
"title": "Value",
"description": "The number, exactly as it should land, such as 9, 70 or 2.5."
},
"unit": {
"type": "string",
"maxLength": 12,
"title": "Unit",
"description": "What follows the number, such as %, x, h or days."
},
"prefix": {
"type": "string",
"maxLength": 4,
"title": "Before the number",
"description": "A sign or symbol in front of the number, such as +, $ or a currency."
},
"label": {
"type": "string",
"maxLength": 48,
"title": "Label",
"description": "What the number says."
}
},
"required": [
"value",
"label"
],
"additionalProperties": false,
"title": "Result"
},
"minItems": 1,
"maxItems": 4,
"title": "Results",
"description": "One to four results, each counting up to exactly the value sent; the clip gets a little over a second longer for each."
},
"quote": {
"type": "object",
"properties": {
"text": {
"type": "string",
"maxLength": 180,
"title": "Quote",
"description": "Their words, without quotation marks: the clip draws its own."
},
"name": {
"type": "string",
"maxLength": 40,
"title": "Name",
"description": "Who said it."
},
"role": {
"type": "string",
"maxLength": 48,
"title": "Role",
"description": "Their role, and where."
},
"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": "Their portrait; without one, their initials are shown."
}
},
"required": [
"text"
],
"additionalProperties": false,
"title": "Quote",
"description": "What one of the customer's people says about it."
},
"labels": {
"type": "object",
"properties": {
"challenge": {
"type": "string",
"maxLength": 24,
"title": "Challenge",
"description": "The heading over the challenge."
},
"solution": {
"type": "string",
"maxLength": 24,
"title": "Solution",
"description": "The heading over the solution."
},
"results": {
"type": "string",
"maxLength": 24,
"title": "Results",
"description": "The heading over the results."
}
},
"additionalProperties": false,
"title": "Words for the parts",
"description": "The heading over each part of the story, in the clip's language. Leave one out and that part shows its icon alone."
},
"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": "A note that must go with the results, such as where they come from."
},
"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"
]
},
"opening": {
"type": "string",
"enum": [
"headline",
"result"
],
"title": "Opening",
"description": "What the clip opens on: the headline, or the first result already counted, with the headline under it.",
"enumNames": [
"The headline",
"The first result"
]
},
"pictureStyle": {
"type": "string",
"enum": [
"backdrop",
"framed"
],
"title": "Picture",
"description": "Backdrop: the picture fills the frame behind the story, veiled. Framed: it stands in a card beside the headline at the start and the end.",
"enumNames": [
"Behind everything",
"In a frame"
]
},
"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",
"customer"
],
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the customer, the story in three parts, the results, the quote 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 headline, such as Customer story."
},
"headline": {
"type": "string",
"maxLength": 72,
"title": "Headline",
"description": "The story in a line."
},
"customer": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 40,
"title": "Name",
"description": "The customer's name."
},
"detail": {
"type": "string",
"maxLength": 48,
"title": "Detail",
"description": "What they do or how large they are."
},
"logo": {
"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": "Logo",
"description": "The customer's logo; it is shown on a light plate, so a logo for light backgrounds works best."
}
},
"additionalProperties": false,
"title": "Customer",
"description": "Who the story is about."
},
"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 the customer's world: their site, their team, the product in use. Any shape works."
},
"challenge": {
"type": "string",
"maxLength": 160,
"title": "Challenge",
"description": "What was hard before."
},
"solution": {
"type": "string",
"maxLength": 160,
"title": "Solution",
"description": "What changed, and how."
},
"figures": {
"type": "array",
"items": {
"type": "object",
"properties": {
"value": {
"type": "number",
"title": "Value",
"description": "The number, exactly as it should land, such as 9, 70 or 2.5."
},
"unit": {
"type": "string",
"maxLength": 12,
"title": "Unit",
"description": "What follows the number, such as %, x, h or days."
},
"prefix": {
"type": "string",
"maxLength": 4,
"title": "Before the number",
"description": "A sign or symbol in front of the number, such as +, $ or a currency."
},
"label": {
"type": "string",
"maxLength": 48,
"title": "Label",
"description": "What the number says."
}
},
"required": [
"value",
"label"
],
"additionalProperties": false,
"title": "Result"
},
"minItems": 1,
"maxItems": 4,
"title": "Results",
"description": "One to four results, each counting up to exactly the value sent; the clip gets a little over a second longer for each."
},
"quote": {
"type": "object",
"properties": {
"text": {
"type": "string",
"maxLength": 180,
"title": "Quote",
"description": "Their words, without quotation marks: the clip draws its own."
},
"name": {
"type": "string",
"maxLength": 40,
"title": "Name",
"description": "Who said it."
},
"role": {
"type": "string",
"maxLength": 48,
"title": "Role",
"description": "Their role, and where."
},
"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": "Their portrait; without one, their initials are shown."
}
},
"additionalProperties": false,
"title": "Quote",
"description": "What one of the customer's people says about it."
},
"labels": {
"type": "object",
"properties": {
"challenge": {
"type": "string",
"maxLength": 24,
"title": "Challenge",
"description": "The heading over the challenge."
},
"solution": {
"type": "string",
"maxLength": 24,
"title": "Solution",
"description": "The heading over the solution."
},
"results": {
"type": "string",
"maxLength": 24,
"title": "Results",
"description": "The heading over the results."
}
},
"additionalProperties": false,
"title": "Words for the parts",
"description": "The heading over each part of the story, in the clip's language. Leave one out and that part shows its icon alone."
},
"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": "A note that must go with the results, such as where they come from."
},
"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"
]
},
"opening": {
"type": "string",
"enum": [
"headline",
"result"
],
"title": "Opening",
"description": "What the clip opens on: the headline, or the first result already counted, with the headline under it.",
"enumNames": [
"The headline",
"The first result"
]
},
"pictureStyle": {
"type": "string",
"enum": [
"backdrop",
"framed"
],
"title": "Picture",
"description": "Backdrop: the picture fills the frame behind the story, veiled. Framed: it stands in a card beside the headline at the start and the end.",
"enumNames": [
"Behind everything",
"In a frame"
]
},
"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 customer, the story in three parts, the results, the quote 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_46549cf45b15?variant=Case%20study&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": "Customer story",
"headline": "How Halvorsen Freight ships updates to every depot nine times faster",
"customer": {
"logo": {
"alt": "The company's logo",
"url": "media://example-logo.png"
},
"name": "Halvorsen Freight",
"detail": "Logistics, 4,200 people in nine countries"
},
"picture": {
"alt": "Soft waves of blue, violet and orange",
"url": "media://example-image.jpg"
},
"challenge": "Every release took a weekend: forty services built by hand and tested on one shared server, while trucks waited at the depots.",
"solution": "Lumen Studio now builds and tests every change in the cloud and ships it to each depot the moment it passes.",
"figures": [
{
"unit": "x",
"label": "faster from a change to every depot",
"value": 9
},
{
"unit": "%",
"label": "fewer releases rolled back",
"value": 70
},
{
"unit": "h",
"label": "of weekend work saved every release",
"value": 14
}
],
"quote": {
"text": "We used to plan our weekends around releases. Now a fix reaches every depot before the next truck leaves the yard.",
"name": "Maren Solberg",
"role": "Head of platform, Halvorsen Freight",
"picture": {
"alt": "A person's silhouette on a round green ground",
"url": "media://example-badge.png"
}
},
"labels": {
"challenge": "The challenge",
"solution": "The solution",
"results": "The results"
},
"cta": {
"label": "Read the full story",
"detail": "lumenlabs.example/customers"
},
"disclaimer": "Results reported by Halvorsen Freight for the first half of 2026, against the same period of 2025.",
"look": {
"theme": "brand",
"pace": "standard",
"corners": "soft",
"align": "start",
"opening": "headline",
"pictureStyle": "backdrop",
"logo": "auto"
}
},
"metaData": {
"title": "How Halvorsen Freight ships nine times faster with Lumen Studio",
"captionTiny": "Halvorsen Freight now ships updates to every depot nine times faster, with 70 percent fewer rollbacks.",
"captionShort": "Every release used to cost Halvorsen Freight a weekend. With Lumen Studio, every change is built and tested in the cloud and reaches every depot nine times faster, with 70 percent fewer rollbacks and 14 hours of weekend work saved per release.",
"captionMedium": "Every release used to cost Halvorsen Freight a weekend: forty services built by hand and tested on one shared server, while trucks waited at the depots. Now Lumen Studio builds and tests every change in the cloud and ships it to each depot the moment it passes. The result: updates reach every depot nine times faster, 70 percent fewer releases are rolled back and the team saves 14 hours of weekend work every release. Read the full story on our website.",
"captionLong": "Halvorsen Freight moves goods for 4,200 people in nine countries, and every software release used to cost its platform team a weekend: forty services built by hand and tested on one shared server, while trucks waited at the depots. Today Lumen Studio builds and tests every change in the cloud and ships it to each depot the moment it passes. In the first half of 2026, against the same months of 2025, updates reached every depot nine times faster, 70 percent fewer releases were rolled back and the team saved 14 hours of weekend work on every release. \"We used to plan our weekends around releases,\" says Maren Solberg, head of platform. \"Now a fix reaches every depot before the next truck leaves the yard.\" Read the full story on our website.",
"hashtags": [
"customerstory",
"casestudy",
"lumenstudio",
"logistics",
"devops"
]
}
}
}

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.