/v2/options/{symbol}/vol/term Implied-volatility term structure for one underlying
vol_getTerm
At-the-money implied volatility for every expiry of one underlying, from ITMatrixHQ's own greeks engine. Use it to read the volatility term structure at a glance.
Path parameters
symbolstring requiredRegistered underlying, e.g.
SPY
Details
Each row is one expiry: dte, the at-the-money strike atm_strike (the strike nearest spot where both the call and the put solved), atm_iv (the mean of that call's and put's IV) and n_contracts (how many of the expiry's contracts solved). as_of_ms identifies the solve the answer comes from.
Units
atm_ivis annualized, as a fraction (0.119= 11.9%).atm_strikeis in integer thousandths of a dollar (764000= $764.00).dteis calendar days from the current ET session to expiry.spotis dollars;as_of_msis epoch milliseconds.
Freshness
Updated with every new solve during market hours; outside them, the last solve is served.
Limits
No per-operation limit applies to requests with an API key.
Empty results
An underlying the engine does not cover yet returns 200 with as_of_ms: null, expiries: [] and a meta.note: a fact about coverage, not a zero. An unregistered symbol is 404 not_found.
Example
GET /v2/options/SPY/vol/term{
"data": {
"symbol": "SPY",
"as_of_ms": 1790256746156,
"spot": 764.09,
"expiries": [
{
"expiry": "2026-09-25",
"dte": 0,
"atm_strike": 764000,
"atm_iv": 0.1189,
"n_contracts": 268
}
]
}
}Response
Prices are dollars, timestamps epoch milliseconds, strikes integer thousandths of a dollar; null means unknown. Units →
200application/json
{symbol, as_of_ms, spot, expiries} in data; empty expiries with a meta.note when the underlying is not covered
object
A successful response: the payload consumers parse plus response metadata. data shapes are the platform types — never reshaped by the envelope.
data object required
as_of_ms integer · int64 nullable epoch ms Null until a frame has been observed for this underlying.
expiries array<VolTermExpiry> required
atm_iv number · double nullable Mean of the call and put IV at atm_strike.
atm_strike integer · int64 nullable 1/1000 $ The ATM strike (integer thousandths), or null when no strike in this expiry has both rights solved.
dte integer · int64 required Calendar days from the current ET session to expiry.
expiry string required ISO date YYYY-MM-DD.
n_contracts integer required Contracts in this expiry whose IV solved.
spot number · double nullable symbol string 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.
Errors
Every error is the JSON error envelope; branch on error.code.
| Status | Meaning |
|---|---|
| 400 |
|
| 401 |
|
| 403 |
|
| 404 |
|