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 and they are cached at the edge. All of them except the two wallet reads 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) and token decimals 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

links holds the creator’s website, X and Telegram links as https URLs. Each is null when the creator left it empty or entered something that is not a valid link. A bare X handle becomes https://x.com/<handle> and a bare Telegram handle becomes https://t.me/<handle>. A website that is not an https:// URL is null. To list every token one creator launched, pass creator:

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. To learn about new launches without polling, subscribe a webhook endpoint to build.blank.launch.created.v1 or build.blank.launch.confirmed.v1. Their data is this same Token object. See Webhooks.

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.
To get new trades pushed instead of polling, subscribe a webhook endpoint to build.blank.trade.confirmed.v1. Its data is this same Trade object. See Webhooks.

A wallet’s trades

Every indexed trade a wallet made across visible Blank tokens, newest first. Pass mint to narrow it to one token.
Each item has the same fields as Trades; mintAddress tells you which token it was. A wallet with no trades, or a mint that is unknown or hidden, returns 200 with an empty page, never 404. Cursor paginated with cursor and limit; a cursor is bound to the wallet and mint it was issued for.

A wallet’s holdings

The Blank tokens a wallet holds right now, highest value first.
Balances come from chain, not from the trade index: the Worker reads every SPL Token and Token-2022 account the wallet owns, sums the balance per mint, drops zero balances, and keeps only visible Blank tokens. Transfers and airdrops therefore show up even though they are not trades. The response is { data: [...], asOf }, where asOf is when the balances were read. It is not paginated and holds at most 500 holdings, sorted by valueInSol descending, then by mint. A wallet without Blank tokens returns an empty data. When the chain read fails the operation returns 503 market_data_unavailable rather than a partial list. Results are cached for 15 seconds per wallet.

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 except the two wallet reads 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 and wallet holdings use the public-read-expensive rate policy; the others 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.