Build a Robinhood Chain stats dashboard
Build a Robinhood Chain analytics dashboard with the Crius API: DEX volume, trades, TVL, launches, gas and volume history in your time zone, with code.
Use GET /v1/robinhood/stats?window=24h (or 1h, 7d) for headline numbers (DEX volume per DEX, trades, traders, TVL, locked liquidity, launches per launchpad, gas, block time), GET /v1/robinhood/volume?days=30&tz=... for daily and hourly series and weekday / hour patterns, and /launchpads and /v1/status for the rest. All work without a key; with one, each data call costs 1 credit. Cache them for a minute.
A Robinhood Chain stats dashboard shows the state of the whole chain at a glance: DEX volume and trades, active traders, total value locked, new tokens and graduations per launchpad, gas costs and block times, with history charts behind them. The Crius API serves each panel from one call: chain stats for the headline numbers, volume history for the charts and patterns, launchpads for the launchpad table and service status for index health. All of them are on the anonymous plan.
Architecture
-
One backend cache. A small server calls each endpoint on its own schedule and keeps the last response. Visitors read the cache, so a dashboard with thousands of views a day makes a few thousand calls, not millions.
-
Panels. Tiles from
/stats(1h and 24h), a daily volume bar chart and an hourly line from/volume, a weekday × hour heatmap from/volume’s patterns, a launchpad table from/launchpads, a trending list from/tokens?list=trending, and an index-health badge from/v1/status. -
Freshness. Show
meta.blockandmeta.lag_msfrom the responses you display, so readers know which block the numbers reflect.
Endpoints used: GET/stats GET/volume GET/launchpads GET/v1/status GET/tokens
Headline numbers: the last hour
Robinhood Chain in the last hour
How much traded on Robinhood Chain in the last hour, where, and what did a swap cost?
curl "https://api.crius.sh/v1/robinhood/stats?window=1h"const res = await fetch("https://api.crius.sh/v1/robinhood/stats?window=1h");const { data, meta } = await res.json();import requests
r = requests.get( "https://api.crius.sh/v1/robinhood/stats?window=1h",)body = r.json()print(body["data"])Real response 200 Captured Oct 28, 2026 · 100 lines (arrays trimmed)
{ "data": { "blocks": { "active_wallets": 20075, "avg_block_time_ms": 98, "tps_1m": 36.7, "txs": 133816 }, "chain": "robinhood", "chain_id": 4663, "dex": { "by_dex": { "launch_curve": 61192.3, "pons_curve": 1062218, "uniswap_v2": 275858, "uniswap_v3": 11880413, "uniswap_v4": 14793757 }, "traders": 21078, "trades": 153255, "volume_usd": 28073439, "wash_volume_usd": 2621.56 }, "eth_usd": 2355.49, "finalized_block": 100401329, "gas": { "avg_swap_cost_eth": 0.00000827998, "avg_swap_cost_usd": 0.0195034, "l1_base_fee_gwei": 0, "l2_gas_price_gwei": 0.021874 }, "head_block": 100409861, "l1_block": 26294128, "launchpads": [ { "graduated": 4, "launches": 158, "launchpad": "pons", "launchpad_name": "Pons", "volume_usd": 2519361 }, { "graduated": 0, "launches": 29, "launchpad": "long", "launchpad_name": "Long.xyz", "volume_usd": 386815 }, { "graduated": 1, "launches": 55, "launchpad": "flap", "launchpad_name": "Flap.sh", "volume_usd": 58185.2 } ], "liquidity": { "locked_lp_usd": 44720881, "method": "2x quote side (ETH/WETH/USDG) of every pool; V3/V4 in-range", "tvl_usd": 322374159 }, "pools": { "by_dex": { "launch_curve": 55, "pons_curve": 158, "uniswap_v2": 61, "uniswap_v3": 5, "uniswap_v4": 412 }, "new": 691 }, "reorgs": { "count": 0, "max_depth": 0 }, "safe_block": 100405028, "tokens": { "by_attribution": { "known_launchpad": 243, "other": 163 }, "new": 406, "new_1h": 406 }, "window": "1h" }, "meta": { "block": 100409861, "block_age_ms": 1204, "block_ts": 1793225391000, "chain": "robinhood", "coverage": { "note": "aggregates cover blocks indexed since start_block until backfill completes", "since_block": 0 }, "finalized_block": 100401329, "lag_ms": 74, "safe_block": 100405028 }}What this tells you
dex.volume_usd28,073,439 across 153,255tradesby 21,078traders.dex.by_dexsplits it: Uniswap v4 14,793,757, v3 11,880,413, the Pons curve 1,062,218, v2 275,858 and other launch curves 61,192.3.tokens.new406 in the hour: 243 from known launchpads, 163 other (tokens.by_attribution).launchpadshas Pons at 158 launches and 4 graduations, Long.xyz at 29 and Flap.sh at 55 launches with 1 graduation.liquidity.tvl_usd322,374,159 with 44,720,881 in locked LP (locked_lp_usd);liquidity.methodsays how TVL is counted (2 × the quote side of every pool, in-range for v3 and v4).gas.avg_swap_cost_usdis about 2 cents (0.0195034),blocks.avg_block_time_ms98 andblocks.tps_1m36.7.reorgs.countis 0.meta.coverage.since_block: 0: the aggregates cover the chain from its first block.
Charts: volume history in your time zone
Daily and hourly volume, New York time
What were the last three days of volume in New York time, and when is the chain busiest?
curl "https://api.crius.sh/v1/robinhood/volume?days=3&hours=3&tz=America/New_York"const res = await fetch("https://api.crius.sh/v1/robinhood/volume?days=3&hours=3&tz=America/New_York");const { data, meta } = await res.json();import requests
r = requests.get( "https://api.crius.sh/v1/robinhood/volume?days=3&hours=3&tz=America/New_York",)body = r.json()print(body["data"])Real response 200 Captured Oct 28, 2026 · 334 lines (arrays trimmed)
{ "data": { "as_of_ts": 1793225400000, "by_hour": { "lookback_days": 90, "peak_hour": 10, "quietest_hour": 0, "rows": [ { "avg_trades": 141478, "avg_volume_usd": 30431396, "days_counted": 89, "hour": 0, "share_pct": 2.96526 }, { "avg_trades": 143248, "avg_volume_usd": 31741345, "days_counted": 89, "hour": 1, "share_pct": 3.0929 }, { "avg_trades": 137989, "avg_volume_usd": 30467983, "days_counted": 89, "hour": 2, "share_pct": 2.96882 } ] }, "by_weekday": { "lookback_days": 90, "peak_day": "wednesday", "quietest_day": "saturday", "rows": [ { "avg_trades": 4188231, "avg_volume_usd": 1007469201, "day": "monday", "days_counted": 13, "share_pct": 14.3392, "total_volume_usd": 13097099608 }, { "avg_trades": 4146036, "avg_volume_usd": 985164052, "day": "tuesday", "days_counted": 13, "share_pct": 14.0218, "total_volume_usd": 12807132672 }, { "avg_trades": 4322566, "avg_volume_usd": 1438855279, "day": "wednesday", "days_counted": 12, "share_pct": 18.9038, "total_volume_usd": 17266263345 } ] }, "chain": "robinhood", "daily": { "busiest_day": { "ts": 1792900800000, "volume_usd": 530086557 }, "days": 3, "rows": [ { "buy_volume_usd": 276848199, "sell_volume_usd": 253238359, "trades": 1497541, "ts": 1792900800000, "volume_usd": 530086557, "wash_volume_usd": 50353764 }, { "buy_volume_usd": 263678297, "sell_volume_usd": 249859608, "trades": 1579804, "ts": 1792987200000, "volume_usd": 513537905, "wash_volume_usd": 50665065 }, { "buy_volume_usd": 237376106, "sell_volume_usd": 198604557, "trades": 1536041, "ts": 1793073600000, "volume_usd": 435980663, "wash_volume_usd": 50477350 } ] }, "hourly": { "busiest_hour": { "ts": 1793217600000, "volume_usd": 41214488 }, "hours": 3, "rows": [ { "buy_volume_usd": 20462975, "sell_volume_usd": 15801392, "trades": 117048, "ts": 1793214000000, "volume_usd": 36264366, "wash_volume_usd": 38390.2 }, { "buy_volume_usd": 19621873, "sell_volume_usd": 21592616, "trades": 115601, "ts": 1793217600000, "volume_usd": 41214488, "wash_volume_usd": 111979 }, { "buy_volume_usd": 13778367, "sell_volume_usd": 12101340, "trades": 140966, "ts": 1793221200000, "volume_usd": 25879707, "wash_volume_usd": 2621.56 } ] }, "method": { "caught_up": true, "data_since_ts": 1779484440000, "live": "windows up to 1h from the live trade flow (chain time); longer windows from complete minutes plus the live flow", "outliers": "excluded: single trades valued above $25000000 (mispriced quotes), counted in outlier_trades", "table_through_ts": 1793224860000, "volume": "organic DEX volume in USD at trade time (Uniswap V2/V3/V4, launchpad curves)", "wash": "excluded: same-tx round trips — buys and sells of one token in one pool inside one tx that cancel within 2%" }, "tz": "America/New_York", "windows": { "180d": { "buy_volume_usd": 54359954506, "buys": 253835268, "change_pct": null, "complete": false, "outlier_trades": 762, "prev_volume_usd": null, "sell_volume_usd": 52437080014, "sells": 204582929, "tokens": 1738934, "traders": 8246046, "traders_note": "unique traders / tokens: approximate (HyperLogLog), up to the last complete minute", "trades": 458418197, "volume_usd": 106797034520, "wash_trades": 1140815, "wash_volume_usd": 43228252019 }, "1h": { "buy_volume_usd": 14265111, "buys": 75723, "change_pct": -0.550523, "complete": true, "outlier_trades": 0, "prev_volume_usd": 28270704, "sell_volume_usd": 13849957, "sells": 77740, "tokens": 1727, "traders": 21102, "trades": 153463, "volume_usd": 28115068, "wash_trades": 27, "wash_volume_usd": 2621.56 }, "1m": { "buy_volume_usd": 215981, "buys": 1243, "change_pct": -15.5255, "complete": true, "outlier_trades": 0, "prev_volume_usd": 462782, "sell_volume_usd": 174952, "sells": 1029, "tokens": 177, "traders": 1107, "trades": 2272, "volume_usd": 390933, "wash_trades": 0, "wash_volume_usd": 0 }, "1s": { "buy_volume_usd": 7395.66, "buys": 36, "change_pct": 249.657, "complete": true, "outlier_trades": 0, "prev_volume_usd": 3890.85, "sell_volume_usd": 6208.99, "sells": 37, "tokens": 25, "traders": 51, "trades": 73, "volume_usd": 13604.7, "wash_trades": 0, "wash_volume_usd": 0 }, "24h": { "buy_volume_usd": 287374377, "buys": 908075, "change_pct": 20.5728, "complete": true, "outlier_trades": 0, "prev_volume_usd": 445470035, "sell_volume_usd": 249741535, "sells": 874783, "tokens": 13023, "traders": 153999, "traders_note": "unique traders / tokens: approximate (HyperLogLog), up to the last complete minute", "trades": 1782858, "volume_usd": 537115913, "wash_trades": 17597, "wash_volume_usd": 100833841 }, "30d": { "buy_volume_usd": 12246515202, "buys": 34847713, "change_pct": -51.5447, "complete": true, "outlier_trades": 69, "prev_volume_usd": 48876260264, "sell_volume_usd": 11436620583, "sells": 31076104, "tokens": 291323, "traders": 2263899, "traders_note": "unique traders / tokens: approximate (HyperLogLog), up to the last complete minute", "trades": 65923817, "volume_usd": 23683135785, "wash_trades": 296156, "wash_volume_usd": 5483273587 }, "30s": { "buy_volume_usd": 101246, "buys": 648, "change_pct": -35.5977, "complete": true, "outlier_trades": 0, "prev_volume_usd": 237790, "sell_volume_usd": 51896, "sells": 456, "tokens": 133, "traders": 597, "trades": 1104, "volume_usd": 153142, "wash_trades": 0, "wash_volume_usd": 0 }, "5m": { "buy_volume_usd": 1221510, "buys": 7565, "change_pct": -33.8303, "complete": true, "outlier_trades": 0, "prev_volume_usd": 3930121, "sell_volume_usd": 1379039, "sells": 8041, "tokens": 417, "traders": 4438, "trades": 15606, "volume_usd": 2600549, "wash_trades": 0, "wash_volume_usd": 0 }, "6h": { "buy_volume_usd": 106140026, "buys": 325797, "change_pct": 58.3393, "complete": true, "outlier_trades": 0, "prev_volume_usd": 129388468, "sell_volume_usd": 98732768, "sells": 334428, "tokens": 5453, "traders": 64490, "traders_note": "unique traders / tokens: approximate (HyperLogLog), up to the last complete minute", "trades": 660225, "volume_usd": 204872794, "wash_trades": 541, "wash_volume_usd": 359759 }, "7d": { "buy_volume_usd": 1909534740, "buys": 5757353, "change_pct": -31.3756, "complete": true, "outlier_trades": 0, "prev_volume_usd": 5322163628, "sell_volume_usd": 1742769364, "sells": 5565930, "tokens": 58656, "traders": 501350, "traders_note": "unique traders / tokens: approximate (HyperLogLog), up to the last complete minute", "trades": 11323283, "volume_usd": 3652304104, "wash_trades": 66125, "wash_volume_usd": 453119545 }, "90d": { "buy_volume_usd": 46760664123, "buys": 208521629, "change_pct": null, "complete": true, "outlier_trades": 343, "prev_volume_usd": null, "sell_volume_usd": 45144542946, "sells": 166894584, "tokens": 1441104, "traders": 7052878, "traders_note": "unique traders / tokens: approximate (HyperLogLog), up to the last complete minute", "trades": 375416213, "volume_usd": 91905207070, "wash_trades": 953623, "wash_volume_usd": 41341982607 } } }, "meta": { "block": 100409945, "block_age_ms": 674, "block_ts": 1793225400000, "chain": "robinhood", "finalized_block": 100401329, "lag_ms": 9, "safe_block": 100405028 }}What this tells you
daily.rowsstart at New York midnight: the firstts, 1792900800000, is 04:00 UTC. Each row hasvolume_usd,buy_volume_usd,sell_volume_usd,tradesandwash_volume_usd, ready for a stacked bar chart.by_hour.peak_houris 10 (10:00 New York) over a 90-day lookback. The same call in UTC (the reference sample) says 14: the same hour, four hours apart.by_weekdayputs the peak onwednesdayand the quietest day onsaturday.windowsgives tiles from1sto180d. The24hwindow:volume_usd537,115,913 from 1,782,858 trades,change_pct+20.57% against the previous 24 hours (prev_volume_usd445,470,035).tradersandtokensin windows are approximate counts (traders_note: HyperLogLog), andmethodspells out what is excluded: wash round trips and trades above $25,000,000.
Use it in your app
// dashboard.mjs: node dashboard.mjs, then GET http://localhost:8080/api/dashboard (Node.js 22+)import { createServer } from "node:http";
const BASE = "https://api.crius.sh";const HEADERS = process.env.CRIUS_API_KEY ? { "x-api-key": process.env.CRIUS_API_KEY } : {};const TZ = "America/New_York";
// panel -> [path, refresh interval in seconds]const PANELS = { hour: ["/v1/robinhood/stats?window=1h", 60], day: ["/v1/robinhood/stats?window=24h", 60], volume: [`/v1/robinhood/volume?days=30&hours=48&tz=${encodeURIComponent(TZ)}`, 300], launchpads: ["/v1/robinhood/launchpads", 300], trending: ["/v1/robinhood/tokens?list=trending&window=24h&limit=10", 60], status: ["/v1/status", 30],};const cache = {};
async function refresh(name) { const [path, every] = PANELS[name]; try { const res = await fetch(BASE + path, { headers: HEADERS }); if (res.ok) cache[name] = await res.json(); // keep the last good answer on errors } catch (e) { console.error(name, e.message); } setTimeout(() => refresh(name), every * 1000);}
for (const [i, name] of Object.keys(PANELS).entries()) setTimeout(() => refresh(name), i * 600); // stagger: stay under 2 req/s without a key
createServer((req, res) => { if (req.url !== "/api/dashboard") return res.writeHead(404).end(); const d = (k) => cache[k]?.data; const body = { tiles: { volume_24h: d("day")?.dex.volume_usd, trades_24h: d("day")?.dex.trades, traders_24h: d("day")?.dex.traders, tvl: d("day")?.liquidity.tvl_usd, new_tokens_1h: d("hour")?.tokens.new, swap_cost_usd: d("hour")?.gas.avg_swap_cost_usd, }, daily: d("volume")?.daily.rows, hourly: d("volume")?.hourly.rows, heatmap: { weekday: d("volume")?.by_weekday, hour: d("volume")?.by_hour }, launchpads: d("launchpads")?.map((l) => ({ name: l.name, ...l.stats })), trending: d("trending")?.map((t) => ({ address: t.address, symbol: t.symbol, change: t.change_pct?.["24h"], volume: t.volume_usd?.["24h"] })), index: d("status")?.chains?.robinhood, block: cache.day?.meta?.block, }; res.writeHead(200, { "content-type": "application/json", "cache-control": "public, max-age=15" }); res.end(JSON.stringify(body));}).listen(8080);What it costs
| Panel | Endpoint | Refresh | Credits per month |
|---|---|---|---|
| Hour and day tiles | /stats × 2 |
60 s | 86,400 |
| Volume charts and heatmap | /volume |
5 min | 8,640 |
| Launchpad table | /launchpads |
5 min | 8,640 |
| Trending tokens | /tokens |
60 s | 43,200 |
| Index health | /v1/status |
30 s | 0 (public, not metered) |
Each metered call costs 1 credit with a key: about 147,000 credits a month in total, under 15% of the Free plan. Without a key the same schedule runs on the anonymous plan (about 0.1 requests per second on average), which is enough for a public dashboard. See Plans & limits.
Frequently asked questions
How is Robinhood Chain DEX volume counted?
Organic DEX volume in USD at trade time across Uniswap v2, v3, v4 and launchpad curves. Same-transaction round trips (a buy and a sell of one token in one pool and one transaction that cancel within 2%) are excluded and reported as wash_volume_usd, and single trades valued above $25,000,000 are excluded as mispriced (outlier_trades). /volume returns these rules in method.
Can I show the volume chart in my users' time zone?
Yes: pass an IANA time zone in tz (for example tz=America/New_York or tz=Asia/Dubai). Daily rows then start at local midnight and the hour-of-day pattern uses local hours.
Do I need an API key for a public dashboard?
No. /stats, /volume, /launchpads, /tokens, /v1/status and /v1/chains are on the anonymous plan. Call them from your server, not from every visitor's browser: the anonymous limit is 2 requests per second per IP, and a Free key raises it to 10.
How live are the numbers?
/volume windows up to 1 hour come from the live trade flow; longer windows combine complete minutes with the live flow. Every response carries meta.block and meta.lag_ms, which you can show as "updated at block …".
Related
Get your free Crius API key
Every example on this page works with a free key: higher rate limits than the anonymous plan, holders, wallets and the WebSocket stream. No card needed.
- Robinhood Chain (4663) only, from our own archive nodes
- REST + WebSocket
- Pay on-chain or by card