Finance (Real estate), Just sold 1.0.0
| Template | Finance (Real estate), tpl_abd904ec6309 |
|---|---|
| Variant | Just sold |
| Version | 1.0.0, the newest: what a channel following this variant draws |
| Shapes | 9x16, 4x5, 1x1, 16x9, 2x3 |
| Length | 27 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 sale celebrated: the photo with a bold status ribbon, the headline, the price it sold for or your words, the address and up to three figures, complete on the first frame. Then the figures count up, each photo turns, the seller's words where sent, then the agent and the button. The brokerage and the disclosure stay throughout. About three seconds longer per photo. metaData is never drawn.
| Field | Type | Required | Limit | What it is |
|---|---|---|---|---|
clipData | group | yes | Clip data: Everything drawn in the clip: the status ribbon, the headline, the price or the words, the address, the figures, the photos, the seller's words, the call to action, the brokerage and the disclosure. | |
clipData.status | text | up to 24 characters | Status ribbon: The news, on a bold ribbon over the photos, such as Sold, Just sold or Sold over asking. | |
clipData.headline | text | up to 64 characters | Headline: The story of the sale in a few words, above the price. | |
clipData.address | text | yes | up to 80 characters | Address: Where it is: the street and the town, or only the area if you prefer. |
clipData.soldPrice | number | from 0, 2 decimals | Sold price: The price it sold for as a number, set large the way your language writes it, in the currency below. Leave it out to show your words instead. | |
clipData.currency | text | up to 3 characters | Currency: The price's currency as a three-letter code, such as EUR, GBP or USD. | |
clipData.soldText | text | up to 32 characters | Price in words: Shown as written where no price is sent, such as Sold above asking or Price withheld. | |
clipData.stats | list | up to 3 | Figures: Up to three figures about the sale, in the order they are shown, counted up from nought to exactly what was sent, such as the days it took or the share of the asking price. | |
clipData.stats[] | group | Figure | ||
clipData.stats[].value | number | yes | 2 decimals | Figure: The figure itself, shown exactly as sent in the channel's language. |
clipData.stats[].unit | text | up to 8 characters | Unit: What follows the figure, such as % or days. A percent sign stays on the figure. | |
clipData.stats[].label | text | up to 32 characters | What it counts: What the figure is, in a few words beside it, such as days on the market. | |
clipData.photos | list | yes | at least 1, up to 4 | Photos: The home's photos in the order they are shown, the first the cover. One to four, each adding about three seconds. |
clipData.photos[] | 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. | |
clipData.quote | text | up to 160 characters | The seller's words: What the sellers said about the sale, shown large before the end. Leave it out and the clip goes straight to the end. | |
clipData.quoteBy | text | up to 40 characters | Who said it: Who the words are from, such as the sellers' name. | |
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.brokerage | text | yes | up to 60 characters | Brokerage: Your licensed brokerage name, set prominently in the header on every frame. |
clipData.disclosure | text | up to 300 characters | Disclosure: The licence and the statements the law asks for, shown above your footer line 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, 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": {
"status": {
"type": "string",
"maxLength": 24,
"title": "Status ribbon",
"description": "The news, on a bold ribbon over the photos, such as Sold, Just sold or Sold over asking."
},
"headline": {
"type": "string",
"maxLength": 64,
"title": "Headline",
"description": "The story of the sale in a few words, above the price."
},
"address": {
"type": "string",
"maxLength": 80,
"title": "Address",
"description": "Where it is: the street and the town, or only the area if you prefer."
},
"soldPrice": {
"type": "number",
"minimum": 0,
"title": "Sold price",
"description": "The price it sold for as a number, set large the way your language writes it, in the currency below. Leave it out to show your words instead."
},
"currency": {
"type": "string",
"maxLength": 3,
"title": "Currency",
"description": "The price's currency as a three-letter code, such as EUR, GBP or USD."
},
"soldText": {
"type": "string",
"maxLength": 32,
"title": "Price in words",
"description": "Shown as written where no price is sent, such as Sold above asking or Price withheld."
},
"stats": {
"type": "array",
"items": {
"type": "object",
"properties": {
"value": {
"type": "number",
"title": "Figure",
"description": "The figure itself, shown exactly as sent in the channel's language."
},
"unit": {
"type": "string",
"maxLength": 8,
"title": "Unit",
"description": "What follows the figure, such as % or days. A percent sign stays on the figure."
},
"label": {
"type": "string",
"maxLength": 32,
"title": "What it counts",
"description": "What the figure is, in a few words beside it, such as days on the market."
}
},
"required": [
"value"
],
"additionalProperties": false,
"title": "Figure"
},
"maxItems": 3,
"title": "Figures",
"description": "Up to three figures about the sale, in the order they are shown, counted up from nought to exactly what was sent, such as the days it took or the share of the asking price."
},
"photos": {
"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": "Photo",
"description": "A photo of the home, any shape, with its description as alt text."
},
"minItems": 1,
"maxItems": 4,
"title": "Photos",
"description": "The home's photos in the order they are shown, the first the cover. One to four, each adding about three seconds."
},
"quote": {
"type": "string",
"maxLength": 160,
"title": "The seller's words",
"description": "What the sellers said about the sale, shown large before the end. Leave it out and the clip goes straight to the end."
},
"quoteBy": {
"type": "string",
"maxLength": 40,
"title": "Who said it",
"description": "Who the words are from, such as the sellers' name."
},
"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."
},
"brokerage": {
"type": "string",
"maxLength": 60,
"title": "Brokerage",
"description": "Your licensed brokerage name, set prominently in the header on every frame."
},
"disclosure": {
"type": "string",
"maxLength": 300,
"title": "Disclosure",
"description": "The licence and the statements the law asks for, shown above your footer line 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, softly rounded, text at the start."
}
},
"required": [
"address",
"photos",
"brokerage"
],
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the status ribbon, the headline, the price or the words, the address, the figures, the photos, the seller's words, the call to action, the brokerage 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": {
"status": {
"type": "string",
"maxLength": 24,
"title": "Status ribbon",
"description": "The news, on a bold ribbon over the photos, such as Sold, Just sold or Sold over asking."
},
"headline": {
"type": "string",
"maxLength": 64,
"title": "Headline",
"description": "The story of the sale in a few words, above the price."
},
"address": {
"type": "string",
"maxLength": 80,
"title": "Address",
"description": "Where it is: the street and the town, or only the area if you prefer."
},
"soldPrice": {
"type": "number",
"minimum": 0,
"title": "Sold price",
"description": "The price it sold for as a number, set large the way your language writes it, in the currency below. Leave it out to show your words instead."
},
"currency": {
"type": "string",
"maxLength": 3,
"title": "Currency",
"description": "The price's currency as a three-letter code, such as EUR, GBP or USD."
},
"soldText": {
"type": "string",
"maxLength": 32,
"title": "Price in words",
"description": "Shown as written where no price is sent, such as Sold above asking or Price withheld."
},
"stats": {
"type": "array",
"items": {
"type": "object",
"properties": {
"value": {
"type": "number",
"title": "Figure",
"description": "The figure itself, shown exactly as sent in the channel's language."
},
"unit": {
"type": "string",
"maxLength": 8,
"title": "Unit",
"description": "What follows the figure, such as % or days. A percent sign stays on the figure."
},
"label": {
"type": "string",
"maxLength": 32,
"title": "What it counts",
"description": "What the figure is, in a few words beside it, such as days on the market."
}
},
"required": [
"value"
],
"additionalProperties": false,
"title": "Figure"
},
"maxItems": 3,
"title": "Figures",
"description": "Up to three figures about the sale, in the order they are shown, counted up from nought to exactly what was sent, such as the days it took or the share of the asking price."
},
"photos": {
"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": "Photo",
"description": "A photo of the home, any shape, with its description as alt text."
},
"minItems": 1,
"maxItems": 4,
"title": "Photos",
"description": "The home's photos in the order they are shown, the first the cover. One to four, each adding about three seconds."
},
"quote": {
"type": "string",
"maxLength": 160,
"title": "The seller's words",
"description": "What the sellers said about the sale, shown large before the end. Leave it out and the clip goes straight to the end."
},
"quoteBy": {
"type": "string",
"maxLength": 40,
"title": "Who said it",
"description": "Who the words are from, such as the sellers' name."
},
"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."
},
"brokerage": {
"type": "string",
"maxLength": 60,
"title": "Brokerage",
"description": "Your licensed brokerage name, set prominently in the header on every frame."
},
"disclosure": {
"type": "string",
"maxLength": 300,
"title": "Disclosure",
"description": "The licence and the statements the law asks for, shown above your footer line 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, softly rounded, text at the start."
}
},
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the status ribbon, the headline, the price or the words, the address, the figures, the photos, the seller's words, the call to action, the brokerage 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_abd904ec6309?variant=Just%20sold&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": {
"status": "Just sold",
"headline": "Sold in 9 days, above asking",
"address": "12 Parkside Avenue, Larkspur Hill",
"soldPrice": 1287500,
"currency": "EUR",
"soldText": "",
"stats": [
{
"unit": "",
"label": "days on the market",
"value": 9
},
{
"unit": "%",
"label": "of the asking price",
"value": 103
},
{
"unit": "",
"label": "offers received",
"value": 6
}
],
"photos": [
{
"alt": "Hills and a lake under a changing sky",
"url": "media://example-image-with-animation.svg"
},
{
"alt": "Soft waves of blue, violet and orange",
"url": "media://example-image.jpg"
}
],
"quote": "We had six offers in the first week and moved on the day we hoped. Sophie made every step feel easy.",
"quoteBy": "The Hartley family, sellers",
"cta": {
"label": "Ask for a free valuation",
"detail": "+44 20 7946 0321"
},
"brokerage": "Larkspur Realty Ltd",
"disclosure": "Larkspur Realty Ltd, licence 0612345. Equal housing opportunity.",
"look": {
"logo": "auto",
"pace": "calm",
"align": "start",
"theme": "brand",
"corners": "soft",
"logoSize": "auto"
}
},
"metaData": {
"title": "Just sold: 12 Parkside Avenue, Larkspur Hill, in 9 days and above asking",
"captionTiny": "Just sold in Larkspur Hill: 9 days on the market, 103% of the asking price, 6 offers. Thinking of selling? Ask for a free valuation.",
"captionShort": "Just sold: 12 Parkside Avenue, Larkspur Hill, in nine days and above the asking price. Six offers in the first week, and the Hartley family moved on the day they hoped. Thinking of selling this year? Ask us for a free valuation and find out what your home could achieve.",
"captionMedium": "Just sold: 12 Parkside Avenue, Larkspur Hill, after only nine days on the market and at 103% of the asking price. The light-filled family home by the park drew six offers in the first week, and the Hartley family moved on the day they hoped. Homes like this are in demand in Larkspur Hill right now, and we have buyers waiting. Thinking of selling? Ask Sophie Laurent for a free, no-obligation valuation. Larkspur Realty Ltd, licence 0612345. Equal housing opportunity.",
"captionLong": "Just sold: 12 Parkside Avenue, Larkspur Hill, after only nine days on the market and at 103% of the asking price. The light-filled family home by the park, with its south-facing garden and open-plan kitchen, drew six offers in the first week, and the Hartley family moved on the day they hoped. \"We had six offers in the first week and moved on the day we hoped. Sophie made every step feel easy.\" Homes like this are in demand in Larkspur Hill right now, and we have buyers registered and waiting for the next one. If you are thinking of selling this year, ask Sophie Laurent, our listing agent, for a free, no-obligation valuation: she will tell you what your home could achieve and how to get there. Larkspur Realty Ltd, licence 0612345. Equal housing opportunity.",
"hashtags": [
"justsold",
"realestate",
"sold",
"homeseller",
"propertymarket"
]
}
}
}
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.