Pub Feed 4
Feed description 4
| Feed id | fd_497825865140 |
|---|---|
| Source | pub-test-feeds |
| Market | Public bodies |
| Schedule | Weekly, Mon 09:00 |
| Drawn with | Template 4, Standard 1.0.0 |
| Shapes | 9x16, 4x5, 1x1, 16x9, 2x3 |
| Languages | Any: each channel takes its own language from the event, or the default |
| Freshness | An event older than 24 hours is kept but never published |
Example video
The 1x1 cut of this feed, drawn from an example of what it carries. Open the video on its own.
Use cases
- Council and authority announcements, the moment they are published.
- Dates people plan around: waste collection, opening hours, public events.
- Open data made visible: air quality, water levels, traffic or budget figures.
What it carries
One story in two parts: clipData, which is drawn in the clip (a headline, an optional second line, up to six figures, up to five points, up to three images and a source), and metaData, which is the post's title, captions and hashtags and is never drawn.
| Field | Type | Required | Limit | What it is |
|---|---|---|---|---|
clipData | group | yes | Clip data: Everything drawn in the clip: the headline, the second line, the figures, the points, the images and the source. It may also be quoted in the post text, but it is drawn first and foremost. | |
clipData.headline | text | yes | up to 80 characters | Headline: The one line a viewer reads first. |
clipData.subline | text | up to 120 characters | Second line: A supporting line under the headline. Left out where the headline says enough. | |
clipData.figures | list | up to 6 | Figures: The numbers this story is about, drawn in the order they are sent. | |
clipData.figures[] | group | Figure | ||
clipData.figures[].label | text | yes | up to 24 characters | What it is |
clipData.figures[].value | number | yes | 4 decimals | The figure |
clipData.figures[].unit | text | up to 8 characters | Unit: Printed after the figure. A currency symbol, a percent sign, a suffix. | |
clipData.figures[].direction | enum | up, down, flat | Direction: Which accent the figure wears. Absent means neither. | |
clipData.bullets | list | up to 5 | Points: Short supporting points, one line each. | |
clipData.bullets[] | text | up to 90 characters | Point | |
clipData.images | list | up to 3 | Images: Up to three pictures from the media library, drawn side by side. Only files in the library are drawn; any other picture shows as missing. | |
clipData.images[] | image | media:// file from the media library, alt text up to 120 characters | Image: A picture from the media library, and its alt text of at most 120 characters. | |
clipData.source | text | up to 60 characters | Source: Who this came from, where it has to be credited. | |
metaData | group | Meta data: Everything about the post that is never drawn in the clip: its title, its captions for each length 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: YouTube, Facebook Feed and LinkedIn. Up to 100 characters, which every one of them takes. | |
metaData.captionShort | text | up to 500 characters | Caption for Telegram: Up to 500 characters. | |
metaData.captionMedium | text | up to 1500 characters | Caption for Instagram, TikTok, Facebook Reels and LinkedIn: Up to 1500 characters. | |
metaData.captionLong | text | up to 4000 characters | Caption for YouTube and Facebook Feed: Up to 4000 characters. | |
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 422 that
names the field.
The JSON Schema
{
"type": "object",
"properties": {
"clipData": {
"type": "object",
"properties": {
"headline": {
"type": "string",
"maxLength": 80,
"title": "Headline",
"description": "The one line a viewer reads first."
},
"subline": {
"type": "string",
"maxLength": 120,
"title": "Second line",
"description": "A supporting line under the headline. Left out where the headline says enough."
},
"figures": {
"type": "array",
"items": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 24,
"title": "What it is"
},
"value": {
"type": "number",
"title": "The figure"
},
"unit": {
"type": "string",
"maxLength": 8,
"title": "Unit",
"description": "Printed after the figure. A currency symbol, a percent sign, a suffix."
},
"direction": {
"type": "string",
"enum": [
"up",
"down",
"flat"
],
"title": "Direction",
"description": "Which accent the figure wears. Absent means neither."
}
},
"required": [
"label",
"value"
],
"additionalProperties": false,
"title": "Figure"
},
"maxItems": 6,
"title": "Figures",
"description": "The numbers this story is about, drawn in the order they are sent."
},
"bullets": {
"type": "array",
"items": {
"type": "string",
"maxLength": 90,
"title": "Point"
},
"maxItems": 5,
"title": "Points",
"description": "Short supporting points, one line each."
},
"images": {
"type": "array",
"items": {
"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": "Image",
"description": "A picture from the media library, and its alt text of at most 120 characters."
},
"maxItems": 3,
"title": "Images",
"description": "Up to three pictures from the media library, drawn side by side. Only files in the library are drawn; any other picture shows as missing."
},
"source": {
"type": "string",
"maxLength": 60,
"title": "Source",
"description": "Who this came from, where it has to be credited."
}
},
"required": [
"headline"
],
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the headline, the second line, the figures, the points, the images and the source. It may also be quoted in the post text, but it is drawn first and foremost."
},
"metaData": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 100,
"title": "Title",
"description": "Used where the platform has a title of its own: YouTube, Facebook Feed and LinkedIn. Up to 100 characters, which every one of them takes."
},
"captionShort": {
"type": "string",
"maxLength": 500,
"title": "Caption for Telegram",
"description": "Up to 500 characters."
},
"captionMedium": {
"type": "string",
"maxLength": 1500,
"title": "Caption for Instagram, TikTok, Facebook Reels and LinkedIn",
"description": "Up to 1500 characters."
},
"captionLong": {
"type": "string",
"maxLength": 4000,
"title": "Caption for YouTube and Facebook Feed",
"description": "Up to 4000 characters."
},
"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 captions for each length 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": {
"headline": {
"type": "string",
"maxLength": 80,
"title": "Headline",
"description": "The one line a viewer reads first."
},
"subline": {
"type": "string",
"maxLength": 120,
"title": "Second line",
"description": "A supporting line under the headline. Left out where the headline says enough."
},
"figures": {
"type": "array",
"items": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 24,
"title": "What it is"
},
"value": {
"type": "number",
"title": "The figure"
},
"unit": {
"type": "string",
"maxLength": 8,
"title": "Unit",
"description": "Printed after the figure. A currency symbol, a percent sign, a suffix."
},
"direction": {
"type": "string",
"enum": [
"up",
"down",
"flat"
],
"title": "Direction",
"description": "Which accent the figure wears. Absent means neither."
}
},
"required": [
"label",
"value"
],
"additionalProperties": false,
"title": "Figure"
},
"maxItems": 6,
"title": "Figures",
"description": "The numbers this story is about, drawn in the order they are sent."
},
"bullets": {
"type": "array",
"items": {
"type": "string",
"maxLength": 90,
"title": "Point"
},
"maxItems": 5,
"title": "Points",
"description": "Short supporting points, one line each."
},
"images": {
"type": "array",
"items": {
"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": "Image",
"description": "A picture from the media library, and its alt text of at most 120 characters."
},
"maxItems": 3,
"title": "Images",
"description": "Up to three pictures from the media library, drawn side by side. Only files in the library are drawn; any other picture shows as missing."
},
"source": {
"type": "string",
"maxLength": 60,
"title": "Source",
"description": "Who this came from, where it has to be credited."
}
},
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the headline, the second line, the figures, the points, the images and the source. It may also be quoted in the post text, but it is drawn first and foremost."
},
"metaData": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 100,
"title": "Title",
"description": "Used where the platform has a title of its own: YouTube, Facebook Feed and LinkedIn. Up to 100 characters, which every one of them takes."
},
"captionShort": {
"type": "string",
"maxLength": 500,
"title": "Caption for Telegram",
"description": "Up to 500 characters."
},
"captionMedium": {
"type": "string",
"maxLength": 1500,
"title": "Caption for Instagram, TikTok, Facebook Reels and LinkedIn",
"description": "Up to 1500 characters."
},
"captionLong": {
"type": "string",
"maxLength": 4000,
"title": "Caption for YouTube and Facebook Feed",
"description": "Up to 4000 characters."
},
"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 captions for each length 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/feed/fd_497825865140"
Which template draws a feed is Reelwire's decision and can change, so a producer asks by the feed, as above, rather than by its template.
Delivery JSON
Every event of this feed is delivered to Reelwire in this envelope. You do not send it yourself:
switch the feed on under Feeds, have a channel listen to it, and each event becomes a post on that
channel. data is the document described above.
{
"eventId": "01M2SQMKK3G1NVFXV31DCBVB95",
"occurredAt": "2026-09-23T07:00:00Z",
"feedId": "fd_497825865140",
"locale": "en",
"data": {
"clipData": {
"headline": "This is the headline of the clip",
"subline": "This is a second line that adds a little more detail",
"figures": [
{
"label": "Example figure",
"value": 1250,
"unit": "",
"direction": "up"
}
],
"bullets": [
"This is a short supporting point"
],
"images": [
{
"alt": "Example image, PNG",
"url": "media://example-image.png"
},
{
"alt": "Example image, JPEG",
"url": "media://example-image.jpg"
},
{
"alt": "Example image, SVG",
"url": "media://example-image.svg"
}
],
"source": "Example source"
},
"metaData": {
"title": "This is the title of the post",
"captionShort": "This is the short caption, for Telegram. It is published beside the clip and is never drawn on it.",
"captionMedium": "This is the medium caption, for Instagram, TikTok, Facebook Reels and LinkedIn. It is published beside the clip and is never drawn on it. It has room for a second thought: what the clip shows, and why it matters to the people who follow this account.",
"captionLong": "This is the long caption, for YouTube and Facebook Feed. It is published beside the clip and is never drawn on it. It has room for the whole story: what the clip shows, why it matters, and where to read more. A longer text suits the platforms that show a description under the video rather than beside it.",
"hashtags": [
"example",
"reelwire"
]
},
"locales": {
"de": {
"clipData": {
"images": [
{
"alt": "Beispielbild, PNG",
"url": "media://example-image.png"
},
{
"alt": "Beispielbild, JPEG",
"url": "media://example-image.jpg"
},
{
"alt": "Beispielbild, SVG",
"url": "media://example-image.svg"
}
],
"source": "Beispielquelle",
"bullets": [
"Das ist ein kurzer ergänzender Punkt"
],
"figures": [
{
"unit": "",
"label": "Beispielwert",
"value": 1250,
"direction": "up"
}
],
"subline": "Das ist eine zweite Zeile mit etwas mehr Details",
"headline": "Das ist die Überschrift des Clips"
},
"metaData": {
"title": "Das ist der Titel des Beitrags",
"hashtags": [
"beispiel",
"reelwire"
],
"captionLong": "Das ist der lange Text, für YouTube und den Facebook-Feed. Er erscheint neben dem Clip und wird nie auf ihm gezeigt. Er hat Platz für die ganze Geschichte: was der Clip zeigt, warum er zählt und wo man mehr dazu lesen kann. Ein längerer Text passt zu den Plattformen, die eine Beschreibung unter dem Video statt daneben zeigen.",
"captionShort": "Das ist der kurze Text, für Telegram. Er erscheint neben dem Clip und wird nie auf ihm gezeigt.",
"captionMedium": "Das ist der mittlere Text, für Instagram, TikTok, Facebook Reels und LinkedIn. Er erscheint neben dem Clip und wird nie auf ihm gezeigt. Er hat Platz für einen zweiten Gedanken: was der Clip zeigt und warum er für die Menschen zählt, die diesem Konto folgen."
}
},
"es": {
"clipData": {
"images": [
{
"alt": "Imagen de ejemplo, PNG",
"url": "media://example-image.png"
},
{
"alt": "Imagen de ejemplo, JPEG",
"url": "media://example-image.jpg"
},
{
"alt": "Imagen de ejemplo, SVG",
"url": "media://example-image.svg"
}
],
"source": "Fuente de ejemplo",
"bullets": [
"Este es un breve punto de apoyo"
],
"figures": [
{
"unit": "",
"label": "Cifra de ejemplo",
"value": 1250,
"direction": "up"
}
],
"subline": "Esta es una segunda línea con algo más de detalle",
"headline": "Este es el titular del clip"
},
"metaData": {
"title": "Este es el título de la publicación",
"hashtags": [
"ejemplo",
"reelwire"
],
"captionLong": "Este es el texto largo, para YouTube y el feed de Facebook. Se publica junto al clip y nunca aparece en él. Tiene espacio para toda la historia: lo que muestra el clip, por qué importa y dónde leer más. Un texto más largo encaja con las plataformas que muestran la descripción debajo del vídeo en lugar de a su lado.",
"captionShort": "Este es el texto corto, para Telegram. Se publica junto al clip y nunca aparece en él.",
"captionMedium": "Este es el texto medio, para Instagram, TikTok, Facebook Reels y LinkedIn. Se publica junto al clip y nunca aparece en él. Tiene espacio para una segunda idea: lo que muestra el clip y por qué importa a quienes siguen esta cuenta."
}
}
}
}
}
feedId names this feed and never changes, even when the feed is renamed. eventId is set once
per event, so an event delivered twice is published once. occurredAt is when it happened, which
is what the freshness limit is measured from.