Tech and industry (Energy and utilities), Spot price
Today's electricity price hour by hour as a departures board: the price for the hour that is now on flaps with its unit, under it the tariff, the day and what the price includes, a board of the cheapest and the peak hour with their prices and lamps, the day's prices as columns with the source, complete on the first frame, the supplier's notice at the foot throughout. The board ripples, then now, the cheapest and the peak are told in turn, before a tip, the button and the presenter. Eleven seconds.
| Template | Tech and industry (Energy and utilities), tpl_1aa6650d866f |
|---|---|
| Variant | Spot price |
| Version | 1.0.0, the newest: what a channel following this variant draws |
| Shapes | 9x16, 4x5, 1x1, 16x9, 2x3 |
| Length | 11 seconds |
Example video
The 1x1 cut of this variant, drawn from its own worked example. Open the video on its own.
What it accepts
Today's electricity price hour by hour as a departures board: the price now on flaps with its unit, the tariff, the day and what it includes, the cheapest and the peak hour with their lamps, two to twenty-four hourly prices as columns, the source, your notice throughout. Each told in turn, then a tip, the button and your presenter. Eleven seconds. metaData is never drawn.
| Field | Type | Required | Limit | What it is |
|---|---|---|---|---|
clipData | group | yes | Clip data: Everything drawn in the clip: the prices and the hours, the tariff, the day and what the price includes, the source, the words on the board, the tip, the call to action and your notice. | |
clipData.section | text | up to 32 characters | Section: The section in the header, painted as a sign beside your title line, such as Day-ahead prices. | |
clipData.kicker | text | up to 40 characters | Kicker: A short line above the headline, such as Electricity price today. | |
clipData.headline | text | up to 64 characters | Headline: The headline, set large. Say what the prices show; never promise a saving the prices do not show. | |
clipData.day | datetime | yes | Day: The day the prices are for, such as 2026-10-18T00:00:00+02:00. Only the date is read, as it is written here, and it is spelled out in the channel's language beside the tariff. | |
clipData.firstHour | number | from 0, to 23, 0 decimals | First hour: The hour of the day the first price is for, 0 to 23, such as 0 for midnight. Each price after it is the next hour. | |
clipData.nowHour | number | yes | from 0, to 23, 0 decimals | Hour now: The hour of the day shown as now, 0 to 23, such as 18. Its price is the one shown large. |
clipData.prices | list | yes | at least 2, up to 24 | Prices by the hour: The price for each hour, in order from the first hour, two to twenty-four, in the unit below. Each is drawn exactly as sent, with as many decimals as the most precise of them. The cheapest and the peak are the lowest and the highest you send. A negative price hangs below the line. |
clipData.prices[] | number | 4 decimals | Price | |
clipData.unit | text | yes | up to 16 characters | Unit: The unit every price is in, such as ct/kWh, p/kWh or EUR/MWh. Required: a price is never shown without its unit. |
clipData.tariff | text | yes | up to 64 characters | Tariff or market: The tariff or the market the prices belong to, such as Dynamic tariff, bidding zone DE-LU. Shown beside the price on every frame. |
clipData.basis | text | yes | up to 120 characters | What the price includes: What the prices include and leave out, such as whether VAT, grid fees and the standing charge are included. Shown under the price on every frame. |
clipData.source | text | yes | up to 80 characters | Source: Where the prices come from, shown under the columns, such as Source: day-ahead auction, EPEX SPOT. |
clipData.labels | group | Words on the board: The words the board shows beside the figures, in your language. | ||
clipData.labels.now | text | up to 16 characters | Now: The caption over the price now, such as Now. | |
clipData.labels.cheapest | text | up to 16 characters | Cheapest: The row of the cheapest hour, such as Cheapest. | |
clipData.labels.peak | text | up to 16 characters | Peak: The row of the dearest hour, such as Peak. | |
clipData.labels.hour | text | up to 16 characters | Hour: The heading over the hours, such as Hour. | |
clipData.labels.price | text | up to 16 characters | Price: The heading over the prices, such as Price. The unit is set beside it. | |
clipData.tip | text | up to 120 characters | Tip: One sentence shown at the end above the button, such as when to run the dishwasher. Name hours the prices show; never promise a saving. | |
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.notice | text | yes | up to 300 characters | Notice: Who supplies, your licence or registration, and whether the prices include VAT, as your regulator asks. Shown at the foot from the first frame to the last; a long notice is set smaller, never cut. |
clipData.footnote | text | up to 200 characters | Small print: Any other line that must be shown, such as how a dynamic tariff passes the exchange price on. | |
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: dark, standard pace, 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.
Ask Reelwire for the whole JSON Schema, the document your content is checked against, without signing in:
curl "https://app.reelwire.io/v1/formats/template/tpl_1aa6650d866f?variant=Spot%20price&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": "Day-ahead prices",
"kicker": "Electricity price today",
"headline": "Power is cheapest this afternoon",
"day": "2026-10-18T00:00:00+02:00",
"firstHour": 0,
"nowHour": 18,
"prices": [
24.18,
22.6,
21.35,
20.9,
21.12,
23.4,
27.85,
31.2,
30.46,
27.3,
23.95,
20.4,
18.92,
18.12,
18.9,
20.75,
24.6,
31.8,
31.42,
38.8,
34.25,
29.6,
26.1,
24.7
],
"unit": "ct/kWh",
"tariff": "Lindenau Dynamic, bidding zone DE-LU",
"basis": "Day-ahead exchange price, before grid fees, levies and VAT",
"source": "Source: day-ahead auction, EPEX SPOT",
"labels": {
"now": "Now",
"hour": "Hour",
"peak": "Peak",
"price": "Price",
"cheapest": "Cheapest"
},
"tip": "Run the dishwasher and charge the car between 12:00 and 15:00.",
"cta": {
"label": "See today's prices",
"detail": "stadtwerke-lindenau.example/dynamic"
},
"notice": "Stadtwerke Lindenau GmbH, licensed electricity supplier under the German Energy Industry Act. Exchange prices exclude grid fees, levies and VAT at 19%.",
"footnote": "Your dynamic tariff passes the hourly exchange price on at cost plus a fixed margin of 2.0 ct/kWh.",
"look": {
"logo": "auto",
"pace": "standard",
"align": "start",
"theme": "dark",
"corners": "soft",
"logoSize": "auto"
}
},
"metaData": {
"title": "Today's electricity prices, hour by hour",
"captionTiny": "Electricity is cheapest today around 13:00 at 18.12 ct/kWh and dearest at 19:00 at 38.80 ct/kWh. Exchange prices before fees and VAT.",
"captionShort": "Today's day-ahead prices for our dynamic tariff: cheapest around 13:00 at 18.12 ct/kWh, the peak at 19:00 at 38.80 ct/kWh. Run the dishwasher and charge the car between 12:00 and 15:00. Exchange prices before grid fees, levies and VAT.",
"captionMedium": "Today's day-ahead electricity prices for Lindenau Dynamic, bidding zone DE-LU, on 18 October 2026: the cheapest hour is 13:00 at 18.12 ct/kWh and the peak is 19:00 at 38.80 ct/kWh. If you can, run the dishwasher and charge the car between 12:00 and 15:00. Prices are the day-ahead exchange price before grid fees, levies and VAT; your dynamic tariff passes them on at cost plus a fixed margin. Source: day-ahead auction, EPEX SPOT.",
"captionLong": "Today's day-ahead electricity prices for Lindenau Dynamic, bidding zone DE-LU, on Sunday 18 October 2026. The day starts at 24.18 ct/kWh at midnight, falls to its cheapest at 13:00 with 18.12 ct/kWh and climbs to its peak at 19:00 with 38.80 ct/kWh, when the whole country cooks and the sun has set. If you can, run the dishwasher, the washing machine and the car charger between 12:00 and 15:00. The prices shown are the day-ahead exchange price before grid fees, levies and VAT; your dynamic tariff passes them on at cost plus a fixed margin of 2.0 ct/kWh. Source: day-ahead auction, EPEX SPOT. Stadtwerke Lindenau GmbH, licensed electricity supplier under the German Energy Industry Act.",
"hashtags": [
"energy",
"electricity",
"dynamictariff",
"energyprices",
"smartenergy"
]
}
}
}
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.