Options · Exposure, levels, volatility and OI
Options max pain
/v1/options/max-painoptionsMaxPainThe settlement price at which the total payout to option holders is smallest, computed from open interest, for one expiration (by default the nearest): the payout of calls and puts at every strike, the max pain of each listed expiration, and how the max pain of the chosen expiration moved over the stored open interest dates. Open interest is the previous close's, so the figures do not move intraday.
Example request
curl -sS --get "https://api.ordermap.si/v1/options/max-pain" \
-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/max-pain?${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
5 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 ... |
date_queryoptional | stringdate | The expiration to analyse. Default: the nearest. |
datequeryoptional | stringdate | Trading date (YYYY-MM-DD). Default: the most recent session. |
max_queryoptional | integerdefault 90min 1max 400 | Longest expiration, in days, in by_expiration. |
include_queryoptional | boolean | Include how the max pain moved over the stored open interest dates (up to 30). Default true. |
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
dataobjectrequiredMax pain analysis.19 fields insideby_expirationarray<object>requiredMax pain of every expiration within max_dte.4 fields insidedate_of_expirystringdaterequiredExpiration.days_to_expiryintegerrequiredDays from the trading date.max_painnumber | nullrequiredMax pain strike.total_open_interestintegerrequiredCalls plus puts open interest.
date_of_expirystringdaterequiredThe analysed expiration.historyarray<object>requiredMax pain of the analysed expiration on each stored open interest date.2 fields insidedatestringdaterequiredOpen interest date.max_painnumber | nullrequiredMax pain strike.
max_painnumber | nullrequiredStrike at which the total payout to option holders is smallest.open_interest_datestringdaterequiredDate of the open interest used.payoutsarray<object>requiredPayout if the underlying settled at each strike.4 fields insidecall_payoutnumber | nullrequiredPayout to call holders in US dollars.put_payoutnumber | nullrequiredPayout to put holders in US dollars.strikenumberrequiredStrike.total_payoutnumber | nullrequiredTotal payout in US dollars.
trading_datestringdaterequiredTrading date.underlying_pricenumber | nullrequiredUnderlying price.underlying_symbolstringrequiredThe requested underlying.
metaobjectrequiredMeta object
Example response
{
"data": {
"by_expiration": [
{
"date_of_expiry": "2026-10-16",
"days_to_expiry": 0,
"max_pain": 6000,
"total_open_interest": 63250
}
],
"date_of_expiry": "2026-10-16",
"history": [
{
"date": "2026-10-15",
"max_pain": 6000
}
],
"max_pain": 6000,
"open_interest_date": "2026-10-15",
"payouts": [
{
"call_payout": 51000000,
"put_payout": 44000000,
"strike": 6000,
"total_payout": 95000000
}
],
"trading_date": "2026-10-16",
"underlying_price": 6021.4,
"underlying_symbol": "SPX"
},
"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.