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

symbol string required

Stock symbol, e.g. SPY

Query parameters

from string epoch ms

First session of the range, inclusive: epoch-ms, YYYY-MM-DD or YYYY-MM-DDTHH:MM[:SS]. Without from and to, the latest session.

to string

Last session of the range, inclusive: same forms as from.

tz string

IANA timezone for string time inputs (default America/New_York).

limit integer

Rows per page: default 500, at most 5,000 (a larger value is clamped).

cursor string

Opaque 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_volume and consolidated_volume are shares; avg_size is shares per trade.
  • notional, consolidated_notional and vwap are dollars.
  • off_exch_pct is 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

http
GET /v2/offexchange/SPY/activity?limit=1
json
{
  "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.

StatusMeaning
400
401
403

API tier or non-professional attestation required