Public bodies (City councils), City event 1.0.0
| Template | Public bodies (City councils), tpl_edafad905b0f |
|---|---|
| Variant | City event |
| 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 city event: the notice on a coloured banner, the name, the day or days, the times and the place, complete on the first frame; each fact is read in turn, then the picture with a line about the event, up to six programme items at their times, practical notes, the days as calendar pages and the button. 15.5 seconds, 1.5 more per programme 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 name, the line about the event, the day or days, the times, the place, the picture, the programme, the practical notes, 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 What's on or City event. |
clipData.status | text | up to 32 characters | Status: How it stands, beside the kind of notice on the banner, such as Free entry, Tickets on sale or Moved indoors. | |
clipData.name | text | yes | up to 72 characters | Name: The event's name, as you call it, such as Westbrook Summer Festival. A council's event informs and invites: facts only, never a campaign. |
clipData.tagline | text | up to 120 characters | About the event: A plain sentence about the event, shown large beside or under the picture, such as Two days of music, food and family fun by the river. | |
clipData.date | datetime | yes | Day: The day the event is on, or its first day. Only the date is read, as it is written here, and it is spelled out in the channel's language with its weekday. | |
clipData.endDate | datetime | Last day: The last day, for an event over several days, read and spelled out the same way. Left out, or on the same day, the event is one day. | ||
clipData.dateText | text | up to 48 characters | Day, as written: The day in your own words, shown instead of the one written from the date, such as Saturday 13 June. Left out, it is written from the date. | |
clipData.endDateText | text | up to 48 characters | Last day, as written: The last day in your own words, shown instead of the one written from the date. Left out, it is written from the date. | |
clipData.hours | text | up to 64 characters | Times: When it is open, such as 11 am to 6 pm each day, or From 5 pm until the fireworks at 10 pm. | |
clipData.place | text | yes | up to 100 characters | Place: Where it is, spelled out, such as Riverside Park, by the bandstand. |
clipData.picture | image | media:// file from the media library, alt text up to 160 characters | Picture: A photograph of the event or the place, with its description as alt text. Shown large with the sentence about the event, pushing in slowly. Left out, there is no picture scene and the facts are read more slowly. | |
clipData.programme | list | up to 6 | Programme: Up to six items of the programme in their order, each at its time, read in turn, one and a half seconds each; on a short frame they turn pages. Where the programme runs over more than one day, each time is shown with its weekday. | |
clipData.programme[] | group | Item | ||
clipData.programme[].at | datetime | yes | Time: When the item starts. The time is read as it is written here and shown the channel's way. | |
clipData.programme[].title | text | yes | up to 72 characters | What: What happens, in a few words, such as Opening by the Mayor at the bandstand. |
clipData.programme[].icon | enum | music, mic, utensils, coffee, cake-slice, apple, store, shopping-bag, gift, ticket, palette, brush, camera, video, book-open, baby, users, user, dumbbell, trophy, flower-2, trees, sun, moon, star, heart, landmark, bus, train-front, bike, car, footprints, accessibility, map-pin, clock, calendar, info, triangle-alert, phone, mail, globe, trash, recycle, droplets, stethoscope, hand-helping, heart-pulse, lock, megaphone, bell, wifi, house, parking, route, map, diversion, road-closed, barrier | Pictogram: The pictogram beside the item. Left out, the row has none. | |
clipData.notes | list | up to 4 | Good to know: Up to four practical notes for visitors, each with its pictogram: getting there, parking, access, what to bring. Read in turn after the programme. | |
clipData.notes[] | group | Note | ||
clipData.notes[].text | text | yes | up to 80 characters | Note: One practical point, in a sentence. |
clipData.notes[].icon | enum | music, mic, utensils, coffee, cake-slice, apple, store, shopping-bag, gift, ticket, palette, brush, camera, video, book-open, baby, users, user, dumbbell, trophy, flower-2, trees, sun, moon, star, heart, landmark, bus, train-front, bike, car, footprints, accessibility, map-pin, clock, calendar, info, triangle-alert, phone, mail, globe, trash, recycle, droplets, stethoscope, hand-helping, heart-pulse, lock, megaphone, bell, wifi, house, parking, route, map, diversion, road-closed, barrier | Pictogram: The pictogram on the note's tile. Left out, the tile holds the note's number. | |
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.date | text | up to 24 characters | Day: Beside the day: for one day such as Date, for several such as From. | |
clipData.labels.endDate | text | up to 24 characters | Last day: Beside the last day, such as Until. | |
clipData.labels.hours | text | up to 24 characters | Times: Beside the times. | |
clipData.labels.place | text | up to 24 characters | Place: Beside the place. | |
clipData.labels.programme | text | up to 32 characters | Programme: Over the programme. | |
clipData.labels.notes | text | up to 32 characters | Good to know: Over the practical notes. | |
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, such as Plan your visit. |
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 Events and Culture. 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 event's reference or licence, as you write it, such as Ref. EV/2026/031. | |
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 What's on or City event."
},
"status": {
"type": "string",
"maxLength": 32,
"title": "Status",
"description": "How it stands, beside the kind of notice on the banner, such as Free entry, Tickets on sale or Moved indoors."
},
"name": {
"type": "string",
"maxLength": 72,
"title": "Name",
"description": "The event's name, as you call it, such as Westbrook Summer Festival. A council's event informs and invites: facts only, never a campaign."
},
"tagline": {
"type": "string",
"maxLength": 120,
"title": "About the event",
"description": "A plain sentence about the event, shown large beside or under the picture, such as Two days of music, food and family fun by the river."
},
"date": {
"type": "string",
"format": "date-time",
"title": "Day",
"description": "The day the event is on, or its first day. Only the date is read, as it is written here, and it is spelled out in the channel's language with its weekday."
},
"endDate": {
"type": "string",
"format": "date-time",
"title": "Last day",
"description": "The last day, for an event over several days, read and spelled out the same way. Left out, or on the same day, the event is one day."
},
"dateText": {
"type": "string",
"maxLength": 48,
"title": "Day, as written",
"description": "The day in your own words, shown instead of the one written from the date, such as Saturday 13 June. Left out, it is written from the date."
},
"endDateText": {
"type": "string",
"maxLength": 48,
"title": "Last day, as written",
"description": "The last day in your own words, shown instead of the one written from the date. Left out, it is written from the date."
},
"hours": {
"type": "string",
"maxLength": 64,
"title": "Times",
"description": "When it is open, such as 11 am to 6 pm each day, or From 5 pm until the fireworks at 10 pm."
},
"place": {
"type": "string",
"maxLength": 100,
"title": "Place",
"description": "Where it is, spelled out, such as Riverside Park, by the bandstand."
},
"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": 160,
"title": "Alt text",
"description": "What the picture shows, for anyone who cannot see it."
}
},
"required": [
"url"
],
"additionalProperties": false,
"title": "Picture",
"description": "A photograph of the event or the place, with its description as alt text. Shown large with the sentence about the event, pushing in slowly. Left out, there is no picture scene and the facts are read more slowly."
},
"programme": {
"type": "array",
"items": {
"type": "object",
"properties": {
"at": {
"type": "string",
"format": "date-time",
"title": "Time",
"description": "When the item starts. The time is read as it is written here and shown the channel's way."
},
"title": {
"type": "string",
"maxLength": 72,
"title": "What",
"description": "What happens, in a few words, such as Opening by the Mayor at the bandstand."
},
"icon": {
"type": "string",
"enum": [
"music",
"mic",
"utensils",
"coffee",
"cake-slice",
"apple",
"store",
"shopping-bag",
"gift",
"ticket",
"palette",
"brush",
"camera",
"video",
"book-open",
"baby",
"users",
"user",
"dumbbell",
"trophy",
"flower-2",
"trees",
"sun",
"moon",
"star",
"heart",
"landmark",
"bus",
"train-front",
"bike",
"car",
"footprints",
"accessibility",
"map-pin",
"clock",
"calendar",
"info",
"triangle-alert",
"phone",
"mail",
"globe",
"trash",
"recycle",
"droplets",
"stethoscope",
"hand-helping",
"heart-pulse",
"lock",
"megaphone",
"bell",
"wifi",
"house",
"parking",
"route",
"map",
"diversion",
"road-closed",
"barrier"
],
"title": "Pictogram",
"description": "The pictogram beside the item. Left out, the row has none.",
"enumNames": [
"Music",
"Mic",
"Utensils",
"Coffee",
"Cake",
"Apple",
"Store",
"Shopping bag",
"Gift",
"Ticket",
"Palette",
"Brush",
"Camera",
"Video",
"Book open",
"Baby",
"Users",
"User",
"Dumbbell",
"Trophy",
"Flower",
"Trees",
"Sun",
"Moon",
"Star",
"Heart",
"Landmark",
"Bus",
"Train front",
"Bike",
"Car",
"Footprints",
"Accessibility",
"Map pin",
"Clock",
"Calendar",
"Info",
"Triangle alert",
"Phone",
"Mail",
"Globe",
"Trash",
"Recycle",
"Droplets",
"Stethoscope",
"Hand helping",
"Heart pulse",
"Lock",
"Megaphone",
"Bell",
"Wifi",
"House",
"Parking",
"Route",
"Map",
"Diversion",
"Road closed",
"Barrier"
]
}
},
"required": [
"at",
"title"
],
"additionalProperties": false,
"title": "Item"
},
"maxItems": 6,
"title": "Programme",
"description": "Up to six items of the programme in their order, each at its time, read in turn, one and a half seconds each; on a short frame they turn pages. Where the programme runs over more than one day, each time is shown with its weekday."
},
"notes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"text": {
"type": "string",
"maxLength": 80,
"title": "Note",
"description": "One practical point, in a sentence."
},
"icon": {
"type": "string",
"enum": [
"music",
"mic",
"utensils",
"coffee",
"cake-slice",
"apple",
"store",
"shopping-bag",
"gift",
"ticket",
"palette",
"brush",
"camera",
"video",
"book-open",
"baby",
"users",
"user",
"dumbbell",
"trophy",
"flower-2",
"trees",
"sun",
"moon",
"star",
"heart",
"landmark",
"bus",
"train-front",
"bike",
"car",
"footprints",
"accessibility",
"map-pin",
"clock",
"calendar",
"info",
"triangle-alert",
"phone",
"mail",
"globe",
"trash",
"recycle",
"droplets",
"stethoscope",
"hand-helping",
"heart-pulse",
"lock",
"megaphone",
"bell",
"wifi",
"house",
"parking",
"route",
"map",
"diversion",
"road-closed",
"barrier"
],
"title": "Pictogram",
"description": "The pictogram on the note's tile. Left out, the tile holds the note's number.",
"enumNames": [
"Music",
"Mic",
"Utensils",
"Coffee",
"Cake",
"Apple",
"Store",
"Shopping bag",
"Gift",
"Ticket",
"Palette",
"Brush",
"Camera",
"Video",
"Book open",
"Baby",
"Users",
"User",
"Dumbbell",
"Trophy",
"Flower",
"Trees",
"Sun",
"Moon",
"Star",
"Heart",
"Landmark",
"Bus",
"Train front",
"Bike",
"Car",
"Footprints",
"Accessibility",
"Map pin",
"Clock",
"Calendar",
"Info",
"Triangle alert",
"Phone",
"Mail",
"Globe",
"Trash",
"Recycle",
"Droplets",
"Stethoscope",
"Hand helping",
"Heart pulse",
"Lock",
"Megaphone",
"Bell",
"Wifi",
"House",
"Parking",
"Route",
"Map",
"Diversion",
"Road closed",
"Barrier"
]
}
},
"required": [
"text"
],
"additionalProperties": false,
"title": "Note"
},
"maxItems": 4,
"title": "Good to know",
"description": "Up to four practical notes for visitors, each with its pictogram: getting there, parking, access, what to bring. Read in turn after the programme."
},
"labels": {
"type": "object",
"properties": {
"date": {
"type": "string",
"maxLength": 24,
"title": "Day",
"description": "Beside the day: for one day such as Date, for several such as From."
},
"endDate": {
"type": "string",
"maxLength": 24,
"title": "Last day",
"description": "Beside the last day, such as Until."
},
"hours": {
"type": "string",
"maxLength": 24,
"title": "Times",
"description": "Beside the times."
},
"place": {
"type": "string",
"maxLength": 24,
"title": "Place",
"description": "Beside the place."
},
"programme": {
"type": "string",
"maxLength": 32,
"title": "Programme",
"description": "Over the programme."
},
"notes": {
"type": "string",
"maxLength": 32,
"title": "Good to know",
"description": "Over the practical notes."
}
},
"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, such as Plan your visit."
},
"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 Events and Culture. 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 event's reference or licence, as you write it, such as Ref. EV/2026/031."
},
"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",
"name",
"date",
"place",
"issuedBy"
],
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the kind of notice and its status, the name, the line about the event, the day or days, the times, the place, the picture, the programme, the practical notes, 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 What's on or City event."
},
"status": {
"type": "string",
"maxLength": 32,
"title": "Status",
"description": "How it stands, beside the kind of notice on the banner, such as Free entry, Tickets on sale or Moved indoors."
},
"name": {
"type": "string",
"maxLength": 72,
"title": "Name",
"description": "The event's name, as you call it, such as Westbrook Summer Festival. A council's event informs and invites: facts only, never a campaign."
},
"tagline": {
"type": "string",
"maxLength": 120,
"title": "About the event",
"description": "A plain sentence about the event, shown large beside or under the picture, such as Two days of music, food and family fun by the river."
},
"date": {
"type": "string",
"format": "date-time",
"title": "Day",
"description": "The day the event is on, or its first day. Only the date is read, as it is written here, and it is spelled out in the channel's language with its weekday."
},
"endDate": {
"type": "string",
"format": "date-time",
"title": "Last day",
"description": "The last day, for an event over several days, read and spelled out the same way. Left out, or on the same day, the event is one day."
},
"dateText": {
"type": "string",
"maxLength": 48,
"title": "Day, as written",
"description": "The day in your own words, shown instead of the one written from the date, such as Saturday 13 June. Left out, it is written from the date."
},
"endDateText": {
"type": "string",
"maxLength": 48,
"title": "Last day, as written",
"description": "The last day in your own words, shown instead of the one written from the date. Left out, it is written from the date."
},
"hours": {
"type": "string",
"maxLength": 64,
"title": "Times",
"description": "When it is open, such as 11 am to 6 pm each day, or From 5 pm until the fireworks at 10 pm."
},
"place": {
"type": "string",
"maxLength": 100,
"title": "Place",
"description": "Where it is, spelled out, such as Riverside Park, by the bandstand."
},
"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": 160,
"title": "Alt text",
"description": "What the picture shows, for anyone who cannot see it."
}
},
"required": [
"url"
],
"additionalProperties": false,
"title": "Picture",
"description": "A photograph of the event or the place, with its description as alt text. Shown large with the sentence about the event, pushing in slowly. Left out, there is no picture scene and the facts are read more slowly."
},
"programme": {
"type": "array",
"items": {
"type": "object",
"properties": {
"at": {
"type": "string",
"format": "date-time",
"title": "Time",
"description": "When the item starts. The time is read as it is written here and shown the channel's way."
},
"title": {
"type": "string",
"maxLength": 72,
"title": "What",
"description": "What happens, in a few words, such as Opening by the Mayor at the bandstand."
},
"icon": {
"type": "string",
"enum": [
"music",
"mic",
"utensils",
"coffee",
"cake-slice",
"apple",
"store",
"shopping-bag",
"gift",
"ticket",
"palette",
"brush",
"camera",
"video",
"book-open",
"baby",
"users",
"user",
"dumbbell",
"trophy",
"flower-2",
"trees",
"sun",
"moon",
"star",
"heart",
"landmark",
"bus",
"train-front",
"bike",
"car",
"footprints",
"accessibility",
"map-pin",
"clock",
"calendar",
"info",
"triangle-alert",
"phone",
"mail",
"globe",
"trash",
"recycle",
"droplets",
"stethoscope",
"hand-helping",
"heart-pulse",
"lock",
"megaphone",
"bell",
"wifi",
"house",
"parking",
"route",
"map",
"diversion",
"road-closed",
"barrier"
],
"title": "Pictogram",
"description": "The pictogram beside the item. Left out, the row has none.",
"enumNames": [
"Music",
"Mic",
"Utensils",
"Coffee",
"Cake",
"Apple",
"Store",
"Shopping bag",
"Gift",
"Ticket",
"Palette",
"Brush",
"Camera",
"Video",
"Book open",
"Baby",
"Users",
"User",
"Dumbbell",
"Trophy",
"Flower",
"Trees",
"Sun",
"Moon",
"Star",
"Heart",
"Landmark",
"Bus",
"Train front",
"Bike",
"Car",
"Footprints",
"Accessibility",
"Map pin",
"Clock",
"Calendar",
"Info",
"Triangle alert",
"Phone",
"Mail",
"Globe",
"Trash",
"Recycle",
"Droplets",
"Stethoscope",
"Hand helping",
"Heart pulse",
"Lock",
"Megaphone",
"Bell",
"Wifi",
"House",
"Parking",
"Route",
"Map",
"Diversion",
"Road closed",
"Barrier"
]
}
},
"required": [
"at",
"title"
],
"additionalProperties": false,
"title": "Item"
},
"maxItems": 6,
"title": "Programme",
"description": "Up to six items of the programme in their order, each at its time, read in turn, one and a half seconds each; on a short frame they turn pages. Where the programme runs over more than one day, each time is shown with its weekday."
},
"notes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"text": {
"type": "string",
"maxLength": 80,
"title": "Note",
"description": "One practical point, in a sentence."
},
"icon": {
"type": "string",
"enum": [
"music",
"mic",
"utensils",
"coffee",
"cake-slice",
"apple",
"store",
"shopping-bag",
"gift",
"ticket",
"palette",
"brush",
"camera",
"video",
"book-open",
"baby",
"users",
"user",
"dumbbell",
"trophy",
"flower-2",
"trees",
"sun",
"moon",
"star",
"heart",
"landmark",
"bus",
"train-front",
"bike",
"car",
"footprints",
"accessibility",
"map-pin",
"clock",
"calendar",
"info",
"triangle-alert",
"phone",
"mail",
"globe",
"trash",
"recycle",
"droplets",
"stethoscope",
"hand-helping",
"heart-pulse",
"lock",
"megaphone",
"bell",
"wifi",
"house",
"parking",
"route",
"map",
"diversion",
"road-closed",
"barrier"
],
"title": "Pictogram",
"description": "The pictogram on the note's tile. Left out, the tile holds the note's number.",
"enumNames": [
"Music",
"Mic",
"Utensils",
"Coffee",
"Cake",
"Apple",
"Store",
"Shopping bag",
"Gift",
"Ticket",
"Palette",
"Brush",
"Camera",
"Video",
"Book open",
"Baby",
"Users",
"User",
"Dumbbell",
"Trophy",
"Flower",
"Trees",
"Sun",
"Moon",
"Star",
"Heart",
"Landmark",
"Bus",
"Train front",
"Bike",
"Car",
"Footprints",
"Accessibility",
"Map pin",
"Clock",
"Calendar",
"Info",
"Triangle alert",
"Phone",
"Mail",
"Globe",
"Trash",
"Recycle",
"Droplets",
"Stethoscope",
"Hand helping",
"Heart pulse",
"Lock",
"Megaphone",
"Bell",
"Wifi",
"House",
"Parking",
"Route",
"Map",
"Diversion",
"Road closed",
"Barrier"
]
}
},
"required": [
"text"
],
"additionalProperties": false,
"title": "Note"
},
"maxItems": 4,
"title": "Good to know",
"description": "Up to four practical notes for visitors, each with its pictogram: getting there, parking, access, what to bring. Read in turn after the programme."
},
"labels": {
"type": "object",
"properties": {
"date": {
"type": "string",
"maxLength": 24,
"title": "Day",
"description": "Beside the day: for one day such as Date, for several such as From."
},
"endDate": {
"type": "string",
"maxLength": 24,
"title": "Last day",
"description": "Beside the last day, such as Until."
},
"hours": {
"type": "string",
"maxLength": 24,
"title": "Times",
"description": "Beside the times."
},
"place": {
"type": "string",
"maxLength": 24,
"title": "Place",
"description": "Beside the place."
},
"programme": {
"type": "string",
"maxLength": 32,
"title": "Programme",
"description": "Over the programme."
},
"notes": {
"type": "string",
"maxLength": 32,
"title": "Good to know",
"description": "Over the practical notes."
}
},
"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, such as Plan your visit."
},
"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 Events and Culture. 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 event's reference or licence, as you write it, such as Ref. EV/2026/031."
},
"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 name, the line about the event, the day or days, the times, the place, the picture, the programme, the practical notes, 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=City%20event&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": "What's on",
"status": "Free entry",
"name": "Westbrook Summer Festival",
"tagline": "Two days of music, food and family fun by the river",
"date": "2026-06-13T11:00:00+01:00",
"endDate": "2026-06-14T18:00:00+01:00",
"dateText": "",
"endDateText": "",
"hours": "11 am to 6 pm each day",
"place": "Riverside Park, by the bandstand",
"picture": {
"alt": "The festival lawn by the river, with the stage and the market stalls",
"url": "media://example-image.jpg"
},
"programme": [
{
"at": "2026-06-13T11:00:00+01:00",
"icon": "megaphone",
"title": "Opening by the Mayor at the bandstand"
},
{
"at": "2026-06-13T12:00:00+01:00",
"icon": "utensils",
"title": "Food market and local makers open"
},
{
"at": "2026-06-13T14:30:00+01:00",
"icon": "baby",
"title": "Children's theatre on the lawn"
},
{
"at": "2026-06-13T19:00:00+01:00",
"icon": "music",
"title": "Westbrook Brass Band on the main stage"
},
{
"at": "2026-06-14T11:00:00+01:00",
"icon": "footprints",
"title": "Family fun run along the river"
}
],
"notes": [
{
"icon": "bus",
"text": "Buses 4 and 12 stop at the park gates"
},
{
"icon": "parking",
"text": "No parking at the park: use the Park Lane car park"
},
{
"icon": "accessibility",
"text": "Step-free paths, accessible toilets and a quiet tent"
},
{
"icon": "droplets",
"text": "Free water refill stations by the stage"
}
],
"labels": {
"date": "From",
"hours": "Times",
"notes": "Good to know",
"place": "Where",
"endDate": "Until",
"programme": "Programme"
},
"cta": {
"label": "Plan your visit",
"detail": "westbrook.example/festival"
},
"issuedBy": "Issued by Events and Culture, City of Westbrook",
"reference": "Ref. EV/2026/031",
"look": {
"logo": "auto",
"pace": "calm",
"align": "start",
"theme": "brand",
"corners": "soft",
"logoSize": "auto"
}
},
"metaData": {
"title": "Westbrook Summer Festival, 13 and 14 June in Riverside Park",
"captionTiny": "Westbrook Summer Festival: two days of music, food and family fun in Riverside Park, 13 and 14 June, 11 am to 6 pm. Free entry.",
"captionShort": "What's on: the Westbrook Summer Festival is back in Riverside Park on Saturday 13 and Sunday 14 June, 11 am to 6 pm each day, and entry is free. The Mayor opens it at 11 am on Saturday at the bandstand; then the food market, children's theatre, the Westbrook Brass Band and, on Sunday morning, the family fun run along the river. Buses 4 and 12 stop at the park gates.",
"captionMedium": "What's on: Westbrook Summer Festival. Two days of music, food and family fun by the river, in Riverside Park on Saturday 13 and Sunday 14 June, from 11 am to 6 pm each day. Entry is free. The programme: the Mayor opens the festival at 11 am on Saturday at the bandstand; the food market and local makers open at noon; children's theatre on the lawn at 2.30 pm; the Westbrook Brass Band on the main stage at 7 pm; and the family fun run along the river on Sunday at 11 am. Good to know: buses 4 and 12 stop at the park gates; there is no parking at the park, so please use the Park Lane car park; the paths are step-free, with accessible toilets and a quiet tent; and there are free water refill stations by the stage. Full programme at westbrook.example/festival.",
"captionLong": "What's on: the Westbrook Summer Festival returns to Riverside Park on Saturday 13 and Sunday 14 June, with two days of music, food and family fun by the river, from 11 am to 6 pm each day. Entry is free, and everybody is welcome. The Mayor opens the festival at 11 am on Saturday at the bandstand. From noon, the food market and more than forty local makers fill the lawn by the river, and at 2.30 pm the children's theatre company performs on the lawn. On Saturday evening, the Westbrook Brass Band plays the main stage from 7 pm. On Sunday at 11 am, the family fun run sets off along the river path: it is two kilometres, free to enter on the day, and every runner gets a medal. Getting there: buses 4 and 12 stop at the park gates, and the river path is the easiest way in on foot or by bike, with bike racks at the main gate. There is no parking at the park itself, so please use the Park Lane car park, a five-minute walk away; blue badge spaces are kept by the main gate. The paths are step-free, there are accessible toilets and a quiet tent for anybody who needs a break from the crowd, and free water refill stations by the stage, so bring a bottle. The full programme, a map of the site and the latest news are at westbrook.example/festival. Issued by Events and Culture, City of Westbrook.",
"hashtags": [
"westbrook",
"summerfestival",
"whatson",
"riversidepark",
"familyfun"
]
}
}
}
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.