Skip to main content

Tech and industry (Manufacturing and industry), Safety days 1.0.0

TemplateTech and industry (Manufacturing and industry), tpl_1c972308e957
VariantSafety days
Version1.0.0, the newest: what a channel following this variant draws
Shapes9x16, 4x5, 1x1, 16x9, 2x3
Length12 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 plant's safety board: the days without a lost-time incident in ruled cells, counting up to exactly the number sent, the period ruled under it like a dimension, the plant's record against it, and up to three more safety figures, each with its period. The title block and the footnote stay throughout. Nine seconds, and a little over a second more per figure. metaData is never drawn.

FieldTypeRequiredLimitWhat it is
clipDatagroupyesClip data: Everything drawn in the clip: the section, the site, the headline and the line under it, the days with their unit and period, the record, the further figures with their caption, the title block, the call to action and the footnote.
clipData.sectiontextup to 24 charactersSection: What the post is, on the type plate at the end of the header, such as Safety or Health and safety.
clipData.kickertextup to 36 charactersSite: The plant, the site or the team the board belongs to, set small above the headline.
clipData.headlinetextyesup to 56 charactersHeadline: What the board counts, as a headline, such as Days without a lost-time incident.
clipData.sublinetextup to 110 charactersLine under it: One sentence, such as a thank you to the teams.
clipData.daysintegeryesfrom 0, to 99999Days: The days without a lost-time incident, a whole number. The board counts up to exactly this number.
clipData.unittextup to 16 charactersUnit: The word under the board's digits, such as days.
clipData.periodtextyesup to 48 charactersPeriod: The period the count covers, written as it should be shown, such as 29 August 2025 to 15 October 2026 or Since 29 August 2025. A safety figure always names its period, so it is required.
clipData.recordgroupRecord: The plant's record, shown with a bar of the days so far against it. Left out, no record is shown.
clipData.record.labeltextup to 28 charactersCaption: Such as Plant record or Best run.
clipData.record.valuenumberyesRecord: The record itself, a number, shown exactly as sent.
clipData.record.unittextup to 12 charactersUnit: The unit after the record, such as days.
clipData.record.periodtextyesup to 40 charactersPeriod: When the record was set, such as March 2019 to November 2020. Required with a record.
clipData.figuresTitletextup to 32 charactersCaption over the figures: A caption over the further figures, such as Safety this year. Left out, none is drawn.
clipData.figureslistat least 0, up to 3More safety figures: Up to three more safety figures, each with what it is, the number, its unit and the period it covers (required, as for every safety figure). Shown on the first frame, then selected one after another.
clipData.figures[]groupFigure
clipData.figures[].labeltextyesup to 32 charactersWhat it is: Such as Near misses reported or Safety training.
clipData.figures[].valuenumberyes4 decimalsValue: The figure itself, shown exactly as sent with the decimals it was sent with, in the channel's language.
clipData.figures[].unittextup to 12 charactersUnit: The unit after the value, such as hours or %. A percent sign stays on the figure.
clipData.figures[].periodtextyesup to 36 charactersPeriod: The period the figure covers, such as 2026 to date or Rolling 12 months.
clipData.drawinggroupTitle block: The title block at the foot of the stage, on every frame, as on a drawing: the board's or the report's number, the area it covers and the date, exactly as written. A field left out is not drawn; with none, there is no title block.
clipData.drawing.numbertextup to 16 charactersNumber: The board's or the report's number.
clipData.drawing.areatextup to 20 charactersArea: The plant, the halls or the line it covers.
clipData.drawing.datetextup to 16 charactersDate: The date it was updated, written as it should be shown, such as 2026-10-15.
clipData.drawingLabelsgroupTitle block captions: The small caption over each field of the title block, in your language. A caption left out is not drawn; the field still is.
clipData.drawingLabels.numbertextup to 16 charactersOver the number: Such as Board no.
clipData.drawingLabels.areatextup to 12 charactersOver the area: Such as Area.
clipData.drawingLabels.datetextup to 12 charactersOver the date: Such as As of.
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, an app, a phone number.
clipData.footnotetextup to 300 charactersFootnote: Who stands behind the post and how its figures are counted, such as your legal entity and what a lost-time incident is. Shown above your footer line from the first frame to the last; a long one is set smaller, never 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, 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": {
"section": {
"type": "string",
"maxLength": 24,
"title": "Section",
"description": "What the post is, on the type plate at the end of the header, such as Safety or Health and safety."
},
"kicker": {
"type": "string",
"maxLength": 36,
"title": "Site",
"description": "The plant, the site or the team the board belongs to, set small above the headline."
},
"headline": {
"type": "string",
"maxLength": 56,
"title": "Headline",
"description": "What the board counts, as a headline, such as Days without a lost-time incident."
},
"subline": {
"type": "string",
"maxLength": 110,
"title": "Line under it",
"description": "One sentence, such as a thank you to the teams."
},
"days": {
"type": "integer",
"minimum": 0,
"maximum": 99999,
"title": "Days",
"description": "The days without a lost-time incident, a whole number. The board counts up to exactly this number."
},
"unit": {
"type": "string",
"maxLength": 16,
"title": "Unit",
"description": "The word under the board's digits, such as days."
},
"period": {
"type": "string",
"maxLength": 48,
"title": "Period",
"description": "The period the count covers, written as it should be shown, such as 29 August 2025 to 15 October 2026 or Since 29 August 2025. A safety figure always names its period, so it is required."
},
"record": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 28,
"title": "Caption",
"description": "Such as Plant record or Best run."
},
"value": {
"type": "number",
"title": "Record",
"description": "The record itself, a number, shown exactly as sent."
},
"unit": {
"type": "string",
"maxLength": 12,
"title": "Unit",
"description": "The unit after the record, such as days."
},
"period": {
"type": "string",
"maxLength": 40,
"title": "Period",
"description": "When the record was set, such as March 2019 to November 2020. Required with a record."
}
},
"required": [
"value",
"period"
],
"additionalProperties": false,
"title": "Record",
"description": "The plant's record, shown with a bar of the days so far against it. Left out, no record is shown."
},
"figuresTitle": {
"type": "string",
"maxLength": 32,
"title": "Caption over the figures",
"description": "A caption over the further figures, such as Safety this year. Left out, none is drawn."
},
"figures": {
"type": "array",
"items": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 32,
"title": "What it is",
"description": "Such as Near misses reported or Safety training."
},
"value": {
"type": "number",
"title": "Value",
"description": "The figure itself, shown exactly as sent with the decimals it was sent with, in the channel's language."
},
"unit": {
"type": "string",
"maxLength": 12,
"title": "Unit",
"description": "The unit after the value, such as hours or %. A percent sign stays on the figure."
},
"period": {
"type": "string",
"maxLength": 36,
"title": "Period",
"description": "The period the figure covers, such as 2026 to date or Rolling 12 months."
}
},
"required": [
"label",
"value",
"period"
],
"additionalProperties": false,
"title": "Figure"
},
"minItems": 0,
"maxItems": 3,
"title": "More safety figures",
"description": "Up to three more safety figures, each with what it is, the number, its unit and the period it covers (required, as for every safety figure). Shown on the first frame, then selected one after another."
},
"drawing": {
"type": "object",
"properties": {
"number": {
"type": "string",
"maxLength": 16,
"title": "Number",
"description": "The board's or the report's number."
},
"area": {
"type": "string",
"maxLength": 20,
"title": "Area",
"description": "The plant, the halls or the line it covers."
},
"date": {
"type": "string",
"maxLength": 16,
"title": "Date",
"description": "The date it was updated, written as it should be shown, such as 2026-10-15."
}
},
"additionalProperties": false,
"title": "Title block",
"description": "The title block at the foot of the stage, on every frame, as on a drawing: the board's or the report's number, the area it covers and the date, exactly as written. A field left out is not drawn; with none, there is no title block."
},
"drawingLabels": {
"type": "object",
"properties": {
"number": {
"type": "string",
"maxLength": 16,
"title": "Over the number",
"description": "Such as Board no."
},
"area": {
"type": "string",
"maxLength": 12,
"title": "Over the area",
"description": "Such as Area."
},
"date": {
"type": "string",
"maxLength": 12,
"title": "Over the date",
"description": "Such as As of."
}
},
"additionalProperties": false,
"title": "Title block captions",
"description": "The small caption over each field of the title block, in your language. A caption left out is not drawn; the field still is."
},
"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, an 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, a handle or a phone number."
},
"footnote": {
"type": "string",
"maxLength": 300,
"title": "Footnote",
"description": "Who stands behind the post and how its figures are counted, such as your legal entity and what a lost-time incident is. Shown above your footer line from the first frame to the last; a long one is set smaller, never 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, square corners, text at the start."
}
},
"required": [
"headline",
"days",
"period"
],
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the section, the site, the headline and the line under it, the days with their unit and period, the record, the further figures with their caption, the title block, the call to action and the footnote."
},
"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, on the type plate at the end of the header, such as Safety or Health and safety."
},
"kicker": {
"type": "string",
"maxLength": 36,
"title": "Site",
"description": "The plant, the site or the team the board belongs to, set small above the headline."
},
"headline": {
"type": "string",
"maxLength": 56,
"title": "Headline",
"description": "What the board counts, as a headline, such as Days without a lost-time incident."
},
"subline": {
"type": "string",
"maxLength": 110,
"title": "Line under it",
"description": "One sentence, such as a thank you to the teams."
},
"days": {
"type": "integer",
"minimum": 0,
"maximum": 99999,
"title": "Days",
"description": "The days without a lost-time incident, a whole number. The board counts up to exactly this number."
},
"unit": {
"type": "string",
"maxLength": 16,
"title": "Unit",
"description": "The word under the board's digits, such as days."
},
"period": {
"type": "string",
"maxLength": 48,
"title": "Period",
"description": "The period the count covers, written as it should be shown, such as 29 August 2025 to 15 October 2026 or Since 29 August 2025. A safety figure always names its period, so it is required."
},
"record": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 28,
"title": "Caption",
"description": "Such as Plant record or Best run."
},
"value": {
"type": "number",
"title": "Record",
"description": "The record itself, a number, shown exactly as sent."
},
"unit": {
"type": "string",
"maxLength": 12,
"title": "Unit",
"description": "The unit after the record, such as days."
},
"period": {
"type": "string",
"maxLength": 40,
"title": "Period",
"description": "When the record was set, such as March 2019 to November 2020. Required with a record."
}
},
"additionalProperties": false,
"title": "Record",
"description": "The plant's record, shown with a bar of the days so far against it. Left out, no record is shown."
},
"figuresTitle": {
"type": "string",
"maxLength": 32,
"title": "Caption over the figures",
"description": "A caption over the further figures, such as Safety this year. Left out, none is drawn."
},
"figures": {
"type": "array",
"items": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 32,
"title": "What it is",
"description": "Such as Near misses reported or Safety training."
},
"value": {
"type": "number",
"title": "Value",
"description": "The figure itself, shown exactly as sent with the decimals it was sent with, in the channel's language."
},
"unit": {
"type": "string",
"maxLength": 12,
"title": "Unit",
"description": "The unit after the value, such as hours or %. A percent sign stays on the figure."
},
"period": {
"type": "string",
"maxLength": 36,
"title": "Period",
"description": "The period the figure covers, such as 2026 to date or Rolling 12 months."
}
},
"required": [
"label",
"value",
"period"
],
"additionalProperties": false,
"title": "Figure"
},
"minItems": 0,
"maxItems": 3,
"title": "More safety figures",
"description": "Up to three more safety figures, each with what it is, the number, its unit and the period it covers (required, as for every safety figure). Shown on the first frame, then selected one after another."
},
"drawing": {
"type": "object",
"properties": {
"number": {
"type": "string",
"maxLength": 16,
"title": "Number",
"description": "The board's or the report's number."
},
"area": {
"type": "string",
"maxLength": 20,
"title": "Area",
"description": "The plant, the halls or the line it covers."
},
"date": {
"type": "string",
"maxLength": 16,
"title": "Date",
"description": "The date it was updated, written as it should be shown, such as 2026-10-15."
}
},
"additionalProperties": false,
"title": "Title block",
"description": "The title block at the foot of the stage, on every frame, as on a drawing: the board's or the report's number, the area it covers and the date, exactly as written. A field left out is not drawn; with none, there is no title block."
},
"drawingLabels": {
"type": "object",
"properties": {
"number": {
"type": "string",
"maxLength": 16,
"title": "Over the number",
"description": "Such as Board no."
},
"area": {
"type": "string",
"maxLength": 12,
"title": "Over the area",
"description": "Such as Area."
},
"date": {
"type": "string",
"maxLength": 12,
"title": "Over the date",
"description": "Such as As of."
}
},
"additionalProperties": false,
"title": "Title block captions",
"description": "The small caption over each field of the title block, in your language. A caption left out is not drawn; the field still is."
},
"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, an 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, a handle or a phone number."
},
"footnote": {
"type": "string",
"maxLength": 300,
"title": "Footnote",
"description": "Who stands behind the post and how its figures are counted, such as your legal entity and what a lost-time incident is. Shown above your footer line from the first frame to the last; a long one is set smaller, never 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, square corners, text at the start."
}
},
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the section, the site, the headline and the line under it, the days with their unit and period, the record, the further figures with their caption, the title block, the call to action and the footnote."
},
"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_1c972308e957?variant=Safety%20days&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": "Safety",
"kicker": "Plant Ulm-Donautal, all shifts",
"headline": "Days without a lost-time incident",
"subline": "Thank you to every shift for looking out for each other, every day.",
"days": 412,
"unit": "days",
"period": "29 August 2025 to 15 October 2026",
"record": {
"unit": "days",
"label": "Plant record",
"value": 618,
"period": "March 2019 to November 2020"
},
"figuresTitle": "Safety this year",
"figures": [
{
"label": "Near misses reported",
"value": 286,
"period": "1 January to 15 October 2026"
},
{
"unit": "TRIR",
"label": "Recordable incident rate",
"value": 0.42,
"period": "Rolling 12 months"
},
{
"unit": "hours",
"label": "Safety training",
"value": 6240,
"period": "2026 to date"
}
],
"drawing": {
"area": "Halls 1 to 5",
"date": "2026-10-15",
"number": "SB-ULM-02"
},
"drawingLabels": {
"area": "Area",
"date": "As of",
"number": "Board no."
},
"cta": {
"label": "See how we work safely",
"detail": "vossberg.example/safety"
},
"footnote": "Vossberg Precision GmbH, Ulm. A lost-time incident is a work injury that kept a colleague off work for at least one full shift.",
"look": {
"logo": "auto",
"pace": "standard",
"align": "start",
"theme": "brand",
"corners": "square",
"logoSize": "auto"
}
},
"metaData": {
"title": "412 days without a lost-time incident at Plant Ulm",
"captionTiny": "412 days without a lost-time incident at our plant in Ulm. Thank you to every shift for looking out for each other. #safetyfirst",
"captionShort": "412 days without a lost-time incident at Plant Ulm-Donautal, from 29 August 2025 to today. Our record is 618 days, and we are on our way. This year our teams reported 286 near misses and spent 6,240 hours in safety training, because every report and every hour is a hand that goes home whole. Thank you to every shift.",
"captionMedium": "412 days without a lost-time incident at Plant Ulm-Donautal, counted from 29 August 2025 to 15 October 2026. Our plant record is 618 days, set between March 2019 and November 2020, and we are well on our way to beating it. Behind the number are the people on every shift: 286 near misses reported so far this year, a recordable incident rate of 0.42 over the last twelve months and 6,240 hours of safety training in 2026. Every near miss reported is a lesson learned before anybody gets hurt. Thank you for looking out for each other, every day.",
"captionLong": "412 days without a lost-time incident at Plant Ulm-Donautal, counted from 29 August 2025 to 15 October 2026. Our plant record is 618 days, set between March 2019 and November 2020, and we are well on our way to beating it. Behind the number are the people on every shift in halls 1 to 5: 286 near misses reported between January and October, a total recordable incident rate of 0.42 over the last twelve months and 6,240 hours of safety training in 2026 so far. We count a lost-time incident as any work injury that keeps a colleague off work for at least one full shift, and we publish the board every month whatever it says. Every near miss reported is a lesson learned before anybody gets hurt, and every hour of training is a hand that goes home whole. Thank you to every shift for looking out for each other, every day. Vossberg Precision GmbH, Ulm.",
"hashtags": [
"safetyfirst",
"manufacturing",
"workplacesafety",
"zeroharm",
"plantlife"
]
}
}
}

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.