/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
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
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_midpointandbucket_widthare dollars;notionalis dollars;volumeis shares.distance_bpsis basis points from the reference price (negative = below it;nullwithout one);lookback_sessionsanddistinct_sessionscount 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
GET /v2/offexchange/SPY/concentration?limit=1{
"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.
| Status | Meaning |
|---|---|
| 400 | |
| 401 | |
| 403 | API tier or non-professional attestation required |