Public bodies (City councils), Council meeting 1.0.0
| Template | Public bodies (City councils), tpl_edafad905b0f |
|---|---|
| Variant | Council meeting |
| Version | 1.0.0, the newest: what a channel following this variant draws |
| Shapes | 9x16, 4x5, 1x1, 16x9, 2x3 |
| Length | 23 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 council or committee meeting: the notice on a coloured banner, the headline, the meeting, its date, time and place, complete on the first frame; each fact is read in turn, then up to eight agenda items numbered in order, how to watch, attend and speak, the date and the button. Neutral: an agenda, never a position. 14 seconds, 1.7 more per item. metaData is never drawn.
| Field | Type | Required | Limit | What it is |
|---|---|---|---|---|
clipData | group | yes | Clip data: Everything drawn in the clip: the kind of notice and its status, the headline, the meeting, its date, time and place, the agenda, how to watch, attend and speak, the labels, the call to action, who issued it and the reference. | |
clipData.notice | text | yes | up to 24 characters | Kind of notice: What kind of notice this is, on the coloured banner under your logo on every frame, such as Council meeting or Committee meeting. |
clipData.status | text | up to 32 characters | Status: How it stands, beside the kind of notice on the banner, such as Open to the public, Agenda published or Date changed. | |
clipData.headline | text | yes | up to 80 characters | Headline: Which meeting and what it is for, in plain words, such as The Full Council meets to set the budget for 2027. Facts only: an agenda, never a position, and nothing for or against an item, a party or a candidate. |
clipData.meeting | text | yes | up to 60 characters | Meeting: The council or committee that meets, as it is called, such as Full Council or Planning Committee. |
clipData.starts | datetime | yes | Date and time: When the meeting starts. The date and the time are read as they are written here, and spelled out in the channel's language, the date with its weekday. | |
clipData.dateText | text | up to 48 characters | Date, as written: The date in your own words, shown instead of the one written from the date, such as Thursday 12 November. Left out, it is written from the date. | |
clipData.timeText | text | up to 48 characters | Time, as written: The time in your own words, shown instead of the one written from the date, such as 6.30 pm, doors open at 6 pm. Left out, it is written from the date. | |
clipData.place | text | yes | up to 100 characters | Place: Where the meeting is held, spelled out, such as Council Chamber, Westbrook Town Hall, Market Street, or Online only. |
clipData.agenda | list | at least 1, up to 8 | Agenda: Up to eight items in the agenda's own order, each numbered and read in turn, about one and two thirds of a second each; on a short frame they turn pages. Name each item as the agenda names it: facts only, never a position for or against it. | |
clipData.agenda[] | group | Item | ||
clipData.agenda[].title | text | yes | up to 80 characters | Item: The item as the agenda names it. |
clipData.agenda[].note | text | up to 72 characters | Note: Who reports or what the meeting is asked to do, such as Report of the Director of Finance, for decision. | |
clipData.watch | text | up to 100 characters | How to watch: Where the meeting can be watched, live or later, such as Live and recorded at westbrook.example/live. Left out, with the other two ways, there is no scene for taking part. | |
clipData.attend | text | up to 100 characters | How to attend: How to come in person, such as The public gallery is open to all, with a step-free entrance on Market Street. | |
clipData.speak | text | up to 120 characters | How to speak: How a resident can speak at the meeting or ask a question, with the deadline, such as Register by noon on Tuesday 10 November at westbrook.example/speak. | |
clipData.labels | group | Labels: The words beside the facts and over the scenes, in your language. A label left out is not drawn; the pictogram still says which is which. | ||
clipData.labels.meeting | text | up to 24 characters | Meeting: Beside the meeting. | |
clipData.labels.date | text | up to 24 characters | Date: Beside the date. | |
clipData.labels.time | text | up to 24 characters | Time: Beside the time. | |
clipData.labels.place | text | up to 24 characters | Place: Beside the place. | |
clipData.labels.agenda | text | up to 32 characters | Agenda: Over the agenda. | |
clipData.labels.takePart | text | up to 32 characters | Taking part: Over the ways to take part. | |
clipData.labels.watch | text | up to 24 characters | Watch: Beside how to watch. | |
clipData.labels.attend | text | up to 24 characters | Attend: Beside how to attend. | |
clipData.labels.speak | text | up to 24 characters | Speak: Beside how to speak. | |
clipData.cta | group | Call to action: The button at the end and the line under it, such as a web address 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: A web address, a phone number, an office. | |
clipData.issuedBy | text | yes | up to 120 characters | Issued by: The department or office that issues the notice, in your own words, such as Issued by Democratic Services. Shown with your reference above your footer line from the first frame to the last, set smaller rather than cut. |
clipData.reference | text | up to 40 characters | Reference: The meeting's or the agenda's reference, as you write it, such as Agenda FC/2026/11. | |
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, 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": {
"notice": {
"type": "string",
"maxLength": 24,
"title": "Kind of notice",
"description": "What kind of notice this is, on the coloured banner under your logo on every frame, such as Council meeting or Committee meeting."
},
"status": {
"type": "string",
"maxLength": 32,
"title": "Status",
"description": "How it stands, beside the kind of notice on the banner, such as Open to the public, Agenda published or Date changed."
},
"headline": {
"type": "string",
"maxLength": 80,
"title": "Headline",
"description": "Which meeting and what it is for, in plain words, such as The Full Council meets to set the budget for 2027. Facts only: an agenda, never a position, and nothing for or against an item, a party or a candidate."
},
"meeting": {
"type": "string",
"maxLength": 60,
"title": "Meeting",
"description": "The council or committee that meets, as it is called, such as Full Council or Planning Committee."
},
"starts": {
"type": "string",
"format": "date-time",
"title": "Date and time",
"description": "When the meeting starts. The date and the time are read as they are written here, and spelled out in the channel's language, the date with its weekday."
},
"dateText": {
"type": "string",
"maxLength": 48,
"title": "Date, as written",
"description": "The date in your own words, shown instead of the one written from the date, such as Thursday 12 November. Left out, it is written from the date."
},
"timeText": {
"type": "string",
"maxLength": 48,
"title": "Time, as written",
"description": "The time in your own words, shown instead of the one written from the date, such as 6.30 pm, doors open at 6 pm. Left out, it is written from the date."
},
"place": {
"type": "string",
"maxLength": 100,
"title": "Place",
"description": "Where the meeting is held, spelled out, such as Council Chamber, Westbrook Town Hall, Market Street, or Online only."
},
"agenda": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 80,
"title": "Item",
"description": "The item as the agenda names it."
},
"note": {
"type": "string",
"maxLength": 72,
"title": "Note",
"description": "Who reports or what the meeting is asked to do, such as Report of the Director of Finance, for decision."
}
},
"required": [
"title"
],
"additionalProperties": false,
"title": "Item"
},
"minItems": 1,
"maxItems": 8,
"title": "Agenda",
"description": "Up to eight items in the agenda's own order, each numbered and read in turn, about one and two thirds of a second each; on a short frame they turn pages. Name each item as the agenda names it: facts only, never a position for or against it."
},
"watch": {
"type": "string",
"maxLength": 100,
"title": "How to watch",
"description": "Where the meeting can be watched, live or later, such as Live and recorded at westbrook.example/live. Left out, with the other two ways, there is no scene for taking part."
},
"attend": {
"type": "string",
"maxLength": 100,
"title": "How to attend",
"description": "How to come in person, such as The public gallery is open to all, with a step-free entrance on Market Street."
},
"speak": {
"type": "string",
"maxLength": 120,
"title": "How to speak",
"description": "How a resident can speak at the meeting or ask a question, with the deadline, such as Register by noon on Tuesday 10 November at westbrook.example/speak."
},
"labels": {
"type": "object",
"properties": {
"meeting": {
"type": "string",
"maxLength": 24,
"title": "Meeting",
"description": "Beside the meeting."
},
"date": {
"type": "string",
"maxLength": 24,
"title": "Date",
"description": "Beside the date."
},
"time": {
"type": "string",
"maxLength": 24,
"title": "Time",
"description": "Beside the time."
},
"place": {
"type": "string",
"maxLength": 24,
"title": "Place",
"description": "Beside the place."
},
"agenda": {
"type": "string",
"maxLength": 32,
"title": "Agenda",
"description": "Over the agenda."
},
"takePart": {
"type": "string",
"maxLength": 32,
"title": "Taking part",
"description": "Over the ways to take part."
},
"watch": {
"type": "string",
"maxLength": 24,
"title": "Watch",
"description": "Beside how to watch."
},
"attend": {
"type": "string",
"maxLength": 24,
"title": "Attend",
"description": "Beside how to attend."
},
"speak": {
"type": "string",
"maxLength": 24,
"title": "Speak",
"description": "Beside how to speak."
}
},
"additionalProperties": false,
"title": "Labels",
"description": "The words beside the facts and over the scenes, in your language. A label left out is not drawn; the pictogram still says which is which."
},
"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": "A web address, a phone number, an office."
}
},
"required": [
"label"
],
"additionalProperties": false,
"title": "Call to action",
"description": "The button at the end and the line under it, such as a web address or a phone number."
},
"issuedBy": {
"type": "string",
"maxLength": 120,
"title": "Issued by",
"description": "The department or office that issues the notice, in your own words, such as Issued by Democratic Services. Shown with your reference above your footer line from the first frame to the last, set smaller rather than cut."
},
"reference": {
"type": "string",
"maxLength": 40,
"title": "Reference",
"description": "The meeting's or the agenda's reference, as you write it, such as Agenda FC/2026/11."
},
"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, text at the start."
}
},
"required": [
"notice",
"headline",
"meeting",
"starts",
"place",
"issuedBy"
],
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the kind of notice and its status, the headline, the meeting, its date, time and place, the agenda, how to watch, attend and speak, the labels, the call to action, who issued it and the reference."
},
"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": {
"notice": {
"type": "string",
"maxLength": 24,
"title": "Kind of notice",
"description": "What kind of notice this is, on the coloured banner under your logo on every frame, such as Council meeting or Committee meeting."
},
"status": {
"type": "string",
"maxLength": 32,
"title": "Status",
"description": "How it stands, beside the kind of notice on the banner, such as Open to the public, Agenda published or Date changed."
},
"headline": {
"type": "string",
"maxLength": 80,
"title": "Headline",
"description": "Which meeting and what it is for, in plain words, such as The Full Council meets to set the budget for 2027. Facts only: an agenda, never a position, and nothing for or against an item, a party or a candidate."
},
"meeting": {
"type": "string",
"maxLength": 60,
"title": "Meeting",
"description": "The council or committee that meets, as it is called, such as Full Council or Planning Committee."
},
"starts": {
"type": "string",
"format": "date-time",
"title": "Date and time",
"description": "When the meeting starts. The date and the time are read as they are written here, and spelled out in the channel's language, the date with its weekday."
},
"dateText": {
"type": "string",
"maxLength": 48,
"title": "Date, as written",
"description": "The date in your own words, shown instead of the one written from the date, such as Thursday 12 November. Left out, it is written from the date."
},
"timeText": {
"type": "string",
"maxLength": 48,
"title": "Time, as written",
"description": "The time in your own words, shown instead of the one written from the date, such as 6.30 pm, doors open at 6 pm. Left out, it is written from the date."
},
"place": {
"type": "string",
"maxLength": 100,
"title": "Place",
"description": "Where the meeting is held, spelled out, such as Council Chamber, Westbrook Town Hall, Market Street, or Online only."
},
"agenda": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 80,
"title": "Item",
"description": "The item as the agenda names it."
},
"note": {
"type": "string",
"maxLength": 72,
"title": "Note",
"description": "Who reports or what the meeting is asked to do, such as Report of the Director of Finance, for decision."
}
},
"required": [
"title"
],
"additionalProperties": false,
"title": "Item"
},
"minItems": 1,
"maxItems": 8,
"title": "Agenda",
"description": "Up to eight items in the agenda's own order, each numbered and read in turn, about one and two thirds of a second each; on a short frame they turn pages. Name each item as the agenda names it: facts only, never a position for or against it."
},
"watch": {
"type": "string",
"maxLength": 100,
"title": "How to watch",
"description": "Where the meeting can be watched, live or later, such as Live and recorded at westbrook.example/live. Left out, with the other two ways, there is no scene for taking part."
},
"attend": {
"type": "string",
"maxLength": 100,
"title": "How to attend",
"description": "How to come in person, such as The public gallery is open to all, with a step-free entrance on Market Street."
},
"speak": {
"type": "string",
"maxLength": 120,
"title": "How to speak",
"description": "How a resident can speak at the meeting or ask a question, with the deadline, such as Register by noon on Tuesday 10 November at westbrook.example/speak."
},
"labels": {
"type": "object",
"properties": {
"meeting": {
"type": "string",
"maxLength": 24,
"title": "Meeting",
"description": "Beside the meeting."
},
"date": {
"type": "string",
"maxLength": 24,
"title": "Date",
"description": "Beside the date."
},
"time": {
"type": "string",
"maxLength": 24,
"title": "Time",
"description": "Beside the time."
},
"place": {
"type": "string",
"maxLength": 24,
"title": "Place",
"description": "Beside the place."
},
"agenda": {
"type": "string",
"maxLength": 32,
"title": "Agenda",
"description": "Over the agenda."
},
"takePart": {
"type": "string",
"maxLength": 32,
"title": "Taking part",
"description": "Over the ways to take part."
},
"watch": {
"type": "string",
"maxLength": 24,
"title": "Watch",
"description": "Beside how to watch."
},
"attend": {
"type": "string",
"maxLength": 24,
"title": "Attend",
"description": "Beside how to attend."
},
"speak": {
"type": "string",
"maxLength": 24,
"title": "Speak",
"description": "Beside how to speak."
}
},
"additionalProperties": false,
"title": "Labels",
"description": "The words beside the facts and over the scenes, in your language. A label left out is not drawn; the pictogram still says which is which."
},
"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": "A web address, a phone number, an office."
}
},
"additionalProperties": false,
"title": "Call to action",
"description": "The button at the end and the line under it, such as a web address or a phone number."
},
"issuedBy": {
"type": "string",
"maxLength": 120,
"title": "Issued by",
"description": "The department or office that issues the notice, in your own words, such as Issued by Democratic Services. Shown with your reference above your footer line from the first frame to the last, set smaller rather than cut."
},
"reference": {
"type": "string",
"maxLength": 40,
"title": "Reference",
"description": "The meeting's or the agenda's reference, as you write it, such as Agenda FC/2026/11."
},
"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, text at the start."
}
},
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the kind of notice and its status, the headline, the meeting, its date, time and place, the agenda, how to watch, attend and speak, the labels, the call to action, who issued it and the reference."
},
"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_edafad905b0f?variant=Council%20meeting&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": {
"notice": "Council meeting",
"status": "Open to the public",
"headline": "The Full Council meets to set the budget for 2027",
"meeting": "Full Council",
"starts": "2026-11-12T18:30:00+00:00",
"dateText": "",
"timeText": "",
"place": "Council Chamber, Westbrook Town Hall, Market Street",
"agenda": [
{
"title": "Apologies and declarations of interest"
},
{
"note": "To approve as a correct record",
"title": "Minutes of the meeting held on 8 October"
},
{
"note": "Up to 30 minutes",
"title": "Questions from residents"
},
{
"note": "Report of the Director of Finance, for decision",
"title": "Budget 2027 and the council tax for next year"
},
{
"note": "Report of the Head of Waste Services, for decision",
"title": "Changes to bin collection days in the north of the city"
}
],
"watch": "Live and recorded at westbrook.example/live",
"attend": "The public gallery is open to all, with a step-free entrance on Market Street",
"speak": "Register by noon on Tuesday 10 November to speak on an item: westbrook.example/speak",
"labels": {
"date": "Date",
"time": "Time",
"place": "Place",
"speak": "Speak",
"watch": "Watch",
"agenda": "On the agenda",
"attend": "Attend",
"meeting": "Meeting",
"takePart": "How to take part"
},
"cta": {
"label": "Read the agenda",
"detail": "westbrook.example/meetings"
},
"issuedBy": "Issued by Democratic Services, City of Westbrook",
"reference": "Agenda FC/2026/11",
"look": {
"logo": "auto",
"pace": "calm",
"align": "start",
"theme": "brand",
"corners": "soft",
"logoSize": "auto"
}
},
"metaData": {
"title": "Full Council meeting on 12 November: the budget for 2027",
"captionTiny": "The Full Council meets on Thursday 12 November at 6.30 pm in the Council Chamber to set the budget for 2027. Watch live or come along.",
"captionShort": "Council meeting: the Full Council meets on Thursday 12 November at 6.30 pm in the Council Chamber at Westbrook Town Hall. On the agenda: questions from residents, the budget for 2027 and the council tax for next year, and changes to bin collection days in the north of the city. The meeting is open to the public and streamed live at westbrook.example/live. To speak on an item, register by noon on Tuesday 10 November.",
"captionMedium": "Council meeting. The Full Council meets on Thursday 12 November at 6.30 pm in the Council Chamber, Westbrook Town Hall, Market Street, to set the budget for 2027. On the agenda: apologies and declarations of interest; the minutes of the meeting held on 8 October; up to 30 minutes of questions from residents; the budget for 2027 and the council tax for next year, on a report of the Director of Finance; and changes to bin collection days in the north of the city, on a report of the Head of Waste Services. The meeting is open to the public: the gallery is open to all, with a step-free entrance on Market Street, and the meeting is streamed live and recorded at westbrook.example/live. To speak on an item, register by noon on Tuesday 10 November at westbrook.example/speak. The agenda and all the reports are at westbrook.example/meetings. Issued by Democratic Services, City of Westbrook.",
"captionLong": "Council meeting. The Full Council of the City of Westbrook meets on Thursday 12 November at 6.30 pm in the Council Chamber at Westbrook Town Hall, Market Street. The main business of the meeting is to set the budget for 2027 and the council tax for next year. The agenda, in order: apologies and declarations of interest; the minutes of the meeting held on 8 October, to be approved as a correct record; questions from residents, for up to 30 minutes; the budget for 2027 and the council tax for next year, on a report of the Director of Finance, for decision; and changes to bin collection days in the north of the city, on a report of the Head of Waste Services, for decision. Every meeting of the council is open to the public. The public gallery is open to all on a first come, first served basis, with a step-free entrance and a hearing loop, and the doors open at 6 pm. If you cannot come, you can watch the meeting live at westbrook.example/live, where the recording stays available afterwards. Residents may ask a question or speak on an item on the agenda: register by noon on Tuesday 10 November at westbrook.example/speak, or call Democratic Services on 0300 123 4567, and we will tell you when you will be called. The full agenda, the reports and the minutes of earlier meetings are at westbrook.example/meetings. Issued by Democratic Services, City of Westbrook. Agenda FC/2026/11.",
"hashtags": [
"westbrook",
"councilmeeting",
"localdemocracy",
"budget2027",
"haveyoursay"
]
}
}
}
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.