Options BBO

l2:bbo:options

Best Bid/Offer for options instruments — sent on every best bid or ask price or size change. Includes mark price, Greeks, IV, and spread metrics.

Channel: l2:bbo:options:{pair}:{maturity}
Example: l2:bbo:options:ETH_USDC:31OCT25

All instruments in a maturity publish to the same channel. Use tag filtering to receive only specific instruments, strikes, or option types.

Payload

16-element positional array — instrument name at index 0. "" for unavailable values.

IndexTypeFieldDescription
0stringinstrumentInstrument name
1integertimestampUnix timestamp in milliseconds
2stringbid_priceBest bid price ("" if no bids)
3stringbid_contractsContracts at best bid ("" if no bids)
4stringask_priceBest ask price ("" if no asks)
5stringask_contractsContracts at best ask ("" if no asks)
6stringmark_priceMark price from IV blend ("" if unavailable)
7stringmark_ivMark implied volatility ("" if unavailable)
8stringbid_ivImplied volatility at best bid ("" if unavailable)
9stringask_ivImplied volatility at best ask ("" if unavailable)
10stringdeltaOption delta
11stringgammaOption gamma
12stringvegaOption vega
13stringthetaOption theta
14stringrhoOption rho
15stringspread_bpsBid-ask spread in basis points ("" if unavailable)

Tag Filtering

Publications carry instrument, strike, and option_type tags for server-side filtering. Without a filter, all instruments in the maturity are delivered.

TagExampleDescription
instrumentETH_USDC-31OCT25-130000-CFilter by exact instrument
strike130000Filter by strike price (numeric comparison supported)
option_typeC or PFilter by calls or puts

Subscribe — Protobuf SDK

All instruments in a maturity

import { Centrifuge } from "centrifuge/build/protobuf";

const client = new Centrifuge("wss://staging.kyan.sh/stream/websocket?format=protobuf");
const sub = client.newSubscription("l2:bbo:options:ETH_USDC:31OCT25", { since: {} });

sub.on("publication", (ctx) => {
  const data = ctx.data instanceof Uint8Array
    ? JSON.parse(new TextDecoder().decode(ctx.data))
    : ctx.data;

  const [instrument, timestamp, bidPrice, bidContracts, askPrice, askContracts, ...rest] = data;
  // rest: [markPrice, markIv, bidIv, askIv, delta, gamma, vega, theta, rho, spreadBps]
});

sub.subscribe();
client.connect();

Filtered: specific instrument

const sub = client.newSubscription("l2:bbo:options:ETH_USDC:31OCT25", {
  since: {},
  tagsFilter: { key: "instrument", cmp: "eq", val: "ETH_USDC-31OCT25-130000-C" }
});

Filtered: near-ATM calls only

const sub = client.newSubscription("l2:bbo:options:ETH_USDC:31OCT25", {
  since: {},
  tagsFilter: {
    op: "and",
    nodes: [
      { key: "option_type", cmp: "eq", val: "C" },
      { key: "strike", cmp: "in", vals: ["125000", "130000", "135000"] }
    ]
  }
});

Recovery

Subscribe with since: {} to receive the last known BBO on subscribe. On reconnect, the SDK automatically recovers.

Related channels

Channels providing related data.

ChannelWhy
Index PriceUnderlying spot price. Used for moneyness calculation and mark-to-market.
SVI SurfaceVol surface parameters. mark_iv in BBO is derived from this surface.
Interest RateRisk-free rate input for Black-Scholes pricing. Affects forward price and rho.
Options L2Full depth behind the top-of-book prices shown here, with per-level IV.
Perps BBOPerps top-of-book for the same underlying. Basis = perp mid - index.
Funding RateFunding rate on the perps instrument for the same underlying.
Order LifecycleYour order fills, cancellations, and MMP events.
Trades (Options)Public options trade tape showing executions, aggressor side, and premium.

Did this page help you?