/v2/stocks/{symbol}/bars OHLCV bars for one stock symbol
bars_getBars
ITMatrixHQ price bars for one stock over a half-open time range [from, to), ascending by time. Use it for charting and historical price analysis at one-minute to daily resolution.
Path parameters
symbolstring requiredStock symbol, e.g.
SPY
Query parameters
fromstring epoch msRange start (required): epoch-ms,
YYYY-MM-DD, orYYYY-MM-DDTHH:MM[:SS](tzapplies to string forms). Half-open[from, to).tostringRange end (required): same forms as
from(exclusive).tzstringIANA timezone for string time inputs (default
America/New_York).timeframestringBar timeframe:
1s,1m,5m,1hor1d(default1m).tfstringAlias for
timeframe.timeframewins if both are sent.limitinteger · int32Bars per page: default 10,000, at most 50,000 (at most 1,000 with an API key; a larger value is clamped, not refused).
cursorstringOpaque continuation cursor from a previous response's
meta.cursor.
Details
A long range is served a page at a time: repeat the request with cursor=<meta.cursor> until meta.cursor is absent. meta.complete_through is the last bucket known to be complete; the current bucket may still change.
Units
ts_msis the epoch-millisecond start of the bar.open,high,low,closeandvwapare dollars.volumeis shares;vwapandtrade_countappear when known.
Limits
Requests with an API key are limited to 1,000 bars per page, and to a span of 7 days for 1m (and 1s), 30 days for 5m, 90 days for 1h and 2 years for 1d. A longer span or larger limit is clamped, never refused: from moves forward and meta.caps.applied lists range_clamped or limit_clamped. At most 2 requests with the same API key may be in flight on this route at once; another gets 429 rate_limited with Retry-After: 1.
Empty results
A real ticker with no bars in the range returns 200 with an empty data list. A string that is not a ticker at all is 404 not_found.
Example
GET /v2/stocks/SPY/bars?timeframe=1d&from=2026-09-21&to=2026-09-26{
"data": [
{
"symbol": "SPY",
"timeframe": "1d",
"ts_ms": 1790035200000,
"open": 774.03,
"high": 775.14,
"low": 772.57,
"close": 773.38,
"volume": 34802336,
"trade_count": 470399
},
{
"symbol": "SPY",
"timeframe": "1d",
"ts_ms": 1790121600000,
"open": 772.79,
"high": 773.05,
"low": 766.5,
"close": 767.81,
"volume": 54931688,
"trade_count": 614754
}
],
"meta": {
"caps": { "tier": "pro", "applied": [] },
"complete_through": 1790308800000,
"row_count": 5
}
}Response
Prices are dollars, timestamps epoch milliseconds, strikes integer thousandths of a dollar; null means unknown. Units →
200application/jsonapplication/x-protobuf
Bars in data (epoch-ms bucket starts); meta.caps.applied lists clamps, meta.cursor continues, meta.complete_through is the last bucket. Under Accept: application/x-protobuf the same result is served as the public protobuf body (/v2/rest-protocol.proto); JSON stays the default for every other Accept.
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
close number · double required high number · double required low number · double required open number · double required symbol string required timeframe string required The aggregate timeframes v2 works with.
1s1m5m1h1dtrade_count integer · int64 nullable ts_ms integer · int64 required epoch ms volume integer · int64 required vwap number · double nullable 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 |
|
| 404 |
|
| 502 |
|
| 503 |
|