/api/sd/liquidity
GETPartialPARTIAL

Order-book depth and slippage

Per-exchange order-book depth within ±0.5 / 1 / 2 % of mid, spread, and the slippage of a 10k / 100k / 1M USD market order, plus an aggregate per market type with its denominator.

GET/api/sd/liquidity
Partial coverage. For the most liquid coins, the public snapshots of several large venues do not reach the full band, so those venues are excluded from the aggregate and the aggregate understates total depth. `lower_bound_*` fields add the part that was observed. Always read `n_included` together with the depth value.

Request

Query parameters

NameTypeRequiredDefaultAllowed valuesDescription
coinstringRequired——Coin symbol, case-insensitive (for example `BTC`). Missing or malformed values return 400. Example: BTC
marketstringOptionalallperp, spot, allMarket type. Perpetual and spot books are never added together.

Example request

curl -s "https://www.coinboss.com/api/sd/liquidity?coin=BTC"

Response fields

The field table is generated from real responses, so it lists exactly what the endpoint returns. Paths use a[] for array items and {*} for objects keyed by a dynamic name such as a coin or an exchange.

FieldTypeUnitDescription
successboolean—true when the request succeeded. On failure the body is `{ success: false, code, error, request_id }`.
schemastring—Schema id of this response. It changes only when an existing field changes meaning or type.
nownumbermsServer time when the response was built.
coinstring—Coin symbol (upper case).
marketstring—`perp` or `spot`.
venuesarray—One row per exchange × market × contract.
venues[]object—One row per exchange × market × contract.
venues[].exchangestring—Exchange id (lower case).
venues[].marketstring—`perp` or `spot`.
venues[].symbolstring—Contract symbol in CoinBoss storage form.
venues[].quotestring—Quote currency of the market; USDT, USDC and USD are counted 1:1 as USD.
venues[].multipliernumber—Coins per quoted unit (1000 for `1000PEPE`-style contracts). Prices are already divided by it.
venues[].contract_valuenumber—Size of one contract: coins for linear contracts, USD for inverse contracts.
venues[].inverseboolean—True for coin-margined contracts quoted in USD per contract.
venues[].midnumberUSD(best bid + best ask) ÷ 2, price of one coin.
venues[].best_bidnumberUSDBest bid price of one coin.
venues[].best_asknumberUSDBest ask price of one coin.
venues[].spread_bpsnumberbp(best ask − best bid) ÷ mid.
venues[].n_bidsnumber—Bid price levels in the snapshot.
venues[].n_asksnumber—Ask price levels in the snapshot.
venues[].reach_bid_pctnumber%Distance from mid to the farthest bid level in the snapshot.
venues[].reach_ask_pctnumber%Distance from mid to the farthest ask level in the snapshot.
venues[].book_complete_bidboolean—True when the whole bid side of the book was returned.
venues[].book_complete_askboolean—True when the whole ask side of the book was returned.
venues[].bandsobject—Depth per band; the keys `0.5`, `1` and `2` are the distance from mid in percent.
venues[].bands.1object—Band of this distance from mid, in percent.
venues[].bands.1.bid_depth_usdnumberUSDResting bid notional between mid and the lower band edge. A lower bound when `complete` is false.
venues[].bands.1.ask_depth_usdnumberUSDResting ask notional between mid and the upper band edge. A lower bound when `complete` is false.
venues[].bands.1.completeboolean—True when both sides of the snapshot reach the band edge. Incomplete rows are left out of aggregates.
venues[].bands.2object—Band of this distance from mid, in percent.
venues[].bands.2.bid_depth_usdnumberUSDResting bid notional between mid and the lower band edge. A lower bound when `complete` is false.
venues[].bands.2.ask_depth_usdnumberUSDResting ask notional between mid and the upper band edge. A lower bound when `complete` is false.
venues[].bands.2.completeboolean—True when both sides of the snapshot reach the band edge. Incomplete rows are left out of aggregates.
venues[].bands.0.5object—Band of this distance from mid, in percent.
venues[].bands.0.5.bid_depth_usdnumberUSDResting bid notional between mid and the lower band edge. A lower bound when `complete` is false.
venues[].bands.0.5.ask_depth_usdnumberUSDResting ask notional between mid and the upper band edge. A lower bound when `complete` is false.
venues[].bands.0.5.completeboolean—True when both sides of the snapshot reach the band edge. Incomplete rows are left out of aggregates.
venues[].slippageobject—Slippage of a market order; the keys `10000`, `100000` and `1000000` are the order size in USD.
venues[].slippage.10000object—Market order of this size in USD.
venues[].slippage.10000.buy_bpsnumberbpAverage fill price of a market buy relative to mid (includes half the spread); `null` when the snapshot cannot fill the order.
venues[].slippage.10000.sell_bpsnumber|nullbpAverage fill price of a market sell relative to mid (includes half the spread); `null` when the snapshot cannot fill the order.
venues[].slippage.10000.buy_flagnull—`insufficient_book` when the order cannot be filled from the snapshot, `upper_bound` when an aggregated bucket was used, otherwise `null`.
venues[].slippage.10000.sell_flagstring|null—`insufficient_book` when the order cannot be filled from the snapshot, `upper_bound` when an aggregated bucket was used, otherwise `null`.
venues[].slippage.100000object—Market order of this size in USD.
venues[].slippage.100000.buy_bpsnumber|nullbpAverage fill price of a market buy relative to mid (includes half the spread); `null` when the snapshot cannot fill the order.
venues[].slippage.100000.sell_bpsnumber|nullbpAverage fill price of a market sell relative to mid (includes half the spread); `null` when the snapshot cannot fill the order.
venues[].slippage.100000.buy_flagstring|null—`insufficient_book` when the order cannot be filled from the snapshot, `upper_bound` when an aggregated bucket was used, otherwise `null`.
venues[].slippage.100000.sell_flagstring|null—`insufficient_book` when the order cannot be filled from the snapshot, `upper_bound` when an aggregated bucket was used, otherwise `null`.
venues[].slippage.1000000object—Market order of this size in USD.
venues[].slippage.1000000.buy_bpsnumber|nullbpAverage fill price of a market buy relative to mid (includes half the spread); `null` when the snapshot cannot fill the order.
venues[].slippage.1000000.sell_bpsnumber|nullbpAverage fill price of a market sell relative to mid (includes half the spread); `null` when the snapshot cannot fill the order.
venues[].slippage.1000000.buy_flagstring|null—`insufficient_book` when the order cannot be filled from the snapshot, `upper_bound` when an aggregated bucket was used, otherwise `null`.
venues[].slippage.1000000.sell_flagstring|null—`insufficient_book` when the order cannot be filled from the snapshot, `upper_bound` when an aggregated bucket was used, otherwise `null`.
venues[].book_bid_usdnumberUSDNotional of all bids contained in the snapshot.
venues[].book_ask_usdnumberUSDNotional of all asks contained in the snapshot.
venues[].agg_step_bpsnumber|nullbpWidest price-aggregation bucket used inside ±2 %; `null` when only raw levels were used.
venues[].layersnumber—Number of snapshots stitched together for this row.
venues[].observed_atnumber|nullmsTimestamp given by the source for the data.
venues[].received_atnumbermsTime the CoinBoss collector received the data.
venues[].lag_msnumber|nullmsReceive time minus the book timestamp of the venue; `null` when the venue gives none.
venues[].age_snumbersSeconds since the row was received.
venues[].fresh_window_snumbersA row older than this is stale.
venues[].is_staleboolean—True when the data is older than its fresh window.
venues[].tierstring—Collection tier: `A` for the most traded coins, `B` for the rest.
venues[].period_snumbersCollection period of the row.
aggregateobject—Totals per market type. Perpetual and spot are never added together.
aggregate.perpobject—Aggregate over perpetual books; `null` when there is no row. may be absent
aggregate.perp.n_rowsnumber—Rows found, including stale ones. may be absent
aggregate.perp.n_freshnumber—Fresh rows. may be absent
aggregate.perp.mid_mediannumberUSDMedian mid price of the fresh rows. may be absent
aggregate.perp.spread_bps_minnumberbpTightest spread among the fresh rows. may be absent
aggregate.perp.bandsobject—Depth per band; the keys `0.5`, `1` and `2` are the distance from mid in percent. may be absent
aggregate.perp.bands.1object—Band of this distance from mid, in percent. may be absent
aggregate.perp.bands.1.bid_depth_usdnumberUSDResting bid notional between mid and the lower band edge. A lower bound when `complete` is false. may be absent
aggregate.perp.bands.1.ask_depth_usdnumberUSDResting ask notional between mid and the upper band edge. A lower bound when `complete` is false. may be absent
aggregate.perp.bands.1.n_includednumber—Rows included in the depth sum: fresh and complete for the band. Read it together with the depth value. may be absent
aggregate.perp.bands.1.n_freshnumber—Fresh rows. may be absent
aggregate.perp.bands.1.included_exchangesarray—Sources whose fresh data is included. may be absent
aggregate.perp.bands.1.included_exchanges[]string—Sources whose fresh data is included. may be absent
aggregate.perp.bands.1.excluded_incompletearray—Fresh rows left out of the band because their snapshot does not reach the band edge. may be absent
aggregate.perp.bands.1.excluded_incomplete[]object—Fresh rows left out of the band because their snapshot does not reach the band edge. may be absent
aggregate.perp.bands.1.excluded_incomplete[].exchangestring—Exchange id (lower case). may be absent
aggregate.perp.bands.1.excluded_incomplete[].symbolstring—Contract symbol in CoinBoss storage form. may be absent
aggregate.perp.bands.1.excluded_incomplete[].reach_bid_pctnumber%Distance from mid to the farthest bid level in the snapshot. may be absent
aggregate.perp.bands.1.excluded_incomplete[].reach_ask_pctnumber%Distance from mid to the farthest ask level in the snapshot. may be absent
aggregate.perp.bands.1.lower_bound_bid_usdnumberUSDBid depth including the observed part of incomplete rows. A floor, not an estimate. may be absent
aggregate.perp.bands.1.lower_bound_ask_usdnumberUSDAsk depth including the observed part of incomplete rows. A floor, not an estimate. may be absent
aggregate.perp.bands.1.uses_aggregated_bucketsboolean—True when an included row used price-aggregated buckets, which makes the sum a lower bound. may be absent
aggregate.perp.bands.2object—Band of this distance from mid, in percent. may be absent
aggregate.perp.bands.2.bid_depth_usdnumberUSDResting bid notional between mid and the lower band edge. A lower bound when `complete` is false. may be absent
aggregate.perp.bands.2.ask_depth_usdnumberUSDResting ask notional between mid and the upper band edge. A lower bound when `complete` is false. may be absent
aggregate.perp.bands.2.n_includednumber—Rows included in the depth sum: fresh and complete for the band. Read it together with the depth value. may be absent
aggregate.perp.bands.2.n_freshnumber—Fresh rows. may be absent
aggregate.perp.bands.2.included_exchangesarray—Sources whose fresh data is included. may be absent
aggregate.perp.bands.2.included_exchanges[]string—Sources whose fresh data is included. may be absent
aggregate.perp.bands.2.excluded_incompletearray—Fresh rows left out of the band because their snapshot does not reach the band edge. may be absent
aggregate.perp.bands.2.excluded_incomplete[]object—Fresh rows left out of the band because their snapshot does not reach the band edge. may be absent
aggregate.perp.bands.2.excluded_incomplete[].exchangestring—Exchange id (lower case). may be absent
aggregate.perp.bands.2.excluded_incomplete[].symbolstring—Contract symbol in CoinBoss storage form. may be absent
aggregate.perp.bands.2.excluded_incomplete[].reach_bid_pctnumber%Distance from mid to the farthest bid level in the snapshot. may be absent
aggregate.perp.bands.2.excluded_incomplete[].reach_ask_pctnumber%Distance from mid to the farthest ask level in the snapshot. may be absent
aggregate.perp.bands.2.lower_bound_bid_usdnumberUSDBid depth including the observed part of incomplete rows. A floor, not an estimate. may be absent
aggregate.perp.bands.2.lower_bound_ask_usdnumberUSDAsk depth including the observed part of incomplete rows. A floor, not an estimate. may be absent
aggregate.perp.bands.2.uses_aggregated_bucketsboolean—True when an included row used price-aggregated buckets, which makes the sum a lower bound. may be absent
aggregate.perp.bands.0.5object—Band of this distance from mid, in percent. may be absent
aggregate.perp.bands.0.5.bid_depth_usdnumberUSDResting bid notional between mid and the lower band edge. A lower bound when `complete` is false. may be absent
aggregate.perp.bands.0.5.ask_depth_usdnumberUSDResting ask notional between mid and the upper band edge. A lower bound when `complete` is false. may be absent
aggregate.perp.bands.0.5.n_includednumber—Rows included in the depth sum: fresh and complete for the band. Read it together with the depth value. may be absent
aggregate.perp.bands.0.5.n_freshnumber—Fresh rows. may be absent
aggregate.perp.bands.0.5.included_exchangesarray—Sources whose fresh data is included. may be absent
aggregate.perp.bands.0.5.included_exchanges[]string—Sources whose fresh data is included. may be absent
aggregate.perp.bands.0.5.excluded_incompletearray—Fresh rows left out of the band because their snapshot does not reach the band edge. may be absent
aggregate.perp.bands.0.5.excluded_incomplete[]object—Fresh rows left out of the band because their snapshot does not reach the band edge. may be absent
aggregate.perp.bands.0.5.excluded_incomplete[].exchangestring—Exchange id (lower case). may be absent
aggregate.perp.bands.0.5.excluded_incomplete[].symbolstring—Contract symbol in CoinBoss storage form. may be absent
aggregate.perp.bands.0.5.excluded_incomplete[].reach_bid_pctnumber%Distance from mid to the farthest bid level in the snapshot. may be absent
aggregate.perp.bands.0.5.excluded_incomplete[].reach_ask_pctnumber%Distance from mid to the farthest ask level in the snapshot. may be absent
aggregate.perp.bands.0.5.lower_bound_bid_usdnumberUSDBid depth including the observed part of incomplete rows. A floor, not an estimate. may be absent
aggregate.perp.bands.0.5.lower_bound_ask_usdnumberUSDAsk depth including the observed part of incomplete rows. A floor, not an estimate. may be absent
aggregate.perp.bands.0.5.uses_aggregated_bucketsboolean—True when an included row used price-aggregated buckets, which makes the sum a lower bound. may be absent
aggregate.spotobject—Aggregate over spot books; `null` when there is no row. may be absent
aggregate.spot.n_rowsnumber—Rows found, including stale ones. may be absent
aggregate.spot.n_freshnumber—Fresh rows. may be absent
aggregate.spot.mid_mediannumberUSDMedian mid price of the fresh rows. may be absent
aggregate.spot.spread_bps_minnumberbpTightest spread among the fresh rows. may be absent
aggregate.spot.bandsobject—Depth per band; the keys `0.5`, `1` and `2` are the distance from mid in percent. may be absent
aggregate.spot.bands.1object—Band of this distance from mid, in percent. may be absent
aggregate.spot.bands.1.bid_depth_usdnumberUSDResting bid notional between mid and the lower band edge. A lower bound when `complete` is false. may be absent
aggregate.spot.bands.1.ask_depth_usdnumberUSDResting ask notional between mid and the upper band edge. A lower bound when `complete` is false. may be absent
aggregate.spot.bands.1.n_includednumber—Rows included in the depth sum: fresh and complete for the band. Read it together with the depth value. may be absent
aggregate.spot.bands.1.n_freshnumber—Fresh rows. may be absent
aggregate.spot.bands.1.included_exchangesarray—Sources whose fresh data is included. may be absent
aggregate.spot.bands.1.included_exchanges[]string—Sources whose fresh data is included. may be absent
aggregate.spot.bands.1.excluded_incompletearray—Fresh rows left out of the band because their snapshot does not reach the band edge. may be absent
aggregate.spot.bands.1.excluded_incomplete[]object—Fresh rows left out of the band because their snapshot does not reach the band edge. may be absent
aggregate.spot.bands.1.excluded_incomplete[].exchangestring—Exchange id (lower case). may be absent
aggregate.spot.bands.1.excluded_incomplete[].symbolstring—Contract symbol in CoinBoss storage form. may be absent
aggregate.spot.bands.1.excluded_incomplete[].reach_bid_pctnumber%Distance from mid to the farthest bid level in the snapshot. may be absent
aggregate.spot.bands.1.excluded_incomplete[].reach_ask_pctnumber%Distance from mid to the farthest ask level in the snapshot. may be absent
aggregate.spot.bands.1.lower_bound_bid_usdnumberUSDBid depth including the observed part of incomplete rows. A floor, not an estimate. may be absent
aggregate.spot.bands.1.lower_bound_ask_usdnumberUSDAsk depth including the observed part of incomplete rows. A floor, not an estimate. may be absent
aggregate.spot.bands.1.uses_aggregated_bucketsboolean—True when an included row used price-aggregated buckets, which makes the sum a lower bound. may be absent
aggregate.spot.bands.2object—Band of this distance from mid, in percent. may be absent
aggregate.spot.bands.2.bid_depth_usdnumberUSDResting bid notional between mid and the lower band edge. A lower bound when `complete` is false. may be absent
aggregate.spot.bands.2.ask_depth_usdnumberUSDResting ask notional between mid and the upper band edge. A lower bound when `complete` is false. may be absent
aggregate.spot.bands.2.n_includednumber—Rows included in the depth sum: fresh and complete for the band. Read it together with the depth value. may be absent
aggregate.spot.bands.2.n_freshnumber—Fresh rows. may be absent
aggregate.spot.bands.2.included_exchangesarray—Sources whose fresh data is included. may be absent
aggregate.spot.bands.2.included_exchanges[]string—Sources whose fresh data is included. may be absent
aggregate.spot.bands.2.excluded_incompletearray—Fresh rows left out of the band because their snapshot does not reach the band edge. may be absent
aggregate.spot.bands.2.excluded_incomplete[]object—Fresh rows left out of the band because their snapshot does not reach the band edge. may be absent
aggregate.spot.bands.2.excluded_incomplete[].exchangestring—Exchange id (lower case). may be absent
aggregate.spot.bands.2.excluded_incomplete[].symbolstring—Contract symbol in CoinBoss storage form. may be absent
aggregate.spot.bands.2.excluded_incomplete[].reach_bid_pctnumber%Distance from mid to the farthest bid level in the snapshot. may be absent
aggregate.spot.bands.2.excluded_incomplete[].reach_ask_pctnumber%Distance from mid to the farthest ask level in the snapshot. may be absent
aggregate.spot.bands.2.lower_bound_bid_usdnumberUSDBid depth including the observed part of incomplete rows. A floor, not an estimate. may be absent
aggregate.spot.bands.2.lower_bound_ask_usdnumberUSDAsk depth including the observed part of incomplete rows. A floor, not an estimate. may be absent
aggregate.spot.bands.2.uses_aggregated_bucketsboolean—True when an included row used price-aggregated buckets, which makes the sum a lower bound. may be absent
aggregate.spot.bands.0.5object—Band of this distance from mid, in percent. may be absent
aggregate.spot.bands.0.5.bid_depth_usdnumberUSDResting bid notional between mid and the lower band edge. A lower bound when `complete` is false. may be absent
aggregate.spot.bands.0.5.ask_depth_usdnumberUSDResting ask notional between mid and the upper band edge. A lower bound when `complete` is false. may be absent
aggregate.spot.bands.0.5.n_includednumber—Rows included in the depth sum: fresh and complete for the band. Read it together with the depth value. may be absent
aggregate.spot.bands.0.5.n_freshnumber—Fresh rows. may be absent
aggregate.spot.bands.0.5.included_exchangesarray—Sources whose fresh data is included. may be absent
aggregate.spot.bands.0.5.included_exchanges[]string—Sources whose fresh data is included. may be absent
aggregate.spot.bands.0.5.excluded_incompletearray—Fresh rows left out of the band because their snapshot does not reach the band edge. may be absent
aggregate.spot.bands.0.5.excluded_incomplete[]object—Fresh rows left out of the band because their snapshot does not reach the band edge. may be absent
aggregate.spot.bands.0.5.excluded_incomplete[].exchangestring—Exchange id (lower case). may be absent
aggregate.spot.bands.0.5.excluded_incomplete[].symbolstring—Contract symbol in CoinBoss storage form. may be absent
aggregate.spot.bands.0.5.excluded_incomplete[].reach_bid_pctnumber%Distance from mid to the farthest bid level in the snapshot. may be absent
aggregate.spot.bands.0.5.excluded_incomplete[].reach_ask_pctnumber%Distance from mid to the farthest ask level in the snapshot. may be absent
aggregate.spot.bands.0.5.lower_bound_bid_usdnumberUSDBid depth including the observed part of incomplete rows. A floor, not an estimate. may be absent
aggregate.spot.bands.0.5.lower_bound_ask_usdnumberUSDAsk depth including the observed part of incomplete rows. A floor, not an estimate. may be absent
aggregate.spot.bands.0.5.uses_aggregated_bucketsboolean—True when an included row used price-aggregated buckets, which makes the sum a lower bound. may be absent
coverageobject—What is and is not included in the numbers. Compare this before comparing totals with another source.
coverage.included_exchangesarray—Sources whose fresh data is included.
coverage.included_exchanges[]string—Sources whose fresh data is included.
coverage.unavailablearray—Sources that could not be included, each with a reason. They are never counted as 0. empty in the samples used to generate this table
coverage.stale_excludedarray—Rows left out because their last update is outside the fresh window. empty in the samples used to generate this table
coverage.no_marketarray—Exchange × market pairs that are collected but hold no row for this coin. empty in the samples used to generate this table
methodobject—Plain-text statement of the formulas used for this response, one entry per field.
method.midstring—Formula note for `mid`, plain text.
method.spread_bpsstring—Formula note for `spread_bps`, plain text.
method.bid_depth_usdstring—Formula note for `bid_depth_usd`, plain text.
method.ask_depth_usdstring—Formula note for `ask_depth_usd`, plain text.
method.completestring—Formula note for `complete`, plain text.
method.reach_pctstring—Formula note for `reach_pct`, plain text.
method.slippage_bpsstring—Formula note for `slippage_bps`, plain text.
method.agg_step_bpsstring—Formula note for `agg_step_bps`, plain text.
method.aggregatestring—Formula note for `aggregate`, plain text.
method.freshstring—Formula note for `fresh`, plain text.
method.lag_msstring—Formula note for `lag_ms`, plain text.
method.no_marketstring—Formula note for `no_market`, plain text.
metaobject—Lineage and freshness of this response.
meta.schemastring—Schema id of this response. It changes only when an existing field changes meaning or type.
meta.sourcearray—Upstream public endpoints the data was collected from.
meta.source[]object—Upstream public endpoints the data was collected from.
meta.source[].exchangestring—Exchange id (lower case).
meta.source[].marketstring—`perp` or `spot`.
meta.source[].endpointstring—Public endpoint of the source the collector reads (shown for lineage; clients never call it).
meta.observed_atnumbermsTimestamp given by the source for the data.
meta.received_atnumbermsTime the CoinBoss collector received the data.
meta.fetched_atnumbermsTime this response was assembled.
meta.windowstring—Time window the numbers cover.
meta.qualitystring—FRESH, PARTIAL, STALE, BROKEN or UNAVAILABLE, judged from data timestamps and coverage.
meta.is_staleboolean—True when the data is older than its fresh window.
meta.cache_ttl_snumbersCache lifetime of this response.
meta.fallbackstring—What the endpoint returns when the collector or a source fails.
meta.collector_heartbeat_age_snumbersSeconds since the collector last reported that it is running.

