Data availability
The API reports what it can trust and is explicit about what it cannot. For forensic work that distinction is the point: unavailable must never be rendered as zero
null value, or a day with no row, means not trusted or not measured for that day. It does not mean no holders, no concentration or no activity. Coerce it to 0 and you will draw a cliff that never happenedHandling null
Break the line, or skip the point. Never fill it
// token_series, format "columns": { day: [...], netflow_usd: [...] }
const { day, netflow_usd } = body.data.data;
// Wrong: invents a quiet day
const series = netflow_usd.map((v) => v ?? 0);
// Right: the gap stays a gap, and values are matched by day
const points = day.map((d, i) => ({
x: d,
y: netflow_usd[i], // null passes straight through
}));
// Most chart libraries break the line on null. Check yours does
// rather than assuming it, because the failure is silent.unavailable and reason
Each daily metric comes from one of the token's panels. When a panel can't be read for the token, token_series names it in unavailable with the reason in words, and its metrics are null. token_overview does the same for the grade, the panels and today. One panel being unavailable never blocks the rest of the answer. Render only what is there
"unavailable": {
"holder_profitability": "No holders_in_profit rows for this window yet."
}Sections
The API serves only what the site shows. get_sections answers a section only while the token's page shows it, with its data, cached_at and age_seconds. Every other section is left out and named in not_on_the_site_yet: not built for this token yet, still being built, or not on the site at all. Never estimate a figure in its place. GET /v1/catalog lists the sections the token page shows right now
Realized PnL not built yet
Some tokens do not yet have a trade log, the wallet-attributed swaps realized PnL is built from. Until it is, daily realized PnL comes back null, with its panel and the reason in unavailable, and profit and loss and top wallets aren't served. Check before rendering those metrics. A built log with no rows is served: it means nobody sold
Window coverage
Blocktronics stores up to 60 days for a token, ending at the last settled UTC day (to in a token_series answer); the open day so far is today's. Series are as long as the token has existed and are never extrapolated: a young token has fewer days. Count them (days) rather than assuming you got the maximum. A span you ask for with from and to returns only the stored days inside it, with a note for the rest
Tokens on several chains
A token on several chains is one token. Asking for any of its chains answers with the family's combined figures, charged once, and family in the answer names each chain and how its figures are combined
Per-source caveats
- CEX flow depends on labelled exchange addresses. An unlabelled venue is invisible to it
- Concentration and holder counts exclude known infrastructure wallets (DEX liquidity, CEX hot wallets, bridges, protocol contracts), so they reflect genuine holders
- Bundle sell-pressure is a notional upper bound at spot, not realized proceeds
- Daily realized PnL prices sells against a lifetime average buy, not per-lot cost basis. Sound for trend, not for accounting
- Today so far is partial by definition. Never add its hours to a daily series