Option chain (single venue)
Call and put side by side for every strike of one expiry on one venue: open interest, volume, mark price, mark / bid / ask IV and greeks as published by the venue.
/api/sd/options/chainRequest
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 |
| exchange | string | Required | — | deribit, binance, bybit, okx, gate, coincall | Venue id. `all` is not accepted here: a chain belongs to one venue. Example: okx |
| expiry | string | Optional | — | — | UTC expiry date as `YYYY-MM-DD`. Default: the nearest expiry. `all` is not accepted. |
| kind | string | Optional | — | inverse, linear | Contract family when the venue lists both coin-settled (`inverse`) and stablecoin-settled (`linear`) options. Default: the family with the larger open interest for that expiry. |
| limit | integer | Optional | 100 | ≥ 1 · ≤ 500 | Strikes per page (one row = one strike with its call and put). |
| offset | integer | Optional | 0 | ≥ 0 · ≤ 100000 | Number of strikes to skip. |
Example request
curl -s "https://www.coinboss.com/api/sd/options/chain?coin=BTC&exchange=okx"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). |
| exchange | string | — | Exchange id (lower case). |
| expiry | string | — | Expiry date (UTC), `YYYY-MM-DD`, or `all`. |
| expiry_ts | number | ms | Expiry time. |
| days_left | number | days | Days until expiry. |
| kind | string | — | Contract family: `inverse` (coin-settled) or `linear` (stablecoin-settled). |
| kinds_available | array | — | Contract families the venue lists for this expiry. |
| kinds_available[] | string | — | Contract families the venue lists for this expiry. |
| expiries_available | array | — | Expiry dates that currently have contracts. |
| expiries_available[] | string | — | Expiry dates that currently have contracts. |
| underlying | string | — | Underlying of the contract family. |
| settle | string | — | Settlement currency of the contract family. |
| contract_size | number | coin | Quantity of the underlying coin per contract. |
| underlying_price | number | USD | Forward / underlying price published by the venue for this expiry. |
| index_price | number | USD | Spot index price used for USD conversion (median of the venues' own index prices in aggregates). |
| total_strikes | number | — | Strikes available for this expiry before paging. |
| limit | number | — | Row limit applied. |
| offset | number | — | Rows skipped. |
| returned | number | — | Strikes returned in this page. |
| rows | array | — | One row per strike with its call and put. |
| rows[] | object | — | One row per strike with its call and put. |
| rows[].strike | number | USD | Strike price. |
| rows[].call | object | — | Call contract at this strike; `null` when the venue lists none. |
| rows[].call.instrument | string | — | Contract name as the venue writes it. |
| rows[].call.oi_contracts | number | contracts | Open interest in contracts as the venue counts them. |
| rows[].call.oi_coin | number | coin | Open interest in units of the underlying coin. |
| rows[].call.oi_usd | number | USD | Open interest as USD notional: coin quantity × spot index price. One-sided. |
| rows[].call.vol_contracts_24h | number | contracts | 24h volume in contracts as the venue counts them. |
| rows[].call.vol_coin_24h | number | coin | 24h traded quantity in units of the underlying coin. |
| rows[].call.vol_usd_24h | number | USD | 24h notional volume: traded coin quantity × current spot index price. Not premium turnover. |
| rows[].call.vol_premium_usd_24h | number|null | USD | 24h premium turnover (option price × quantity) where the venue publishes it; `null` elsewhere. Never added to notional volume. |
| rows[].call.mark_price | number|null | — | Mark price of the option in its quote unit (coin for coin-settled contracts). |
| rows[].call.mark_price_usd | number|null | USD | Mark price of the option converted to USD. |
| rows[].call.mark_iv | number | % | Implied volatility at the mark price. |
| rows[].call.bid_iv | number|null | % | Implied volatility at the best bid; `null` when the venue does not publish it. |
| rows[].call.ask_iv | number|null | % | Implied volatility at the best ask; `null` when the venue does not publish it. |
| rows[].call.delta | number|null | — | Delta as published by the venue; `null` when not published. |
| rows[].call.gamma | number|null | — | Gamma as published by the venue; `null` when not published. |
| rows[].call.vega | number|null | — | Vega as published by the venue; `null` when not published. |
| rows[].call.theta | number|null | — | Theta as published by the venue; `null` when not published. |
| rows[].call.observed_at | number | ms | Timestamp given by the source for the data. |
| rows[].put | object | — | Put contract at this strike; `null` when the venue lists none. |
| rows[].put.instrument | string | — | Contract name as the venue writes it. |
| rows[].put.oi_contracts | number | contracts | Open interest in contracts as the venue counts them. |
| rows[].put.oi_coin | number | coin | Open interest in units of the underlying coin. |
| rows[].put.oi_usd | number | USD | Open interest as USD notional: coin quantity × spot index price. One-sided. |
| rows[].put.vol_contracts_24h | number | contracts | 24h volume in contracts as the venue counts them. |
| rows[].put.vol_coin_24h | number | coin | 24h traded quantity in units of the underlying coin. |
| rows[].put.vol_usd_24h | number | USD | 24h notional volume: traded coin quantity × current spot index price. Not premium turnover. |
| rows[].put.vol_premium_usd_24h | number|null | USD | 24h premium turnover (option price × quantity) where the venue publishes it; `null` elsewhere. Never added to notional volume. |
| rows[].put.mark_price | number | — | Mark price of the option in its quote unit (coin for coin-settled contracts). |
| rows[].put.mark_price_usd | number | USD | Mark price of the option converted to USD. |
| rows[].put.mark_iv | number | % | Implied volatility at the mark price. |
| rows[].put.bid_iv | number|null | % | Implied volatility at the best bid; `null` when the venue does not publish it. |
| rows[].put.ask_iv | number|null | % | Implied volatility at the best ask; `null` when the venue does not publish it. |
| rows[].put.delta | number|null | — | Delta as published by the venue; `null` when not published. |
| rows[].put.gamma | number|null | — | Gamma as published by the venue; `null` when not published. |
| rows[].put.vega | number|null | — | Vega as published by the venue; `null` when not published. |
| rows[].put.theta | number|null | — | Theta as published by the venue; `null` when not published. |
| rows[].put.observed_at | number | ms | Timestamp given by the source for the data. |
| 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. empty in the samples used to generate this table |
| 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.field_gaps | array | — | Columns a venue does not publish; they are `null` for that venue. |
| coverage.field_gaps[] | object | — | Columns a venue does not publish; they are `null` for that venue. |
| coverage.field_gaps[].exchange | string | — | Exchange id (lower case). |
| coverage.field_gaps[].fields | array | — | Names of the missing columns. |
| coverage.field_gaps[].fields[] | string | — | Names of the missing columns. |
| coverage.field_gaps[].kind | string | — | Contract family: `inverse` (coin-settled) or `linear` (stablecoin-settled). |
| method | object | — | Plain-text statement of the formulas used for this response, one entry per field. |
| method.chain | string | — | Formula note for `chain`, plain text. |
| method.kind | string | — | Formula note for `kind`, plain text. |
| method.oi_usd | string | — | Formula note for `oi_usd`, plain text. |
| method.mark_price | string | — | Formula note for `mark_price`, plain text. |
| method.iv | string | — | Formula note for `iv`, plain text. |
| method.greeks | string | — | Formula note for `greeks`, plain text. |
| method.vol_usd_24h | string | — | Formula note for `vol_usd_24h`, plain text. |
| method.vol_premium_usd_24h | string | — | Formula note for `vol_premium_usd_24h`, 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. |
Generated 2026-11-11 23:00 UTC from 3 real responses.
Example response
/api/sd/options/chain?coin=BTC&exchange=okx · Real response captured 2026-11-13 03:52:54 UTC. Long arrays and maps are shortened for display: rows had 45 items; expiries_available had 12 items.
- "success"true
- "schema""coinboss.sd.options/1"
- "now"1794541974766
- "coin""BTC"
- "exchange""okx"
- "expiry""2026-11-13"
- "expiry_ts"1794556800000
- "days_left"0.1716
- "kind""inverse"
- "kinds_available"
- "inverse"
- "linear"
- "expiries_available"
- "2026-11-13"
- "2026-11-14"
- "2026-11-15"
- "2026-11-16"
- "2026-11-20"
- "2026-11-27"
- "2026-12-04"
- "2026-12-25"
- "underlying""BTC-USD"
- "settle""BTC"
- "contract_size"0.01
- "underlying_price"71428.8359576
- "index_price"71417.4
- "total_strikes"45
- "limit"100
- "offset"0
- "returned"45
- "rows"
- "coverage"
- "included_exchanges"
- "unavailable"
- "stale_excluded"
- "field_gaps"
- "stale_included"
- "method"
- "chain""T-quote for one exchange, one expiry and one contract family: one row per strike (ascending) with the call and put legs; paginated by strike with limit (default…"
- "kind""inverse = coin-settled (Deribit BTC/ETH, OKX *-USD); linear = USD/USDT/USDC-settled. When an exchange lists both families for the expiry and kind is omitted, th…"
- "oi_usd""sum over contracts of oi_coin x that exchange's spot index price (USDT/USDC treated 1:1 as USD); oi_coin is open interest in units of the underlying coin after …"
- "mark_price""exchange-native quote: Deribit/OKX inverse in underlying coin per 1 coin; Binance in USDT per contract (contract_size coins); others in USD per 1 coin. mark_pri…"
- "iv""mark_iv / bid_iv / ask_iv in percent as published by the exchange (no-quote sentinels such as 0 or -1 are null)"
- "greeks""delta/gamma/vega/theta exactly as published by the exchange (OKX: Black-Scholes greeks in USD terms); never computed by CoinBoss; null where the exchange does n…"
- "vol_usd_24h""NOTIONAL 24h volume = sum of vol_coin (24h traded quantity in underlying coin) x the exchange's CURRENT spot index price; not premium turnover. Binance statisti…"
- "vol_premium_usd_24h""PREMIUM turnover (option price x quantity) as reported by the exchange: Deribit volume_usd, Binance amount, Gate sum(|size| x multiplier x price) from the 24h t…"
- "meta"
- "schema""coinboss.sd.options/1"
- "source"
- "observed_at"1794522472654
- "received_at"1794522473638
- "fetched_at"1794541974766
- "window""latest"
- "quality""STALE"
- "is_stale"true
- "cache_ttl_s"60
- "fallback""on collector failure the last stored rows are served: an exchange whose newest batch is older than 25 min (collector cycle is 10 min) is excluded from totals (l…"
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&exchange=deribit | 200 | 59 ms | Pass STALE |
| coin=BTC&limit=5&exchange=bybit | 200 | 3 ms | Pass STALE |
| coin=BTC | 400 | 1 ms | Pass returns the expected error |
Checked 2026-11-13 03:28:17 UTC
Details
- Authentication
- None. Public endpoint.
- Rate limit
- 1200 requests per minute per IP
- Server cache
- 60s
- Edge micro-cache
- 10s
- Update frequency
- Collector round every 10 minutes; a venue is fresh for 25 minutes after its last successful round.
- Window
- Latest snapshot of one expiry.
- Data sources
- Public REST option endpoints of Deribit, Binance, Bybit, OKX, Gate and Coincall, collected and stored by CoinBoss (sd_opt_latest, sd_opt_summary_hourly). No third-party aggregator is involved.
- Exchange coverage
- Six option venues. A coin that has no listed options on the selected venues returns HTTP 200 with null fields, `meta.quality = "UNAVAILABLE"` and the reason under `coverage.unavailable`. Venues without a public option feed are listed there as well.
- Pagination
- Offset-based: `limit` (max 500) and `offset`; `total_strikes` and `returned` are in the response.
- Sorting
- Strike ascending.
- Units
- USD notional = contracts × contract size × spot index price of the venue. `*_coin` fields are in units of the underlying coin. Implied volatility is in percent (55 = 55 %). `vol_premium_usd_24h` is premium turnover, reported separately and never added to notional volume.
- Method
- Greeks and IV are passed through from the venue, not recomputed. A venue that does not publish a column returns `null` for it and the column is listed under `coverage.field_gaps`.
- Timestamps
- Unix epoch milliseconds (UTC) unless the field description says otherwise
- Response format
- json
- Stability
- Stable
- Available since
- 2026-11-11
Live status
The endpoint reports data quality STALE
Availability, last 30 days
100% of 406 checks passed
- Returned but not documented: coverage.stale_included, coverage.stale_included[], coverage.stale_included[].exchange, coverage.stale_included[].age_s
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/options/chainDegradedstring — Coin symbol, case-insensitive (for example `BTC`). Missing or malformed values return 400.
string — Venue id. `all` is not accepted here: a chain belongs to one venue.
string — UTC expiry date as `YYYY-MM-DD`. Default: the nearest expiry. `all` is not accepted.
string — Contract family when the venue lists both coin-settled (`inverse`) and stablecoin-settled (`linear`) options. Default: the family with the larger open interest for that expiry.
integer · default 100 · min 1 · max 500 — Strikes per page (one row = one strike with its call and put).
integer · default 0 · min 0 · max 100000 — Number of strikes to skip.
https://www.coinboss.com/api/sd/options/chain?coin=BTC&exchange=okxMore in this category
- Option chain (single venue) /api/sd/options/chain
- Options by expiry /api/sd/options/expiries
- Options history (hourly) /api/sd/options/history
- Options overview (all venues) /api/sd/options/overview
- Options by strike /api/sd/options/strikes
- Coin-page options summary /api/currency/options-summary
- Options implied-volatility smile / term structure /api/options/iv
- Options implied-volatility history /api/options/iv-history
- Options max pain /api/options/max-pain
- Options OI by expiry /api/options/oi-by-expiry
- Options OI by strike /api/options/oi-by-strike
- Options overview /api/options/overview
- Options volume distribution /api/options/volume-dist