Real estate (Estate agents and realtors), Buy or rent 1.0.0
| Template | Real estate (Estate agents and realtors), tpl_7b86c0b39c0e |
|---|---|
| Variant | Buy or rent |
| Version | 1.0.0, the newest: what a channel following this variant draws |
| Shapes | 9x16, 4x5, 1x1, 16x9, 2x3 |
| Length | 18 seconds |
Example video
The 1x1 cut of this version, drawn from its own worked example. Open the video on its own.
What it accepts
Buy or rent as a magazine's page: the monthly cost of buying and of renting the same home side by side, up to four costs each on dotted leaders with their total, complete on the first frame; then the break-even year as the big figure, a summary, the agent's byline and the button. The assumptions and the licence stay on screen throughout. Eighteen seconds. metaData is never drawn.
| Field | Type | Required | Limit | What it is |
|---|---|---|---|---|
clipData | group | yes | Clip data: Everything drawn in the clip: the issue line, the headline, the home and its price, the photo, both sides' costs and totals, the break-even figure, the assumptions, the call to action, the licence and the disclosure. | |
clipData.issue | group | Issue line: The line under the masthead, in small capitals: the section, the date and the office. A part left out is not drawn. | ||
clipData.issue.section | text | up to 28 characters | Section: The name of the feature, set in your brand colour, such as Buy or rent. | |
clipData.issue.date | text | up to 32 characters | Date: The date or the issue, written as you want it read, such as 15 October 2026. | |
clipData.issue.agency | text | up to 44 characters | Office: The agency or the office, such as Albrecht Immobilien, Schwabing. | |
clipData.headline | text | yes | up to 72 characters | Headline: The page's headline, such as Buy or rent the same flat? The monthly cost, side by side. |
clipData.home | text | yes | up to 120 characters | The home: The home both sides are for, in a sentence, set under the headline. |
clipData.photo | image | media:// file from the media library, alt text up to 120 characters | Photo: A photo of the home, any shape, with its description as alt text. Shown with the headline where there is room. | |
clipData.priceLabel | text | up to 24 characters | Price label: The words before the home's price, such as Purchase price. | |
clipData.price | number | from 0, 2 decimals | Price: The home's purchase price, as a number in the currency below. Left out, no price is shown. | |
clipData.currency | text | yes | up to 3 characters | Currency: The currency of every figure, as a three-letter code, such as EUR, GBP or USD. |
clipData.per | text | up to 20 characters | Period: After each total, such as per month or a month. | |
clipData.buying | group | yes | Buying: The monthly costs of owning the home. | |
clipData.buying.label | text | yes | up to 20 characters | Name: What this side is called, such as Buying or Renting. |
clipData.buying.lines | list | yes | at least 1, up to 4 | Monthly costs: One to four costs a month, in the currency above. The clip adds them up for this side's total and works out nothing else. |
clipData.buying.lines[] | group | Cost | ||
clipData.buying.lines[].label | text | yes | up to 32 characters | Cost: What the cost is, such as Mortgage payment, Rent or Service charge. |
clipData.buying.lines[].amount | number | yes | from 0, 2 decimals | Amount: What it costs a month, as a number in the currency above. |
clipData.renting | group | yes | Renting: The monthly costs of renting the same home. | |
clipData.renting.label | text | yes | up to 20 characters | Name: What this side is called, such as Buying or Renting. |
clipData.renting.lines | list | yes | at least 1, up to 4 | Monthly costs: One to four costs a month, in the currency above. The clip adds them up for this side's total and works out nothing else. |
clipData.renting.lines[] | group | Cost | ||
clipData.renting.lines[].label | text | yes | up to 32 characters | Cost: What the cost is, such as Mortgage payment, Rent or Service charge. |
clipData.renting.lines[].amount | number | yes | from 0, 2 decimals | Amount: What it costs a month, as a number in the currency above. |
clipData.totalLabel | text | up to 24 characters | Total label: Over each side's total, such as Each month in all. | |
clipData.breakEven | group | yes | Break-even: When buying comes out ahead of renting, as your own calculation finds it: the clip's big figure. | |
clipData.breakEven.label | text | yes | up to 64 characters | Label: The words over the figure, such as Buying costs less than renting after. |
clipData.breakEven.value | number | yes | from 0, 1 decimals | Figure: How long until buying comes out ahead, as a number, such as 12. |
clipData.breakEven.unit | text | up to 16 characters | Unit: After the figure, such as years. | |
clipData.breakEven.note | text | up to 120 characters | Note: A sentence under the figure saying what it means, never advice. | |
clipData.assumptions | text | yes | up to 240 characters | Assumptions: What the comparison assumes, on every frame under the figures: the deposit, the rate and its term, how rents and prices change, the costs of buying. A comparison, never advice. |
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.licence | text | yes | up to 200 characters | Licence: The agency's licence or registration line, as the law where you advertise asks for it, set in the imprint on every frame. |
clipData.disclosure | text | up to 300 characters | Disclosure: Any further statements, shown under the licence from the first frame to the last. A long one is set smaller, never cut. | |
clipData.look | group | Look: How the clip looks and moves. The same six switches in every format (theme, pace, corners, alignment, logo, logo size). Leave any out for the package's default: the brand's colours, calm, square 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": {
"issue": {
"type": "object",
"properties": {
"section": {
"type": "string",
"maxLength": 28,
"title": "Section",
"description": "The name of the feature, set in your brand colour, such as Buy or rent."
},
"date": {
"type": "string",
"maxLength": 32,
"title": "Date",
"description": "The date or the issue, written as you want it read, such as 15 October 2026."
},
"agency": {
"type": "string",
"maxLength": 44,
"title": "Office",
"description": "The agency or the office, such as Albrecht Immobilien, Schwabing."
}
},
"additionalProperties": false,
"title": "Issue line",
"description": "The line under the masthead, in small capitals: the section, the date and the office. A part left out is not drawn."
},
"headline": {
"type": "string",
"maxLength": 72,
"title": "Headline",
"description": "The page's headline, such as Buy or rent the same flat? The monthly cost, side by side."
},
"home": {
"type": "string",
"maxLength": 120,
"title": "The home",
"description": "The home both sides are for, in a sentence, set under the headline."
},
"photo": {
"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": "Photo",
"description": "A photo of the home, any shape, with its description as alt text. Shown with the headline where there is room."
},
"priceLabel": {
"type": "string",
"maxLength": 24,
"title": "Price label",
"description": "The words before the home's price, such as Purchase price."
},
"price": {
"type": "number",
"minimum": 0,
"title": "Price",
"description": "The home's purchase price, as a number in the currency below. Left out, no price is shown."
},
"currency": {
"type": "string",
"maxLength": 3,
"title": "Currency",
"description": "The currency of every figure, as a three-letter code, such as EUR, GBP or USD."
},
"per": {
"type": "string",
"maxLength": 20,
"title": "Period",
"description": "After each total, such as per month or a month."
},
"buying": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 20,
"title": "Name",
"description": "What this side is called, such as Buying or Renting."
},
"lines": {
"type": "array",
"items": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 32,
"title": "Cost",
"description": "What the cost is, such as Mortgage payment, Rent or Service charge."
},
"amount": {
"type": "number",
"minimum": 0,
"title": "Amount",
"description": "What it costs a month, as a number in the currency above."
}
},
"required": [
"label",
"amount"
],
"additionalProperties": false,
"title": "Cost"
},
"minItems": 1,
"maxItems": 4,
"title": "Monthly costs",
"description": "One to four costs a month, in the currency above. The clip adds them up for this side's total and works out nothing else."
}
},
"required": [
"label",
"lines"
],
"additionalProperties": false,
"title": "Buying",
"description": "The monthly costs of owning the home."
},
"renting": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 20,
"title": "Name",
"description": "What this side is called, such as Buying or Renting."
},
"lines": {
"type": "array",
"items": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 32,
"title": "Cost",
"description": "What the cost is, such as Mortgage payment, Rent or Service charge."
},
"amount": {
"type": "number",
"minimum": 0,
"title": "Amount",
"description": "What it costs a month, as a number in the currency above."
}
},
"required": [
"label",
"amount"
],
"additionalProperties": false,
"title": "Cost"
},
"minItems": 1,
"maxItems": 4,
"title": "Monthly costs",
"description": "One to four costs a month, in the currency above. The clip adds them up for this side's total and works out nothing else."
}
},
"required": [
"label",
"lines"
],
"additionalProperties": false,
"title": "Renting",
"description": "The monthly costs of renting the same home."
},
"totalLabel": {
"type": "string",
"maxLength": 24,
"title": "Total label",
"description": "Over each side's total, such as Each month in all."
},
"breakEven": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 64,
"title": "Label",
"description": "The words over the figure, such as Buying costs less than renting after."
},
"value": {
"type": "number",
"minimum": 0,
"title": "Figure",
"description": "How long until buying comes out ahead, as a number, such as 12."
},
"unit": {
"type": "string",
"maxLength": 16,
"title": "Unit",
"description": "After the figure, such as years."
},
"note": {
"type": "string",
"maxLength": 120,
"title": "Note",
"description": "A sentence under the figure saying what it means, never advice."
}
},
"required": [
"label",
"value"
],
"additionalProperties": false,
"title": "Break-even",
"description": "When buying comes out ahead of renting, as your own calculation finds it: the clip's big figure."
},
"assumptions": {
"type": "string",
"maxLength": 240,
"title": "Assumptions",
"description": "What the comparison assumes, on every frame under the figures: the deposit, the rate and its term, how rents and prices change, the costs of buying. A comparison, never advice."
},
"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."
},
"licence": {
"type": "string",
"maxLength": 200,
"title": "Licence",
"description": "The agency's licence or registration line, as the law where you advertise asks for it, set in the imprint on every frame."
},
"disclosure": {
"type": "string",
"maxLength": 300,
"title": "Disclosure",
"description": "Any further statements, shown under the licence from the first frame to the last. A long one is set smaller, never cut."
},
"look": {
"type": "object",
"properties": {
"theme": {
"type": "string",
"enum": [
"brand",
"light",
"dark",
"bold"
],
"title": "Theme",
"description": "Brand: your brand's own colours and background. Light or dark: a page tinted with your brand colour. Bold: your brand colour as the page.",
"enumNames": [
"Brand colours",
"Light",
"Dark",
"Bold brand colour"
]
},
"pace": {
"type": "string",
"enum": [
"calm",
"standard",
"punchy"
],
"title": "Pace",
"description": "How things arrive: calm fades, a standard rhythm, or punchy slams and hard cuts.",
"enumNames": [
"Calm",
"Standard",
"Punchy"
]
},
"corners": {
"type": "string",
"enum": [
"square",
"soft",
"round"
],
"title": "Corners",
"description": "The shape of cards, pictures and buttons.",
"enumNames": [
"Square",
"Softly rounded",
"Round"
]
},
"align": {
"type": "string",
"enum": [
"start",
"centre"
],
"title": "Text alignment",
"description": "Where the text lines up.",
"enumNames": [
"At the start of the line",
"Centred"
]
},
"logo": {
"type": "string",
"enum": [
"auto",
"free"
],
"title": "Logo",
"description": "The style's own: the logo on a small plate so it reads on any page. As it is: the logo whole, with no plate, frame or crop, for a logo made to stand on the page, such as one with a transparent background. As it is, make sure your logo reads on the page of the theme you choose.",
"enumNames": [
"The style's own",
"As it is, no plate or crop"
]
},
"logoSize": {
"type": "string",
"enum": [
"auto",
"small",
"large"
],
"title": "Logo size",
"description": "Standard is the style's own size. Small draws the logo a fifth smaller, with its plate. Large draws it a quarter larger wherever the style has room for it, and at the standard size where it has none.",
"enumNames": [
"Standard",
"Small",
"Large"
]
}
},
"additionalProperties": false,
"title": "Look",
"description": "How the clip looks and moves. The same six switches in every format (theme, pace, corners, alignment, logo, logo size). Leave any out for the package's default: the brand's colours, calm, square corners, text at the start."
}
},
"required": [
"headline",
"home",
"currency",
"buying",
"renting",
"breakEven",
"assumptions",
"licence"
],
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the issue line, the headline, the home and its price, the photo, both sides' costs and totals, the break-even figure, the assumptions, the call to action, the licence and the disclosure."
},
"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": {
"issue": {
"type": "object",
"properties": {
"section": {
"type": "string",
"maxLength": 28,
"title": "Section",
"description": "The name of the feature, set in your brand colour, such as Buy or rent."
},
"date": {
"type": "string",
"maxLength": 32,
"title": "Date",
"description": "The date or the issue, written as you want it read, such as 15 October 2026."
},
"agency": {
"type": "string",
"maxLength": 44,
"title": "Office",
"description": "The agency or the office, such as Albrecht Immobilien, Schwabing."
}
},
"additionalProperties": false,
"title": "Issue line",
"description": "The line under the masthead, in small capitals: the section, the date and the office. A part left out is not drawn."
},
"headline": {
"type": "string",
"maxLength": 72,
"title": "Headline",
"description": "The page's headline, such as Buy or rent the same flat? The monthly cost, side by side."
},
"home": {
"type": "string",
"maxLength": 120,
"title": "The home",
"description": "The home both sides are for, in a sentence, set under the headline."
},
"photo": {
"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": "Photo",
"description": "A photo of the home, any shape, with its description as alt text. Shown with the headline where there is room."
},
"priceLabel": {
"type": "string",
"maxLength": 24,
"title": "Price label",
"description": "The words before the home's price, such as Purchase price."
},
"price": {
"type": "number",
"minimum": 0,
"title": "Price",
"description": "The home's purchase price, as a number in the currency below. Left out, no price is shown."
},
"currency": {
"type": "string",
"maxLength": 3,
"title": "Currency",
"description": "The currency of every figure, as a three-letter code, such as EUR, GBP or USD."
},
"per": {
"type": "string",
"maxLength": 20,
"title": "Period",
"description": "After each total, such as per month or a month."
},
"buying": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 20,
"title": "Name",
"description": "What this side is called, such as Buying or Renting."
},
"lines": {
"type": "array",
"items": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 32,
"title": "Cost",
"description": "What the cost is, such as Mortgage payment, Rent or Service charge."
},
"amount": {
"type": "number",
"minimum": 0,
"title": "Amount",
"description": "What it costs a month, as a number in the currency above."
}
},
"required": [
"label",
"amount"
],
"additionalProperties": false,
"title": "Cost"
},
"minItems": 1,
"maxItems": 4,
"title": "Monthly costs",
"description": "One to four costs a month, in the currency above. The clip adds them up for this side's total and works out nothing else."
}
},
"additionalProperties": false,
"title": "Buying",
"description": "The monthly costs of owning the home."
},
"renting": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 20,
"title": "Name",
"description": "What this side is called, such as Buying or Renting."
},
"lines": {
"type": "array",
"items": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 32,
"title": "Cost",
"description": "What the cost is, such as Mortgage payment, Rent or Service charge."
},
"amount": {
"type": "number",
"minimum": 0,
"title": "Amount",
"description": "What it costs a month, as a number in the currency above."
}
},
"required": [
"label",
"amount"
],
"additionalProperties": false,
"title": "Cost"
},
"minItems": 1,
"maxItems": 4,
"title": "Monthly costs",
"description": "One to four costs a month, in the currency above. The clip adds them up for this side's total and works out nothing else."
}
},
"additionalProperties": false,
"title": "Renting",
"description": "The monthly costs of renting the same home."
},
"totalLabel": {
"type": "string",
"maxLength": 24,
"title": "Total label",
"description": "Over each side's total, such as Each month in all."
},
"breakEven": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 64,
"title": "Label",
"description": "The words over the figure, such as Buying costs less than renting after."
},
"value": {
"type": "number",
"minimum": 0,
"title": "Figure",
"description": "How long until buying comes out ahead, as a number, such as 12."
},
"unit": {
"type": "string",
"maxLength": 16,
"title": "Unit",
"description": "After the figure, such as years."
},
"note": {
"type": "string",
"maxLength": 120,
"title": "Note",
"description": "A sentence under the figure saying what it means, never advice."
}
},
"additionalProperties": false,
"title": "Break-even",
"description": "When buying comes out ahead of renting, as your own calculation finds it: the clip's big figure."
},
"assumptions": {
"type": "string",
"maxLength": 240,
"title": "Assumptions",
"description": "What the comparison assumes, on every frame under the figures: the deposit, the rate and its term, how rents and prices change, the costs of buying. A comparison, never advice."
},
"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."
},
"licence": {
"type": "string",
"maxLength": 200,
"title": "Licence",
"description": "The agency's licence or registration line, as the law where you advertise asks for it, set in the imprint on every frame."
},
"disclosure": {
"type": "string",
"maxLength": 300,
"title": "Disclosure",
"description": "Any further statements, shown under the licence from the first frame to the last. A long one is set smaller, never cut."
},
"look": {
"type": "object",
"properties": {
"theme": {
"type": "string",
"enum": [
"brand",
"light",
"dark",
"bold"
],
"title": "Theme",
"description": "Brand: your brand's own colours and background. Light or dark: a page tinted with your brand colour. Bold: your brand colour as the page.",
"enumNames": [
"Brand colours",
"Light",
"Dark",
"Bold brand colour"
]
},
"pace": {
"type": "string",
"enum": [
"calm",
"standard",
"punchy"
],
"title": "Pace",
"description": "How things arrive: calm fades, a standard rhythm, or punchy slams and hard cuts.",
"enumNames": [
"Calm",
"Standard",
"Punchy"
]
},
"corners": {
"type": "string",
"enum": [
"square",
"soft",
"round"
],
"title": "Corners",
"description": "The shape of cards, pictures and buttons.",
"enumNames": [
"Square",
"Softly rounded",
"Round"
]
},
"align": {
"type": "string",
"enum": [
"start",
"centre"
],
"title": "Text alignment",
"description": "Where the text lines up.",
"enumNames": [
"At the start of the line",
"Centred"
]
},
"logo": {
"type": "string",
"enum": [
"auto",
"free"
],
"title": "Logo",
"description": "The style's own: the logo on a small plate so it reads on any page. As it is: the logo whole, with no plate, frame or crop, for a logo made to stand on the page, such as one with a transparent background. As it is, make sure your logo reads on the page of the theme you choose.",
"enumNames": [
"The style's own",
"As it is, no plate or crop"
]
},
"logoSize": {
"type": "string",
"enum": [
"auto",
"small",
"large"
],
"title": "Logo size",
"description": "Standard is the style's own size. Small draws the logo a fifth smaller, with its plate. Large draws it a quarter larger wherever the style has room for it, and at the standard size where it has none.",
"enumNames": [
"Standard",
"Small",
"Large"
]
}
},
"additionalProperties": false,
"title": "Look",
"description": "How the clip looks and moves. The same six switches in every format (theme, pace, corners, alignment, logo, logo size). Leave any out for the package's default: the brand's colours, calm, square corners, text at the start."
}
},
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the issue line, the headline, the home and its price, the photo, both sides' costs and totals, the break-even figure, the assumptions, the call to action, the licence and the disclosure."
},
"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_7b86c0b39c0e?variant=Buy%20or%20rent&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": {
"issue": {
"date": "15 October 2026",
"agency": "Albrecht Immobilien, Schwabing",
"section": "Buy or rent"
},
"headline": "Buy or rent the same flat? What each costs a month",
"home": "The same two-room flat of 68 m² in Maxvorstadt, bought with a mortgage or rented from its owner.",
"photo": {
"alt": "Soft waves of blue, violet and orange",
"url": "media://example-image.jpg"
},
"priceLabel": "Purchase price",
"price": 620000,
"currency": "EUR",
"per": "per month",
"buying": {
"label": "Buying",
"lines": [
{
"label": "Mortgage payment",
"amount": 2090
},
{
"label": "Service charge",
"amount": 260
},
{
"label": "Maintenance reserve",
"amount": 110
},
{
"label": "Property tax",
"amount": 25
}
]
},
"renting": {
"label": "Renting",
"lines": [
{
"label": "Rent",
"amount": 1780
},
{
"label": "Service charges",
"amount": 240
},
{
"label": "Contents insurance",
"amount": 12
}
]
},
"totalLabel": "Each month in all",
"breakEven": {
"note": "From then on, the share of the flat paid off outweighs what twelve years of rent would have cost.",
"unit": "years",
"label": "Buying costs less than renting after",
"value": 12
},
"assumptions": "Assumes a 25% deposit, a 3.5% rate fixed for 30 years, rents rising 3% and the flat's value 2% a year, and buying costs of 10% paid at the start. An illustration, not advice.",
"cta": {
"label": "Talk to us about buying",
"detail": "+49 89 5550 1234"
},
"licence": "Albrecht Immobilien GmbH, licensed under section 34c GewO by the City of Munich.",
"disclosure": "Mortgage figures are an illustration, not an offer of credit. Your bank sets the real ones.",
"look": {
"logo": "auto",
"pace": "calm",
"align": "start",
"theme": "brand",
"corners": "square",
"logoSize": "auto"
}
},
"metaData": {
"title": "Buy or rent the same flat? The monthly cost, side by side",
"captionTiny": "Buy or rent? The same Maxvorstadt flat costs 2,485 euros a month to buy and 2,032 to rent; buying comes out ahead after 12 years.",
"captionShort": "Buy or rent the same two-room flat in Maxvorstadt? Buying costs 2,485 euros a month with the mortgage, service charge, maintenance and tax; renting costs 2,032. On our assumptions, buying comes out ahead after 12 years. Every figure and assumption in the clip.",
"captionMedium": "Buy or rent? We put the same two-room flat of 68 m² in Maxvorstadt, asking 620,000 euros, side by side. Buying: a mortgage payment of 2,090 euros, a service charge of 260, a maintenance reserve of 110 and property tax of 25, so 2,485 a month. Renting: 1,780 rent, 240 service charges and 12 for contents insurance, so 2,032 a month. On our assumptions, buying costs less than renting after 12 years. The assumptions are in the clip; your own figures will differ. Talk to us.",
"captionLong": "Buy or rent the same flat? A question we hear every week, so we did the sums for one real kind of home: a two-room flat of 68 m² in Maxvorstadt, asking 620,000 euros or 1,780 euros a month to rent. Buying costs 2,485 euros a month: a mortgage payment of 2,090, a service charge of 260, a maintenance reserve of 110 and property tax of 25. Renting costs 2,032 euros a month: the rent, 240 in service charges and 12 for contents insurance. On our assumptions (a 25% deposit, a 3.5% rate fixed for 30 years, rents rising 3% and the flat's value 2% a year, buying costs of 10% paid at the start), buying costs less than renting after 12 years. It is an illustration, not advice: your bank, your deposit and your plans change the answer. Talk to us about buying or renting in Munich. Albrecht Immobilien GmbH, licensed under section 34c GewO.",
"hashtags": [
"buyorrent",
"munich",
"realestate",
"firsthome",
"property"
]
}
}
}
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.