Track a token's holder count over time
Chart a Robinhood Chain token's holder count over time: min, max, new and exited holders per interval, with your own definition of a holder. Real example.
Call GET /v1/robinhood/token/{address}/holders/history?interval=1h (Starter plan, 10 credits). It returns parallel arrays per interval: t, holders (count at the end), min, max, new and exited, plus a summary with the period's min, max and now. min_usd or min_balance set who counts as a holder.
Holder count history is the number of addresses holding a token, measured over time at the interval you choose. Crius replays every transfer of the token and, for each interval, returns the count at its end, the lowest and highest count during it, and how many wallets arrived and left. You decide who counts as a holder: any balance, a minimum USD value or a minimum token amount.
Get the history in one call
CHARGE's first five days: from 476 holders to 294
How did the number of Charge AI (0x7b8892cea949bc60d494681d1bc3ea96071ab0b8) holders change day by day after its launch?
curl "https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/holders/history?interval=1d&limit=5" \ -H "x-api-key: $CRIUS_API_KEY"const res = await fetch("https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/holders/history?interval=1d&limit=5", { headers: { "x-api-key": process.env.CRIUS_API_KEY },});const { data, meta } = await res.json();import os, requests
r = requests.get( "https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/holders/history?interval=1d&limit=5", headers={"x-api-key": os.environ["CRIUS_API_KEY"]},)body = r.json()print(body["data"])Real response 200 Captured Oct 28, 2026 · 70 lines (arrays trimmed)
{ "data": { "exited": [ 3082, 1030, 462, 216, 148 ], "history": "complete", "holder_definition": { "exclude": [], "min_balance": null, "min_usd": null, "note": "" }, "holders": [ 421, 381, 359, 309, 294 ], "interval": "1d", "max": [ 476, 429, 382, 359, 313 ], "min": [ 1, 378, 353, 306, 294 ], "new": [ 3503, 990, 440, 166, 133 ], "summary": { "max": 476, "max_ts": 1791936000000, "min": 1, "min_ts": 1791936000000, "now": 238 }, "t": [ 1791936000000, 1792022400000, 1792108800000, 1792195200000, 1792281600000 ] }, "meta": { "block": 100406819, "block_age_ms": 372, "block_ts": 1793225080000, "chain": "robinhood", "finalized_block": 100397649, "lag_ms": 41, "safe_block": 100401329 }}What this tells you
interval: "1d": each array index is one UTC day.t[0]is 1791936000000 (2026-10-14, launch day) andt[4]1792281600000 (2026-10-18). The captured example is cut to the first five days.- Launch day:
min[0]: 1(right after the mint, the whole supply sat in one address),max[0]: 476, and the day closed atholders[0]: 421. new[0]: 3503andexited[0]: 3082: thousands of wallets bought and sold out on the first day. That’s what launch-day flipping looks like.- From day 2 the count only fell: 381, 359, 309, 294. On each of those days
exitedwas higher thannew(1030 against 990 on day 2, 148 against 133 on day 5). summary.max: 476atmax_ts: 1791936000000is the peak of the whole history;summary.now: 238holders at capture, half the peak.holder_definitionhas nomin_balance,min_usdorexclude: every address with a balance counts, including pools and the burn address. Addexclude=infrato leave them out.
The arrays add up: each day’s closing count is the previous close plus new minus exited (421 + 990 − 1030 = 381).
What the fields mean
| Field | Meaning |
|---|---|
interval | Bucket size: 1m, 5m, 15m, 1h (default), 4h or 1d. |
t[] | Start of each interval, unix ms. |
holders[] | Holder count at the end of the interval. |
min[], max[] | Lowest and highest count during the interval. |
new[], exited[] | Addresses that became holders, and that stopped being holders, during the interval. |
summary.min, min_ts, max, max_ts | Lowest and highest count in the window, and the interval where each happened. |
summary.now | The count at the end of the window. |
holder_definition | Who counts: min_balance, min_usd, exclude, and a note (for example that min_usd was converted at the current price). |
history | complete when the token's whole transfer history is indexed. |
from and to limit the window, with the same point forms as snapshots: block:N, ts:MS, mcap:USD, or the labels launch, graduation, ath, now (see historical holders). For example from=graduation&to=now&interval=4h charts holders since the token left its bonding curve. Intervals with no transfers are left out, so the t array can skip time.
Use it in your app
-
Choose an interval for the chart’s range.
1hfor a few days,1dfor weeks. Finer intervals return more points for the same window. -
Decide who counts. The raw count includes every dust wallet, pools and the burn address. For a number users trust, use
exclude=infraand a smallmin_usd, and say so on the chart. -
Plot
holdersas the line andmin/maxas the band. On busy days the count moves a lot inside one interval; the band shows it. Bars ofnewandexitedexplain the moves. -
Get a Starter key. Holder history needs the Starter plan and costs 10 credits per call. Past intervals don’t change, so fetch the full history once and then only the recent window.
import os, requestsfrom datetime import datetime, timezone
token = "0x7b8892cea949bc60d494681d1bc3ea96071ab0b8"r = requests.get( f"https://api.crius.sh/v1/robinhood/token/{token}/holders/history", params={"interval": "1d", "from": "launch", "to": "now", "exclude": "infra", "min_usd": 1}, headers={"x-api-key": os.environ["CRIUS_API_KEY"]},)d = r.json()["data"]for t, n, new, out in zip(d["t"], d["holders"], d["new"], d["exited"]): day = datetime.fromtimestamp(t / 1000, timezone.utc).date() print(day, n, f"+{new}", f"-{out}")s = d["summary"]print(f"peak {s['max']}, now {s['now']} ({s['now'] / s['max']:.0%} of peak)")Frequently asked questions
How do I get a token's holder count history?
Call /v1/robinhood/token/{address}/holders/history with an interval (1m, 5m, 15m, 1h, 4h, 1d). Each index i of the arrays is one interval starting at t[i] (unix ms): holders[i] is the count at its end, min[i] and max[i] the lowest and highest during it, new[i] and exited[i] the wallets that arrived and left.
What was the most holders a token ever had?
summary.max and summary.max_ts give the highest count in the window and when it happened; summary.min and min_ts the lowest; summary.now the current count. For CHARGE, the peak was 476 on launch day and the count at capture was 238.
Can I ignore dust wallets in the holder count?
Yes. min_usd=10 counts only wallets holding $10 or more, min_balance a token amount. min_usd is converted to a token amount at the current price (holder_definition.note says so), so the threshold is the same token amount across the whole chart.
Why are new and exited holders so high on launch day?
Arrivals and exits both rise with volume. On CHARGE's first day 3,503 wallets became holders and 3,082 left the same day; quick flippers and bots inflate both. Watch new against exited rather than the count alone.
Which plan does holder history need?
The Starter plan or higher, 10 credits per call. See Plans & limits.
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