Skip to main content

Tech and industry (Manufacturing and industry), Quality rate 1.0.0

TemplateTech and industry (Manufacturing and industry), tpl_1c972308e957
VariantQuality rate
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 quality figure on a measuring dial: the first-pass yield or the figure sent on a gauge with its goal marked, the needle sweeping to exactly the number sent and stamped where the goal is met, the period it covers, up to three more quality figures, each with its period, and a line about what drove it. Eight 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 period, the figure on the dial with its goal and scale, the further figures with their caption, the line about what drove it, 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 Quality.
clipData.kickertextup to 36 charactersSite: The plant, the line or the station the figures are for, set small above the headline.
clipData.headlinetextyesup to 56 charactersHeadline: What the post says, as a headline, such as First-pass yield in September.
clipData.periodtextyesup to 40 charactersPeriod: The period the figure covers, written as it should be shown, such as September 2026. A quality figure always names its period, so it is required.
clipData.figuregroupyesThe figure on the dial: The quality figure the dial shows, such as the first-pass yield: what it is, the number, its unit, the goal marked on the dial, and whether higher or lower is better.
clipData.figure.labeltextyesup to 28 charactersWhat it is: Set under the figure in the dial, such as First-pass yield.
clipData.figure.valuenumberyes4 decimalsValue: The figure itself, shown exactly as sent with the decimals it was sent with, in the channel's language.
clipData.figure.unittextup to 8 charactersUnit: The unit after the figure, such as % or ppm. A percent sign stays on the figure.
clipData.figure.goalnumberGoal: The goal, in the same unit, marked on the dial. Left out, no goal is marked.
clipData.figure.goalLabeltextup to 16 charactersCaption of the goal: The word before the goal under the dial, such as Goal or Target.
clipData.figure.betterenumhigher, lowerBetter is: Whether a higher or a lower figure is better: a yield is better higher, a defect rate lower. It decides whether the goal is met, which the stamp shows.
clipData.scalegroupScale of the dial: Where the dial starts and ends, in the figure's unit, written at its two ends, such as 95 to 100 for a yield. Left out, a percentage's dial runs from 0 to 100 and any other from 0 to the larger of the figure and the goal, with no figures at its ends.
clipData.scale.fromnumberyesFrom: Where the dial starts.
clipData.scale.tonumberyesTo: Where it ends, larger than where it starts.
clipData.figuresTitletextup to 32 charactersCaption over the figures: A caption over the further figures, such as Quality this month. Left out, none is drawn.
clipData.figureslistat least 0, up to 3More quality figures: Up to three more quality figures, each with what it is, the number, its unit and the period it covers (required, as for every quality figure). Shown on the first frame, then selected one after another.
clipData.figures[]groupFigure
clipData.figures[].labeltextyesup to 32 charactersWhat it is: Such as Scrap rate or Defects at customers.
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 % or ppm. A percent sign stays on the figure.
clipData.figures[].periodtextyesup to 36 charactersPeriod: The period the figure covers, such as September 2026 or Last 12 months.
clipData.driverLabeltextup to 24 charactersCaption of the line about it: A caption over the line about what drove the figure, such as What drove it.
clipData.drivertextup to 140 charactersWhat drove it: One or two sentences on what made the difference, such as a new measuring step.
clipData.drawinggroupTitle block: The title block at the foot of the stage, on every frame, as on a drawing: 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 report's number.
clipData.drawing.areatextup to 20 charactersArea: The plant, the line or the station it covers.
clipData.drawing.datetextup to 16 charactersDate: The date of issue, written as it should be shown, such as 2026-10-05.
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 Report no.
clipData.drawingLabels.areatextup to 12 charactersOver the area: Such as Area.
clipData.drawingLabels.datetextup to 12 charactersOver the date: Such as Issued.
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 the figures are measured, such as your legal entity and how the yield is counted. 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 Quality."
},
"kicker": {
"type": "string",
"maxLength": 36,
"title": "Site",
"description": "The plant, the line or the station the figures are for, set small above the headline."
},
"headline": {
"type": "string",
"maxLength": 56,
"title": "Headline",
"description": "What the post says, as a headline, such as First-pass yield in September."
},
"period": {
"type": "string",
"maxLength": 40,
"title": "Period",
"description": "The period the figure covers, written as it should be shown, such as September 2026. A quality figure always names its period, so it is required."
},
"figure": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 28,
"title": "What it is",
"description": "Set under the figure in the dial, such as First-pass yield."
},
"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": 8,
"title": "Unit",
"description": "The unit after the figure, such as % or ppm. A percent sign stays on the figure."
},
"goal": {
"type": "number",
"title": "Goal",
"description": "The goal, in the same unit, marked on the dial. Left out, no goal is marked."
},
"goalLabel": {
"type": "string",
"maxLength": 16,
"title": "Caption of the goal",
"description": "The word before the goal under the dial, such as Goal or Target."
},
"better": {
"type": "string",
"enum": [
"higher",
"lower"
],
"title": "Better is",
"description": "Whether a higher or a lower figure is better: a yield is better higher, a defect rate lower. It decides whether the goal is met, which the stamp shows.",
"enumNames": [
"Higher",
"Lower"
]
}
},
"required": [
"label",
"value"
],
"additionalProperties": false,
"title": "The figure on the dial",
"description": "The quality figure the dial shows, such as the first-pass yield: what it is, the number, its unit, the goal marked on the dial, and whether higher or lower is better."
},
"scale": {
"type": "object",
"properties": {
"from": {
"type": "number",
"title": "From",
"description": "Where the dial starts."
},
"to": {
"type": "number",
"title": "To",
"description": "Where it ends, larger than where it starts."
}
},
"required": [
"from",
"to"
],
"additionalProperties": false,
"title": "Scale of the dial",
"description": "Where the dial starts and ends, in the figure's unit, written at its two ends, such as 95 to 100 for a yield. Left out, a percentage's dial runs from 0 to 100 and any other from 0 to the larger of the figure and the goal, with no figures at its ends."
},
"figuresTitle": {
"type": "string",
"maxLength": 32,
"title": "Caption over the figures",
"description": "A caption over the further figures, such as Quality this month. Left out, none is drawn."
},
"figures": {
"type": "array",
"items": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 32,
"title": "What it is",
"description": "Such as Scrap rate or Defects at customers."
},
"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 % or ppm. A percent sign stays on the figure."
},
"period": {
"type": "string",
"maxLength": 36,
"title": "Period",
"description": "The period the figure covers, such as September 2026 or Last 12 months."
}
},
"required": [
"label",
"value",
"period"
],
"additionalProperties": false,
"title": "Figure"
},
"minItems": 0,
"maxItems": 3,
"title": "More quality figures",
"description": "Up to three more quality figures, each with what it is, the number, its unit and the period it covers (required, as for every quality figure). Shown on the first frame, then selected one after another."
},
"driverLabel": {
"type": "string",
"maxLength": 24,
"title": "Caption of the line about it",
"description": "A caption over the line about what drove the figure, such as What drove it."
},
"driver": {
"type": "string",
"maxLength": 140,
"title": "What drove it",
"description": "One or two sentences on what made the difference, such as a new measuring step."
},
"drawing": {
"type": "object",
"properties": {
"number": {
"type": "string",
"maxLength": 16,
"title": "Number",
"description": "The report's number."
},
"area": {
"type": "string",
"maxLength": 20,
"title": "Area",
"description": "The plant, the line or the station it covers."
},
"date": {
"type": "string",
"maxLength": 16,
"title": "Date",
"description": "The date of issue, written as it should be shown, such as 2026-10-05."
}
},
"additionalProperties": false,
"title": "Title block",
"description": "The title block at the foot of the stage, on every frame, as on a drawing: 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 Report 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 Issued."
}
},
"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 the figures are measured, such as your legal entity and how the yield is counted. 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",
"period",
"figure"
],
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the section, the site, the headline and the period, the figure on the dial with its goal and scale, the further figures with their caption, the line about what drove it, 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 Quality."
},
"kicker": {
"type": "string",
"maxLength": 36,
"title": "Site",
"description": "The plant, the line or the station the figures are for, set small above the headline."
},
"headline": {
"type": "string",
"maxLength": 56,
"title": "Headline",
"description": "What the post says, as a headline, such as First-pass yield in September."
},
"period": {
"type": "string",
"maxLength": 40,
"title": "Period",
"description": "The period the figure covers, written as it should be shown, such as September 2026. A quality figure always names its period, so it is required."
},
"figure": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 28,
"title": "What it is",
"description": "Set under the figure in the dial, such as First-pass yield."
},
"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": 8,
"title": "Unit",
"description": "The unit after the figure, such as % or ppm. A percent sign stays on the figure."
},
"goal": {
"type": "number",
"title": "Goal",
"description": "The goal, in the same unit, marked on the dial. Left out, no goal is marked."
},
"goalLabel": {
"type": "string",
"maxLength": 16,
"title": "Caption of the goal",
"description": "The word before the goal under the dial, such as Goal or Target."
},
"better": {
"type": "string",
"enum": [
"higher",
"lower"
],
"title": "Better is",
"description": "Whether a higher or a lower figure is better: a yield is better higher, a defect rate lower. It decides whether the goal is met, which the stamp shows.",
"enumNames": [
"Higher",
"Lower"
]
}
},
"additionalProperties": false,
"title": "The figure on the dial",
"description": "The quality figure the dial shows, such as the first-pass yield: what it is, the number, its unit, the goal marked on the dial, and whether higher or lower is better."
},
"scale": {
"type": "object",
"properties": {
"from": {
"type": "number",
"title": "From",
"description": "Where the dial starts."
},
"to": {
"type": "number",
"title": "To",
"description": "Where it ends, larger than where it starts."
}
},
"additionalProperties": false,
"title": "Scale of the dial",
"description": "Where the dial starts and ends, in the figure's unit, written at its two ends, such as 95 to 100 for a yield. Left out, a percentage's dial runs from 0 to 100 and any other from 0 to the larger of the figure and the goal, with no figures at its ends."
},
"figuresTitle": {
"type": "string",
"maxLength": 32,
"title": "Caption over the figures",
"description": "A caption over the further figures, such as Quality this month. Left out, none is drawn."
},
"figures": {
"type": "array",
"items": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 32,
"title": "What it is",
"description": "Such as Scrap rate or Defects at customers."
},
"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 % or ppm. A percent sign stays on the figure."
},
"period": {
"type": "string",
"maxLength": 36,
"title": "Period",
"description": "The period the figure covers, such as September 2026 or Last 12 months."
}
},
"required": [
"label",
"value",
"period"
],
"additionalProperties": false,
"title": "Figure"
},
"minItems": 0,
"maxItems": 3,
"title": "More quality figures",
"description": "Up to three more quality figures, each with what it is, the number, its unit and the period it covers (required, as for every quality figure). Shown on the first frame, then selected one after another."
},
"driverLabel": {
"type": "string",
"maxLength": 24,
"title": "Caption of the line about it",
"description": "A caption over the line about what drove the figure, such as What drove it."
},
"driver": {
"type": "string",
"maxLength": 140,
"title": "What drove it",
"description": "One or two sentences on what made the difference, such as a new measuring step."
},
"drawing": {
"type": "object",
"properties": {
"number": {
"type": "string",
"maxLength": 16,
"title": "Number",
"description": "The report's number."
},
"area": {
"type": "string",
"maxLength": 20,
"title": "Area",
"description": "The plant, the line or the station it covers."
},
"date": {
"type": "string",
"maxLength": 16,
"title": "Date",
"description": "The date of issue, written as it should be shown, such as 2026-10-05."
}
},
"additionalProperties": false,
"title": "Title block",
"description": "The title block at the foot of the stage, on every frame, as on a drawing: 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 Report 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 Issued."
}
},
"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 the figures are measured, such as your legal entity and how the yield is counted. 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 period, the figure on the dial with its goal and scale, the further figures with their caption, the line about what drove it, 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=Quality%20rate&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": "Quality",
"kicker": "Plant Ulm-Donautal, final inspection",
"headline": "First-pass yield in September",
"period": "September 2026",
"figure": {
"goal": 98.5,
"unit": "%",
"label": "First-pass yield",
"value": 99.2,
"better": "higher",
"goalLabel": "Goal"
},
"scale": {
"to": 100,
"from": 95
},
"figuresTitle": "Quality at a glance",
"figures": [
{
"unit": "%",
"label": "Scrap rate",
"value": 0.6,
"period": "September 2026"
},
{
"unit": "ppm",
"label": "Defects at customers",
"value": 12,
"period": "Last 12 months"
},
{
"label": "Customer complaints",
"value": 1,
"period": "Q3 2026"
}
],
"driverLabel": "What drove it",
"driver": "In-line gauging on all six grinding cells caught drift before a part ever left the station.",
"drawing": {
"area": "Final inspection",
"date": "2026-10-05",
"number": "QA-2026-09"
},
"drawingLabels": {
"area": "Area",
"date": "Issued",
"number": "Report no."
},
"cta": {
"label": "Ask for our quality report",
"detail": "vossberg.example/quality"
},
"footnote": "Vossberg Precision GmbH, Ulm. First-pass yield: parts passing final inspection the first time, without rework, out of all parts inspected.",
"look": {
"logo": "auto",
"pace": "standard",
"align": "start",
"theme": "brand",
"corners": "square",
"logoSize": "auto"
}
},
"metaData": {
"title": "First-pass yield in September: 99.2% against a goal of 98.5%",
"captionTiny": "September at Plant Ulm: 99.2% first-pass yield against a goal of 98.5%, scrap at 0.6% and 12 ppm at our customers.",
"captionShort": "First-pass yield at Plant Ulm-Donautal in September: 99.2%, against a goal of 98.5%. Scrap came down to 0.6% and our customers counted 12 defective parts per million over the last twelve months. What made the difference: in-line gauging on all six grinding cells, which catches drift before a part ever leaves the station.",
"captionMedium": "First-pass yield at Plant Ulm-Donautal in September: 99.2% of all parts passed final inspection the first time, without rework, against our goal of 98.5%. Scrap came down to 0.6% for the month, our customers counted 12 defective parts per million over the last twelve months, and we had one customer complaint in the third quarter. What made the difference: in-line gauging on all six grinding cells, which measures every part at the machine and catches drift before a part ever leaves the station. Ask us for the full quality report.",
"captionLong": "First-pass yield at Plant Ulm-Donautal in September: 99.2% of all parts passed final inspection the first time, without rework, against our goal of 98.5%. Scrap came down to 0.6% for the month, our customers counted 12 defective parts per million over the last twelve months, and we had one customer complaint in the third quarter, closed within eight working days. What made the difference: in-line gauging on all six grinding cells, which measures every part at the machine and corrects the wheel as soon as the figures start to drift, so a part that would have failed final inspection is never made. Quality you can plan on means fewer incoming inspections at your end and no surprises on your line. Ask us for the full quality report, with every figure and how we measure it. Vossberg Precision GmbH, Ulm.",
"hashtags": [
"quality",
"manufacturing",
"zerodefects",
"precisionengineering",
"iso9001"
]
}
}
}

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.