Skip to main content

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

The base URL defaults to 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.
Do not parse these with Number or parseFloat. Token supplies and lamport amounts exceed the safe integer range, and binary floats cannot represent decimal prices exactly. Use a decimal library, or BigInt for raw integer strings.
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

Same fields as the list entries. Unknown mints return 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 with cursor and limit.

Holder stats

Returns 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 an ETag. 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.
No 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.