Docs
GET /v2/offexchange/{symbol}/profile

Off-exchange volume at price for one symbol

offexchange_getProfile

One stock's off-exchange volume, notional and trade count at each price level, per session. Use it to draw an off-exchange volume profile.

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

  • price_thousandths is the price in integer thousandths of a dollar (766295 = $766.295).
  • volume is shares; notional is dollars.

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/profile?limit=1
json
{
  "data": [
    {
      "date": "2026-09-25",
      "price_thousandths": 766295,
      "volume": 226.0,
      "notional": 173182.67,
      "trade_count": 3
    }
  ],
  "meta": {
    "symbol": "SPY",
    "synthetic": true,
    "suppressed_count": 1,
    "session": "2026-09-25",
    "count": 1
  }
}

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 OffExchangeProfileResponse protobuf

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
date string required
notional number · double required
price_thousandths integer · int64 required
trade_count integer · int64 required
volume 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