Generated 2026-11-11 23:28 UTC from 4 real responses.

Example response

/api/sd/liquidity?coin=BTC · Real response captured 2026-11-13 03:58:06 UTC. Long arrays and maps are shortened for display: venues had 39 items; meta.source had 38 items; coverage.included_exchanges had 24 items; aggregate.perp.bands.1.included_exchanges had 19 items; aggregate.perp.bands.2.included_exchanges had 16 items; aggregate.spot.bands.1.included_exchanges had 14 items.

  • {
    • "success": true,
    • "schema": "coinboss.sd.liquidity/1",
    • "now": 1794542286066,
    • "coin": "BTC",
    • "market": "all",
    • "venues": [
      • { … 31 }
      ],
    • "aggregate": {
      • "perp": { … 5 },
      • "spot": { … 5 }
      },
    • "coverage": {
      • "included_exchanges": [ … 8 ],
      • "unavailable": [],
      • "stale_excluded": [],
      • "no_market": []
      },
    • "method": {
      • "mid": "(best_bid + best_ask) / 2 of the venue order book, normalised to the USD price of ONE coin (1000PEPE / kPEPE style contr…",
      • "spread_bps": "(best_ask - best_bid) / mid * 1e4",
      • "bid_depth_usd": "sum of resting bid notional with price >= mid * (1 - band%), in USD; notional = price * size * contract_value (inverse c…",
      • "ask_depth_usd": "sum of resting ask notional with price <= mid * (1 + band%), in USD; same notional rule as bid_depth_usd",
      • "complete": "true when BOTH sides of the snapshot reach the band edge (reach_pct >= band) or the whole side of the book was returned;…",
      • "reach_pct": "distance in % between mid and the farthest price level contained in the snapshot on that side",
      • "slippage_bps": "market order of N USD walked through the book: buy = (avg_fill / mid - 1) * 1e4, sell = (1 - avg_fill / mid) * 1e4, meas…",
      • "agg_step_bps": "widest price-aggregation bucket (in bps of mid) used inside +-2% for venues whose REST only exposes a shallow raw book (…",
      • "aggregate": "per market and band: sum over rows that are fresh AND complete for that band; n_included / n_fresh is the denominator; l…",
      • "fresh": "a row is fresh when now - received_at <= max(3 * period_s, 300s); stale rows are listed in coverage.stale_excluded; rows…",
      • "lag_ms": "received_at - venue timestamp of the book (null when the venue gives none); Gate spot books deeper than 100 levels are v…",
      • "no_market": "covered venue/market pairs that are being collected but hold no row for this coin: not listed there, or the contract was…"
      },
    • "meta": {
      • "schema": "coinboss.sd.liquidity/1",
      • "source": [ … 1 ],
      • "observed_at": 1794542285214,
      • "received_at": 1794542285776,
      • "fetched_at": 1794542286066,
      • "window": "latest",
      • "quality": "PARTIAL",
      • "is_stale": false,
      • "cache_ttl_s": 15,
      • "fallback": "on collector failure the last stored row is served with is_stale=true and left out of the aggregate; rows older than 24h…",
      • "collector_heartbeat_age_s": 9
      }
    }

