Tokens and Market Data
Every operation on this page is anonymous. No API key, no scope, no wallet. They are public reads, they are cached at the edge, and they all support conditional requests.Setup
https://api.blank.build/api/v2. Every call returns { data, metadata, response }, and metadata.requestId is the X-Request-Id you should log alongside failures.
Numbers are strings
Every monetary value, price, and amount is a canonical decimal string. Raw on-chain amounts are unsigned integer strings. Nothing is a JSON number, so nothing loses precision in transit. Integer counts (holderCount, activeStakers, trades, rank) are real JSON numbers. Timestamps are RFC 3339 strings.
List tokens
Returns tokens in reverse launch order.
The response is
{ data: [...], page: { nextCursor, hasMore } }. See Conventions for the full pagination contract.
Token fields
TokenStatus
pending, pending_launch_init, pending_escrows, pending_finalization, bonding, pre_raise_pending, pre_raising, pre_raise_settling, pre_raise_refunding, pre_raise_failed, graduating_migration_pending, graduated, graduation_failed, expired, cancelled, failed.
Treat this as an open enum in your own code. Match the statuses you care about and fall through on the rest.
Get one token
404 token_not_found.
Paginate the full set
blank.tokens.iterate() handles cursors for you and yields tokens one at a time. maxPages is a required safety bound in practice — it defaults to 100 and throws if the walk runs past it.
Market snapshot
The current price, cap, and liquidity for one token.asOf is when the indexer computed the snapshot, not when you called. Show it if your UI implies live pricing.
Candles
from, to, and interval are all required. Timestamps are RFC 3339 with an offset, and from must be strictly before to. The range is half-open: from is inclusive, to is exclusive. Intervals: 1m, 5m, 15m, 1h, 4h, 1d.
The CandleSeries response carries data, interval, from, to, and provenance ("blank-indexer"). Each candle has time, open, high, low, close, volumeInSol (decimal strings) and trades (integer).
A series is capped at 1000 candles. A window that would exceed the cap, or
that is otherwise out of range, returns
422 market_time_range_invalid. Split
long ranges into consecutive windows, or step up to a coarser interval.Trades
Newest first, cursor paginated withcursor and limit.
Holder stats
mintAddress, holderCount (integer), slot (numeric string or null), asOf, and provenance.
provenance tells you how the count was derived: live_trade_index (running index, freshest), trade_replay (rebuilt from trade history), or onchain_snapshot (read from chain state). A token with no computed stats returns 404 holder_stats_not_found.
Caching and conditional requests
Every response carries anETag. Send it back as If-None-Match and you get 304 Not Modified with no body when nothing changed.
Polling faster than
max-age gains you nothing but rate-limit budget. Candles use the public-read-expensive rate policy; the other five use public-read-cheap. Both are documented in Conventions.
Authorization header — these endpoints are anonymous, so this request is safe to make from anywhere.
Errors
Full problem-details shape and retry guidance live in Errors.
Next
- Fees — fee state and distribution history.
- Staking — pools, leaderboards, positions.
- Conventions — pagination, rate limits, idempotency.