Tech and industry (Manufacturing and industry), Safety days 1.0.0
| Template | Tech and industry (Manufacturing and industry), tpl_1c972308e957 |
|---|---|
| Variant | Safety days |
| Version | 1.0.0, the newest: what a channel following this variant draws |
| Shapes | 9x16, 4x5, 1x1, 16x9, 2x3 |
| Length | 12 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.
| Field | Type | Required | Limit | What it is |
|---|---|---|---|---|
clipData | group | yes | Clip 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.section | text | up to 24 characters | Section: What the post is, on the type plate at the end of the header, such as Safety or Health and safety. | |
clipData.kicker | text | up to 36 characters | Site: The plant, the site or the team the board belongs to, set small above the headline. | |
clipData.headline | text | yes | up to 56 characters | Headline: What the board counts, as a headline, such as Days without a lost-time incident. |
clipData.subline | text | up to 110 characters | Line under it: One sentence, such as a thank you to the teams. | |
clipData.days | integer | yes | from 0, to 99999 | Days: The days without a lost-time incident, a whole number. The board counts up to exactly this number. |
clipData.unit | text | up to 16 characters | Unit: The word under the board's digits, such as days. | |
clipData.period | text | yes | up to 48 characters | Period: 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.record | group | Record: The plant's record, shown with a bar of the days so far against it. Left out, no record is shown. | ||
clipData.record.label | text | up to 28 characters | Caption: Such as Plant record or Best run. | |
clipData.record.value | number | yes | Record: The record itself, a number, shown exactly as sent. | |
clipData.record.unit | text | up to 12 characters | Unit: The unit after the record, such as days. | |
clipData.record.period | text | yes | up to 40 characters | Period: When the record was set, such as March 2019 to November 2020. Required with a record. |
clipData.figuresTitle | text | up to 32 characters | Caption over the figures: A caption over the further figures, such as Safety this year. Left out, none is drawn. | |
clipData.figures | list | at least 0, up to 3 | More 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[] | group | Figure | ||
clipData.figures[].label | text | yes | up to 32 characters | What it is: Such as Near misses reported or Safety training. |
clipData.figures[].value | number | yes | 4 decimals | Value: The figure itself, shown exactly as sent with the decimals it was sent with, in the channel's language. |
clipData.figures[].unit | text | up to 12 characters | Unit: The unit after the value, such as hours or %. A percent sign stays on the figure. | |
clipData.figures[].period | text | yes | up to 36 characters | Period: The period the figure covers, such as 2026 to date or Rolling 12 months. |
clipData.drawing | group | Title 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.number | text | up to 16 characters | Number: The board's or the report's number. | |
clipData.drawing.area | text | up to 20 characters | Area: The plant, the halls or the line it covers. | |
clipData.drawing.date | text | up to 16 characters | Date: The date it was updated, written as it should be shown, such as 2026-10-15. | |
clipData.drawingLabels | group | Title 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.number | text | up to 16 characters | Over the number: Such as Board no. | |
clipData.drawingLabels.area | text | up to 12 characters | Over the area: Such as Area. | |
clipData.drawingLabels.date | text | up to 12 characters | Over the date: Such as As of. | |
clipData.cta | group | Call 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.label | text | yes | up to 28 characters | Button: What the button says. |
clipData.cta.detail | text | up to 48 characters | Line under it: An address, a handle, an app, a phone number. | |
clipData.footnote | text | up to 300 characters | Footnote: 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.look | group | Look: 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.theme | enum | brand, light, dark, bold | Theme: 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.pace | enum | calm, standard, punchy | Pace: How things arrive: calm fades, a standard rhythm, or punchy slams and hard cuts. | |
clipData.look.corners | enum | square, soft, round | Corners: The shape of cards, pictures and buttons. | |
clipData.look.align | enum | start, centre | Text alignment: Where the text lines up. | |
clipData.look.logo | enum | auto, free | Logo: 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.logoSize | enum | auto, small, large | Logo 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. | |
metaData | group | Meta 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.title | text | up to 100 characters | Title: 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.captionTiny | text | up to 200 characters | Tiny description (Pinterest, Threads, X): Up to 200 characters. The brand's description, link and hashtags follow it within the platform's limit. | |
metaData.captionShort | text | up to 500 characters | Short description (Telegram, Threema, WeChat, WhatsApp): Up to 500 characters. The brand's description, link and hashtags follow it within the platform's limit. | |
metaData.captionMedium | text | up to 1500 characters | Medium 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.captionLong | text | up to 4000 characters | Long description (Facebook Feed, YouTube): Up to 4000 characters. The brand's description, link and hashtags follow it within the platform's limit. | |
metaData.hashtags | list | up to 15 | Hashtags: Written without the #. Up to 15, which every platform takes. | |
metaData.hashtags[] | text | up to 60 characters | Hashtag |
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.