Holder Streams
Live holder updates — per-balance-change events and periodic concentration summaries — pushed the moment they happen, instead of polling Holder Summary.
Holder streams aren’t bridged to the public WebSocket yet. The events below are produced internally today; the client channels are on the roadmap. Until then, poll GET /v1/token/{mint}/holders/summary (15s cache).
Balance updates
Planned channel token:{mint}:holders — one event per balance change on the token.
| Field | Type | Description |
|---|---|---|
wallet | string | Holder whose balance changed |
mint | string | Token mint |
balance_raw | number | New raw balance after the change |
slot | number | Slot of the change |
event_index | number | Intra-slot ordinal |
ts | number | Unix ms |
source | string | hot (live swap) or hydrator (backfill insert) |
class | string | human · pool · curve · program_account (Holder Labels) |
Concentration summaries
Planned channel token:{mint}:holders:summary — the full summary, re-emitted on change (roughly every 30s, only when the holder picture actually moves).
| Field | Type | Description |
|---|---|---|
mint | string | Token mint |
distinct_count | number | Distinct non-zero holders |
total_balance_raw | number | Sum of holder balances |
supply_raw | number | null | On-chain supply, raw units |
hydration_status | string | born_forward · hydrating · hydrated · partial_forward |
concentration | object | top_10_pct / top_50_pct / top_100_pct |
top_n | array | Top holders, each with wallet, balance_raw, pct_of_total, class, labels |
ts | number | Unix ms |
The summary stream is deduplicated — it only fires when the fingerprint (counts, totals, top-N, concentration) changes, so an idle token stays quiet. This mirrors the REST + Streaming Model: backfill with the summary endpoint, then keep it live off the stream once it ships.