/v2/offexchange/{symbol}/activity Off-exchange activity by session for one symbol
offexchange_getActivity
Session-by-session off-exchange volume, notional, trade count, VWAP and share of consolidated volume for one stock. Use it to track how much of a symbol's trading happens off-exchange.
Path parameters
symbolstring requiredStock symbol, e.g.
SPY
Query parameters
fromstring epoch msFirst session of the range, inclusive: epoch-ms,
YYYY-MM-DDorYYYY-MM-DDTHH:MM[:SS]. Withoutfromandto, the latest session.tostringLast session of the range, inclusive: same forms as
from.tzstringIANA timezone for string time inputs (default
America/New_York).limitintegerRows per page: default 500, at most 5,000 (a larger value is clamped).
cursorstringOpaque continuation cursor from a previous response's
meta.cursor.
Details
Rows below the disclosure threshold (fewer than three executions) are omitted, never zero-filled; meta.suppressed_count says how many. meta.synthetic: true marks these as ITMatrixHQ's own aggregates of off-exchange (TRF) activity, not a redistributed trade feed: no individual print, print id, timestamp or raw condition code is ever returned. Pages continue through the opaque meta.cursor.
Units
off_exch_volumeandconsolidated_volumeare shares;avg_sizeis shares per trade.notional,consolidated_notionalandvwapare dollars.off_exch_pctis a fraction of consolidated volume (0.434= 43.4%).
Freshness
End-of-day data: a session appears the morning after it trades. meta.session, meta.latest_session, meta.as_of and meta.history_sessions say which trading date is shown.
Limits
At most 5,000 rows per page (default 500).
Empty results
A symbol or range with no data is 200 with empty data and a meta.note; empty is never a denial.
Example
GET /v2/offexchange/SPY/activity?limit=1{
"data": [
{
"date": "2026-09-25",
"off_exch_volume": 15912149.66,
"notional": 12252745897.15,
"trade_count": 263130,
"avg_size": 60.47,
"vwap": 769.657,
"off_exch_pct": 0.434,
"consolidated_volume": 36666826.66,
"consolidated_notional": 28237860090.62
}
],
"meta": {
"symbol": "SPY",
"synthetic": true,
"disclosure_k": 3,
"suppressed_count": 0,
"session": "2026-09-25",
"latest_session": "2026-09-25",
"count": 1,
"cursor": null
}
}Response
Prices are dollars, timestamps epoch milliseconds, strikes integer thousandths of a dollar; null means unknown. Units →
200application/jsonapplication/x-protobuf
Typed synthetic aggregates as JSON, or OffExchangeActivityResponse from /v2/rest-protocol.proto
object
A successful response: the payload consumers parse plus response metadata. data shapes are the platform types — never reshaped by the envelope.
data array<object> required
avg_size number · double required consolidated_notional number · double nullable consolidated_volume number · double nullable date string required notional number · double required off_exch_pct number · double nullable off_exch_volume number · double required trade_count integer · int64 required vwap number · double required 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.
Send Accept: application/x-protobuf for a protobuf body instead of JSON — see Protobuf. Errors stay JSON.
Errors
Every error is the JSON error envelope; branch on error.code.
| Status | Meaning |
|---|---|
| 400 | |
| 401 | |
| 403 | API tier or non-professional attestation required |