Option Quotes
Streams every NBBO update for one option contract. Each change to the national best bid or offer delivers a Quote event to the registered callback.
The snippets below assume a connected client with streaming started — see Getting Started for the connect-and-stream ladder.
use thetadatadx::fpss::protocol::Contract;
use thetadatadx::fpss::{FpssData, FpssEvent};
tdx.start_streaming(|event: &FpssEvent| {
if let FpssEvent::Data(FpssData::Quote { contract, bid, ask, .. }) = event {
println!("{} bid={bid} ask={ask}", contract.symbol);
}
})?;
let sub = Contract::option("SPY", OptionLeg { expiration: "20260618", strike: "570", right: "C" })?.quote();
tdx.subscribe(sub.clone())?;
// Remove this stream; the session stays open for other subscriptions.
tdx.unsubscribe(sub)?;from thetadatadx import Contract
def on_event(event):
if event.kind == "quote":
print(event.contract.symbol, event.bid, event.ask)
tdx.start_streaming(on_event)
sub = Contract.option("SPY", expiration="20260618", strike="570", right="C").quote()
tdx.subscribe(sub)
# Remove this stream; the session stays open for other subscriptions.
tdx.unsubscribe(sub)import { Contract } from 'thetadatadx';
tdx.startStreaming((event) => {
if (event.kind === 'quote') {
const e = event.quote!;
console.log(e.contract.symbol, e.bid, e.ask);
}
});
const sub = Contract.option('SPY', { expiration: '20260618', strike: '570', right: 'C' }).quote();
tdx.subscribe(sub);
// Remove this stream; the session stays open for other subscriptions.
tdx.unsubscribe(sub);client.set_callback([](const tdx::FpssEvent& event) {
if (event.kind == TDX_FPSS_QUOTE) {
auto& e = event.quote;
std::cout << e.contract.symbol << " bid=" << e.bid << " ask=" << e.ask << "\n";
}
});
auto sub = tdx::Contract::option("SPY", {.expiration = "20260618", .strike = "570", .right = "C"}).quote();
client.subscribe(sub);
// Remove this stream; the session stays open for other subscriptions.
client.unsubscribe(sub);GET ws://127.0.0.1:25520/v1/eventsWebSocket streaming from the bundled server binary. Send one JSON envelope per command; set "add": false to unsubscribe.
Example
websocat ws://127.0.0.1:25520/v1/events
{"msg_type": "STREAM", "sec_type": "OPTION", "req_type": "QUOTE", "id": 1, "add": true, "contract": {"symbol": "SPY", "expiration": 20260618, "strike": 570000, "right": "C"}}The WebSocket envelope takes the strike in thousandths of a dollar (570000 = $570.00); the SDKs take dollars.
Event fields
Each update arrives as a Quote event with these fields:
| Field | Type | Description |
|---|---|---|
contract | contract | Resolved contract identity (symbol, security type, and option fields). |
ms_of_day | i32 | Milliseconds since midnight Eastern Time. |
bid_size | i32 | Last NBBO bid size. |
bid_exchange | i32 | Exchange code of the NBBO bid. |
bid | f64 | Last NBBO bid price. |
bid_condition | i32 | Quote condition code on the bid side. |
ask_size | i32 | Last NBBO ask size. |
ask_exchange | i32 | Exchange code of the NBBO ask. |
ask | f64 | Last NBBO ask price. |
ask_condition | i32 | Quote condition code on the ask side. |
date | i32 | Trading date as a YYYYMMDD integer. |
received_at_ns | u64 | Local receive timestamp, nanoseconds since the Unix epoch. |
The contract field carries symbol, the security type, and — for options — expiration, right, and the strike. See Handling Events for the full event catalogue and per-language field shapes.