Skip to main content

Promo code, Flashy 1.0.0

TemplatePromo code, tpl_ca13747efacd
VariantFlashy
Version1.0.0, the newest: what a channel following this variant draws
Shapes9x16, 4x5, 1x1, 16x9, 2x3
Length10 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 promo code on a coupon with a dashed edge: what it gives, the code set as large as the coupon allows and never shortened, how long it is valid, where to use it and the small print, with the picture of what it is for and a button that is pressed near the end. metaData is the post's title, descriptions and hashtags and is never drawn.

FieldTypeRequiredLimitWhat it is
clipDatagroupyesClip data: Everything drawn: a kicker, the title, the code with what it gives, how long it is valid and where to use it, the small print, the button, the picture and the look. The validity is required, because a discount has to say how long it runs.
clipData.kickertextup to 20 charactersKicker: A word or two above the title, such as NEW CUSTOMERS or THIS WEEKEND.
clipData.titletextyesup to 80 charactersTitle: What the offer is about. Shown from the first frame.
clipData.codetextyesup to 20 charactersCode: Drawn exactly as written, every character, as large as the coupon allows and never shortened or broken over two lines, in a face that tells 0 from O and 1 from I and l.
clipData.benefittextyesup to 48 charactersWhat it gives: The discount or the extra, written as it should be read, above the code. Nothing is worked out from it.
clipData.validUntildatetimeyesValid until: The last moment the code works, always shown on the coupon. The date and time are drawn as they are written here, in the channel's language.
clipData.wheretextup to 60 charactersWhere to use it: The shop, the app or the website.
clipData.termstextup to 200 charactersSmall print: Who may use it, how often, the minimum order and what is left out. Drawn small but always readable.
clipData.buttontextup to 28 charactersButton: The button under the coupon, pressed near the end. Left out, no button is drawn.
clipData.pictureimagemedia:// file from the media library, alt text up to 120 charactersPicture: What the offer is for, beside or above the coupon. Left out, the coupon stands alone and is set larger.
clipData.pictureFitenumfill, wholePicture fit: Fill the frame (the default) for a photograph or a pattern; show it whole for a cut-out product or a logo.
clipData.lookgroupLook: How the clip looks and moves within its style. The same five switches in every format of the collections. Leave a switch out, or set it to the style's own, and the style decides.
clipData.look.themeenumauto, brand, light, dark, boldTheme: The style's own choice; your brand's own colours and background; a light or dark page tinted with your brand colour; or your brand colour as the page.
clipData.look.paceenumauto, calm, standard, punchyPace: How things arrive: the style's own rhythm, calm fades, a standard rhythm, or punchy slams and cuts.
clipData.look.cornersenumauto, square, soft, roundCorners: The shape of cards, panels and marks.
clipData.look.alignenumauto, start, centreText alignment: Where the text lines up.
clipData.look.logoenumauto, freeLogo: The style's own: the logo on the style's plate (a card, a disc, a badge) 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.
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": {
"kicker": {
"type": "string",
"maxLength": 20,
"title": "Kicker",
"description": "A word or two above the title, such as NEW CUSTOMERS or THIS WEEKEND."
},
"title": {
"type": "string",
"maxLength": 80,
"title": "Title",
"description": "What the offer is about. Shown from the first frame."
},
"code": {
"type": "string",
"maxLength": 20,
"title": "Code",
"description": "Drawn exactly as written, every character, as large as the coupon allows and never shortened or broken over two lines, in a face that tells 0 from O and 1 from I and l."
},
"benefit": {
"type": "string",
"maxLength": 48,
"title": "What it gives",
"description": "The discount or the extra, written as it should be read, above the code. Nothing is worked out from it."
},
"validUntil": {
"type": "string",
"format": "date-time",
"title": "Valid until",
"description": "The last moment the code works, always shown on the coupon. The date and time are drawn as they are written here, in the channel's language."
},
"where": {
"type": "string",
"maxLength": 60,
"title": "Where to use it",
"description": "The shop, the app or the website."
},
"terms": {
"type": "string",
"maxLength": 200,
"title": "Small print",
"description": "Who may use it, how often, the minimum order and what is left out. Drawn small but always readable."
},
"button": {
"type": "string",
"maxLength": 28,
"title": "Button",
"description": "The button under the coupon, pressed near the end. Left out, no button is drawn."
},
"picture": {
"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": "Picture",
"description": "What the offer is for, beside or above the coupon. Left out, the coupon stands alone and is set larger."
},
"pictureFit": {
"type": "string",
"enum": [
"fill",
"whole"
],
"title": "Picture fit",
"description": "Fill the frame (the default) for a photograph or a pattern; show it whole for a cut-out product or a logo.",
"enumNames": [
"Fill the frame",
"Show it whole"
]
},
"look": {
"type": "object",
"properties": {
"theme": {
"type": "string",
"enum": [
"auto",
"brand",
"light",
"dark",
"bold"
],
"title": "Theme",
"description": "The style's own choice; your brand's own colours and background; a light or dark page tinted with your brand colour; or your brand colour as the page.",
"enumNames": [
"The style's own",
"Brand colours",
"Light",
"Dark",
"Bold brand colour"
]
},
"pace": {
"type": "string",
"enum": [
"auto",
"calm",
"standard",
"punchy"
],
"title": "Pace",
"description": "How things arrive: the style's own rhythm, calm fades, a standard rhythm, or punchy slams and cuts.",
"enumNames": [
"The style's own",
"Calm",
"Standard",
"Punchy"
]
},
"corners": {
"type": "string",
"enum": [
"auto",
"square",
"soft",
"round"
],
"title": "Corners",
"description": "The shape of cards, panels and marks.",
"enumNames": [
"The style's own",
"Square",
"Softly rounded",
"Round"
]
},
"align": {
"type": "string",
"enum": [
"auto",
"start",
"centre"
],
"title": "Text alignment",
"description": "Where the text lines up.",
"enumNames": [
"The style's own",
"At the start of the line",
"Centred"
]
},
"logo": {
"type": "string",
"enum": [
"auto",
"free"
],
"title": "Logo",
"description": "The style's own: the logo on the style's plate (a card, a disc, a badge) 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"
]
}
},
"additionalProperties": false,
"title": "Look",
"description": "How the clip looks and moves within its style. The same five switches in every format of the collections. Leave a switch out, or set it to the style's own, and the style decides."
}
},
"required": [
"title",
"code",
"benefit",
"validUntil"
],
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn: a kicker, the title, the code with what it gives, how long it is valid and where to use it, the small print, the button, the picture and the look. The validity is required, because a discount has to say how long it runs."
},
"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": {
"kicker": {
"type": "string",
"maxLength": 20,
"title": "Kicker",
"description": "A word or two above the title, such as NEW CUSTOMERS or THIS WEEKEND."
},
"title": {
"type": "string",
"maxLength": 80,
"title": "Title",
"description": "What the offer is about. Shown from the first frame."
},
"code": {
"type": "string",
"maxLength": 20,
"title": "Code",
"description": "Drawn exactly as written, every character, as large as the coupon allows and never shortened or broken over two lines, in a face that tells 0 from O and 1 from I and l."
},
"benefit": {
"type": "string",
"maxLength": 48,
"title": "What it gives",
"description": "The discount or the extra, written as it should be read, above the code. Nothing is worked out from it."
},
"validUntil": {
"type": "string",
"format": "date-time",
"title": "Valid until",
"description": "The last moment the code works, always shown on the coupon. The date and time are drawn as they are written here, in the channel's language."
},
"where": {
"type": "string",
"maxLength": 60,
"title": "Where to use it",
"description": "The shop, the app or the website."
},
"terms": {
"type": "string",
"maxLength": 200,
"title": "Small print",
"description": "Who may use it, how often, the minimum order and what is left out. Drawn small but always readable."
},
"button": {
"type": "string",
"maxLength": 28,
"title": "Button",
"description": "The button under the coupon, pressed near the end. Left out, no button is drawn."
},
"picture": {
"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": "Picture",
"description": "What the offer is for, beside or above the coupon. Left out, the coupon stands alone and is set larger."
},
"pictureFit": {
"type": "string",
"enum": [
"fill",
"whole"
],
"title": "Picture fit",
"description": "Fill the frame (the default) for a photograph or a pattern; show it whole for a cut-out product or a logo.",
"enumNames": [
"Fill the frame",
"Show it whole"
]
},
"look": {
"type": "object",
"properties": {
"theme": {
"type": "string",
"enum": [
"auto",
"brand",
"light",
"dark",
"bold"
],
"title": "Theme",
"description": "The style's own choice; your brand's own colours and background; a light or dark page tinted with your brand colour; or your brand colour as the page.",
"enumNames": [
"The style's own",
"Brand colours",
"Light",
"Dark",
"Bold brand colour"
]
},
"pace": {
"type": "string",
"enum": [
"auto",
"calm",
"standard",
"punchy"
],
"title": "Pace",
"description": "How things arrive: the style's own rhythm, calm fades, a standard rhythm, or punchy slams and cuts.",
"enumNames": [
"The style's own",
"Calm",
"Standard",
"Punchy"
]
},
"corners": {
"type": "string",
"enum": [
"auto",
"square",
"soft",
"round"
],
"title": "Corners",
"description": "The shape of cards, panels and marks.",
"enumNames": [
"The style's own",
"Square",
"Softly rounded",
"Round"
]
},
"align": {
"type": "string",
"enum": [
"auto",
"start",
"centre"
],
"title": "Text alignment",
"description": "Where the text lines up.",
"enumNames": [
"The style's own",
"At the start of the line",
"Centred"
]
},
"logo": {
"type": "string",
"enum": [
"auto",
"free"
],
"title": "Logo",
"description": "The style's own: the logo on the style's plate (a card, a disc, a badge) 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"
]
}
},
"additionalProperties": false,
"title": "Look",
"description": "How the clip looks and moves within its style. The same five switches in every format of the collections. Leave a switch out, or set it to the style's own, and the style decides."
}
},
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn: a kicker, the title, the code with what it gives, how long it is valid and where to use it, the small print, the button, the picture and the look. The validity is required, because a discount has to say how long it runs."
},
"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_ca13747efacd?variant=Flashy&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": {
"kicker": "This weekend",
"title": "New season, new walls: 20% off every roll of the Dunes wallpaper collection",
"code": "AUTUMN20OFF",
"benefit": "20% off every roll of Dunes wallpaper",
"validUntil": "2026-11-01T23:59:00+01:00",
"where": "In every Halden Interiors shop and at halden.example",
"terms": "Full-price rolls of the Dunes collection only, once per customer. Not valid on paint, tools or samples, and cannot be combined with other codes or offers.",
"button": "Shop the collection",
"picture": {
"alt": "Soft waves of blue, violet and orange, the Dunes pattern",
"url": "media://example-image.jpg"
},
"pictureFit": "fill",
"look": {
"theme": "auto",
"pace": "auto",
"corners": "auto",
"align": "auto",
"logo": "auto"
}
},
"metaData": {
"title": "20% off every roll of Dunes wallpaper this weekend with the code AUTUMN20OFF",
"captionTiny": "New season, new walls: the code AUTUMN20OFF takes 20% off every roll of Dunes wallpaper, in our shops and at halden.example, until Sunday 1 November.",
"captionShort": "New season, new walls. This weekend the code AUTUMN20OFF takes 20% off every full-price roll of the Dunes wallpaper collection: soft waves of colour in four colourways, from sand to midnight blue. Use it at the till in any Halden Interiors shop or at checkout on halden.example until Sunday 1 November at 23:59. Once per customer; not valid on paint, tools or samples, and not combinable with other codes or offers.",
"captionMedium": "New season, new walls. This weekend the code AUTUMN20OFF takes 20% off every full-price roll of the Dunes wallpaper collection, our new range of soft, layered waves of colour in four colourways, from warm sand to midnight blue. Dunes is a non-woven wallpaper, so it goes up with paste on the wall rather than on the paper, it is washable, and it comes off again in whole strips when you next fancy a change. Order free samples first if you are choosing between colourways, then use the code at checkout on halden.example or show it at the till in any Halden Interiors shop. Our shop teams will work out how many rolls your room needs from its measurements, and every roll in an order is from the same print batch, so the colour matches from one strip to the next. The code works until Sunday 1 November at 23:59, once per customer, on full-price rolls of the Dunes collection only. It is not valid on paint, tools or samples and cannot be combined with other codes or offers. The shop and the code in this clip are illustrative.",
"captionLong": "New season, new walls. This weekend the code AUTUMN20OFF takes 20% off every full-price roll of the Dunes wallpaper collection, our new range of soft, layered waves of colour in four colourways, from warm sand through dusk violet to midnight blue. Dunes is a non-woven wallpaper: it goes up with paste on the wall rather than on the paper, so there is no soaking and no waiting, the strips can be slid into place before the paste sets, and it comes off again dry and in whole strips when you next fancy a change. It is washable, it does not shrink as it dries, and each roll covers about five square metres. If you are choosing between colourways, order free samples first: they arrive within two working days, and a sample on the wall in your own light tells you more than any photograph. Then use the code at checkout on halden.example, or show it at the till in any Halden Interiors shop, where our teams will work out from your room's measurements how many rolls you need, pattern repeat included. Every roll in one order comes from the same print batch, so the colour matches from one strip to the next, and unopened rolls can be returned within thirty days. The code works until Sunday 1 November at 23:59. It is valid once per customer, on full-price rolls of the Dunes collection only, and not on paint, tools, paste or samples. It cannot be combined with other codes or offers, or with the trade discount. Delivery is free on orders over 60 euros, and every order can be collected from your nearest shop the next working day instead. The shop and the code in this clip are illustrative.",
"hashtags": [
"promocode",
"wallpaper",
"interiors",
"homedecor",
"deal"
]
}
}
}

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.