Skip to main content
BackQuant ingests crypto options from multiple exchanges and folds them into one canonical surface. Filterable venue IDs on public v2 are: deribit · bybit · okx · binance · derive · thalex · delta_india · delta

Venues at a glance

Coins

Where venues show up

When a metric is “multi-venue blended,” OI from every venue that lists the coin is summed on normalized instrument names. Bid/ask depth for IV remains Deribit-primary. Strike-profile payloads advertise available_exchanges with the full chain set (including Thalex / Derive / both Delta IDs) even on thin books, so UI filters stay stable.

Which fields are cross-venue, and which are one venue’s

A single row of /options/chain deliberately mixes both kinds. Reading a single-venue field as a market-wide total is the most common way to misread this API, so the split is explicit: volume is contracts, notional_volume is premium paid in USD, and trade_count is prints. All three mean the same thing on every symbol; only the venue scope differs.
Before 2026-09-01, notional_volume on HYPE carried underlying notional (contracts x spot) rather than premium, because that is what Derive publishes. It is now converted, so the field is comparable across symbols. If you stored HYPE values before that date they are not comparable with current ones.

Why SOL and HYPE are not blended

Publishing a “cross-venue” total that quietly omits a venue would be worse than publishing one venue’s number and saying so. Our tape does not span venues for these two, so they carry the source venue’s own figures and are labelled here rather than blended into something that looks complete.

null is not 0

On those three activity fields the distinction is load-bearing:
  • 0 means measured, and nothing traded in the window.
  • null means not measured.
SOL reports trade_count: null, because no venue publishes a per-contract trade count for it. Collapsing the two is how a contract that traded thousands of times can read as untraded. On BTC and ETH all three read null in the rare window where the cross-venue measurement is briefly unavailable (recovery is about 60 seconds). We report it missing rather than substituting one venue’s figure, which would answer a cross-venue question with a number 10-20x smaller and give you no way to tell.

Under as_of

Point-in-time chains recompute the activity fields for the 24 hours ending at the resolved snapshot, from the same cross-venue tape, so history does not serve figures that were only ever single-venue. meta.extra.activity_rebuilt confirms it ran. bid and ask are different. On chains persisted before 2026-09-01 they are 0 because they were never recorded, and no recomputation can recover them. meta.extra.quotes_note says so on every affected response, so those zeros are never mistaken for an unquoted market.

Counting prints and notional together

A cross-venue trade count is dominated by retail flow. Over 24 hours on BTC, one venue contributed 194,063 of 255,369 prints but only 7.8Mof7.8M of 46M in premium, while Deribit contributed 6,060 prints and $30M. Neither number alone describes the activity; read them together.

What ?exchanges= actually does

The filter re-aggregates the surface from the per-venue breakdown. It is not a scaling of the blended number, so ?exchanges=deribit,bybit returns exactly what those two books contribute, and the parts add back up to the unfiltered response. Two quantities behave differently, and the distinction matters when you compare a filtered result against the total:
  • Exposures (GEX, DEX, charm, vega) are greek x open interest, so they are linear in OI. A venue’s share of the open interest is exactly its share of the exposure, and the per-venue parts sum back to the total.
  • Implied volatility does not split. IV is a quote, not a quantity. A venue-filtered IV surface or expected move reports that venue’s own mark IV, never a share of the cross-venue blend. Unfiltered, the blend is OI-weighted across the venues quoting that contract. A venue that does not quote a contract is left out of that contract’s IV rather than counted as zero.
Unknown venue names are ignored, and a filter naming only unknown venues returns every venue instead of an empty response.
A venue returning zero is not the same as a venue being off. Zero means it lists no contracts on that surface right now; off means the feed is disabled. GET /v2/status reports chain and tape per venue as on / off / unknown so you can tell which you are looking at.

Per-venue open interest: by_venue

Open-interest surfaces carry an explicit split so you never have to infer one from repeated filtered calls:
  • Open interest is coin-native on every venue, so the cross-venue sum is meaningful without conversion. notional_oi_usd is total_oi x spot using the same spot the response reports.
  • All eight venues are always present, zero-filled, so your parsing never has to handle a missing key.
  • Delta India and Delta Global are independent books and are summed, never deduplicated.
  • by_venue_unattributed is null when the split reconciles with the response totals, which is the normal case. A non-null value means some open interest could not be attributed to a venue, and is shown rather than quietly dropped.
Available on OI by expiry, expiry summary and GEX strike profile. On the strike profile the split covers the strikes actually returned, so it tracks any strike or moneyness filter you applied. Requesting a single expiry= token returns whole-expiry venue OI with a by_venue_note saying so, because no finer per-(strike, expiry) split is published.

Per-venue dealer flow: include=by_venue

Open interest by venue tells you where the stock sits. Flow by venue tells you who is moving it, and the two answer different questions. /v2/tape/flow-by-strike?include=by_venue splits each strike’s aggressor flow across the venues that traded it, with net_size as sold minus bought.

Why one venue is not enough

Deribit carries roughly 88% of BTC option premium. That share is why most data feeds are Deribit-only, and why a single-venue view looks like it should be sufficient. Measured over seven days of live data, restricted to contracts at least two venues traded $5,000 or more of premium on, so thin-venue noise cannot flatter the result: On 57 of those BTC contracts and 41 of the ETH ones, Deribit alone gives the opposite sign to the aggregate.
BTC 86,000 call, 11 Sep - aggregate +38.35 Deribit -26.20 (200k)Bybit+44.63(200k) · Bybit **+44.63** (143k) · OKX +12.72 ($51k)
A Deribit-only view reports dealers short that strike. They are long it. The 12% of premium that sits elsewhere is not a rounding error on the answer, it is frequently the whole of it. Every response carries venue_disagreement, so you can see how much the venues are splitting on the window you actually requested rather than taking the figures above on trust.

Delta Exchange units

Delta lists mini options. The public API always exposes coin size and USD premium already normalized. You do not need to re-apply contract_value on the public fields. Ingest mapping (for transparency):
where upstream size is contracts and upstream price is USD per coin. Use the API’s amount and premium_usd as-is. Thalex is USD-settled: premium_usd = price × amount with amount already coin-equivalent.

Settlement and expiry labels

Public expiry tokens (e.g. 18AUG26) follow the Deribit-session calendar used across GEX, OPEX countdowns, and TRACE:
  • Countdowns and 0DTE / front-expiry selection use the 08:00 UTC cliff.
  • After that session roll, remaining Delta inventory for that calendar day is rolled into the next session expiry in the aggregated chain so strike / GEX / OI surfaces stay on one expiry ladder.
  • Filter and response tokens stay Deribit-style; you do not get a separate public “India 12:00” expiry id.

Why Binance isn’t on the live options WS

The public Binance options WebSocket host is not reachable from our infrastructure. We poll REST trades for the most-active BTC/ETH contracts (~30s). The hot list refreshes about every 5 minutes by 24h volume. Low-volume strikes may be missed.

See also

Tape overview

Flow by strike

Positioning

Data freshness