CRIUS Docs
API status Get API key
Holders & wallets

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.

Updated 2 min read
Short answer

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?

GET/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/holders/history?interval=1d&limit=5
curl "https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/holders/history?interval=1d&limit=5" \
-H "x-api-key: $CRIUS_API_KEY"
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) and t[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 at holders[0]: 421.
  • new[0]: 3503 and exited[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 exited was higher than new (1030 against 990 on day 2, 148 against 133 on day 5).
  • summary.max: 476 at max_ts: 1791936000000 is the peak of the whole history; summary.now: 238 holders at capture, half the peak.
  • holder_definition has no min_balance, min_usd or exclude: every address with a balance counts, including pools and the burn address. Add exclude=infra to 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

FieldMeaning
intervalBucket 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_tsLowest and highest count in the window, and the interval where each happened.
summary.nowThe count at the end of the window.
holder_definitionWho counts: min_balance, min_usd, exclude, and a note (for example that min_usd was converted at the current price).
historycomplete 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

  1. Choose an interval for the chart’s range. 1h for a few days, 1d for weeks. Finer intervals return more points for the same window.

  2. Decide who counts. The raw count includes every dust wallet, pools and the burn address. For a number users trust, use exclude=infra and a small min_usd, and say so on the chart.

  3. Plot holders as the line and min/max as the band. On busy days the count moves a lot inside one interval; the band shows it. Bars of new and exited explain the moves.

  4. 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, requests
from 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.

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