Docs
GET /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

symbol string required

Registered underlying, e.g. SPY

Query parameters

session string ISO date

Exchange 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_thousandths is the strike in integer thousandths of a dollar.
  • call_volume / put_volume are contracts, call_premium_usd / put_premium_usd dollars, call_trade_count / put_trade_count prints.

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

http
GET /v2/flow/SPY/cross-section?session=2026-09-04
json
{
  "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
One of observed_liveeod_reconciled
seq 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
One of cross_section_session
meta 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.

StatusMeaning
400

invalid_params

401

unauthenticated

403

not_entitled_tier — not an app principal, or below site pro; attestation_required — Pro without a CBOE attestation

404

not_found — symbol is not registered