- Live API Reference
- Volatility Analytics
- 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.
Parameters
| Name | In | Type | Required | Default | Description |
|---|---|---|---|---|---|
symbol |
path | string | required | - | Underlying symbol (e.g. SPY) |
Request
curl https://lab.flashalpha.com/v1/surface/SPYimport 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.
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 |
|---|---|---|
403 | tier_restricted | Live CME futures symbols (for example ES=F) on a plan below Growth. Calls without a key count as Free. |
404 | no_option_data | The symbol has no live option data, so there is no surface. |
503 | surface_not_ready | Surface 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,moneynessandivstraight into a surface chart - Read skew per tenor - take one row of
ivand 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
Related reading
- Build an IV surface in Python - SVI fitting and plotting a surface from the API
- Live volatility surface services compared - where a public IV grid fits
Complementary endpoints
- SVI Parameters - fitted SVI parameters per expiry (a separate fit, not used to build this grid)
- Advanced Volatility - variance surface, arbitrage checks and greeks surfaces
- Skew & Volatility Term Structure - skew and term structure metrics without the full grid