Real estate (Mortgage brokers), Fixed rate ending 1.0.0
| Template | Real estate (Mortgage brokers), tpl_f10c6ae64146 |
|---|---|
| Variant | Fixed rate ending |
| Version | 1.0.0, the newest: what a channel following this variant draws |
| Shapes | 9x16, 4x5, 1x1, 16x9, 2x3 |
| Length | 11 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 fixed rate's end as a chat: a buyer's question, the broker's answer and a card with the days left, counted from the post's own date to the day the rate ends, a bar of its life and the steps to take, ticked in turn. Complete on the first frame. The broker types and the last message brings the button. The legal line stays at the foot. metaData is never drawn.
| Field | Type | Required | Limit | What it is |
|---|---|---|---|---|
clipData | group | yes | Clip data: Everything drawn in the clip: the section, the post's date, the buyer's question, your answer, the card with the days left, the day the rate ends and the bar of its life, the steps, your closing message, the call to action and the legal line (and the representative example where you add one). | |
clipData.section | text | up to 32 characters | Section: A few words under your name in the bar at the top, such as Fixed rate ending or Remortgage reminder. | |
clipData.postedAt | datetime | yes | Post's date: The date this post is dated, such as 2026-10-16T09:00:00+01:00. The days left are counted from this day to the day the rate ends, never from the day the clip is drawn, and it is shown on the date chip over the thread. Required. | |
clipData.endsAt | datetime | yes | Fixed rate ends: The day the fixed rate ends, such as 2027-01-31T23:59:00+00:00. Only its own day counts. Required. | |
clipData.startedAt | datetime | Fixed rate began: The day the fixed rate began, such as 2022-02-01T09:00:00+00:00. With it the card draws a bar of the rate's life with a dot where the post stands. Leave it out for no bar. | ||
clipData.question | group | Buyer's question: The question the post answers, as a message on the end side in your brand colour. Leave it out to start with your answer. | ||
clipData.question.text | text | up to 100 characters | Question: The words, short as a message is. | |
clipData.question.name | text | up to 32 characters | Who asks: Shown over the question, such as Sam, homeowner. Never a real client's name without their consent. | |
clipData.question.time | text | up to 12 characters | Time: The time beside the message, written as it should be shown, such as 09:41. | |
clipData.question.read | boolean | Read tick: Shows a tick beside the time, the question read. | ||
clipData.answer | group | Your answer: Your reply before the card, on the start side beside your presenter's picture, under their name and role. Leave it out to share the card alone. | ||
clipData.answer.text | text | up to 160 characters | Answer: Your words, short as a message is. Never promise a rate or a saving: rates depend on the homeowner's circumstances. | |
clipData.answer.time | text | up to 12 characters | Time: The time beside your message, such as 09:42. | |
clipData.card | group | yes | Countdown card: The card you share in the thread: its title and the words around the days left. | |
clipData.card.title | text | up to 40 characters | Title: The card's title in its header strip, such as Your fixed rate. | |
clipData.card.daysLabel | text | up to 24 characters | Days caption: Beside the days left, such as days to go. Write it for the number shown: it is drawn as sent. | |
clipData.card.endsLabel | text | up to 32 characters | Ends caption: Over the day the rate ends, such as Your fixed rate ends on. | |
clipData.steps | list | yes | at least 1, up to 5 | What to do: One to five things to do, in the order they are shown, each with the moment it belongs to, each read and ticked in turn, adding a second each. Promise nothing: no step says a rate or a saving. |
clipData.steps[] | group | Step | ||
clipData.steps[].when | text | up to 28 characters | When: The moment it belongs to, such as Six months before. | |
clipData.steps[].text | text | yes | up to 70 characters | Step: What to do, such as Ask me for a review of your options. |
clipData.closing | text | up to 100 characters | Closing message: Your last message, over the button, such as Want me to review your options? | |
clipData.cta | group | Call to action: The button at the end and the line under it, such as a web address, a handle or a phone number. | ||
clipData.cta.label | text | yes | up to 28 characters | Button: What the button says. |
clipData.cta.detail | text | up to 48 characters | Line under it: An address, a handle, an app, a phone number. | |
clipData.representative | text | up to 320 characters | Representative example: Leave it out unless your post names a rate or a cost: then the rules where you advertise ask for the representative example, and it is shown at the foot of every frame in the strong weight, set smaller rather than cut. Nothing in this clip shows a rate by itself. | |
clipData.legal | text | yes | up to 300 characters | Legal line: Who you are and who regulates you, with your number, and the risk warning your market asks for, such as Your home may be repossessed if you do not keep up repayments on your mortgage. Shown at the foot of every frame, set smaller rather than cut. Required. |
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, standard pace, round corners, 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": {
"section": {
"type": "string",
"maxLength": 32,
"title": "Section",
"description": "A few words under your name in the bar at the top, such as Fixed rate ending or Remortgage reminder."
},
"postedAt": {
"type": "string",
"format": "date-time",
"title": "Post's date",
"description": "The date this post is dated, such as 2026-10-16T09:00:00+01:00. The days left are counted from this day to the day the rate ends, never from the day the clip is drawn, and it is shown on the date chip over the thread. Required."
},
"endsAt": {
"type": "string",
"format": "date-time",
"title": "Fixed rate ends",
"description": "The day the fixed rate ends, such as 2027-01-31T23:59:00+00:00. Only its own day counts. Required."
},
"startedAt": {
"type": "string",
"format": "date-time",
"title": "Fixed rate began",
"description": "The day the fixed rate began, such as 2022-02-01T09:00:00+00:00. With it the card draws a bar of the rate's life with a dot where the post stands. Leave it out for no bar."
},
"question": {
"type": "object",
"properties": {
"text": {
"type": "string",
"maxLength": 100,
"title": "Question",
"description": "The words, short as a message is."
},
"name": {
"type": "string",
"maxLength": 32,
"title": "Who asks",
"description": "Shown over the question, such as Sam, homeowner. Never a real client's name without their consent."
},
"time": {
"type": "string",
"maxLength": 12,
"title": "Time",
"description": "The time beside the message, written as it should be shown, such as 09:41."
},
"read": {
"type": "boolean",
"title": "Read tick",
"description": "Shows a tick beside the time, the question read."
}
},
"additionalProperties": false,
"title": "Buyer's question",
"description": "The question the post answers, as a message on the end side in your brand colour. Leave it out to start with your answer."
},
"answer": {
"type": "object",
"properties": {
"text": {
"type": "string",
"maxLength": 160,
"title": "Answer",
"description": "Your words, short as a message is. Never promise a rate or a saving: rates depend on the homeowner's circumstances."
},
"time": {
"type": "string",
"maxLength": 12,
"title": "Time",
"description": "The time beside your message, such as 09:42."
}
},
"additionalProperties": false,
"title": "Your answer",
"description": "Your reply before the card, on the start side beside your presenter's picture, under their name and role. Leave it out to share the card alone."
},
"card": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 40,
"title": "Title",
"description": "The card's title in its header strip, such as Your fixed rate."
},
"daysLabel": {
"type": "string",
"maxLength": 24,
"title": "Days caption",
"description": "Beside the days left, such as days to go. Write it for the number shown: it is drawn as sent."
},
"endsLabel": {
"type": "string",
"maxLength": 32,
"title": "Ends caption",
"description": "Over the day the rate ends, such as Your fixed rate ends on."
}
},
"additionalProperties": false,
"title": "Countdown card",
"description": "The card you share in the thread: its title and the words around the days left."
},
"steps": {
"type": "array",
"items": {
"type": "object",
"properties": {
"when": {
"type": "string",
"maxLength": 28,
"title": "When",
"description": "The moment it belongs to, such as Six months before."
},
"text": {
"type": "string",
"maxLength": 70,
"title": "Step",
"description": "What to do, such as Ask me for a review of your options."
}
},
"required": [
"text"
],
"additionalProperties": false,
"title": "Step"
},
"minItems": 1,
"maxItems": 5,
"title": "What to do",
"description": "One to five things to do, in the order they are shown, each with the moment it belongs to, each read and ticked in turn, adding a second each. Promise nothing: no step says a rate or a saving."
},
"closing": {
"type": "string",
"maxLength": 100,
"title": "Closing message",
"description": "Your last message, over the button, such as Want me to review your options?"
},
"cta": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 28,
"title": "Button",
"description": "What the button says."
},
"detail": {
"type": "string",
"maxLength": 48,
"title": "Line under it",
"description": "An address, a handle, an app, a phone number."
}
},
"required": [
"label"
],
"additionalProperties": false,
"title": "Call to action",
"description": "The button at the end and the line under it, such as a web address, a handle or a phone number."
},
"representative": {
"type": "string",
"maxLength": 320,
"title": "Representative example",
"description": "Leave it out unless your post names a rate or a cost: then the rules where you advertise ask for the representative example, and it is shown at the foot of every frame in the strong weight, set smaller rather than cut. Nothing in this clip shows a rate by itself."
},
"legal": {
"type": "string",
"maxLength": 300,
"title": "Legal line",
"description": "Who you are and who regulates you, with your number, and the risk warning your market asks for, such as Your home may be repossessed if you do not keep up repayments on your mortgage. Shown at the foot of every frame, set smaller rather than cut. Required."
},
"look": {
"type": "object",
"properties": {
"theme": {
"type": "string",
"enum": [
"brand",
"light",
"dark",
"bold"
],
"title": "Theme",
"description": "Brand: your brand's own colours and background. Light or dark: a page tinted with your brand colour. Bold: your brand colour as the page.",
"enumNames": [
"Brand colours",
"Light",
"Dark",
"Bold brand colour"
]
},
"pace": {
"type": "string",
"enum": [
"calm",
"standard",
"punchy"
],
"title": "Pace",
"description": "How things arrive: calm fades, a standard rhythm, or punchy slams and hard cuts.",
"enumNames": [
"Calm",
"Standard",
"Punchy"
]
},
"corners": {
"type": "string",
"enum": [
"square",
"soft",
"round"
],
"title": "Corners",
"description": "The shape of cards, pictures and buttons.",
"enumNames": [
"Square",
"Softly rounded",
"Round"
]
},
"align": {
"type": "string",
"enum": [
"start",
"centre"
],
"title": "Text alignment",
"description": "Where the text lines up.",
"enumNames": [
"At the start of the line",
"Centred"
]
},
"logo": {
"type": "string",
"enum": [
"auto",
"free"
],
"title": "Logo",
"description": "The style's own: the logo on a small plate so it reads on any page. As it is: the logo whole, with no plate, frame or crop, for a logo made to stand on the page, such as one with a transparent background. As it is, make sure your logo reads on the page of the theme you choose.",
"enumNames": [
"The style's own",
"As it is, no plate or crop"
]
},
"logoSize": {
"type": "string",
"enum": [
"auto",
"small",
"large"
],
"title": "Logo size",
"description": "Standard is the style's own size. Small draws the logo a fifth smaller, with its plate. Large draws it a quarter larger wherever the style has room for it, and at the standard size where it has none.",
"enumNames": [
"Standard",
"Small",
"Large"
]
}
},
"additionalProperties": false,
"title": "Look",
"description": "How the clip looks and moves. The same six switches in every format (theme, pace, corners, alignment, logo, logo size). Leave any out for the package's default: the brand's colours, standard pace, round corners, text at the start."
}
},
"required": [
"postedAt",
"endsAt",
"card",
"steps",
"legal"
],
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the section, the post's date, the buyer's question, your answer, the card with the days left, the day the rate ends and the bar of its life, the steps, your closing message, the call to action and the legal line (and the representative example where you add one)."
},
"metaData": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 100,
"title": "Title",
"description": "Used where the platform has a title of its own: Facebook Feed, LinkedIn, Pinterest and YouTube. Up to 100 characters, which every one of them takes."
},
"captionTiny": {
"type": "string",
"maxLength": 200,
"title": "Tiny description (Pinterest, Threads, X)",
"description": "Up to 200 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"captionShort": {
"type": "string",
"maxLength": 500,
"title": "Short description (Telegram, Threema, WeChat, WhatsApp)",
"description": "Up to 500 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"captionMedium": {
"type": "string",
"maxLength": 1500,
"title": "Medium description (Discord, Facebook Reels, Instagram, LinkedIn, Signal, Slack, TikTok)",
"description": "Up to 1500 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"captionLong": {
"type": "string",
"maxLength": 4000,
"title": "Long description (Facebook Feed, YouTube)",
"description": "Up to 4000 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"hashtags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60,
"title": "Hashtag"
},
"maxItems": 15,
"title": "Hashtags",
"description": "Written without the #. Up to 15, which every platform takes."
}
},
"additionalProperties": false,
"title": "Meta data",
"description": "Everything about the post that is never drawn in the clip: its title, its description in four lengths, one per kind of platform, and its hashtags. Reelwire adds the brand's description, link and hashtags after it. Left out, the post text is generated from the clip data."
},
"locales": {
"type": "object",
"additionalProperties": {
"type": "object",
"properties": {
"clipData": {
"type": "object",
"properties": {
"section": {
"type": "string",
"maxLength": 32,
"title": "Section",
"description": "A few words under your name in the bar at the top, such as Fixed rate ending or Remortgage reminder."
},
"postedAt": {
"type": "string",
"format": "date-time",
"title": "Post's date",
"description": "The date this post is dated, such as 2026-10-16T09:00:00+01:00. The days left are counted from this day to the day the rate ends, never from the day the clip is drawn, and it is shown on the date chip over the thread. Required."
},
"endsAt": {
"type": "string",
"format": "date-time",
"title": "Fixed rate ends",
"description": "The day the fixed rate ends, such as 2027-01-31T23:59:00+00:00. Only its own day counts. Required."
},
"startedAt": {
"type": "string",
"format": "date-time",
"title": "Fixed rate began",
"description": "The day the fixed rate began, such as 2022-02-01T09:00:00+00:00. With it the card draws a bar of the rate's life with a dot where the post stands. Leave it out for no bar."
},
"question": {
"type": "object",
"properties": {
"text": {
"type": "string",
"maxLength": 100,
"title": "Question",
"description": "The words, short as a message is."
},
"name": {
"type": "string",
"maxLength": 32,
"title": "Who asks",
"description": "Shown over the question, such as Sam, homeowner. Never a real client's name without their consent."
},
"time": {
"type": "string",
"maxLength": 12,
"title": "Time",
"description": "The time beside the message, written as it should be shown, such as 09:41."
},
"read": {
"type": "boolean",
"title": "Read tick",
"description": "Shows a tick beside the time, the question read."
}
},
"additionalProperties": false,
"title": "Buyer's question",
"description": "The question the post answers, as a message on the end side in your brand colour. Leave it out to start with your answer."
},
"answer": {
"type": "object",
"properties": {
"text": {
"type": "string",
"maxLength": 160,
"title": "Answer",
"description": "Your words, short as a message is. Never promise a rate or a saving: rates depend on the homeowner's circumstances."
},
"time": {
"type": "string",
"maxLength": 12,
"title": "Time",
"description": "The time beside your message, such as 09:42."
}
},
"additionalProperties": false,
"title": "Your answer",
"description": "Your reply before the card, on the start side beside your presenter's picture, under their name and role. Leave it out to share the card alone."
},
"card": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 40,
"title": "Title",
"description": "The card's title in its header strip, such as Your fixed rate."
},
"daysLabel": {
"type": "string",
"maxLength": 24,
"title": "Days caption",
"description": "Beside the days left, such as days to go. Write it for the number shown: it is drawn as sent."
},
"endsLabel": {
"type": "string",
"maxLength": 32,
"title": "Ends caption",
"description": "Over the day the rate ends, such as Your fixed rate ends on."
}
},
"additionalProperties": false,
"title": "Countdown card",
"description": "The card you share in the thread: its title and the words around the days left."
},
"steps": {
"type": "array",
"items": {
"type": "object",
"properties": {
"when": {
"type": "string",
"maxLength": 28,
"title": "When",
"description": "The moment it belongs to, such as Six months before."
},
"text": {
"type": "string",
"maxLength": 70,
"title": "Step",
"description": "What to do, such as Ask me for a review of your options."
}
},
"required": [
"text"
],
"additionalProperties": false,
"title": "Step"
},
"minItems": 1,
"maxItems": 5,
"title": "What to do",
"description": "One to five things to do, in the order they are shown, each with the moment it belongs to, each read and ticked in turn, adding a second each. Promise nothing: no step says a rate or a saving."
},
"closing": {
"type": "string",
"maxLength": 100,
"title": "Closing message",
"description": "Your last message, over the button, such as Want me to review your options?"
},
"cta": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 28,
"title": "Button",
"description": "What the button says."
},
"detail": {
"type": "string",
"maxLength": 48,
"title": "Line under it",
"description": "An address, a handle, an app, a phone number."
}
},
"additionalProperties": false,
"title": "Call to action",
"description": "The button at the end and the line under it, such as a web address, a handle or a phone number."
},
"representative": {
"type": "string",
"maxLength": 320,
"title": "Representative example",
"description": "Leave it out unless your post names a rate or a cost: then the rules where you advertise ask for the representative example, and it is shown at the foot of every frame in the strong weight, set smaller rather than cut. Nothing in this clip shows a rate by itself."
},
"legal": {
"type": "string",
"maxLength": 300,
"title": "Legal line",
"description": "Who you are and who regulates you, with your number, and the risk warning your market asks for, such as Your home may be repossessed if you do not keep up repayments on your mortgage. Shown at the foot of every frame, set smaller rather than cut. Required."
},
"look": {
"type": "object",
"properties": {
"theme": {
"type": "string",
"enum": [
"brand",
"light",
"dark",
"bold"
],
"title": "Theme",
"description": "Brand: your brand's own colours and background. Light or dark: a page tinted with your brand colour. Bold: your brand colour as the page.",
"enumNames": [
"Brand colours",
"Light",
"Dark",
"Bold brand colour"
]
},
"pace": {
"type": "string",
"enum": [
"calm",
"standard",
"punchy"
],
"title": "Pace",
"description": "How things arrive: calm fades, a standard rhythm, or punchy slams and hard cuts.",
"enumNames": [
"Calm",
"Standard",
"Punchy"
]
},
"corners": {
"type": "string",
"enum": [
"square",
"soft",
"round"
],
"title": "Corners",
"description": "The shape of cards, pictures and buttons.",
"enumNames": [
"Square",
"Softly rounded",
"Round"
]
},
"align": {
"type": "string",
"enum": [
"start",
"centre"
],
"title": "Text alignment",
"description": "Where the text lines up.",
"enumNames": [
"At the start of the line",
"Centred"
]
},
"logo": {
"type": "string",
"enum": [
"auto",
"free"
],
"title": "Logo",
"description": "The style's own: the logo on a small plate so it reads on any page. As it is: the logo whole, with no plate, frame or crop, for a logo made to stand on the page, such as one with a transparent background. As it is, make sure your logo reads on the page of the theme you choose.",
"enumNames": [
"The style's own",
"As it is, no plate or crop"
]
},
"logoSize": {
"type": "string",
"enum": [
"auto",
"small",
"large"
],
"title": "Logo size",
"description": "Standard is the style's own size. Small draws the logo a fifth smaller, with its plate. Large draws it a quarter larger wherever the style has room for it, and at the standard size where it has none.",
"enumNames": [
"Standard",
"Small",
"Large"
]
}
},
"additionalProperties": false,
"title": "Look",
"description": "How the clip looks and moves. The same six switches in every format (theme, pace, corners, alignment, logo, logo size). Leave any out for the package's default: the brand's colours, standard pace, round corners, text at the start."
}
},
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the section, the post's date, the buyer's question, your answer, the card with the days left, the day the rate ends and the bar of its life, the steps, your closing message, the call to action and the legal line (and the representative example where you add one)."
},
"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_f10c6ae64146?variant=Fixed%20rate%20ending&version=1.0.0"
Delivery JSON
Your own system sends this to one of your streams, POST /v1/stream, and every channel listening to
that stream draws it with its template. data is the document described above; a stream with an
empty field map passes it to the template unchanged. Try it first on POST /v1/stream/validate,
which answers the same without publishing anything. Streams and feeds
explains the rest, including how to map a document of your own shape instead.
{
"streamId": "st_your_stream_id",
"eventId": "01M2SQMKK3G1NVFXV31DCBVB95",
"occurredAt": "2026-09-23T07:00:00Z",
"locale": "en",
"data": {
"clipData": {
"section": "Fixed rate ending",
"postedAt": "2026-10-16T09:00:00+01:00",
"endsAt": "2027-01-31T23:59:00+00:00",
"startedAt": "2022-02-01T09:00:00+00:00",
"question": {
"name": "Sam, homeowner",
"read": true,
"text": "My fixed rate ends in January. What should I be doing now?",
"time": "09:41"
},
"answer": {
"text": "Start early, Sam. You can usually lock a new deal months ahead, so you never slip onto your lender's standard rate by default.",
"time": "09:42"
},
"card": {
"title": "Your fixed rate",
"daysLabel": "days to go",
"endsLabel": "Your fixed rate ends on"
},
"steps": [
{
"text": "Ask me for a review of your options",
"when": "Six months before"
},
{
"text": "Check your lender's early repayment charge, if any",
"when": "Four months before"
},
{
"text": "Lock a new deal ahead of the end date",
"when": "Three months before"
},
{
"text": "Have your latest payslips and statements ready",
"when": "One month before"
}
],
"closing": "Want me to look at your options before January?",
"cta": {
"label": "Book a free review",
"detail": "keystone.example/book or 020 7946 0321"
},
"representative": "Representative example: borrowing 200,000 over 20 years at 4.49% fixed for 5 years, then 7.49% variable for 15 years, 1,263 a month then 1,610; total amount payable 361,100. Overall cost for comparison 6.8% APRC.",
"legal": "Keystone Mortgages Ltd is authorised and regulated by the Financial Conduct Authority, FRN 123456. Your home may be repossessed if you do not keep up repayments on your mortgage.",
"look": {
"logo": "auto",
"pace": "standard",
"align": "start",
"theme": "brand",
"corners": "round",
"logoSize": "auto"
}
},
"metaData": {
"title": "Your fixed rate is ending: what to do and when",
"captionTiny": "Your fixed rate is ending? Start six months before: review your options, check any early repayment charge, lock a new deal. Your home may be repossessed if you do not keep up repayments.",
"captionShort": "Your fixed rate ends on 31 January 2027, 107 days from today. Start early: ask for a review of your options, check any early repayment charge and lock a new deal ahead of the end date. Book a free review and we will look at your options. Your home may be repossessed if you do not keep up repayments on your mortgage.",
"captionMedium": "Fixed rate ending soon? Counting from 16 October 2026, a rate that ends on 31 January 2027 has 107 days to go. Here is what to do and when: six months before, ask for a review of your options; four months before, check any early repayment charge; three months before, lock a new deal ahead of the end date; one month before, have your latest payslips and statements ready. Book a free review and we will look at your options. Your home may be repossessed if you do not keep up repayments on your mortgage.",
"captionLong": "Your fixed rate is ending: what should you be doing now? Counting from 16 October 2026, a fixed rate that ends on 31 January 2027 has 107 days to go, and when it ends most lenders move you onto their standard variable rate by default. That is why the best time to act is early. Six months before the end, ask for a review of your options. Four months before, check whether your lender charges an early repayment fee if you leave a little ahead of time. Three months before, lock a new deal ahead of the end date, so you never slip onto the standard rate. One month before, have your latest payslips and bank statements ready for the lender's checks. What is available depends on your circumstances, so book a free review and we will look at your options. Keystone Mortgages Ltd is authorised and regulated by the Financial Conduct Authority, FRN 123456. Your home may be repossessed if you do not keep up repayments on your mortgage.",
"hashtags": [
"remortgage",
"fixedrate",
"mortgage",
"homeowner",
"mortgagebroker"
]
}
}
}
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.