Volatility Surface API - Public Implied Volatility Grid | FlashAlpha
  1. Volatility Surface Grid

Volatility Surface Grid API

A pre-computed implied volatility grid by tenor and moneyness, interpolated from market contract IVs. Public, no API key needed.

Endpoint

Returns the cached volatility surface grid for a symbol. The surface is pre-computed from out-of-the-money contract implied volatilities (bilinear interpolation, no SVI smoothing), cached, and updated periodically during market hours.

GET /v1/surface/{symbol}
No auth required Public

Parameters

Name In Type Required Default Description
symbol path string required - Underlying symbol (e.g. SPY)

Request

curl https://lab.flashalpha.com/v1/surface/SPY
import requests

resp = requests.get("https://lab.flashalpha.com/v1/surface/SPY")
resp.raise_for_status()
s = resp.json()
# iv[i][j] is the implied vol at tenors[i] (years) and moneyness[j]
print(f"{s['symbol']} spot {s['spot']}, {s['grid_size']}x{s['grid_size']} grid from {s['slices_used']} slices")
const resp = await fetch("https://lab.flashalpha.com/v1/surface/SPY");
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
const s = await resp.json();
// s.iv[i][j] is the implied vol at s.tenors[i] (years) and s.moneyness[j]
console.log(`${s.symbol} spot ${s.spot}, ${s.grid_size}x${s.grid_size} grid`);

Try it live

Runs on live market data. Public endpoint: no API key needed.

GET

Response

{
  "symbol": "SPY",
  "spot": 760.345,
  "as_of": "2026-10-30T13:46:25Z",
  "grid_size": 50,
  "tenors": [
    0.003,
    0.003378,
    0.003803
  ],
  "moneyness": [
    -0.25,
    -0.239796,
    -0.229592
  ],
  "iv": [
    [
      0.504276,
      0.504276,
      0.504276
    ],
    [
      0.504276,
      0.504276,
      0.504276
    ]
  ],
  "slices_used": 33,
  "endpoint_version": "2026.09.30",
  "data_as_of": {
    "node": "fa5",
    "equity_feed": "2026-10-30T13:46:28.746Z",
    "equity_options_feed": "2026-10-30T13:46:28Z",
    "index_feed": "2026-10-30T13:46:28.113Z",
    "index_options_feed": "2026-10-30T13:46:24Z",
    "futures_feed": "2026-10-30T13:46:25.854Z",
    "futures_options_feed": "2026-10-30T13:46:25.948Z",
    "flow_feed": "2026-10-30T13:46:00Z",
    "oi_feed": "2026-10-29T20:00:00Z",
    "macro_feed": "2026-10-29T21:00:20Z"
  }
}

Sending request…

See this endpoint on live data

Send this exact request and the real response shows up here, right next to the example.

Arrays truncated to three points for brevity - the live response has grid_size tenors, grid_size moneyness points and a grid_size × grid_size iv matrix, and data_as_of lists every upstream feed.

Response Fields

Field Type Description
symbol string Underlying symbol
spot number Underlying spot price the grid was built against
as_of string ISO 8601 timestamp of the surface snapshot
grid_size integer Points per axis of the grid
tenors array of number Time to expiry of each grid row, in years
moneyness array of number Log-moneyness of each grid column
iv array of array Implied volatility (decimal) at tenors[i], moneyness[j]
slices_used integer Number of expiry slices the grid was built from
data_as_of object When each upstream feed last delivered (see response envelope)

Errors

Status Error When
403tier_restrictedLive CME futures symbols (for example ES=F) on a plan below Growth. Calls without a key count as Free.
404no_option_dataThe symbol has no live option data, so there is no surface.
503surface_not_readySurface data is still loading, or the market is closed. The body includes market_open. Try again shortly.

What Is the Volatility Surface Endpoint?

The volatility surface shows implied volatility across both strike and time to expiry. This endpoint returns it as a ready-to-plot grid: each row is a tenor, each column a moneyness point, and each cell an implied volatility interpolated from listed out-of-the-money contracts (no SVI smoothing). Because the grid is pre-computed and public, you can chart a surface, read skew at a given tenor, or compare term structure without fitting anything yourself and without an API key. For fitted SVI parameters per expiry, see SVI Parameters and Advanced Volatility.

Common Use Cases

  • Plot a 3D surface - feed tenors, moneyness and iv straight into a surface chart
  • Read skew per tenor - take one row of iv and compare the put and call wings
  • Track term structure - read the at-the-money column across tenors
  • Price off-grid options - interpolate the grid for a quick IV estimate before calling the pricing endpoints

Related reading

Complementary endpoints

Ready to build with FlashAlpha?

Get your free API key and start pulling live options data in 60 seconds.

No credit card required Setup in 60 seconds Secure & reliable