Open interest for one coin
Self-data layer: open interest for one coin (per exchange / contract, with quality flags)
/api/sd/oiRequest
Query parameters
| Name | Type | Required | Default | Allowed values | Description |
|---|---|---|---|---|---|
| coin | string | Required | — | — | Coin symbol; 400 when missing. Alias: `base`. Example: BTC |
Example request
curl -s "https://www.coinboss.com/api/sd/oi?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 }`. |
| coin | string | — | Coin symbol, upper case (for example BTC). |
| now | number | ms | Server time when the response was built. |
| total_usd | number | USD | Open interest across all included exchanges and contracts, as each exchange reports it (USD notional). |
| n_exchanges | number | — | Number of exchanges in the total. |
| n_contracts | number | — | Number of contracts in the total. |
| asof | number | ms | Newest update time among the included rows. |
| total_usd_single_adjusted | number | USD | `total_usd` with the figures of exchanges that report both sides (`double_sided.exchanges`) halved, so every venue counts one side. |
| double_sided | object | — | Exchanges known to publish long + short open interest as one number. |
| double_sided.exchanges | array | — | Exchanges. |
| double_sided.exchanges[] | string | — | Exchanges. |
| double_sided.oi_usd | number | USD | Reported open interest of those exchanges before halving. |
| by_kind | object | — | Split by linear / inverse. |
| by_kind.linear_usd | number | USD | Open interest of linear contracts (margined and settled in a stablecoin or USD). |
| by_kind.inverse_usd | number | USD | Open interest of inverse (coin-margined) contracts, converted to USD at the contract price. |
| by_margin | object | — | Split by margin currency. |
| by_margin.other | number | USD | Other margin currencies (for example USD-settled venues such as CME). |
| by_margin.usdt | number | USD | USDT-margined contracts. |
| by_margin.usdc | number | USD | USDC-margined contracts. may be absent |
| by_margin.coin | number | USD | Coin-margined contracts. may be absent |
| by_contract_type | object | — | Split by perpetual / delivery. |
| by_contract_type.perpetual_usd | number | USD | Perpetual contracts. |
| by_contract_type.delivery_usd | number | USD | Dated futures (delivery contracts). |
| change | object | — | Change of open interest over 1h / 4h / 24h, computed on the same set of contracts at both ends. dynamic keys: h1,h4,h24 |
| change.{*} | object | — | Change over the stated period. |
| change.{*}.pct | number | % | Percentage change between `prev` and `cur`. |
| change.{*}.cur | number | USD | Current sum over the matched contracts. |
| change.{*}.prev | number | USD | Sum over the same contracts at `prev_ts`. |
| change.{*}.n_matched | number | — | Contracts (or exchanges) present at both ends. |
| change.{*}.n_total | number | — | Contracts (or exchanges) present now. |
| change.{*}.matched_share_pct | number | % | Share of current open interest covered by the matched set. may be absent |
| change.{*}.prev_ts | number | ms | Time of the baseline snapshot. |
| change.{*}.span_min | number | min | Actual distance between baseline and now. |
| change.{*}.basis | string | — | Which snapshot series the baseline comes from. |
| change.{*}.frozen_excluded | object | — | Rows left out of the change because their value did not move between the two snapshots (source not updating). may be absent |
| change.{*}.frozen_excluded.n_baseline | number | — | Items in the baseline snapshot. may be absent |
| change.{*}.frozen_excluded.n_current | number | — | Items in the current snapshot. may be absent |
| change.{*}.frozen_excluded.cur_usd | number | USD | Current value. may be absent |
| change.{*}.frozen_excluded.prev_usd | number | USD | Baseline value. may be absent |
| by_exchange | array | — | Per-exchange breakdown. |
| by_exchange[] | object | — | Per-exchange breakdown. |
| by_exchange[].exchange | string | — | Exchange id, lower case (for example `binance`). |
| by_exchange[].oi_usd | number | USD | Open interest in USD notional. |
| by_exchange[].share_pct | number | % | Share of the total. |
| by_exchange[].n_contracts | number | — | Number of contracts. |
| by_exchange[].linear_usd | number | USD | Linear contracts. |
| by_exchange[].inverse_usd | number | USD | Inverse (coin-margined) contracts. |
| by_exchange[].perpetual_usd | number | USD | Perpetual contracts. |
| by_exchange[].delivery_usd | number | USD | Delivery contracts. |
| by_exchange[].oi_side | string | — | `double` when the exchange reports both sides in one number, `single` when it reports one side, `unstated` when the exchange does not document it. |
| by_exchange[].oi_usd_single_adjusted | number|null | USD | Single-side equivalent; null when the side convention is unstated. |
| by_exchange[].updated_at | number | ms | When this row was last updated. |
| by_exchange[].age_s | number | s | Seconds since this row was last updated. |
| by_exchange[].is_stale | boolean | — | true when the row is older than the freshness window; stale rows are not used in totals. |
| contracts | array | — | Per-contract rows. |
| contracts[] | object | — | Per-contract rows. |
| contracts[].exchange | string | — | Exchange id, lower case (for example `binance`). |
| contracts[].symbol | string | — | Instrument symbol as normalised by CoinBoss (for example BTCUSDT). |
| contracts[].native_symbol | string|null | — | Symbol exactly as the exchange writes it. |
| contracts[].oi_usd | number | USD | Open interest in USD notional. |
| contracts[].oi_side | string | — | `double`, `single` or `unstated`: whether the exchange reports both sides of open interest in one number. |
| contracts[].oi_usd_single | number|null | USD | Single-side equivalent of `oi_usd`; null when the side convention is unstated. |
| contracts[].margin | string | — | Margin currency class: `usdt`, `usdc`, `coin` or `other`. |
| contracts[].kind | string | — | `linear` or `inverse`. |
| contracts[].contract_type | string | — | `perpetual` or `delivery`. |
| contracts[].expiry_ts | number|null | ms | Expiry of a delivery contract; null for perpetuals or when not published. |
| contracts[].margin_basis | string | — | How the margin class was determined (from the contract specification or the venue default). |
| contracts[].updated_at | number | ms | When this row was last updated. |
| contracts[].age_s | number | s | Seconds since this row was last updated. |
| contracts[].is_stale | boolean | — | true when the row is older than the freshness window; stale rows are not used in totals. |
| contracts[].collector | string | — | Internal collector that produced the row. |
| contracts[].included_since | number|null | ms | When this contract entered the totals; null for the base set. |
| coverage | object | — | What is and is not included in the numbers above. Compare this before comparing totals with another source. |
| coverage.included_exchanges | array | — | Exchanges whose data is included in the totals. |
| coverage.included_exchanges[] | string | — | Exchanges included in the totals. |
| coverage.pending | array | — | Contracts that are collected but not yet included in totals (for example while their own 25-hour history is still building). Listed with their current value so the gap is visible. |
| coverage.pending[] | object | — | Items collected but not yet included. |
| coverage.pending[].exchange | string | — | Exchange id, lower case (for example `binance`). |
| coverage.pending[].symbol | string | — | Instrument symbol as normalised by CoinBoss (for example BTCUSDT). |
| coverage.pending[].native_symbol | string | — | Symbol exactly as the exchange writes it. |
| coverage.pending[].margin | string | — | Margin currency class. |
| coverage.pending[].contract_type | string | — | `perpetual` or `delivery`. |
| coverage.pending[].oi_usd | number | USD | Open interest in USD notional. |
| coverage.pending[].age_s | number | s | Seconds since this row was last updated. |
| coverage.pending[].reason | string | — | Reason code. |
| coverage.pending[].detail | string|null | — | Detail. |
| coverage.pending_usd | number|null | USD | Sum of the pending contracts, not part of `total_usd`. |
| coverage.stale_excluded | array | — | Rows left out because their last update is outside the usable window. empty in the samples used to generate this table |
| coverage.unavailable | array | — | Exchange / contract pairs that could not be included, each with a reason. They are never counted as 0. |
| coverage.unavailable[] | object | — | Items for which no data is available, with reasons. Never reported as 0. |
| coverage.unavailable[].exchange | string | — | Exchange id, lower case (for example `binance`). |
| coverage.unavailable[].symbol | string | — | Instrument symbol as normalised by CoinBoss (for example BTCUSDT). |
| coverage.unavailable[].native_symbol | string | — | Symbol exactly as the exchange writes it. |
| coverage.unavailable[].margin | string | — | Margin currency class. |
| coverage.unavailable[].contract_type | string | — | `perpetual` or `delivery`. |
| coverage.unavailable[].reason | string | — | Reason code. |
| coverage.unavailable[].detail | string | — | Detail. |
| method | object | — | Plain-text statement of the formulas used for this response. |
| method.total | string | — | Total. |
| method.usd | string | USD | Value. |
| method.change_h1_h4 | string | — | Plain-text definition of the 1h and 4h open interest changes: each contract is compared with its own snapshot nearest to the window start. |
| method.change_h24 | string | — | Plain-text definition of the 24h open interest change: same-exchange pairing against the hourly snapshot nearest to 24 hours ago, frozen baselines excluded. |
| method.oi_side | string | — | `double`, `single` or `unstated`: whether the exchange reports both sides of open interest in one number. |
Generated 2026-11-11 23:00 UTC from 4 real responses.
Example response
/api/sd/oi?coin=BTC · Real response captured 2026-11-13 03:12:34 UTC. Long arrays and maps are shortened for display: change had 3 items; contracts had 95 items; by_exchange had 22 items; coverage.included_exchanges had 22 items.
- "success"true
- "coin""BTC"
- "now"1794539554492
- "total_usd"50067963912.49
- "n_exchanges"22
- "n_contracts"95
- "asof"1794539523000
- "total_usd_single_adjusted"44681803095.20498
- "double_sided"
- "exchanges"
- "oi_usd"10772321634.57
- "by_kind"
- "linear_usd"45173854696.49
- "inverse_usd"4894109216
- "by_margin"
- "other"8278589520.31
- "usdt"31767450832.469997
- "usdc"5127814343.709999
- "coin"4894109216
- "by_contract_type"
- "perpetual_usd"41882574873.81
- "delivery_usd"8185389038.68
- "change"
- "h1"
- "h4"
- "by_exchange"
- "contracts"
- "coverage"
- "included_exchanges"
- "pending"
- "pending_usd"null
- "stale_excluded"
- "unavailable"
- "method"
- "total""SUM(oi_usd) over fresh contracts (non-CME updated within 3h; CME within 120h)"
- "usd""linear: contracts × contract_size × mark/last price; inverse: contracts × contract_face_value_usd (or coin amount × price)"
- "change_h1_h4""same-contract pairing vs own snapshot nearest to now−W (15-minute snapshots, hourly fallback)"
- "change_h24""same-exchange pairing vs hourly snapshot nearest to now−24h (site-wide convention); contracts whose baseline snapshot is a frozen carry-over (identical to the c…"
- "oi_side""as disclosed by each exchange; double = exchange API itself reports open interest as twice the single-sided figure"
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 | 32 ms | Pass |
| coin=SOL | 200 | 33 ms | Pass |
| coin=ARKM | 200 | 21 ms | Pass |
| — | 400 | 1 ms | Pass returns the expected error |
Checked 2026-11-13 02:57:39 UTC
Details
- Authentication
- None. Public endpoint.
- Rate limit
- 1200 requests per minute per IP
- Server cache
- 20s
- Edge micro-cache
- 10s
- Update frequency
- every 60 s for most venues (written together with tickers; binance top-50 and okx dedicated 60 s jobs); full binance / bingx / aster / gate / htx sweeps every 5 min; coin-margined / USDC / dated contracts every 120 s (promoted to the shared table every 5 min); cme once per trading day (04:10 UTC); 15-minute contract-level snapshots for short-window changes
- Window
- latest snapshot (rows within 3 h, cme 120 h; is_stale flag after 15 min, cme 36 h); changes over 1 h / 4 h (15-minute snapshots) and 24 h (hourly archive)
- Data sources
- Open interest polled by in-house collectors from the public REST APIs of 22 derivatives venues (e.g. binance, okx, bybit, gate, bitget, hyperliquid) plus CME's official daily volume/open-interest report.
- Exchange coverage
- 23 sources with fresh rows (22 venues + cme); all contract types (USDT / USDC / USD linear, coin-margined inverse, perpetual and dated); bybit and gate report double-sided open interest as disclosed by the venue; rows older than 3 h (cme: 120 h) are excluded; coverage block lists included, pending (waiting for 25 h of own history), stale-excluded and unavailable venues
- Units
- open interest in USD notional; total_usd_single_adjusted halves venues that report double-sided OI; changes in percent
- Method
- total_usd = SUM(oi_usd) over fresh contracts (multiplier contracts folded); breakdowns by kind / margin / contract type; h1 / h4 change by same-contract pairing against 15-minute snapshots (+/- 10 min, fallback hourly archive) and only when >= 50% of OI is matched; h24 change by same-exchange pairing against the hourly bucket nearest now - 24 h
- 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 402 checks passed
- Returned but not documented: coverage.stale_excluded[], coverage.stale_excluded[].exchange, coverage.stale_excluded[].symbol, coverage.stale_excluded[].oi_usd, coverage.stale_excluded[].age_s, coverage.stale_excluded[].reason
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/oiAvailablestring — Coin symbol; 400 when missing. Alias: `base`.
https://www.coinboss.com/api/sd/oi?coin=BTCMore in this category
- Open interest for one coin /api/sd/oi
- Open-interest ranking per coin across exchanges /api/market/open-interest
- Stacked OI chart series for one coin /api/oi/chart
- Aggregated open-interest history for one coin /api/oi/history
- Open-interest matrix /api/oi/matrix
- Open-interest summary for one coin /api/oi/summary