/v2/flow/{symbol}/cross-section Cumulative option volume by strike and expiration for one underlying
flow_getCrossSection
The session's cumulative call and put volume, premium and trade counts for one underlying, by strike and by expiration. Use it to see where the day's options activity is concentrated.
Path parameters
symbolstring requiredRegistered underlying, e.g.
SPY
Query parameters
sessionstring ISO dateExchange session (
YYYY-MM-DD). Omit for the latest session held.
Details
coverage.status is observed_live while the section is built from the live tape, and the section stays explicitly incomplete (coverage.complete: false) until the end-of-day reconciliation replaces it with eod_reconciled coverage.
Available with an API Pro key, or in the ITMatrixHQ apps on Pro. Both need a non-professional market-data declaration (POST /v2/account/classification), and the symbol's own entitlement still applies.
Units
strike_thousandthsis the strike in integer thousandths of a dollar.call_volume/put_volumeare contracts,call_premium_usd/put_premium_usddollars,call_trade_count/put_trade_countprints.
Freshness
Updated as the session trades; the store holds about the last 24 hours (meta.retention).
Limits
No per-operation limit applies to requests with an API key: each request reads one underlying.
Empty results
snapshot: null with a meta.note when no section has been observed for the symbol and session. Nothing is estimated.
Example
GET /v2/flow/SPY/cross-section?session=2026-09-04{
"data": {
"snapshot": {
"symbol": "SPY",
"seq": 51234,
"coverage": {
"status": "observed_live",
"complete": false,
"session_date": "2026-09-04",
"observed_from_ms": 1788528600000,
"observed_through_ms": 1788552000000,
"registry_version": 1,
"standard_multiplier_assumed": true
},
"update": {
"kind": "cross_section_session",
"by_strike": [
{
"strike_thousandths": 760000,
"measures": {
"call_volume": 41250,
"put_volume": 88310,
"call_premium_usd": 21870500.0,
"put_premium_usd": 30112400.0,
"call_trade_count": 5120,
"put_trade_count": 7804
}
}
],
"by_expiration": [
{
"expiry": "2026-09-18",
"measures": {
"call_volume": 612400,
"put_volume": 705980,
"call_premium_usd": 184300200.0,
"put_premium_usd": 221450900.0,
"call_trade_count": 60411,
"put_trade_count": 71002
}
}
]
}
}
},
"meta": { "symbol": "SPY", "retention": "intraday_24h" }
}Response
Prices are dollars, timestamps epoch milliseconds, strikes integer thousandths of a dollar; null means unknown. Units →
200application/json
Latest or requested cumulative strike/expiration section; snapshot may be null
object
A successful response: the payload consumers parse plus response metadata. data shapes are the platform types — never reshaped by the envelope.
data object required
snapshot object nullable
Stable public projection of the latest cumulative per-symbol section.
coverage object required
Completeness metadata carried by every flow payload. Live values never claim to be a complete session; the nightly flat-file replacement is the only producer allowed to stamp EodReconciled and complete = true.
complete boolean required observed_from_ms integer · int64 required epoch ms observed_through_ms integer · int64 required epoch ms registry_version integer · int32 required session_date string · date required ISO date US-Eastern exchange session this payload belongs to. Consumers must never merge cumulative flow across this boundary.
standard_multiplier_assumed boolean required OPRA does not carry adjusted-contract deliverables on each print. true means premium used the standard 100-share multiplier.
status string required observed_liveeod_reconciledseq integer · int64 required symbol string required update one of required
variant 1 object
by_expiration array<ExpirationFlowMsg> required
expiry string · date required ISO date measures object required
call_premium_usd number · double required USD call_trade_count integer · int32 required call_volume integer · int64 required put_premium_usd number · double required USD put_trade_count integer · int32 required put_volume integer · int64 required by_strike array<StrikeFlowMsg> required
measures object required
call_premium_usd number · double required USD call_trade_count integer · int32 required call_volume integer · int64 required put_premium_usd number · double required USD put_trade_count integer · int32 required put_volume integer · int64 required strike_thousandths integer · int64 required kind string required cross_section_sessionmeta object required
Response metadata.
caps object nullable
meta.caps — the entitlement caps that shaped this response. applied lists the caps that actually changed it (for example range_clamped).
applied array<string> required Which caps actually shaped this response (e.g. range_clamped). Empty = nothing was clamped.
darkpool boolean nullable Whether this account can use Off-Exchange in the site.
flow boolean nullable Whether the OPRA option-flow capability (flow) is granted to this principal in the app: site Pro plus a CBOE non-professional attestation (never on an itm_ key). Emitted explicitly — true and false — by the account endpoints, so the app reads the grant instead of inferring it from tier and attestation; absent on routes that do not report it.
gexDepth string nullable GEX data depth when the route reports it. Camel-cased to match the browser capability bundle; absent on unrelated routes.
tier string required The tier the request was served under.
cursor string nullable Opaque continuation cursor (pass back as ?cursor=); absent when there is nothing more to read.
plane string nullable Which serving tier answered the read (meta.plane). Informational provenance: treat it as an opaque label, because new values may appear.
Errors
Every error is the JSON error envelope; branch on error.code.
| Status | Meaning |
|---|---|
| 400 |
|
| 401 |
|
| 403 |
|
| 404 |
|