Skip to main content

Tech and industry (Software and SaaS), API change 1.0.0

TemplateTech and industry (Software and SaaS), tpl_fe11839b9ed7
VariantAPI change
Version1.0.0, the newest: what a channel following this variant draws
Shapes9x16, 4x5, 1x1, 16x9, 2x3
Length15 seconds

Example video​

The 1x1 cut of this version, drawn from its own worked example. Open the video on its own.

What it accepts​

An API change as a developer post in a bento of tiles: the kind of change, the API version, what changes and the date it applies on a tile of your colour, the code before and after as short blocks in your monospace face, lines broken and never cut, then up to four numbered steps and the docs address. Then the button and your presenter. 10.2 seconds, 1.6 more a step. metaData is never drawn.

FieldTypeRequiredLimitWhat it is
clipDatagroupyesClip data: Everything drawn in the clip: the section, the kind of change, the version, what changes and the date, the code before and after, the steps, the documentation's address, the call to action and the small print.
clipData.sectiontextup to 28 charactersSection: What the post is about, on a chip at the end of the header, such as Developer update or API changelog.
clipData.chiptextup to 20 charactersKind of change: On a chip with a pulsing dot above the headline, such as Breaking change, Deprecation or New endpoint.
clipData.versiontextup to 20 charactersAPI version: The API's version beside the chip in your monospace face (or your body face where your brand has none), such as v4 or 2026-11-02.
clipData.headlinetextyesup to 64 charactersWhat changes: What changes, in a few words, the headline of the post.
clipData.summarytextup to 140 charactersLine under it: What changes and why, in a sentence.
clipData.dateLabeltextup to 24 charactersBefore the date: A few words set before the date, such as Applies from or Required from.
clipData.datedatetimeyesDate it applies: The day the change applies, written under the headline in the channel's language, such as 2 November 2026, and on a chip at the end. A change always carries its date.
clipData.beforegroupyesBefore: The code as it is now, in a block tinted with your brand's down colour and marked with a minus.
clipData.before.labeltextup to 24 charactersLabel: A word over the block, such as Before or Until 2 November.
clipData.before.codetextyesup to 240 charactersCode: The code, a short request or response of up to about eight lines; each line break starts a new line and indentation is kept. A line too long for the block is broken and set a little in, never cut.
clipData.aftergroupyesAfter: The code as it will be, in a block tinted with your brand's up colour and marked with a plus. Its new lines are lit one after another.
clipData.after.labeltextup to 24 charactersLabel: A word over the block, such as Before or Until 2 November.
clipData.after.codetextyesup to 240 charactersCode: The code, a short request or response of up to about eight lines; each line break starts a new line and indentation is kept. A line too long for the block is broken and set a little in, never cut.
clipData.stepslistyesat least 1, up to 4What to do: One to four steps, each on a numbered tile, lit one after another.
clipData.steps[]textup to 120 charactersStep: One step, in a sentence.
clipData.docstextup to 64 charactersDocumentation: The address of the migration guide, on a tile under the steps.
clipData.ctagroupCall 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.labeltextyesup to 28 charactersButton: What the button says.
clipData.cta.detailtextup to 48 charactersLine under it: An address, a handle, an app, a phone number.
clipData.footnotetextup to 300 charactersSmall print: What must be said with the post, shown from the first frame to the last above your brand's footer line: how long the old version keeps working, which plans have API access, trademarks. A long one is set smaller, never cut.
clipData.lookgroupLook: 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.themeenumbrand, light, dark, boldTheme: 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.paceenumcalm, standard, punchyPace: How things arrive: calm fades, a standard rhythm, or punchy slams and hard cuts.
clipData.look.cornersenumsquare, soft, roundCorners: The shape of cards, pictures and buttons.
clipData.look.alignenumstart, centreText alignment: Where the text lines up.
clipData.look.logoenumauto, freeLogo: 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.logoSizeenumauto, small, largeLogo 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.
metaDatagroupMeta 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.titletextup to 100 charactersTitle: 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.captionTinytextup to 200 charactersTiny description (Pinterest, Threads, X): Up to 200 characters. The brand's description, link and hashtags follow it within the platform's limit.
metaData.captionShorttextup to 500 charactersShort description (Telegram, Threema, WeChat, WhatsApp): Up to 500 characters. The brand's description, link and hashtags follow it within the platform's limit.
metaData.captionMediumtextup to 1500 charactersMedium 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.captionLongtextup to 4000 charactersLong description (Facebook Feed, YouTube): Up to 4000 characters. The brand's description, link and hashtags follow it within the platform's limit.
metaData.hashtagslistup to 15Hashtags: Written without the #. Up to 15, which every platform takes.
metaData.hashtags[]textup to 60 charactersHashtag

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": 28,
"title": "Section",
"description": "What the post is about, on a chip at the end of the header, such as Developer update or API changelog."
},
"chip": {
"type": "string",
"maxLength": 20,
"title": "Kind of change",
"description": "On a chip with a pulsing dot above the headline, such as Breaking change, Deprecation or New endpoint."
},
"version": {
"type": "string",
"maxLength": 20,
"title": "API version",
"description": "The API's version beside the chip in your monospace face (or your body face where your brand has none), such as v4 or 2026-11-02."
},
"headline": {
"type": "string",
"maxLength": 64,
"title": "What changes",
"description": "What changes, in a few words, the headline of the post."
},
"summary": {
"type": "string",
"maxLength": 140,
"title": "Line under it",
"description": "What changes and why, in a sentence."
},
"dateLabel": {
"type": "string",
"maxLength": 24,
"title": "Before the date",
"description": "A few words set before the date, such as Applies from or Required from."
},
"date": {
"type": "string",
"format": "date-time",
"title": "Date it applies",
"description": "The day the change applies, written under the headline in the channel's language, such as 2 November 2026, and on a chip at the end. A change always carries its date."
},
"before": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 24,
"title": "Label",
"description": "A word over the block, such as Before or Until 2 November."
},
"code": {
"type": "string",
"maxLength": 240,
"title": "Code",
"description": "The code, a short request or response of up to about eight lines; each line break starts a new line and indentation is kept. A line too long for the block is broken and set a little in, never cut."
}
},
"required": [
"code"
],
"additionalProperties": false,
"title": "Before",
"description": "The code as it is now, in a block tinted with your brand's down colour and marked with a minus."
},
"after": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 24,
"title": "Label",
"description": "A word over the block, such as Before or Until 2 November."
},
"code": {
"type": "string",
"maxLength": 240,
"title": "Code",
"description": "The code, a short request or response of up to about eight lines; each line break starts a new line and indentation is kept. A line too long for the block is broken and set a little in, never cut."
}
},
"required": [
"code"
],
"additionalProperties": false,
"title": "After",
"description": "The code as it will be, in a block tinted with your brand's up colour and marked with a plus. Its new lines are lit one after another."
},
"steps": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120,
"title": "Step",
"description": "One step, in a sentence."
},
"minItems": 1,
"maxItems": 4,
"title": "What to do",
"description": "One to four steps, each on a numbered tile, lit one after another."
},
"docs": {
"type": "string",
"maxLength": 64,
"title": "Documentation",
"description": "The address of the migration guide, on a tile under the steps."
},
"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."
},
"footnote": {
"type": "string",
"maxLength": 300,
"title": "Small print",
"description": "What must be said with the post, shown from the first frame to the last above your brand's footer line: how long the old version keeps working, which plans have API access, trademarks. 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, standard pace, round corners, text at the start."
}
},
"required": [
"headline",
"date",
"before",
"after",
"steps"
],
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the section, the kind of change, the version, what changes and the date, the code before and after, the steps, the documentation's address, the call to action and the small print."
},
"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": 28,
"title": "Section",
"description": "What the post is about, on a chip at the end of the header, such as Developer update or API changelog."
},
"chip": {
"type": "string",
"maxLength": 20,
"title": "Kind of change",
"description": "On a chip with a pulsing dot above the headline, such as Breaking change, Deprecation or New endpoint."
},
"version": {
"type": "string",
"maxLength": 20,
"title": "API version",
"description": "The API's version beside the chip in your monospace face (or your body face where your brand has none), such as v4 or 2026-11-02."
},
"headline": {
"type": "string",
"maxLength": 64,
"title": "What changes",
"description": "What changes, in a few words, the headline of the post."
},
"summary": {
"type": "string",
"maxLength": 140,
"title": "Line under it",
"description": "What changes and why, in a sentence."
},
"dateLabel": {
"type": "string",
"maxLength": 24,
"title": "Before the date",
"description": "A few words set before the date, such as Applies from or Required from."
},
"date": {
"type": "string",
"format": "date-time",
"title": "Date it applies",
"description": "The day the change applies, written under the headline in the channel's language, such as 2 November 2026, and on a chip at the end. A change always carries its date."
},
"before": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 24,
"title": "Label",
"description": "A word over the block, such as Before or Until 2 November."
},
"code": {
"type": "string",
"maxLength": 240,
"title": "Code",
"description": "The code, a short request or response of up to about eight lines; each line break starts a new line and indentation is kept. A line too long for the block is broken and set a little in, never cut."
}
},
"additionalProperties": false,
"title": "Before",
"description": "The code as it is now, in a block tinted with your brand's down colour and marked with a minus."
},
"after": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 24,
"title": "Label",
"description": "A word over the block, such as Before or Until 2 November."
},
"code": {
"type": "string",
"maxLength": 240,
"title": "Code",
"description": "The code, a short request or response of up to about eight lines; each line break starts a new line and indentation is kept. A line too long for the block is broken and set a little in, never cut."
}
},
"additionalProperties": false,
"title": "After",
"description": "The code as it will be, in a block tinted with your brand's up colour and marked with a plus. Its new lines are lit one after another."
},
"steps": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120,
"title": "Step",
"description": "One step, in a sentence."
},
"minItems": 1,
"maxItems": 4,
"title": "What to do",
"description": "One to four steps, each on a numbered tile, lit one after another."
},
"docs": {
"type": "string",
"maxLength": 64,
"title": "Documentation",
"description": "The address of the migration guide, on a tile under the steps."
},
"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."
},
"footnote": {
"type": "string",
"maxLength": 300,
"title": "Small print",
"description": "What must be said with the post, shown from the first frame to the last above your brand's footer line: how long the old version keeps working, which plans have API access, trademarks. 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, standard pace, round corners, text at the start."
}
},
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the section, the kind of change, the version, what changes and the date, the code before and after, the steps, the documentation's address, the call to action and the small print."
},
"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_fe11839b9ed7?variant=API%20change&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": "Developer update",
"chip": "Breaking change",
"version": "API v4",
"headline": "Due dates carry their time zone",
"summary": "Every task's due date now comes with its time zone, so a deadline means the same moment for everyone.",
"dateLabel": "Applies from",
"date": "2026-11-02T09:00:00+01:00",
"before": {
"code": "GET /v3/tasks/481\n{\n \"id\": 481,\n \"due\": \"2026-11-20\"\n}",
"label": "Before"
},
"after": {
"code": "GET /v4/tasks/481\n{\n \"id\": 481,\n \"due\": {\n \"date\": \"2026-11-20\",\n \"timeZone\": \"Europe/Berlin\"\n }\n}",
"label": "After"
},
"steps": [
"Read due.date where you read due today.",
"Send a timeZone with every due date you create or change.",
"Move your requests from /v3 to /v4 before 2 November."
],
"docs": "docs.flowbase.example/api/v4/due-dates",
"cta": {
"label": "Read the migration guide",
"detail": "flowbase.example/developers"
},
"footnote": "Version 3 of the Flowbase API keeps working until 1 February 2027. Flowbase is a trademark of Flowbase Inc.",
"look": {
"logo": "auto",
"pace": "standard",
"align": "start",
"theme": "brand",
"corners": "round",
"logoSize": "auto"
}
},
"metaData": {
"title": "Flowbase API v4: due dates carry their time zone",
"captionTiny": "Flowbase API v4 from 2 November 2026: due dates become an object with a date and a time zone. Migration guide in the docs.",
"captionShort": "Heads up, developers: from 2 November 2026, Flowbase API v4 returns every due date as an object with a date and a time zone, so a deadline means the same moment everywhere. Read due.date, send a timeZone and move from /v3 to /v4. Version 3 works until 1 February 2027.",
"captionMedium": "Heads up, developers: a breaking change to the Flowbase API. From 2 November 2026, API v4 returns every task's due date as an object with a date and a time zone instead of a plain date, so a deadline means the same moment for everyone, wherever they work. What to do: read due.date where you read due today, send a timeZone with every due date you create or change, and move your requests from /v3 to /v4 before 2 November. Version 3 keeps working until 1 February 2027. The migration guide, with examples for every endpoint, is at docs.flowbase.example/api/v4/due-dates.",
"captionLong": "Heads up, developers: a breaking change to the Flowbase API. From 2 November 2026, API v4 returns every task's due date as an object with a date and a time zone instead of a plain date. Teams across time zones told us a deadline set in Berlin showed a day early in San Francisco; with the time zone travelling with the date, a deadline now means the same moment for everyone. What to do: read due.date wherever you read due today, send a timeZone with every due date you create or change (an IANA name such as Europe/Berlin), and move your requests from /v3 to /v4 before 2 November. Version 3 keeps working until 1 February 2027, so there is time to test. The migration guide, with before and after examples for every endpoint and a checklist, is at docs.flowbase.example/api/v4/due-dates. Questions? Our developer forum is open.",
"hashtags": [
"api",
"developers",
"changelog",
"breakingchange",
"saas"
]
}
}
}

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.