One envelope
Every response is{ data, meta }. meta.asOf is a timestamp (ms): on wallet positions and closed positions it is the moment the holdings were read on-chain, on pulse and token holders the moment the list was computed, and on wallet equity history the moment the curve was computed (the age of the data, so a cached response is visible as such); elsewhere it is the server time of the response. A field that can’t be computed is null (never a fabricated value, see null means unknown); when data is momentarily unavailable the endpoint returns a 503 with Retry-After rather than partial data.
Chain ids
evm:<EIP-155 id> (e.g. evm:8453 for Base, evm:645749 for HyperEVM - canonical ids, nothing invented) and solana (solana:solana is accepted on input; the prefix is case-insensitive). Responses always echo the canonical id.
camelCase fields, ms timestamps
All fields are camelCase; every timestamp is unix milliseconds and ends inAt (candle time is unix seconds, TradingView-style). Trade timestamps carry the block time: EVM blocks are second-stamped, and Solana slots are stamped at second precision too, so a trade at is a whole second; the order of trades inside a second is exact (block/logIndex on EVM, slot order and the cursor on Solana), and the live stream carries a finer at on Solana. Timestamp parameters follow the same rule: milliseconds everywhere (fromAt, toAt, beforeAt, and from / to outside candles), seconds for the candle bounds endTime and from. A value in the other unit is rejected with 400 rather than interpreted.
null means unknown
Anull field means the source is unavailable or the value fails sanity checks (e.g. marketCapUsd > $1T). A 0 is always a measured zero.
Strict validation
Unknown params or invalid enums return 400 with a machine-readableerror.code - never silently-empty data. A parameter we do not know answers UNKNOWN_PARAM and names it in the message; a known parameter with a bad value answers INVALID_PARAM.
Native + USD
On-chain amounts are native-denominated (priceNative, liquidityNative as strings for precision); USD fields are computed from native prices. On Solana, trade/volume USD figures use the rate at the time of each trade (meta.usdBasis: "trade"); EVM uses the current spot ("spot"). Amounts are GROSS on-chain (the exact swapped amounts).
Batch twins
Hot single-GET endpoints have a POST twin on the same path takingitems[]; the response array is in input order with per-item {error} slots. Billing is per item served: an {error} slot is never billed.
Solana included
Every REST endpoint and stream also serves Solana with the same shapes: chain=solana, base58 addresses (case-sensitive), tx identity is the signature (carried in txHash). Displayed Solana volumes and counts are the full on-chain figures; organic twins (wash-filtered) are available as separate*Organic fields where provided. Solana trades aggregate multihop legs per transaction (effective VWAP); EVM tapes serve one row per swap event, so a swap routed through several pools of a token yields several rows sharing txHash. On token stats, token details, market data and token pools, txns counts distinct transactions on every chain.