Skip to main content

Finance (Insurance), Customer story 1.0.0

TemplateFinance (Insurance), tpl_466386ca3ac5
VariantCustomer story
Version1.0.0, the newest: what a channel following this variant draws
Shapes9x16, 4x5, 1x1, 16x9, 2x3
Length20 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 claim told by the customer: their portrait, the headline and two to four moments along a soft path, complete on the first frame, each told in turn, then how it ended with a tick and up to two figures counting up, the customer's own words, the button and your agent. The disclosure stays on screen throughout. Sixteen seconds with two moments, two more per moment. metaData is never drawn.

FieldTypeRequiredLimitWhat it is
clipDatagroupyesClip data: Everything drawn in the clip: the section, the headline, the customer, the moments of the story, the outcome and its figures, the quote, the call to action and the disclosure.
clipData.sectiontextup to 24 charactersSection: What the post is about, on a soft label at the end of the header, such as Home insurance or Travel cover.
clipData.headlinetextyesup to 64 charactersHeadline: The title of the story.
clipData.customergroupyesCustomer: Who tells the story: their name, where they live and a picture of them, on the cover beside the headline and there to the end.
clipData.customer.nametextyesup to 32 charactersName: The customer's name, or how they would like to be called, such as Sarah M.
clipData.customer.placetextup to 32 charactersPlace: Where they live, under the name.
clipData.customer.pictureimagemedia:// file from the media library, alt text up to 120 charactersPicture: A picture of the customer from the media library, shown in a circle. Without one the first letters of their name are shown.
clipData.storylistyesat least 2, up to 4The story: Two to four moments of the claim as the customer lived it, in order, each on a soft card along a path: when it was and what happened. All are there on the first frame, then each is told in turn. Where the frame is short of height they turn pages.
clipData.story[]groupMoment
clipData.story[].labeltextyesup to 32 charactersWhen: When it happened, or what it was, such as Monday, 7 am.
clipData.story[].texttextyesup to 120 charactersWhat happened: What happened, in a sentence or two, in the customer's words or yours.
clipData.outcometextup to 100 charactersOutcome: How it ended, in a line after the story, beside a tick, such as Paid in full in six days.
clipData.statslistup to 2Figures: Up to two figures from the claim under the outcome, each counting up to exactly the value sent, such as 24 hours until the assessor visited.
clipData.stats[]groupFigure
clipData.stats[].valuenumberyesfrom 0, to 999999, 2 decimalsFigure: The figure itself, such as 24. Shown exactly as sent, with the decimals it was sent with, in the channel's language.
clipData.stats[].unittextup to 8 charactersUnit: Beside the figure, such as hours, days or %.
clipData.stats[].labeltextup to 32 charactersLabel: What the figure is, under it.
clipData.quotetextup to 180 charactersQuote: The customer's own words, large and warm after the outcome.
clipData.ctagroupCall to action: The button at the end and the line under it, such as a web address 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 phone number, an app, an office.
clipData.disclosuretextup to 300 charactersDisclosure: What must be shown with the post, such as who the insurer or agent is, the licence and where it applies, and that cover is subject to the policy's terms, conditions and exclusions. On screen from the first frame to the last, set smaller rather than cut.
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, standard pace, round 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": {
"section": {
"type": "string",
"maxLength": 24,
"title": "Section",
"description": "What the post is about, on a soft label at the end of the header, such as Home insurance or Travel cover."
},
"headline": {
"type": "string",
"maxLength": 64,
"title": "Headline",
"description": "The title of the story."
},
"customer": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 32,
"title": "Name",
"description": "The customer's name, or how they would like to be called, such as Sarah M."
},
"place": {
"type": "string",
"maxLength": 32,
"title": "Place",
"description": "Where they live, under the name."
},
"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 from the media library, shown in a circle. Without one the first letters of their name are shown."
}
},
"required": [
"name"
],
"additionalProperties": false,
"title": "Customer",
"description": "Who tells the story: their name, where they live and a picture of them, on the cover beside the headline and there to the end."
},
"story": {
"type": "array",
"items": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 32,
"title": "When",
"description": "When it happened, or what it was, such as Monday, 7 am."
},
"text": {
"type": "string",
"maxLength": 120,
"title": "What happened",
"description": "What happened, in a sentence or two, in the customer's words or yours."
}
},
"required": [
"label",
"text"
],
"additionalProperties": false,
"title": "Moment"
},
"minItems": 2,
"maxItems": 4,
"title": "The story",
"description": "Two to four moments of the claim as the customer lived it, in order, each on a soft card along a path: when it was and what happened. All are there on the first frame, then each is told in turn. Where the frame is short of height they turn pages."
},
"outcome": {
"type": "string",
"maxLength": 100,
"title": "Outcome",
"description": "How it ended, in a line after the story, beside a tick, such as Paid in full in six days."
},
"stats": {
"type": "array",
"items": {
"type": "object",
"properties": {
"value": {
"type": "number",
"minimum": 0,
"maximum": 999999,
"title": "Figure",
"description": "The figure itself, such as 24. Shown exactly as sent, with the decimals it was sent with, in the channel's language."
},
"unit": {
"type": "string",
"maxLength": 8,
"title": "Unit",
"description": "Beside the figure, such as hours, days or %."
},
"label": {
"type": "string",
"maxLength": 32,
"title": "Label",
"description": "What the figure is, under it."
}
},
"required": [
"value"
],
"additionalProperties": false,
"title": "Figure"
},
"maxItems": 2,
"title": "Figures",
"description": "Up to two figures from the claim under the outcome, each counting up to exactly the value sent, such as 24 hours until the assessor visited."
},
"quote": {
"type": "string",
"maxLength": 180,
"title": "Quote",
"description": "The customer's own words, large and warm after the outcome."
},
"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 phone number, an app, an office."
}
},
"required": [
"label"
],
"additionalProperties": false,
"title": "Call to action",
"description": "The button at the end and the line under it, such as a web address or a phone number."
},
"disclosure": {
"type": "string",
"maxLength": 300,
"title": "Disclosure",
"description": "What must be shown with the post, such as who the insurer or agent is, the licence and where it applies, and that cover is subject to the policy's terms, conditions and exclusions. On screen from the first frame to the last, set smaller rather than cut."
},
"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, standard pace, round corners, text at the start."
}
},
"required": [
"headline",
"customer",
"story"
],
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the section, the headline, the customer, the moments of the story, the outcome and its figures, the quote, the call to action and the disclosure."
},
"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": {
"section": {
"type": "string",
"maxLength": 24,
"title": "Section",
"description": "What the post is about, on a soft label at the end of the header, such as Home insurance or Travel cover."
},
"headline": {
"type": "string",
"maxLength": 64,
"title": "Headline",
"description": "The title of the story."
},
"customer": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 32,
"title": "Name",
"description": "The customer's name, or how they would like to be called, such as Sarah M."
},
"place": {
"type": "string",
"maxLength": 32,
"title": "Place",
"description": "Where they live, under the name."
},
"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 from the media library, shown in a circle. Without one the first letters of their name are shown."
}
},
"additionalProperties": false,
"title": "Customer",
"description": "Who tells the story: their name, where they live and a picture of them, on the cover beside the headline and there to the end."
},
"story": {
"type": "array",
"items": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 32,
"title": "When",
"description": "When it happened, or what it was, such as Monday, 7 am."
},
"text": {
"type": "string",
"maxLength": 120,
"title": "What happened",
"description": "What happened, in a sentence or two, in the customer's words or yours."
}
},
"required": [
"label",
"text"
],
"additionalProperties": false,
"title": "Moment"
},
"minItems": 2,
"maxItems": 4,
"title": "The story",
"description": "Two to four moments of the claim as the customer lived it, in order, each on a soft card along a path: when it was and what happened. All are there on the first frame, then each is told in turn. Where the frame is short of height they turn pages."
},
"outcome": {
"type": "string",
"maxLength": 100,
"title": "Outcome",
"description": "How it ended, in a line after the story, beside a tick, such as Paid in full in six days."
},
"stats": {
"type": "array",
"items": {
"type": "object",
"properties": {
"value": {
"type": "number",
"minimum": 0,
"maximum": 999999,
"title": "Figure",
"description": "The figure itself, such as 24. Shown exactly as sent, with the decimals it was sent with, in the channel's language."
},
"unit": {
"type": "string",
"maxLength": 8,
"title": "Unit",
"description": "Beside the figure, such as hours, days or %."
},
"label": {
"type": "string",
"maxLength": 32,
"title": "Label",
"description": "What the figure is, under it."
}
},
"required": [
"value"
],
"additionalProperties": false,
"title": "Figure"
},
"maxItems": 2,
"title": "Figures",
"description": "Up to two figures from the claim under the outcome, each counting up to exactly the value sent, such as 24 hours until the assessor visited."
},
"quote": {
"type": "string",
"maxLength": 180,
"title": "Quote",
"description": "The customer's own words, large and warm after the outcome."
},
"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 phone number, an app, an office."
}
},
"additionalProperties": false,
"title": "Call to action",
"description": "The button at the end and the line under it, such as a web address or a phone number."
},
"disclosure": {
"type": "string",
"maxLength": 300,
"title": "Disclosure",
"description": "What must be shown with the post, such as who the insurer or agent is, the licence and where it applies, and that cover is subject to the policy's terms, conditions and exclusions. On screen from the first frame to the last, set smaller rather than cut."
},
"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, standard pace, round corners, text at the start."
}
},
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the section, the headline, the customer, the moments of the story, the outcome and its figures, the quote, the call to action and the disclosure."
},
"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_466386ca3ac5?variant=Customer%20story&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": {
"section": "Customer stories",
"headline": "The kitchen after the flood",
"customer": {
"name": "Sarah Mitchell",
"place": "Leeds, West Yorkshire",
"picture": {
"alt": "A person's silhouette on a round green ground",
"url": "media://example-badge.png"
}
},
"story": [
{
"text": "A pipe burst under the sink overnight. By morning the whole kitchen floor was under water.",
"label": "Monday, 7 am"
},
{
"text": "One call to the claims line. They sent an emergency plumber and told us what to photograph.",
"label": "Monday, 8 am"
},
{
"text": "The assessor came the next day, agreed the repairs with us and booked the drying team.",
"label": "Tuesday"
},
{
"text": "The money was in our account, and our builder could start on the new kitchen straight away.",
"label": "Day six"
}
],
"outcome": "Paid in full in six days",
"stats": [
{
"unit": "hours",
"label": "Until the assessor visited",
"value": 24
},
{
"unit": "weeks",
"label": "Until the new kitchen was in",
"value": 3
}
],
"quote": "I expected forms and arguments. Instead somebody called me back within the hour, and three weeks later we were cooking in a new kitchen.",
"cta": {
"label": "Read more stories",
"detail": "harbourmutual.example/stories"
},
"disclosure": "Harbour Mutual Insurance Ltd, licence 4471. A real claim, shared with the customer's permission. Cover is subject to the terms, conditions and exclusions of your policy.",
"look": {
"logo": "auto",
"pace": "standard",
"align": "start",
"theme": "brand",
"corners": "round",
"logoSize": "auto"
}
},
"metaData": {
"title": "The kitchen after the flood: Sarah's claim, in her words",
"captionTiny": "A burst pipe flooded Sarah's kitchen overnight. Six days later her claim was paid in full. Here is how it went, in her words.",
"captionShort": "A pipe burst under Sarah's sink overnight, and by morning the whole kitchen floor was under water. One call to our claims line brought an emergency plumber. Our assessor came the next day and agreed the repairs, and six days later the claim was paid in full. \"I expected forms and arguments. Instead somebody called me back within the hour.\" Shared with Sarah's permission. Cover is subject to the terms, conditions and exclusions of your policy.",
"captionMedium": "Sarah woke up on a Monday to a kitchen under water: a pipe had burst under the sink overnight. At 8 am she made one call to our claims line. We sent an emergency plumber to stop the leak and told her exactly what to photograph before she started clearing up. The next day our assessor visited, agreed the repairs with her and booked a drying team. On day six the money was in her account, and her builder could start on the new kitchen straight away. Three weeks later the family was cooking in it. \"I expected forms and arguments. Instead somebody called me back within the hour, and three weeks later we were cooking in a new kitchen.\" Thank you, Sarah, for letting us share your story. If something goes wrong at home, we are here 24 hours a day. Harbour Mutual Insurance Ltd, licence 4471. Cover is subject to the terms, conditions and exclusions of your policy.",
"captionLong": "Some claims are about paperwork. Sarah's was about a family kitchen. On a Monday morning she came downstairs to find the whole floor under water: a pipe had burst under the sink overnight, the units were soaked and the flooring was lifting. At 8 am she made one call to our claims line. The adviser who answered sent an emergency plumber to stop the leak, told her to switch off the electrics in the kitchen, and explained exactly what to photograph before she started clearing up: every damaged unit, the floor, the appliances and the pipe itself. The next day our assessor visited. Together they went through the damage, agreed which repairs were needed and booked a drying team, so the new kitchen would not be fitted onto a damp floor. Sarah sent her photos and her builder's quote through the app, and on day six the money was in her account. Her builder started straight away, and three weeks after the flood the family was cooking in a new kitchen. In her own words: \"I expected forms and arguments. Instead somebody called me back within the hour, and three weeks later we were cooking in a new kitchen.\" A few things that helped Sarah's claim go smoothly: she made the leak safe first, she took photos before tidying up, and she kept the receipt for the emergency plumber. If something goes wrong at home, our claims team is here 24 hours a day, every day of the year. Thank you, Sarah, for letting us share your story. Harbour Mutual Insurance Ltd, licence 4471. Cover is subject to the terms, conditions and exclusions of your policy.",
"hashtags": [
"customerstory",
"homeinsurance",
"insuranceclaim",
"escapeofwater",
"peaceofmind"
]
}
}
}

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.