Responses
The response envelope, the status block, request IDs, timestamps, nulls and coverage.
The Envelope
Every successful response is a JSON object with a status block and the answer in data. Cursor-paginated collections add pagination; the listings add sort; a market adds its ticker and liquidity beside data.
{
"status": {
"timestamp": "2026-10-11T14:00:00.000Z",
"elapsed_ms": 18,
"error_code": 0,
"error_message": null,
"request_id": "req_7Hk2pQ9xLm"
},
"data": [
{ "asset_id": "ast_515c3eaa72bd4a8b9403297879d78ef6", "quotes": { "USD": { "price": "0.1584" } } }
],
"pagination": {
"next_cursor": "eyJ2IjoxLCJvIjoyNX0"
}
}| Field | Meaning |
|---|---|
status.timestamp | When the API answered, UTC. |
status.elapsed_ms | Time the API spent on the request, in milliseconds. |
status.error_code | 0 on success; the numeric error code otherwise. |
status.error_message | null on success; the error text otherwise. |
status.request_id | Identifies the request in our logs, prefixed req_. Log it beside your own request. |
data | The answer: an object for one record, an array for a collection, a map for keyed batches such as the simple price. |
pagination.next_cursor | On paginated collections: the cursor for the next page, or null on the last one. |
Failures replace data with an error object; see Errors.
Identifiers
Records are identified by stable, opaque CantonCap IDs with a prefix that names the kind: ast_ for assets, mkt_ for markets, pool_ for pools, iss_ for issuers and trd_ for trades. Venues have readable IDs such as temple, cantex, kora or tradecraft. Store IDs, not symbols: a symbol can be shared by several assets, an ID cannot. An asset is also identified on Canton by its instrument_admin and instrument_id, and GET /v1/assets/map resolves either form to the other.
Numbers
Prices, amounts, volumes, supplies and ratios are decimal strings such as "0.1584", never JSON numbers. Counts (trades, markets, positions) and durations are JSON integers. See Decimals and precision.
- Percentages (
price_changes_pct,price_change_24h_pct,change_24h_pct) are in percentage points:"1.5"means 1.5%, not 150%. - Ratios (
liquidity_to_fdv_ratio,volume_24h_to_fdv_ratio) are raw:"0.025"displays as 2.5%. They carry 18 fractional digits and are not capped at 1. - Basis points are named so:
spread_bps,fee_bps,impact_bps.
Time
- Every time is an RFC 3339 string in UTC, such as
2026-10-11T14:00:00.000Z. Send times in the same form; an offset such as+02:00is accepted. - Ranges include
time_startand excludetime_end. On the quote, candle, chart, supply and trade history endpoints, a range withouttime_endends now and a range withouttime_startstarts 24 hours before its end. - History is returned newest first, and intervals with nothing in them are left out, never filled with zeros or carried-forward values.
- Interval boundaries are aligned to UTC: an hourly bucket runs from :00 to :00.
Freshness Is Yours to Judge
There is no stale flag and no freshness wrapper. Every quote, observation and statistic carries its own last_updated_at: for a calculated asset price it is when the price was calculated, for a venue observation when the venue measured it. Compare it with the clock and decide what age your product accepts.
When the newest refresh of a statistic had no usable value, the API keeps the latest usable value with that value's own, older time, so an old timestamp is the signal. History is never forward-filled.
Null Means Unknown
null means the API does not have a value it can stand behind. It is never a stand-in for zero, and a measured zero is returned as "0". Render a null as an absence, not as 0.
market_capis null for every asset: no reviewed circulating-supply methodology exists, and FDV is never substituted.fdvis null when the total supply is missing, stale or withheld.- A price change for a window without data, such as
30dfor a young asset, is null. - In batch responses, an ID or currency the API cannot answer for is left out rather than returned as null.
Coverage
Where a figure is a sum over observations that may be incomplete, it says how complete it is, so a partial subtotal is never read as a total:
quotes.*.volume.coverageandcompletenessfields arecomplete,partialorunknown.- Asset candles carry
volume_coverage(complete,partialorunavailable) andvolume_method. - Activity measurements carry
covered_secondsand themethodsbehind each value.
Networks
Endpoints that take network default to mainnet and also accept testnet and devnet. Global metrics span every network and say so with network: "all".