Options · Exposure, levels, volatility and OI
Options exposure heatmap
/v1/options/exposure/heatmapoptionsExposureHeatmapA grid of cells, one per strike and expiration, for a modeled exposure (gamma, delta, vanna, charm) or for open interest, volume, premium, net premium or trades; net combines calls and puts, call and put show one side. largest_cell is the cell with the largest absolute value. The window is 40 strikes either side of the underlying price and 12 expirations unless set. Dealer positioning is a model, not observed: with classic_oi the dealer is assumed long the calls and short the puts of the open interest, with flow_adjusted the classified prints since the open interest date adjust it. Public open interest does not identify who holds a position, so the values are estimates of exposure under that assumption. Cells without a listed contract are omitted. strikes_around cannot be combined with strike bounds.
Example request
curl -sS --get "https://api.ordermap.si/v1/options/exposure/heatmap" \
-H "Authorization: Bearer $ORDERMAP_API_KEY" \
--data-urlencode underlying_symbol=SPXWconst params = new URLSearchParams({
underlying_symbol: "SPXW",
});
const res = await fetch(`https://api.ordermap.si/v1/options/exposure/heatmap?${params}`, {
headers: { Authorization: `Bearer ${process.env.ORDERMAP_API_KEY}` },
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const { data, meta } = await res.json();
console.log(data, meta.coverage);Set ORDERMAP_API_KEY to your key. Replace the dates with a recent trading date.
Parameters
19 parameters, 1 required.
| Parameter | Type and limits | Description |
|---|---|---|
underlying_queryrequired | stringat most 8 characterspattern ^[A-Za-z][A-Za-z0-9.]{0,7}$ | Option root or family: SPX covers the SPX and SPXW roots, SPXW only the weekly root, QQQ, NDXP, RUTW, XSP ... |
datequeryoptional | stringdate | Trading date (YYYY-MM-DD). Default: the current session, else the most recent completed one. |
sessionqueryoptional | stringrthgthdefault rth | Trading session: rth is the regular session, gth the overnight (global trading hours) session before the trading date. Overnight data requires the Pro plan and exists only for underlyings with an overnight session; GET /v1/options/sessions shows which. |
contract_queryoptional | stringcallput | Calls or puts. Omit for both. |
date_queryoptional | stringdate | Only this expiration. |
expirationsqueryoptional | array<string>comma-separated in one parameter1 to 64 itemseach at most 128 characterspattern ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ | Only these expirations, comma separated (YYYY-MM-DD), at most 64. Unlisted dates are ignored. |
expiry_queryoptional | string0dte1dteweeklymonthlylte30lte90 | Expiration set: 0dte, 1dte, weekly (within 7 days), monthly (third-Friday expirations), lte30 or lte90 (within 30 or 90 days). |
min_queryoptional | integermin 0max 3650 | Minimum days to expiration (0 = expires on the trading date). |
max_queryoptional | integermin 0max 3650 | Maximum days to expiration. |
min_queryoptional | number> 0max 1000000 | Lowest strike in dollars. |
max_queryoptional | number> 0max 1000000 | Highest strike in dollars. |
strikes_queryoptional | integerdefault 40min 1max 200 | This many listed strikes either side of the strike nearest the underlying price (up to 200). |
max_queryoptional | integerdefault 12min 1max 64 | Number of expirations (columns) in the grid. |
expiration_queryoptional | integermin 0max 400 | Index of the first expiration of the grid among the selected ones. |
metricqueryoptional | stringgammadeltavannacharmopen_interestvolumepremiumnet_premiumtradesdefault gamma | Cell value: gamma, delta, vanna or charm exposure, or open_interest, volume, premium, net_premium or trades. |
legqueryoptional | stringnetcallputdefault net | net (calls plus puts; calls minus puts for open interest, volume, premium and trades), call or put. |
unitqueryoptional | stringper_percentper_dollarrawdefault per_percent | Scale of the values: per_percent (dollars of dealer hedging per 1% move of the underlying), per_dollar (per $1 move) or raw (shares, or per unit of the greek). |
modelqueryoptional | stringclassic_oiflow_adjusteddefault classic_oi | Dealer positioning model: classic_oi (open interest, calls long and puts short) or flow_adjusted (adjusted by classified prints since the open interest date). |
perspectivequeryoptional | stringdealercustomerdefault dealer | dealer (default) or customer, which negates the values only. |
Response
| Status | Meaning | Body |
|---|---|---|
200 | Successful response. | Schema below |
400 | Invalid, unknown or repeated parameters, or an invalid cursor. | Error object |
401 | Missing or invalid API key. | Error object |
403 | The plan, dataset release or account state does not allow this request. | Error object |
422 | The request is valid but no data exists for it. | Error object |
429 | Rate limit, burst limit or cooldown; wait Retry-After seconds.Retry-After | Error object |
500 | Internal error. | Error object |
503 | Data temporarily unavailable; retry after Retry-After seconds.Retry-After | Error object |
504 | The request timed out. | Error object |
Authenticated responses carry the X-RateLimit-* headers (see rate limits); 429 and 503 add Retry-After.
200 response body
dataobjectrequiredA strike by expiration grid.39 fields insidecellsarray<object>requiredCells with a listed contract.4 fields insidedate_of_expirystringdaterequiredExpiration.days_to_expiryintegerrequiredDays from the trading date.strikenumberrequiredStrike.valuenumberrequiredCell value.
expiration_windowobjectrequiredThe expirations shown.3 fields insidecountintegerrequiredExpirations shown.offsetintegerrequiredIndex of the first expiration shown.total_expirationsintegerrequiredExpirations selected.
greekstringrequiredThe measure: gamma, delta, vanna, charm or the heat map metric.largest_cellobject | nullrequiredThe cell with the largest absolute value.3 fields insidedate_of_expirystringdaterequiredExpiration.strikenumberrequiredStrike.valuenumberrequiredValue.
legstringrequiredWhich leg the cells show.netcallputmaximumnumber | nullrequiredLargest cell value.metricstringrequiredThe cell measure.minimumnumber | nullrequiredSmallest cell value.modelstringrequiredDealer positioning model.classic_oiflow_adjustedperspectivestringrequireddealer or customer (customer negates the values).dealercustomerpositioning_modelstringrequiredName and version of the positioning assumption, for example oi_signed_proxy-v1.rootsarray<string>requiredOption roots included.sessionstringrequiredSession valued.rthgthcurballstrike_rangeobjectrequiredThe listed strikes.3 fields insidehighest_strikenumber | nullrequiredHighest listed strike.lowest_strikenumber | nullrequiredLowest listed strike.total_strikesintegerrequiredListed strikes in the selection.
trading_datestringdaterequiredTrading date valued.underlying_symbolstringrequiredThe requested underlying.unitstringrequiredScale of the values.per_percentper_dollarrawunit_labelstringrequiredWhat one unit is, for example usd_per_pct: dollars of dealer hedging per 1% move.valuationobjectrequiredWhat the snapshot was valued on.7 fields insidechain_timestampinteger | nullunix-msrequiredTime of the option chain the valuation used. Unix epoch milliseconds (UTC).open_interest_datestring | nulldaterequiredDate of the open interest the positioning is based on.risk_free_ratenumber | nullrequiredContinuously compounded risk-free rate used.timestampinteger | nullunix-msrequiredValuation time. Unix epoch milliseconds (UTC).underlying_pricenumber | nullrequiredUnderlying price used.underlying_stalebooleanrequiredThe underlying price is older than the freshness limit.underlying_timestampinteger | nullunix-msrequiredTime of the underlying price. Unix epoch milliseconds (UTC).
metaobjectrequiredMeta object
Example response
{
"data": {
"cells": [
{
"date_of_expiry": "2026-10-16",
"days_to_expiry": 0,
"strike": 6000,
"value": -338000000
}
],
"expiration_window": {
"count": 12,
"offset": 0,
"total_expirations": 31
},
"greek": "gamma",
"largest_cell": {
"date_of_expiry": "2026-10-16",
"strike": 6000,
"value": -338000000
},
"leg": "net",
"maximum": 10300000,
"metric": "gamma",
"minimum": -338000000,
"model": "classic_oi",
"perspective": "dealer",
"positioning_model": "oi_signed_proxy-v1",
"roots": [
"SPX",
"SPXW"
],
"session": "rth",
"strike_range": {
"highest_strike": 6600,
"lowest_strike": 5400,
"total_strikes": 121
},
"trading_date": "2026-10-16",
"underlying_symbol": "SPX",
"unit": "per_percent",
"unit_label": "usd_per_pct",
"valuation": {
"chain_timestamp": 1792160995000,
"open_interest_date": "2026-10-15",
"risk_free_rate": 0.0412,
"timestamp": 1792161000000,
"underlying_price": 6021.4,
"underlying_stale": false,
"underlying_timestamp": 1792160999000
}
},
"meta": {
"as_of": 1760659200123,
"coverage": {
"complete": true
},
"delay_ms": 0,
"delayed": false,
"request_id": "0199f0c2-5a1e-7c3b-9d4e-2b6f8a1c3d5e",
"source": "opra"
}
}Values are illustrative. Missing values are null, never 0.