Verified samples

Besides the example above, the probe calls this endpoint with these parameters and checks the schema each time.

ParametersHTTPLatencyResult
coin=ETH&market=spot2003 msPass PARTIAL
coin=PEPE&market=perp2004 msPass FRESH
coin=SOL2004 msPass PARTIAL
—4001 msPass returns the expected error

Checked 2026-11-13 03:58:06 UTC

Details

Authentication
None. Public endpoint.
Rate limit
1200 requests per minute per IP
Server cache
15s
Edge micro-cache
10s
Update frequency
Snapshots every 120 seconds for the most traded coins and every 600 seconds for the rest (a few venues: 300 / 1200 seconds). A row is fresh for three collection periods, at least 300 seconds.
Window
Latest snapshot per contract.
Data sources
Public REST order-book snapshots of 24 exchanges (perpetual and spot markets), collected and stored by CoinBoss (sd_book_latest, sd_book_hist). Depth and slippage are computed by CoinBoss from the raw price levels.
Exchange coverage
24 exchanges, 38 exchange × market lanes. Where a public snapshot does not reach ±0.5 / 1 / 2 % from mid (level cap of the venue), that band is flagged `complete: false`, its value is a lower bound and it is left out of the aggregate; `n_included` / `n_fresh` give the denominator and `excluded_incomplete` lists what was left out.
Pagination
No paging; one row per exchange × market × contract.
Sorting
Perpetual rows first, then spot; inside each by ±1 % depth (bid + ask) descending.
Units
Depth in USD notional, bid and ask side reported separately and never added. Spread and slippage in basis points (1 bp = 0.01 %). USDT / USDC / USD quotes are counted 1:1 as USD.
Method
mid = (best bid + best ask) ÷ 2. Depth = Σ price × size of all levels between mid and mid ± x %. Slippage = (average fill price of a market order of N USD − mid) ÷ mid, in bp; `null` with flag `insufficient_book` when the snapshot cannot fill the order (no extrapolation), flag `upper_bound` when an aggregated price bucket was used.
Timestamps
Unix epoch milliseconds (UTC) unless the field description says otherwise
Response format
json
Stability
Stable
Available since
2026-11-11

