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, edge, 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

18-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
15stringedge_bidMark-to-bid edge ("" if unavailable)
16stringedge_askMark-to-ask edge ("" if unavailable)
17stringspread_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, edgeBid, edgeAsk, 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.