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

Off-exchange price concentration for one symbol

offexchange_getConcentration

The price levels where one stock's off-exchange notional concentrated over a trailing multi-session window, ranked. Use it to find recurring off-exchange price zones.

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

Each row is one price bucket (bucket_midpoint ± bucket_width / 2) with its rank among bucket_count buckets and its distance in basis points from the reference price of the window's last session. Buckets seen in only one session are omitted, as are buckets below the disclosure threshold.

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

  • bucket_midpoint and bucket_width are dollars; notional is dollars; volume is shares.
  • distance_bps is basis points from the reference price (negative = below it; null without one); lookback_sessions and distinct_sessions count sessions.

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/concentration?limit=1
json
{
  "data": [
    {
      "date": "2026-09-25",
      "bucket_midpoint": 760.875,
      "bucket_width": 0.25,
      "volume": 11130680.38,
      "notional": 8468571938.56,
      "trade_count": 32178,
      "distinct_sessions": 9,
      "rank_score": 3549642.94,
      "rank": 1,
      "bucket_count": 120,
      "distance_bps": -114.1,
      "lookback_sessions": 20
    }
  ],
  "meta": {
    "symbol": "SPY",
    "synthetic": true,
    "suppressed_count": 0,
    "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 OffExchangeConcentrationResponse 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
bucket_count integer · int32 required
bucket_midpoint number · double required
bucket_width number · double required
date string required
distance_bps number · double nullable
distinct_sessions integer · int32 required
lookback_sessions integer · int32 required
notional number · double required
rank integer · int32 required
rank_score number · double 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