Combined endpoint (recommended)
GET /tokens/{mint}/actor-chart?series=holders,snipers,insiders,dev&resolution=1h returns wide rows — one object per timestamp with all requested series as keys. One call replaces four separate chart requests.
?series= is a comma-separated subset (default: all four). The dev series is returned as the key dev_held_pct — a 0.0–1.0 fraction of supply held by the deployer.
Single-series endpoints
Use these when you only need one dimension or want to fan out to multiple chart widgets independently:GET /holders/chart/{token}— distinct holder countGET /snipers/chart/{token}— sniper wallet countGET /insiders/chart/{token}— insider wallet countGET /bundlers/chart/{token}— bundler wallet count (stub; all values 0 until Phase 5)
{ "results": [{"ts_ms": <ms>, "value": <number>}], "computed_at": <ms> }.
Resolution and downsampling
?resolution=1h|6h|1d (default 1h). At 6h and 1d the value for each bucket is the last reading in that bucket — these are point-in-time counts, not flows, so summing them would be meaningless.
Freshness and gaps
Data updates within approximately 3–5 seconds of a trade. The underlying coalescing worker marks the mint dirty on each incoming swap event and recomputes all actor counts every 3 seconds. A mint that doesn’t trade for several hours will have gaps in its chart for the quiet hours — holder counts and actor counts don’t change when nothing trades. This is correct behavior, not a bug. Forward-fill the last known value for display purposes.Coverage
Charts start at Phase 3 launch (2026-05-28). There is no pre-launch backfill — upstream holder balances aren’t retained historically. Empty results arrive with acoverage_note explaining this. See Data coverage for the full policy.
