Finance (Crypto and exchanges), On-chain figure
One on-chain figure on a trading terminal: a tag and the headline, the figure panel with what is measured, the coin's symbol and network, the figure as sent in a mono face with its unit and period, its change on a chip in the brand's up or down colour and the source and time of the data, the earlier points drawn on the terminal's grid with up to three stats, then how to read it and up to three quick lines, then the button and the brand's analyst. The risk warning and the not-advice line stay on screen throughout. Ten seconds, and one and a half seconds longer per line.
| Template | Finance (Crypto and exchanges), tpl_20eb67de501a |
|---|---|
| Variant | On-chain figure |
| Version | 1.0.0, the newest: what a channel following this variant draws |
| Shapes | 9x16, 4x5, 1x1, 16x9, 2x3 |
| Length | 15 seconds |
Example video
The 1x1 cut of this variant, drawn from its own worked example. Open the video on its own.
What it accepts
One on-chain figure (active addresses, fees, a hash rate) as sent with its unit and period, its change against an earlier period, an optional line of up to 30 points, up to three stats, the source and its time, then how to read it, up to three quick lines, the button and your analyst. The risk warning and the not-advice line stay on screen. metaData is never drawn.
| Field | Type | Required | Limit | What it is |
|---|---|---|---|---|
clipData | group | yes | Clip data: Everything drawn in the clip: the tag, the headline, the figure and its change, the line and its stats, how to read it, the call to action and the risk lines. | |
clipData.tag | text | up to 20 characters | Tag: The kind of post, in the block at the top, such as On-chain or Network data. | |
clipData.stamp | text | up to 24 characters | Status: A short status beside the light at the top, such as LIVE or 24/7. | |
clipData.headline | text | up to 72 characters | Headline: What the figure says, in a few words. | |
clipData.symbol | text | up to 12 characters | Symbol: The coin's ticker symbol, set large on the figure panel, such as BTC. | |
clipData.network | text | up to 40 characters | Network: The network in words, under the symbol, such as Bitcoin mainnet. | |
clipData.metric | text | yes | up to 32 characters | Figure name: What is measured, on the figure panel's header strip, such as Active addresses. |
clipData.figure | number | yes | 4 decimals | Figure: The on-chain figure, drawn exactly as sent, with the decimals it was sent with. |
clipData.unit | text | up to 12 characters | Unit: The unit after the figure, such as addresses, sat/vB or EH/s. | |
clipData.period | text | yes | up to 48 characters | Period of the figure: The period the figure covers or the day it was read, under the figure. |
clipData.change | number | 4 decimals | Change: The change against the earlier period in the figure's own units, signed: -1250 for a fall. Shown beside the chip when a percentage is sent too. | |
clipData.changePercent | number | 4 decimals | Change in percent: The change against the earlier period in percent, signed: -4.2 for a fall of 4.2%. Shown on the chip in your up or down colour. | |
clipData.since | text | up to 40 characters | Compared with: The earlier period the change is measured against, after the chip, such as vs the previous 7 days. | |
clipData.points | list | at least 2, up to 30 | Points: The figure over earlier periods, oldest first, drawn as a line: 2 to 30 numbers. Leave out to show no line. | |
clipData.points[] | number | 4 decimals | Value | |
clipData.chartLabel | text | up to 32 characters | Chart caption: The caption on the chart panel's header strip, such as Daily, last 30 days. | |
clipData.stats | list | up to 3 | Stats: Up to three figures under the chart, each a short name and its value exactly as you want it shown, such as 30-day high and 815,870. | |
clipData.stats[] | group | Stat | ||
clipData.stats[].label | text | up to 20 characters | Name: What the figure is, such as 30-day high. | |
clipData.stats[].value | text | yes | up to 20 characters | Value: The figure as it is shown. |
clipData.source | text | yes | up to 64 characters | Source of the data: Where the figure comes from, under the figure. |
clipData.dataTime | text | yes | up to 32 characters | Time of the data: When the figure was read, with its time zone. |
clipData.readLabel | text | up to 32 characters | Reading caption: The caption on the reading's header strip, such as How to read it. | |
clipData.reading | text | up to 140 characters | How to read it: What the figure measures and what it does not, in one or two sentences, in a panel after the chart. | |
clipData.details | list | up to 3 | Quick lines: Up to three short lines, each on its own beat after the reading. | |
clipData.details[] | text | up to 72 characters | Line | |
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.riskWarning | text | yes | up to 400 characters | Risk warning: The risk warning your regulator asks for, shown in the risk panel from the first frame to the last. A long warning is set smaller, never cut. |
clipData.notAdvice | text | yes | up to 160 characters | Not advice: The line saying a figure is data and not advice, under the risk warning from the first frame to the last. |
clipData.disclaimer | text | up to 160 characters | Small print: Any other line that must be shown, above your brand's footer line. | |
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, standard pace, square corners, text at the start. | ||
clipData.look.theme | enum | brand, light, dark, bold | Theme: Brand: your brand's own colours and background. Light or dark: a page tinted with your brand colour. Bold: your brand colour as the page. | |
clipData.look.pace | enum | calm, standard, punchy | Pace: How things arrive: calm fades, a standard rhythm, or punchy slams and hard cuts. | |
clipData.look.corners | enum | square, soft, round | Corners: The shape of cards, pictures and buttons. | |
clipData.look.align | enum | start, centre | Text alignment: Where the text lines up. | |
clipData.look.logo | enum | auto, free | Logo: The style's own: the logo on a small plate so it reads on any page. As it is: the logo whole, with no plate, frame or crop, for a logo made to stand on the page, such as one with a transparent background. As it is, make sure your logo reads on the page of the theme you choose. | |
clipData.look.logoSize | enum | auto, small, large | Logo size: Standard is the style's own size. Small draws the logo a fifth smaller, with its plate. Large draws it a quarter larger wherever the style has room for it, and at the standard size where it has none. | |
metaData | group | Meta data: Everything about the post that is never drawn in the clip: its title, its description in four lengths, one per kind of platform, and its hashtags. Reelwire adds the brand's description, link and hashtags after it. Left out, the post text is generated from the clip data. | ||
metaData.title | text | up to 100 characters | Title: Used where the platform has a title of its own: Facebook Feed, LinkedIn, Pinterest and YouTube. Up to 100 characters, which every one of them takes. | |
metaData.captionTiny | text | up to 200 characters | Tiny description (Pinterest, Threads, X): Up to 200 characters. The brand's description, link and hashtags follow it within the platform's limit. | |
metaData.captionShort | text | up to 500 characters | Short description (Telegram, Threema, WeChat, WhatsApp): Up to 500 characters. The brand's description, link and hashtags follow it within the platform's limit. | |
metaData.captionMedium | text | up to 1500 characters | Medium description (Discord, Facebook Reels, Instagram, LinkedIn, Signal, Slack, TikTok): Up to 1500 characters. The brand's description, link and hashtags follow it within the platform's limit. | |
metaData.captionLong | text | up to 4000 characters | Long description (Facebook Feed, YouTube): Up to 4000 characters. The brand's description, link and hashtags follow it within the platform's limit. | |
metaData.hashtags | list | up to 15 | Hashtags: Written without the #. Up to 15, which every platform takes. | |
metaData.hashtags[] | text | up to 60 characters | Hashtag |
locales carries other languages: under each language code, the parts of clipData and metaData that differ, laid over the default, so a language with no copy still renders.
A picture is always a file from your media library: media:// followed by its id or its name.
Anything the table does not list is refused, and so is anything over its limit, with a 400
schema_validation error that names the field.
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_20eb67de501a?variant=On-chain%20figure&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": {
"tag": "On-chain",
"stamp": "Live",
"headline": "Bitcoin network activity climbs to a three-month high",
"symbol": "BTC",
"network": "Bitcoin mainnet",
"metric": "Active addresses",
"figure": 812455,
"unit": "addresses",
"period": "daily average, 17 Oct 2026",
"change": 41237,
"changePercent": 5.35,
"since": "vs the previous 7 days",
"points": [
768120,
771455,
765980,
774310,
779925,
772840,
781205,
786640,
779110,
790375,
795820,
788450,
797210,
802655,
796030,
801480,
808915,
803260,
799745,
806120,
811380,
804590,
809275,
813940,
807655,
810230,
815870,
809410,
811025,
812455
],
"chartLabel": "Daily, last 30 days",
"stats": [
{
"label": "30-day high",
"value": "815,870"
},
{
"label": "30-day low",
"value": "765,980"
},
{
"label": "30-day average",
"value": "792,410"
}
],
"source": "Halcyon Exchange node and indexer, Bitcoin mainnet",
"dataTime": "18 Oct 2026, 14:32 UTC",
"readLabel": "How to read it",
"reading": "Active addresses count the addresses that sent or received bitcoin that day, which is not the same as people",
"details": [
"One person can use many addresses",
"Exchanges move many coins between their own addresses",
"A busy network does not predict a price"
],
"cta": {
"label": "See the on-chain data",
"detail": "halcyon.example/onchain"
},
"riskWarning": "Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong.",
"notAdvice": "On-chain figures are data for information only, not investment advice or a recommendation to buy or sell.",
"disclaimer": "",
"look": {
"logo": "auto",
"pace": "standard",
"align": "start",
"theme": "brand",
"corners": "square",
"logoSize": "auto"
}
},
"metaData": {
"title": "Bitcoin active addresses reach 812,455, up 5.35% in a week",
"captionTiny": "Bitcoin active addresses: 812,455 (daily average), up 5.35% on the previous 7 days. Crypto is high risk: you could lose all you invest.",
"captionShort": "Bitcoin active addresses reached 812,455 as a daily average on 17 Oct 2026, up 5.35% on the previous 7 days. Source: our node and indexer, read 18 Oct 2026, 14:32 UTC. Data for information only, not advice. Don't invest unless you're prepared to lose all the money you invest.",
"captionMedium": "Bitcoin active addresses reached 812,455 as a daily average on 17 Oct 2026, up 41,237 or 5.35% on the previous 7 days. Over 30 days it ranged from 765,980 to 815,870. Active addresses count the addresses that sent or received bitcoin, which is not the same as people. Source: our Bitcoin node and indexer, read 18 Oct 2026, 14:32 UTC. On-chain figures are data for information only, not investment advice. Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong.",
"captionLong": "Bitcoin active addresses reached 812,455 as a daily average on 17 Oct 2026, up 41,237 or 5.35% on the previous 7 days. Over the last 30 days the figure ranged from 765,980 to 815,870, with a 30-day average of 792,410. Active addresses count the addresses that sent or received bitcoin that day. One person can use many addresses and exchanges move many coins between their own, so the figure is not a count of people, and a busy network does not predict a price. Source: our Bitcoin node and indexer, read 18 Oct 2026, 14:32 UTC. On-chain figures are data for information only, not investment advice or a recommendation to buy or sell. Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong.",
"hashtags": [
"bitcoin",
"onchain",
"btc",
"crypto",
"blockchaindata"
]
}
}
}
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.