Live status

PartialChecked 2026-11-13 03:58:06 UTCHTTP 2007 msSchema matchesNewest data point 0s old

The endpoint reports data quality PARTIAL — For the most liquid coins, the public snapshots of several large venues do not reach the full band, so those venues are excluded from the aggregate and the aggregate understates total depth. `lower_bound_*` fields add the part that was observed. Always read `n_included` together with the depth value.

Availability, last 30 days

100% of 407 checks passed

Errors

Failed calls share one shape on every endpoint. The full list is on the errors page. Errors and rate limits →

CodeHTTPMeaningWhat to do
INVALID_PARAM400A required parameter is missing or a value is not accepted. `param` names the parameter when it is known.Do not retry unchanged; fix the request.
UNAUTHORIZED401The `CB-API-KEY` header was sent but the key is unknown or revoked. Public data needs no key — drop the header or use a valid key.Do not retry unchanged.
FORBIDDEN403The route is not part of the public API (internal or account-only).Do not retry.
NOT_FOUND404Unknown route, or the requested coin / exchange / fund does not exist.Do not retry; check the path and identifiers against the catalog.
RATE_LIMITED429More requests than the per-minute limit. `Retry-After` gives the seconds to wait.Wait for `Retry-After`, then retry with backoff.
INTERNAL500Unexpected server error. The message is generic by design; quote `request_id` when reporting it.Retry once after a few seconds; report it with the request id if it persists.
UPSTREAM_FAILED503The data source behind this endpoint did not answer in time. No stale or substitute numbers are returned in its place.Retry with backoff; check the status page.
UNAVAILABLE501 / 503The dataset is temporarily not ready (cache warming) or the endpoint has no lawful public source yet.Retry later; the catalog marks endpoints that are unavailable by design.
REQUEST_FAILED200Some older endpoints answer HTTP 200 with `success: false`. Always check `success`, not only the HTTP status.Depends on the message; treat as a failed request.

Try it

GET/api/sd/liquidityPartial
Parameters

string — Coin symbol, case-insensitive (for example `BTC`). Missing or malformed values return 400.

string · default all — Market type. Perpetual and spot books are never added together.

Request URLhttps://www.coinboss.com/api/sd/liquidity?coin=BTC
Choose an endpoint and press “Send request”. The response, headers and timing will appear here.