Options · Exposure, levels, volatility and OI
Options open interest
Open interest by strike or by expiration.
GET
/v1/options/open-interestoptionsOpenInterestThe open interest of calls and puts at each strike or each expiration, the totals and the put/call ratio. Open interest is the previous close's figure, published each morning, so it does not move during the session. Narrow the rows with date_of_expiry, expirations, expiry_mode or the DTE bounds and with the strike window.
Example request
curl -sS --get "https://api.ordermap.si/v1/options/open-interest" \
-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/open-interest?${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
12 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. |
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 | integermin 1max 500 | This many listed strikes either side of the strike nearest the underlying price. |
strike_queryoptional | numbermin 0.1max 100 | Strikes within this percent of the underlying price. |
group_queryoptional | stringstrikeexpirationdefault strike | Rows per strike or per expiration. |
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
dataobjectrequiredOpen interest by strike or expiration.16 fields insidegroup_bystringrequiredRow grouping.strikeexpirationopen_interest_datestringdaterequiredDate of the open interest.rootsarray<string>requiredOption roots included.rowsarray<object>requiredRows, ascending by strike or expiration.5 fields insidecall_open_interestintegerrequiredCall open interest.date_of_expirystringdateExpiration; present when grouped by expiration.put_open_interestintegerrequiredPut open interest.strikenumberStrike; present when grouped by strike.total_open_interestintegerrequiredCalls plus puts.
totalsobjectrequiredTotals over the rows.3 fields insidecallintegerrequiredCall open interest.putintegerrequiredPut open interest.put_call_rationumber | nullrequiredPut over call open interest.
trading_datestringdaterequiredTrading date.underlying_pricenumber | nullrequiredUnderlying price.underlying_symbolstringrequiredThe requested underlying.
metaobjectrequiredMeta object
Example response
{
"data": {
"group_by": "strike",
"open_interest_date": "2026-10-15",
"roots": [
"SPX",
"SPXW"
],
"rows": [
{
"call_open_interest": 22440,
"put_open_interest": 23940,
"strike": 6000,
"total_open_interest": 46380
}
],
"totals": {
"call": 3120000,
"put": 3680000,
"put_call_ratio": 1.1795
},
"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.