Futures basis (all venues)
Perpetual basis (mark vs index), perp-vs-spot basis on the same exchange and delivery-futures basis with annualised rate, per contract, plus OI-weighted, volume-weighted and median aggregates.
/api/sd/basisRequest
Query parameters
| Name | Type | Required | Default | Allowed values | Description |
|---|---|---|---|---|---|
| coin | string | Required | — | — | Coin symbol, case-insensitive (for example `BTC`). Missing or malformed values return 400. Example: BTC |
Example request
curl -s "https://www.coinboss.com/api/sd/basis?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.
| Field | Type | Unit | Description |
|---|---|---|---|
| success | boolean | — | true when the request succeeded. On failure the body is `{ success: false, code, error, request_id }`. |
| schema | string | — | Schema id of this response. It changes only when an existing field changes meaning or type. |
| now | number | ms | Server time when the response was built. |
| coin | string | — | Coin symbol (upper case). |
| perp | object | — | Perpetual basis: mark price against the index price of the same exchange. |
| perp.unit | string | — | Unit of the basis values (percent). |
| perp.aggregate | object | — | Cross-exchange aggregate of the section. |
| perp.aggregate.oi_weighted_pct | number | % | Basis weighted by open interest; rows without an OI weight are left out. |
| perp.aggregate.oi_weight_usd | number | USD | Sum of the open-interest weights used. |
| perp.aggregate.n_oi_weighted | number | — | Rows that carried an OI weight. |
| perp.aggregate.vol_weighted_pct | number | % | Basis weighted by 24h notional volume. |
| perp.aggregate.vol_weight_usd | number | USD | Sum of the volume weights used. |
| perp.aggregate.n_vol_weighted | number | — | Rows that carried a volume weight. |
| perp.aggregate.median_pct | number | % | Median basis over one primary contract per exchange. |
| perp.aggregate.mean_pct | number | % | Simple mean over the same set as the median. |
| perp.aggregate.n_exchanges | number | — | Exchanges in the aggregate. |
| perp.aggregate.n_contracts | number | — | Contracts in the aggregate. |
| perp.aggregate.min | object | — | Exchange and contract with the lowest basis. |
| perp.aggregate.min.exchange | string | — | Exchange id (lower case). |
| perp.aggregate.min.symbol | string | — | Contract symbol in CoinBoss storage form. |
| perp.aggregate.min.basis_pct | number | % | (mark − index) ÷ index × 100 for perpetuals and delivery; in rankings, the cross-exchange median. |
| perp.aggregate.max | object | — | Exchange and contract with the highest basis. |
| perp.aggregate.max.exchange | string | — | Exchange id (lower case). |
| perp.aggregate.max.symbol | string | — | Contract symbol in CoinBoss storage form. |
| perp.aggregate.max.basis_pct | number | % | (mark − index) ÷ index × 100 for perpetuals and delivery; in rankings, the cross-exchange median. |
| perp.aggregate.median_last_pct | number | % | Median of the last-price basis. |
| perp.aggregate.n_exchanges_last | number | — | Exchanges in the last-price median. |
| perp.aggregate.weights | object | — | Where the weights come from, their fresh window and the age of the oldest weight. |
| perp.aggregate.weights.oi | object | — | Open interest. |
| perp.aggregate.weights.oi.source | string | — | Upstream public endpoints the data was collected from. |
| perp.aggregate.weights.oi.fresh_window_s | number | s | A weight older than this is not used. |
| perp.aggregate.weights.oi.oldest_age_s | number | s | Age of the oldest weight used. |
| perp.aggregate.weights.oi.side | string | — | Whether the open-interest weight is single-sided. |
| perp.aggregate.weights.vol | object | — | Volume. |
| perp.aggregate.weights.vol.source | string | — | Upstream public endpoints the data was collected from. |
| perp.aggregate.weights.vol.fresh_window_s | number | s | A weight older than this is not used. |
| perp.aggregate.weights.vol.oldest_age_s | number | s | Age of the oldest weight used. |
| perp.contracts | array | — | One row per contract. |
| perp.contracts[] | object | — | One row per contract. |
| perp.contracts[].exchange | string | — | Exchange id (lower case). |
| perp.contracts[].symbol | string | — | Contract symbol in CoinBoss storage form. |
| perp.contracts[].native_symbol | string | — | Contract symbol as the exchange writes it. |
| perp.contracts[].quote | string | — | Quote currency of the contract. |
| perp.contracts[].margin_type | string | — | Margin type of the contract (for example USDT-margined, coin-margined). |
| perp.contracts[].multiplier | number | — | Coins per quoted unit (1000 for `1000PEPE`-style contracts). Basis is unaffected. |
| perp.contracts[].mark_price | number|null | — | Mark price published by the exchange. |
| perp.contracts[].index_price | number|null | — | Index price published by the exchange. |
| perp.contracts[].last_price | number|null | — | Last traded price. |
| perp.contracts[].index_kind | string|null | — | What the index is: `exchange_index`, `oracle`, or another kind that is shown but not aggregated. |
| perp.contracts[].basis_pct | number|null | % | (mark − index) ÷ index × 100 for perpetuals and delivery; in rankings, the cross-exchange median. |
| perp.contracts[].basis_abs | number|null | — | mark − index, in the quote currency. |
| perp.contracts[].basis_last_pct | number|null | % | (last − index) ÷ index × 100; `null` when there is no recent trade. |
| perp.contracts[].basis_last_reason | string|null | — | Why `basis_last_pct` is null. |
| perp.contracts[].index_lag_s | number|null | s | Seconds between the mark timestamp and the index timestamp of the row. |
| perp.contracts[].oi_usd | number|null | USD | Open interest of the contract, single-sided; used as weight. |
| perp.contracts[].vol_usd_24h | number|null | USD | 24h notional volume of the contract; used as weight. |
| perp.contracts[].primary | boolean | — | True for the contract that represents its exchange in median and mean. |
| perp.contracts[].in_aggregate | boolean | — | True when the row passed the inclusion rules. |
| perp.contracts[].excluded_reason | string|null | — | Why the row is not in the aggregate. |
| perp.contracts[].last_ts | number|null | ms | Time of the last trade. |
| perp.contracts[].observed_at | number|null | ms | Timestamp given by the source for the data. |
| perp.contracts[].received_at | number | ms | Time the CoinBoss collector received the data. |
| perp.contracts[].age_s | number | s | Seconds since the row was received. |
| spot_perp | object | — | Perpetual price against the spot price of the same exchange. |
| spot_perp.unit | string | — | Unit of the basis values (percent). |
| spot_perp.aggregate | object | — | Cross-exchange aggregate of the section. |
| spot_perp.aggregate.oi_weighted_pct | number | % | Basis weighted by open interest; rows without an OI weight are left out. |
| spot_perp.aggregate.oi_weight_usd | number | USD | Sum of the open-interest weights used. |
| spot_perp.aggregate.n_oi_weighted | number | — | Rows that carried an OI weight. |
| spot_perp.aggregate.vol_weighted_pct | number | % | Basis weighted by 24h notional volume. |
| spot_perp.aggregate.vol_weight_usd | number | USD | Sum of the volume weights used. |
| spot_perp.aggregate.n_vol_weighted | number | — | Rows that carried a volume weight. |
| spot_perp.aggregate.median_pct | number | % | Median basis over one primary contract per exchange. |
| spot_perp.aggregate.mean_pct | number | % | Simple mean over the same set as the median. |
| spot_perp.aggregate.n_exchanges | number | — | Exchanges in the aggregate. |
| spot_perp.aggregate.n_contracts | number | — | Contracts in the aggregate. |
| spot_perp.aggregate.min | object | — | Exchange and contract with the lowest basis. |
| spot_perp.aggregate.min.exchange | string | — | Exchange id (lower case). |
| spot_perp.aggregate.min.symbol | string | — | Contract symbol in CoinBoss storage form. |
| spot_perp.aggregate.min.basis_pct | number | % | (mark − index) ÷ index × 100 for perpetuals and delivery; in rankings, the cross-exchange median. |
| spot_perp.aggregate.max | object | — | Exchange and contract with the highest basis. |
| spot_perp.aggregate.max.exchange | string | — | Exchange id (lower case). |
| spot_perp.aggregate.max.symbol | string | — | Contract symbol in CoinBoss storage form. |
| spot_perp.aggregate.max.basis_pct | number | % | (mark − index) ÷ index × 100 for perpetuals and delivery; in rankings, the cross-exchange median. |
| spot_perp.pairs | array | — | One row per perpetual / spot pair of the same exchange. |
| spot_perp.pairs[] | object | — | One row per perpetual / spot pair of the same exchange. |
| spot_perp.pairs[].exchange | string | — | Exchange id (lower case). |
| spot_perp.pairs[].symbol | string | — | Contract symbol in CoinBoss storage form. |
| spot_perp.pairs[].spot_symbol | string | — | Spot market used as the spot leg. |
| spot_perp.pairs[].quote | string | — | Quote currency of the contract. |
| spot_perp.pairs[].spot_mult | number | — | Factor applied to the spot price so that both legs quote the same quantity. |
| spot_perp.pairs[].futures_price | number|null | — | Perpetual price used; see `price_kind`. |
| spot_perp.pairs[].price_kind | string|null | — | Which perpetual price was used: `last` or `mark`. |
| spot_perp.pairs[].spot_price | number | — | Spot last price, after `spot_mult`. |
| spot_perp.pairs[].basis_pct | number|null | % | (mark − index) ÷ index × 100 for perpetuals and delivery; in rankings, the cross-exchange median. |
| spot_perp.pairs[].basis_last_pct | number|null | % | (last − index) ÷ index × 100; `null` when there is no recent trade. |
| spot_perp.pairs[].basis_mark_pct | number|null | % | (mark − spot) ÷ spot × 100. |
| spot_perp.pairs[].leg_gap_s | number | s | Seconds between the timestamps of the two legs. |
| spot_perp.pairs[].spot_time_kind | string | — | What the spot timestamp is (trade time or receive time). |
| spot_perp.pairs[].spot_vol_24h | number|null | — | 24h turnover of the spot market, in its quote currency. |
| spot_perp.pairs[].oi_usd | number|null | USD | Open interest of the contract, single-sided; used as weight. |
| spot_perp.pairs[].vol_usd_24h | number|null | USD | 24h notional volume of the contract; used as weight. |
| spot_perp.pairs[].primary | boolean | — | True for the contract that represents its exchange in median and mean. |
| spot_perp.pairs[].in_aggregate | boolean | — | True when the row passed the inclusion rules. |
| spot_perp.pairs[].excluded_reason | string|null | — | Why the row is not in the aggregate. |
| spot_perp.pairs[].received_at | number | ms | Time the CoinBoss collector received the data. |
| spot_perp.pairs[].spot_received_at | number | ms | Time the spot leg was received. |
| delivery | object | — | Delivery (dated) futures basis. |
| delivery.unit | string | — | Unit of the basis values (percent). |
| delivery.contracts | array | — | One row per contract. |
| delivery.contracts[] | object | — | One row per contract. |
| delivery.contracts[].exchange | string | — | Exchange id (lower case). |
| delivery.contracts[].symbol | string | — | Contract symbol in CoinBoss storage form. |
| delivery.contracts[].native_symbol | string | — | Contract symbol as the exchange writes it. |
| delivery.contracts[].quote | string | — | Quote currency of the contract. |
| delivery.contracts[].margin_type | string | — | Margin type of the contract (for example USDT-margined, coin-margined). |
| delivery.contracts[].expiry_ts | number | ms | Expiry time of the delivery contract. |
| delivery.contracts[].days_to_expiry | number | days | Days until expiry. |
| delivery.contracts[].mark_price | number | — | Mark price published by the exchange. |
| delivery.contracts[].last_price | number|null | — | Last traded price. |
| delivery.contracts[].index_price | number | — | Index price published by the exchange. |
| delivery.contracts[].index_kind | string | — | What the index is: `exchange_index`, `oracle`, or another kind that is shown but not aggregated. |
| delivery.contracts[].basis_pct | number | % | (mark − index) ÷ index × 100 for perpetuals and delivery; in rankings, the cross-exchange median. |
| delivery.contracts[].annualized_pct | number|null | % per year | basis_pct × 365 ÷ days to expiry, simple interest; `null` inside the last day. |
| delivery.contracts[].basis_reason | null | — | Why `basis_pct` is null. |
| delivery.contracts[].index_lag_s | number | s | Seconds between the mark timestamp and the index timestamp of the row. |
| delivery.contracts[].basis_last_pct | number|null | % | (last − index) ÷ index × 100; `null` when there is no recent trade. |
| delivery.contracts[].annualized_last_pct | number|null | % per year | Annualised basis using the last traded price. |
| delivery.contracts[].spot_symbol | string|null | — | Spot market used as the spot leg. |
| delivery.contracts[].spot_price | number|null | — | Spot last price, after `spot_mult`. |
| delivery.contracts[].spot_price_kind | string|null | — | Which futures price was compared with spot. |
| delivery.contracts[].basis_spot_pct | number|null | % | (futures − same-exchange spot) ÷ spot × 100. |
| delivery.contracts[].annualized_spot_pct | number|null | % per year | Annualised basis against same-exchange spot. |
| delivery.contracts[].annualized_reason | string|null | — | Why the annualised value is null (for example `expiry_lt_1d`). |
| delivery.contracts[].oi_usd | number|null | USD | Open interest of the contract, single-sided; used as weight. |
| delivery.contracts[].vol_usd_24h | number|null | USD | 24h notional volume of the contract; used as weight. |
| delivery.contracts[].last_ts | number|null | ms | Time of the last trade. |
| delivery.contracts[].observed_at | number|null | ms | Timestamp given by the source for the data. |
| delivery.contracts[].received_at | number | ms | Time the CoinBoss collector received the data. |
| delivery.contracts[].age_s | number | s | Seconds since the row was received. |
| coverage | object | — | What is and is not included in the numbers. Compare this before comparing totals with another source. |
| coverage.included_exchanges | array | — | Sources whose fresh data is included. |
| coverage.included_exchanges[] | string | — | Sources whose fresh data is included. |
| coverage.unavailable | array | — | Sources that could not be included, each with a reason. They are never counted as 0. |
| coverage.unavailable[] | object | — | Sources that could not be included, each with a reason. They are never counted as 0. |
| coverage.unavailable[].exchange | string | — | Exchange id (lower case). |
| coverage.unavailable[].reason | string | — | Machine-readable reason code. |
| coverage.unavailable[].detail | string | — | Human-readable explanation of the reason. |
| coverage.stale_excluded | array | — | Rows left out because their last update is outside the fresh window. empty in the samples used to generate this table |
| coverage.missing_fields | array | — | Exchanges that do not publish one of the prices. |
| coverage.excluded_from_aggregate | array | — | Rows shown but left out of the aggregate, each with the reason. |
| coverage.excluded_from_aggregate[] | object | — | Rows shown but left out of the aggregate, each with the reason. |
| coverage.excluded_from_aggregate[].exchange | string | — | Exchange id (lower case). |
| coverage.excluded_from_aggregate[].symbol | string | — | Contract symbol in CoinBoss storage form. |
| coverage.excluded_from_aggregate[].section | string | — | Section the row belongs to. |
| coverage.excluded_from_aggregate[].reason | string | — | Machine-readable reason code. |
| coverage.stock_excluded | array | — | Stock perpetuals that share the ticker and were removed. empty in the samples used to generate this table |
| coverage.dropped_delisted_rows | number | — | Rows dropped because the contract stopped updating. |
| coverage.delivery_unavailable | array | — | Exchanges whose delivery contracts are not collected. |
| coverage.delivery_unavailable[] | object | — | Exchanges whose delivery contracts are not collected. |
| coverage.delivery_unavailable[].exchange | string | — | Exchange id (lower case). |
| coverage.delivery_unavailable[].reason | string | — | Machine-readable reason code. |
| coverage.delivery_unavailable[].detail | string | — | Human-readable explanation of the reason. |
| method | object | — | Plain-text statement of the formulas used for this response, one entry per field. |
| method.perp.basis_pct | string | — | Formula note for `perp.basis_pct`, plain text. |
| method.perp.basis_last_pct | string | — | Formula note for `perp.basis_last_pct`, plain text. |
| method.perp.aggregate.oi_weighted_pct | string | — | Formula note for `perp.aggregate.oi_weighted_pct`, plain text. |
| method.perp.aggregate.vol_weighted_pct | string | — | Formula note for `perp.aggregate.vol_weighted_pct`, plain text. |
| method.perp.aggregate.median_pct | string | — | Formula note for `perp.aggregate.median_pct`, plain text. |
| method.perp.aggregate.inclusion | string | — | Formula note for `perp.aggregate.inclusion`, plain text. |
| method.spot_perp.basis_pct | string | — | Formula note for `spot_perp.basis_pct`, plain text. |
| method.spot_perp.aggregate.inclusion | string | — | Formula note for `spot_perp.aggregate.inclusion`, plain text. |
| method.delivery.basis_pct | string | — | Formula note for `delivery.basis_pct`, plain text. |
| method.delivery.annualized_pct | string | — | Formula note for `delivery.annualized_pct`, plain text. |
| method.index_lag_s | string | — | Formula note for `index_lag_s`, plain text. |
| method.multiplier | string | — | Formula note for `multiplier`, plain text. |
| meta | object | — | Lineage and freshness of this response. |
| meta.schema | string | — | Schema id of this response. It changes only when an existing field changes meaning or type. |
| meta.source | array | — | Upstream public endpoints the data was collected from. |
| meta.source[] | object | — | Upstream public endpoints the data was collected from. |
| meta.source[].exchange | string | — | Exchange id (lower case). |
| meta.source[].endpoint | string | — | Public endpoint of the source the collector reads (shown for lineage; clients never call it). |
| meta.observed_at | number | ms | Timestamp given by the source for the data. |
| meta.received_at | number | ms | Time the CoinBoss collector received the data. |
| meta.fetched_at | number | ms | Time this response was assembled. |
| meta.window | string | — | Time window the numbers cover. |
| meta.quality | string | — | FRESH, PARTIAL, STALE, BROKEN or UNAVAILABLE, judged from data timestamps and coverage. |
| meta.is_stale | boolean | — | True when the data is older than its fresh window. |
| meta.cache_ttl_s | number | s | Cache lifetime of this response. |
| meta.fallback | string | — | What the endpoint returns when the collector or a source fails. |
| meta.collector_heartbeat_age_s | number | s | Seconds since the collector last reported that it is running. |
| coverage.missing_fields[] | object | — | Exchanges that do not publish one of the prices. |
| coverage.missing_fields[].exchange | string | — | Exchange id (lower case). |
| coverage.missing_fields[].symbol | string | — | Contract symbol in CoinBoss storage form. |
| coverage.missing_fields[].missing | string | — | Price the exchange does not publish (`mark` or `index`). |
Generated 2026-11-11 23:00 UTC from 4 real responses.
Example response
/api/sd/basis?coin=BTC · Real response captured 2026-11-13 01:42:45 UTC. Long arrays and maps are shortened for display: meta.source had 20 items; perp.contracts had 37 items; spot_perp.pairs had 22 items; delivery.contracts had 53 items; coverage.unavailable had 4 items; coverage.included_exchanges had 20 items.
- "success"true
- "schema""coinboss.sd.basis/1"
- "now"1794534165725
- "coin""BTC"
- "perp"
- "unit""percent"
- "aggregate"
- "contracts"
- "spot_perp"
- "unit""percent"
- "aggregate"
- "pairs"
- "delivery"
- "unit""percent"
- "contracts"
- "coverage"
- "included_exchanges"
- "unavailable"
- "stale_excluded"
- "missing_fields"
- "excluded_from_aggregate"
- "stock_excluded"
- "dropped_delisted_rows"2
- "delivery_unavailable"
- "method"
- "perp.basis_pct""(mark_price - index_price) / index_price * 100, percent; mark and index are both published by the same exchange for that…"
- "perp.basis_last_pct""(last_price - index_price) / index_price * 100; null when the exchange gives no last-trade price or the last trade is mo…"
- "perp.aggregate.oi_weighted_pct""sum(basis_pct * oi_usd) / sum(oi_usd) over all included perpetual contracts that have an open-interest weight; oi_usd fr…"
- "perp.aggregate.vol_weighted_pct""same with 24h notional volume (market_tickers.volume_usd / sd_contract_latest.vol_usd_24h, <= 1 h old) as weight"
- "perp.aggregate.median_pct""median of basis_pct over one primary contract per exchange (largest OI, then volume, then USDT-margined); mean_pct is th…"
- "perp.aggregate.inclusion""row is fresh (<= 180 s), basis_pct is not null, index_kind is exchange_index or oracle, the contract traded within 24 h …"
- "spot_perp.basis_pct""(perp last_price, or mark_price when last is unusable - spot last price * spot_mult) / (spot last price * spot_mult) * 1…"
- "spot_perp.aggregate.inclusion""as perp, plus spot 24h turnover >= 10000 (quote currency) when the exchange reports it"
- "delivery.basis_pct""(F - S) / S * 100 with F = mark_price and S = the exchange index price of the underlying; basis_last_pct uses F = last_p…"
- "delivery.annualized_pct""basis_pct * 365 / days_to_expiry, simple (not compounded); null when days_to_expiry < 1; days_to_expiry = (expiry_ts - p…"
- "index_lag_s""seconds between the mark timestamp and the index timestamp of the row; 0 when the exchange returns both in one response;…"
- "multiplier""contract units per coin (1000PEPE, kPEPE = 1000); mark and index carry the same multiplier so basis_pct is unaffected; s…"
- "meta"
- "schema""coinboss.sd.basis/1"
- "source"
- "observed_at"1794534153288
- "received_at"1794534153368
- "fetched_at"1794534165725
- "window""latest"
- "quality""FRESH"
- "is_stale"false
- "cache_ttl_s"20
- "fallback""rows older than 180 s are excluded; if no exchange is fresh the last stored rows (<= 1 h old) are served with is_stale=t…"
- "collector_heartbeat_age_s"4
Verified samples
Besides the example above, the probe calls this endpoint with these parameters and checks the schema each time.
| Parameters | HTTP | Latency | Result |
|---|---|---|---|
| coin=ETH | 200 | 25 ms | Pass FRESH |
| coin=SOL | 200 | 21 ms | Pass FRESH |
| coin=PEPE | 200 | 27 ms | Pass PARTIAL |
| — | 400 | 2 ms | Pass returns the expected error |
Checked 2026-11-13 01:28:05 UTC
Details
- Authentication
- None. Public endpoint.
- Rate limit
- 1200 requests per minute per IP
- Server cache
- 20s
- Edge micro-cache
- 10s
- Update frequency
- Collector round every 60 seconds; a row is fresh for 180 seconds. Hourly snapshots feed the history.
- Window
- Latest value per contract.
- Data sources
- Mark price, index price and last price published by 21 derivatives exchanges, plus the spot price of the same exchange, collected and stored by CoinBoss (sd_px_latest, sd_px_hourly).
- Exchange coverage
- 21 exchanges. Exchanges that do not publish an index or mark price are listed under `coverage.unavailable`; rows whose two price legs are more than 60 seconds apart return `null`. Rows left out of the aggregate are listed under `coverage.excluded_from_aggregate` with the reason.
- Pagination
- No paging.
- Sorting
- Contracts with the largest open interest first.
- Units
- All basis values in percent. Prices in the quote currency of the contract (USDT / USDC / USD). `oi_usd` single-sided.
- Method
- Perpetual: basis_pct = (mark − index) ÷ index × 100. Spot-perp: (perpetual price − spot price) ÷ spot price × 100, same exchange and quote currency. Delivery: basis_pct = (futures − index) ÷ index × 100; annualized_pct = basis_pct × 365 ÷ days to expiry (simple interest; `null` inside the last day). Aggregates use one primary contract per exchange; a row enters only if it is fresh, traded within 24 hours and |basis| ≤ 10 %.
- Timestamps
- Unix epoch milliseconds (UTC) unless the field description says otherwise
- Response format
- json
- Stability
- Stable
- Available since
- 2026-11-11
Live status
Availability, last 30 days
100% of 380 checks passed
Errors
Failed calls share one shape on every endpoint. The full list is on the errors page. Errors and rate limits →
| Code | HTTP | Meaning | What to do |
|---|---|---|---|
| INVALID_PARAM | 400 | A 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. |
| UNAUTHORIZED | 401 | The `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. |
| FORBIDDEN | 403 | The route is not part of the public API (internal or account-only). | Do not retry. |
| NOT_FOUND | 404 | Unknown route, or the requested coin / exchange / fund does not exist. | Do not retry; check the path and identifiers against the catalog. |
| RATE_LIMITED | 429 | More requests than the per-minute limit. `Retry-After` gives the seconds to wait. | Wait for `Retry-After`, then retry with backoff. |
| INTERNAL | 500 | Unexpected 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_FAILED | 503 | The 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. |
| UNAVAILABLE | 501 / 503 | The 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_FAILED | 200 | Some 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
/api/sd/basisDegradedstring — Coin symbol, case-insensitive (for example `BTC`). Missing or malformed values return 400.
https://www.coinboss.com/api/sd/basis?coin=BTCMore in this category
- Futures basis (all venues) /api/sd/basis
- Basis history (hourly) /api/sd/basis/history
- Coins ranked by basis /api/sd/basis/rank
- Futures-spot basis list /api/derivatives/basis
- Daily BTC price spread between Coinbase and Kraken /api/p3/cb-kr-spread
- Coinbase Bitcoin premium index /api/p3/coinbase-premium
- Perp premium index list /api/p3/premium-index
- Premium-index history for one coin /api/p3/premium-index/history
- Premium-index candles /api/p3/premium-index/klines
- USDT OTC premium against fiat FX rates /api/usdt-premium
- Full futures-spot basis list /api/basis/list