CRIUS Docs
API status Get API key
Build

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.

Updated 3 min read
Short answer

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

  1. 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.

  2. 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.

  3. Freshness. Show meta.block and meta.lag_ms from 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?

GET/v1/robinhood/stats?window=1h
curl "https://api.crius.sh/v1/robinhood/stats?window=1h"
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_usd 28,073,439 across 153,255 trades by 21,078 traders. dex.by_dex splits 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.new 406 in the hour: 243 from known launchpads, 163 other (tokens.by_attribution). launchpads has Pons at 158 launches and 4 graduations, Long.xyz at 29 and Flap.sh at 55 launches with 1 graduation.
  • liquidity.tvl_usd 322,374,159 with 44,720,881 in locked LP (locked_lp_usd); liquidity.method says how TVL is counted (2 × the quote side of every pool, in-range for v3 and v4).
  • gas.avg_swap_cost_usd is about 2 cents (0.0195034), blocks.avg_block_time_ms 98 and blocks.tps_1m 36.7. reorgs.count is 0.
  • meta.coverage.since_block: 0: the aggregates cover the chain from its first block.
Chain stats reference Runs from your browser on the anonymous plan Data looks wrong? Report it

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?

GET/v1/robinhood/volume?days=3&hours=3&tz=America/New_York
curl "https://api.crius.sh/v1/robinhood/volume?days=3&hours=3&tz=America/New_York"
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.rows start at New York midnight: the first ts, 1792900800000, is 04:00 UTC. Each row has volume_usd, buy_volume_usd, sell_volume_usd, trades and wash_volume_usd, ready for a stacked bar chart.
  • by_hour.peak_hour is 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_weekday puts the peak on wednesday and the quietest day on saturday.
  • windows gives tiles from 1s to 180d. The 24h window: volume_usd 537,115,913 from 1,782,858 trades, change_pct +20.57% against the previous 24 hours (prev_volume_usd 445,470,035).
  • traders and tokens in windows are approximate counts (traders_note: HyperLogLog), and method spells out what is excluded: wash round trips and trades above $25,000,000.
Volume history reference Runs from your browser on the anonymous plan Data looks wrong? Report it

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 …".

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