One envelope
Every response is{ data, meta }. meta.asOf is the server timestamp (ms). Partial sources appear in meta.degraded - data is never silently faked.
Chain ids
evm:<EIP-155 id> (e.g. evm:8453 for Base, evm:645749 for HyperEVM - canonical ids, nothing invented) and solana.
camelCase fields, ms timestamps
All fields are camelCase; every timestamp is unix milliseconds and ends inAt (candle time is unix seconds, TradingView-style).
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.
Native + USD
On-chain amounts are native-denominated (priceNative, liquidityNative as strings for precision); USD fields are computed at the edge from live native prices. Amounts are GROSS on-chain (Mobula was net-of-fee: a ~0.3-1% systematic difference is expected).
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.