Skip to content

Options · Exposure, levels, volatility and OI

Options volatility surface

Implied volatility surface by strike and expiration.
GET/v1/options/volatility/surfaceoptionsVolatilitySurface
On this page

The implied volatility of every strike and expiration in the window as a list of cells. By default each strike shows its out-of-the-money option (puts below the underlying price, calls at and above it), the usual basis for a surface; contract_type selects calls or puts only. The window is 60 strikes either side of the underlying price and 24 expirations unless set. Volatilities are decimals solved by the platform. Cells without a listed contract are omitted.

Example request

curl -sS --get "https://api.ordermap.si/v1/options/volatility/surface" \
  -H "Authorization: Bearer $ORDERMAP_API_KEY" \
  --data-urlencode underlying_symbol=SPXW

Set ORDERMAP_API_KEY to your key. Replace the dates with a recent trading date.

Parameters

14 parameters, 1 required.

ParameterType and limitsDescription
underlying_symbolqueryrequiredstringat 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 ...
datequeryoptionalstringdateTrading date (YYYY-MM-DD). Default: the current session, else the most recent completed one.
sessionqueryoptionalstringrthgthdefault rthTrading 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_typequeryoptionalstringcallputCalls or puts. Omit for both.
date_of_expiryqueryoptionalstringdateOnly this expiration.
expirationsqueryoptionalarray<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_modequeryoptionalstring0dte1dteweeklymonthlylte30lte90Expiration set: 0dte, 1dte, weekly (within 7 days), monthly (third-Friday expirations), lte30 or lte90 (within 30 or 90 days).
min_dtequeryoptionalintegermin 0max 3650Minimum days to expiration (0 = expires on the trading date).
max_dtequeryoptionalintegermin 0max 3650Maximum days to expiration.
min_strikequeryoptionalnumber> 0max 1000000Lowest strike in dollars.
max_strikequeryoptionalnumber> 0max 1000000Highest strike in dollars.
strikes_aroundqueryoptionalintegerdefault 60min 1max 200This many listed strikes either side of the strike nearest the underlying price (up to 200).
max_expirationsqueryoptionalintegerdefault 24min 1max 64Number of expirations (columns) in the grid.
expiration_offsetqueryoptionalintegermin 0max 400Index of the first expiration of the grid among the selected ones.

Response

StatusMeaningBody
200Successful response.Schema below
400Invalid, unknown or repeated parameters, or an invalid cursor.Error object
401Missing or invalid API key.Error object
403The plan, dataset release or account state does not allow this request.Error object
422The request is valid but no data exists for it.Error object
429Rate limit, burst limit or cooldown; wait Retry-After seconds.Retry-AfterError object
500Internal error.Error object
503Data temporarily unavailable; retry after Retry-After seconds.Retry-AfterError object
504The request timed out.Error object

Authenticated responses carry the X-RateLimit-* headers (see rate limits); 429 and 503 add Retry-After.

200 response body

  • dataobjectrequiredImplied volatility surface.19 fields inside
    • basisstringrequiredout_of_the_money: each strike shows its out-of-the-money option; call or put: that leg only.out_of_the_moneycallput
    • cellsarray<object>requiredCells with a listed contract.5 fields inside
      • contract_typestringrequiredCall or put.callput
      • date_of_expirystringdaterequiredExpiration.
      • days_to_expiryintegerrequiredDays from the trading date.
      • implied_volatilitynumberrequiredImplied volatility as a decimal.
      • strikenumberrequiredStrike.
    • rootsarray<string>requiredOption roots included.
    • sessionstringrequiredSession valued.rthgthcurball
    • trading_datestringdaterequiredTrading date valued.
    • underlying_symbolstringrequiredThe requested underlying.
    • valuationobjectrequiredWhat the snapshot was valued on.7 fields inside
      • chain_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": {
    "basis": "out_of_the_money",
    "cells": [
      {
        "contract_type": "put",
        "date_of_expiry": "2026-10-23",
        "days_to_expiry": 7,
        "implied_volatility": 0.158,
        "strike": 6000
      }
    ],
    "roots": [
      "SPX",
      "SPXW"
    ],
    "session": "rth",
    "trading_date": "2026-10-16",
    "underlying_symbol": "SPX",
    "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.