Tech and industry (Hardware and electronics), Firmware update 1.0.0
| Template | Tech and industry (Hardware and electronics), tpl_3864905dddda |
|---|---|
| Variant | Firmware update |
| Version | 1.0.0, the newest: what a channel following this variant draws |
| Shapes | 9x16, 4x5, 1x1, 16x9, 2x3 |
| Length | 19 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 firmware update as a keynote shows one: the version huge, the line under it, the product alone on the brand's ground with its name and the release date, complete on the first frame. Then what changed, each with its chip (New, Improved, Fixed), in pages. Then how to update and the button. The footnote stays throughout. About 1.4 seconds more per change. metaData is never drawn.
| Field | Type | Required | Limit | What it is |
|---|---|---|---|---|
clipData | group | yes | Clip data: Everything drawn in the clip: the eyebrow, the version and the line under it, the product's name and picture, the release date, the changes with their chips, how to update, the call to action and the footnote. | |
clipData.eyebrow | text | up to 24 characters | Eyebrow: A word or two above the version in the brand colour, such as Software update. | |
clipData.version | text | yes | up to 32 characters | Version: The update's name and number as you write it, such as Firmware 2.4 or Version 2.4.0. Set huge on the cover and over every page of changes. |
clipData.tagline | text | up to 90 characters | Line under the version: What the update brings, in a sentence. | |
clipData.product | text | yes | up to 40 characters | Product: The product the update is for, set under the picture on the cover and over the button at the end. |
clipData.picture | image | yes | media:// file from the media library, alt text up to 120 characters | Product picture: The product, from the media library. A cut-out (a PNG with a transparent background) stands whole on the ground with a soft shadow under it; a photograph fills a rounded frame. It stays on screen from the first frame to the last. |
clipData.dateLabel | text | up to 24 characters | Before the date: A word set before the release date, such as Released or Available from. | |
clipData.date | datetime | yes | Release date: The day the update was released or rolls out. Written in the channel's language, such as 14 October 2026. A release always carries its date. | |
clipData.changes | list | yes | at least 1, up to 8 | Changes: What the update changes, one to eight, in the order you want them read, each with its chip. Shown in pages of up to four, each change arriving in turn. Each adds about 1.4 seconds. |
clipData.changes[] | group | Change | ||
clipData.changes[].kind | enum | new, improved, fixed | Kind: How the chip is drawn: filled in the brand colour for something new, outlined in the brand colour for an improvement, outlined quietly for a fix. | |
clipData.changes[].tag | text | yes | up to 16 characters | Chip: The word on the chip, such as New, Improved or Fixed. |
clipData.changes[].title | text | yes | up to 64 characters | Change: What changed, in a few words. |
clipData.changes[].detail | text | up to 120 characters | In a sentence: What it means for the owner, in a sentence under the change. | |
clipData.changes[].condition | text | up to 160 characters | How it was measured: Where the change names a measured figure (a battery life, a range, a speed), how it was measured, shown small under it. Never cut: a long one takes more lines. | |
clipData.howTo | text | up to 200 characters | How to update: How an owner gets the update, shown on the end card above the button, such as which app to open and how long it takes. | |
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 400 characters | Footnote: Shown small above your footer line on every frame: what the update needs, how any figure was tested, that results vary, whose trademarks are named. 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, calm, softly rounded, centred. | ||
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": {
"eyebrow": {
"type": "string",
"maxLength": 24,
"title": "Eyebrow",
"description": "A word or two above the version in the brand colour, such as Software update."
},
"version": {
"type": "string",
"maxLength": 32,
"title": "Version",
"description": "The update's name and number as you write it, such as Firmware 2.4 or Version 2.4.0. Set huge on the cover and over every page of changes."
},
"tagline": {
"type": "string",
"maxLength": 90,
"title": "Line under the version",
"description": "What the update brings, in a sentence."
},
"product": {
"type": "string",
"maxLength": 40,
"title": "Product",
"description": "The product the update is for, set under the picture on the cover and over the button at the end."
},
"picture": {
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"pattern": "^media:\\/\\/[^\\s/\\\\\\u0000-\\u001f][^/\\\\\\u0000-\\u001f]{0,254}$",
"title": "Picture",
"description": "A file from the workspace's media library, written media:// and the file's id or name. A web address is refused."
},
"alt": {
"type": "string",
"maxLength": 120,
"title": "Alt text",
"description": "What the picture shows, for anyone who cannot see it."
}
},
"required": [
"url"
],
"additionalProperties": false,
"title": "Product picture",
"description": "The product, from the media library. A cut-out (a PNG with a transparent background) stands whole on the ground with a soft shadow under it; a photograph fills a rounded frame. It stays on screen from the first frame to the last."
},
"dateLabel": {
"type": "string",
"maxLength": 24,
"title": "Before the date",
"description": "A word set before the release date, such as Released or Available from."
},
"date": {
"type": "string",
"format": "date-time",
"title": "Release date",
"description": "The day the update was released or rolls out. Written in the channel's language, such as 14 October 2026. A release always carries its date."
},
"changes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"new",
"improved",
"fixed"
],
"title": "Kind",
"description": "How the chip is drawn: filled in the brand colour for something new, outlined in the brand colour for an improvement, outlined quietly for a fix.",
"enumNames": [
"New",
"Improved",
"Fixed"
]
},
"tag": {
"type": "string",
"maxLength": 16,
"title": "Chip",
"description": "The word on the chip, such as New, Improved or Fixed."
},
"title": {
"type": "string",
"maxLength": 64,
"title": "Change",
"description": "What changed, in a few words."
},
"detail": {
"type": "string",
"maxLength": 120,
"title": "In a sentence",
"description": "What it means for the owner, in a sentence under the change."
},
"condition": {
"type": "string",
"maxLength": 160,
"title": "How it was measured",
"description": "Where the change names a measured figure (a battery life, a range, a speed), how it was measured, shown small under it. Never cut: a long one takes more lines."
}
},
"required": [
"tag",
"title"
],
"additionalProperties": false,
"title": "Change"
},
"minItems": 1,
"maxItems": 8,
"title": "Changes",
"description": "What the update changes, one to eight, in the order you want them read, each with its chip. Shown in pages of up to four, each change arriving in turn. Each adds about 1.4 seconds."
},
"howTo": {
"type": "string",
"maxLength": 200,
"title": "How to update",
"description": "How an owner gets the update, shown on the end card above the button, such as which app to open and how long it takes."
},
"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": 400,
"title": "Footnote",
"description": "Shown small above your footer line on every frame: what the update needs, how any figure was tested, that results vary, whose trademarks are named. 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, calm, softly rounded, centred."
}
},
"required": [
"version",
"product",
"picture",
"date",
"changes"
],
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the eyebrow, the version and the line under it, the product's name and picture, the release date, the changes with their chips, how to update, 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": {
"eyebrow": {
"type": "string",
"maxLength": 24,
"title": "Eyebrow",
"description": "A word or two above the version in the brand colour, such as Software update."
},
"version": {
"type": "string",
"maxLength": 32,
"title": "Version",
"description": "The update's name and number as you write it, such as Firmware 2.4 or Version 2.4.0. Set huge on the cover and over every page of changes."
},
"tagline": {
"type": "string",
"maxLength": 90,
"title": "Line under the version",
"description": "What the update brings, in a sentence."
},
"product": {
"type": "string",
"maxLength": 40,
"title": "Product",
"description": "The product the update is for, set under the picture on the cover and over the button at the end."
},
"picture": {
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"pattern": "^media:\\/\\/[^\\s/\\\\\\u0000-\\u001f][^/\\\\\\u0000-\\u001f]{0,254}$",
"title": "Picture",
"description": "A file from the workspace's media library, written media:// and the file's id or name. A web address is refused."
},
"alt": {
"type": "string",
"maxLength": 120,
"title": "Alt text",
"description": "What the picture shows, for anyone who cannot see it."
}
},
"required": [
"url"
],
"additionalProperties": false,
"title": "Product picture",
"description": "The product, from the media library. A cut-out (a PNG with a transparent background) stands whole on the ground with a soft shadow under it; a photograph fills a rounded frame. It stays on screen from the first frame to the last."
},
"dateLabel": {
"type": "string",
"maxLength": 24,
"title": "Before the date",
"description": "A word set before the release date, such as Released or Available from."
},
"date": {
"type": "string",
"format": "date-time",
"title": "Release date",
"description": "The day the update was released or rolls out. Written in the channel's language, such as 14 October 2026. A release always carries its date."
},
"changes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"new",
"improved",
"fixed"
],
"title": "Kind",
"description": "How the chip is drawn: filled in the brand colour for something new, outlined in the brand colour for an improvement, outlined quietly for a fix.",
"enumNames": [
"New",
"Improved",
"Fixed"
]
},
"tag": {
"type": "string",
"maxLength": 16,
"title": "Chip",
"description": "The word on the chip, such as New, Improved or Fixed."
},
"title": {
"type": "string",
"maxLength": 64,
"title": "Change",
"description": "What changed, in a few words."
},
"detail": {
"type": "string",
"maxLength": 120,
"title": "In a sentence",
"description": "What it means for the owner, in a sentence under the change."
},
"condition": {
"type": "string",
"maxLength": 160,
"title": "How it was measured",
"description": "Where the change names a measured figure (a battery life, a range, a speed), how it was measured, shown small under it. Never cut: a long one takes more lines."
}
},
"required": [
"tag",
"title"
],
"additionalProperties": false,
"title": "Change"
},
"minItems": 1,
"maxItems": 8,
"title": "Changes",
"description": "What the update changes, one to eight, in the order you want them read, each with its chip. Shown in pages of up to four, each change arriving in turn. Each adds about 1.4 seconds."
},
"howTo": {
"type": "string",
"maxLength": 200,
"title": "How to update",
"description": "How an owner gets the update, shown on the end card above the button, such as which app to open and how long it takes."
},
"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": 400,
"title": "Footnote",
"description": "Shown small above your footer line on every frame: what the update needs, how any figure was tested, that results vary, whose trademarks are named. 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, calm, softly rounded, centred."
}
},
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the eyebrow, the version and the line under it, the product's name and picture, the release date, the changes with their chips, how to update, 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_3864905dddda?variant=Firmware%20update&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": {
"eyebrow": "Software update",
"version": "Firmware 2.4",
"tagline": "Two new features, longer listening and clearer calls.",
"product": "Arc 2",
"picture": {
"alt": "Soft waves of blue, violet and orange",
"url": "media://example-image.jpg"
},
"dateLabel": "Released",
"date": "2026-10-14T09:00:00+02:00",
"changes": [
{
"tag": "New",
"kind": "new",
"title": "Conversation awareness",
"detail": "Start talking and Arc 2 lowers your music and lets voices through."
},
{
"tag": "New",
"kind": "new",
"title": "Multipoint for three devices",
"detail": "Move between phone, laptop and tablet without pairing again."
},
{
"tag": "Improved",
"kind": "improved",
"title": "Up to 2 hours more listening",
"detail": "Smarter power use while noise cancelling is on.",
"condition": "Tested in October 2026 with production units at 50% volume, noise cancelling on. Results vary."
},
{
"tag": "Improved",
"kind": "improved",
"title": "Clearer calls in the wind",
"detail": "A new filter keeps your voice clear outdoors."
},
{
"tag": "Fixed",
"kind": "fixed",
"title": "Touch controls after sleep",
"detail": "Taps work straight away when the headphones wake."
},
{
"tag": "Fixed",
"kind": "fixed",
"title": "Volume jumps on some Android phones"
}
],
"howTo": "Keep Arc 2 charging near your phone, open the Halden app and tap Update. It takes about ten minutes.",
"cta": {
"label": "Update now",
"detail": "halden.example/update"
},
"footnote": "Firmware 2.4 is free for Arc 2 and needs the Halden app 5.2 or later. Battery tested by Halden in October 2026 with production units at 50% volume; results vary with use and settings. Halden and Arc are trademarks of Halden Audio GmbH.",
"look": {
"logo": "auto",
"pace": "calm",
"align": "centre",
"theme": "brand",
"corners": "soft",
"logoSize": "auto"
}
},
"metaData": {
"title": "Arc 2 firmware 2.4: conversation awareness and longer listening",
"captionTiny": "Firmware 2.4 for Arc 2 is out: conversation awareness, multipoint for three devices and up to 2 hours more listening.",
"captionShort": "Firmware 2.4 for Arc 2 is rolling out now. New: conversation awareness and multipoint for three devices. Improved: up to 2 hours more listening and clearer calls in the wind. Plus fixes for touch controls and volume. Update in the Halden app.",
"captionMedium": "Firmware 2.4 is here for Arc 2, free. Start talking and conversation awareness lowers your music and lets voices through; multipoint now keeps your phone, laptop and tablet connected at once. Smarter power use gives you up to 2 hours more listening with noise cancelling on, and a new filter keeps your voice clear on windy calls. We also fixed touch controls after sleep and volume jumps on some Android phones. Keep Arc 2 charging near your phone, open the Halden app and tap Update. Battery tested with production units; results vary.",
"captionLong": "Firmware 2.4 for Arc 2 is rolling out now, free for every owner. Two things are new. Conversation awareness notices when you start talking, lowers your music and lets voices through, then brings your music back when you are done. Multipoint now keeps three devices connected at once, so you can move between your phone, laptop and tablet without pairing again. Two things are better. Smarter power management gives you up to 2 hours more listening with noise cancelling on, and a new wind filter keeps your voice clear on calls outdoors. And two things are fixed: touch controls now respond straight away when the headphones wake, and volume no longer jumps on some Android phones. To update, keep Arc 2 charging near your phone, open the Halden app 5.2 or later and tap Update; it takes about ten minutes. Battery tested by Halden in October 2026 with production units at 50% volume; results vary with use and settings.",
"hashtags": [
"firmware",
"softwareupdate",
"headphones",
"audio",
"tech"
]
}
}
}
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.