Implied Volatility API: Real-Time IV for Every Strike and Expiration | FlashAlpha Research

Implied Volatility API: Real-Time IV for Every Strike and Expiration

Get real-time implied volatility for every strike and expiration across 4,000+ US equities and ETFs. Per-strike IV, IV rank, IV percentile, and SVI-smoothed vol — all via a single API call.


Tomasz Dobrowolski - Quant Engineer

  • #ImpliedVolatility #OptionsAPI #VolatilitySurface #Python

Why You Need an IV API

If you've ever tried to pull implied volatility data programmatically, you already know the pain. Broker platforms rate-limit you or block scraping entirely. Free data sources like Yahoo Finance give you a single "IV" number per ticker — no per-strike granularity, no term structure, and often delayed by 15+ minutes. Google Finance doesn't even surface IV at all.

The moment you need IV per strike, per expiration — for building volatility surfaces, screening for rich premium, or triggering alerts on IV spikes — you need a proper API. One that returns clean, structured data you can pipe directly into your models.

FlashAlpha solves this. Every option contract in our system has a computed implied volatility, calculated from live bid/ask prices using Black-Scholes, plus an SVI-smoothed volatility from Gatheral's parametric fit. You get both raw market IV and a clean, arbitrage-free curve — in a single API call.

What FlashAlpha Returns

The Option Quote endpoint returns the full options chain for any ticker, with IV included on every contract:

  • Implied volatility per strike, per expiration, for both calls and puts
  • SVI-smoothed IV — Gatheral parametric fit that removes noise and ensures no-arbitrage constraints
  • Full Greeks — delta, gamma, theta, vega, rho, vanna, charm
  • Bid/ask/mid pricing with sizes and timestamps
  • Open interest and volume per contract
  • Coverage: 4,000+ US equities and ETFs

Here's what a single contract looks like in the response:

{
  "underlying": "SPY",
  "type": "C",
  "expiry": "2026-03-20",
  "strike": 590.0,
  "bid": 15.25,
  "ask": 15.35,
  "mid": 15.30,
  "implied_vol": 0.1823,
  "svi_vol": 0.1820,
  "delta": 0.6543,
  "gamma": 0.0089,
  "theta": -0.0234,
  "vega": 0.0456,
  "vanna": 0.0078,
  "charm": -0.0045,
  "open_interest": 45000,
  "volume": 3250,
  "lastUpdate": "2026-03-15T16:30:45Z"
}

Every contract in the chain comes back with this structure. You get the full picture — not a single aggregated IV number, but the entire surface worth of data.

Quick Start — Get SPY Implied Volatility in 3 Lines

pip install flashalpha
from flashalpha import FlashAlphaClient

client = FlashAlphaClient(api_key="your_api_key")
chain = client.get_option_chain("SPY")

The chain object contains every listed SPY option with IV, Greeks, pricing, and volume data. Extract the IV column to get implied volatility across all strikes and expirations:

import pandas as pd

df = pd.DataFrame(chain)
print(df[["type", "expiry", "strike", "implied_vol", "svi_vol", "delta", "open_interest"]].head(20))

Output:

  type      expiry  strike  implied_vol  svi_vol   delta  open_interest
0    C  2026-03-20   550.0       0.2145   0.2138  0.8921          12340
1    C  2026-03-20   555.0       0.2034   0.2028  0.8654          15670
2    C  2026-03-20   560.0       0.1956   0.1951  0.8312           8920
3    C  2026-03-20   565.0       0.1897   0.1893  0.7891          21450
4    C  2026-03-20   570.0       0.1854   0.1850  0.7389          34560
5    C  2026-03-20   575.0       0.1823   0.1820  0.6812          28900
6    C  2026-03-20   580.0       0.1798   0.1795  0.6178          42100
7    C  2026-03-20   585.0       0.1785   0.1782  0.5501          38760
8    C  2026-03-20   590.0       0.1823   0.1820  0.6543          45000
9    C  2026-03-20   595.0       0.1876   0.1871  0.4102          31200
10   P  2026-03-20   550.0       0.2312   0.2305  -0.1079          9870
11   P  2026-03-20   555.0       0.2198   0.2191  -0.1346         11230
12   P  2026-03-20   560.0       0.2089   0.2083  -0.1688         14560
13   P  2026-03-20   565.0       0.2001   0.1996  -0.2109         18900
14   P  2026-03-20   570.0       0.1934   0.1929  -0.2611         25670

Notice the svi_vol column — that's the SVI-smoothed implied volatility. It tracks implied_vol closely but removes the noise from illiquid strikes, giving you a clean curve you can use directly in pricing models.

Working Example: IV Smile for a Single Expiration

Pull the chain for SPY, filter to one expiration, and plot IV vs strike to visualize the volatility smile:

from flashalpha import FlashAlphaClient
import pandas as pd
import matplotlib.pyplot as plt

client = FlashAlphaClient(api_key="your_api_key")
chain = client.get_option_chain("SPY")
df = pd.DataFrame(chain)

# Filter to calls, nearest monthly expiry
expiry = sorted(df["expiry"].unique())[1]  # second-nearest expiry
calls = df[(df["type"] == "C") & (df["expiry"] == expiry)].sort_values("strike")

plt.figure(figsize=(10, 5))
plt.plot(calls["strike"], calls["implied_vol"] * 100, "o-", label="Market IV", alpha=0.7)
plt.plot(calls["strike"], calls["svi_vol"] * 100, "-", label="SVI Fit", linewidth=2)
plt.xlabel("Strike")
plt.ylabel("Implied Volatility (%)")
plt.title(f"SPY IV Smile — {expiry}")
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig("spy_iv_smile.png", dpi=150)
plt.show()

The skew is immediately visible — OTM puts trade at higher IV than OTM calls. This is the classic equity skew driven by demand for downside protection. The SVI fit smooths through the noise while preserving the skew shape.

Working Example: IV Surface (3D Visualization)

Pull the chain across all expirations and build a full volatility surface — this is what institutional desks look at:

from flashalpha import FlashAlphaClient
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from datetime import datetime

client = FlashAlphaClient(api_key="your_api_key")
chain = client.get_option_chain("SPY")
df = pd.DataFrame(chain)

# Filter to calls, compute DTE
calls = df[df["type"] == "C"].copy()
calls["dte"] = (pd.to_datetime(calls["expiry"]) - datetime.now()).dt.days

# Pivot into surface matrix
surface = calls.pivot_table(values="svi_vol", index="strike", columns="dte", aggfunc="mean")
surface = surface.dropna(thresh=3).interpolate(method="linear", axis=0).interpolate(method="linear", axis=1)

# Build meshgrid
strikes = surface.index.values
dtes = surface.columns.values
X, Y = np.meshgrid(dtes, strikes)
Z = surface.values * 100

fig = plt.figure(figsize=(14, 8))
ax = fig.add_subplot(111, projection="3d")
ax.plot_surface(X, Y, Z, cmap="viridis", alpha=0.85, edgecolor="none")
ax.set_xlabel("Days to Expiration")
ax.set_ylabel("Strike")
ax.set_zlabel("IV (%)")
ax.set_title("SPY Implied Volatility Surface (SVI)")
ax.view_init(elev=25, azim=235)
plt.tight_layout()
plt.savefig("spy_iv_surface.png", dpi=150)
plt.show()

This is the full implied volatility surface — strike on one axis, time to expiration on the other, IV on the vertical. You can see the skew (OTM puts richer than OTM calls) and the term structure (how IV evolves across expirations). Now you have it in 25 lines of Python.

IV Rank and IV Percentile

Raw IV tells you the current level. IV rank tells you whether that level is high or low relative to history. IV at 35% means nothing without context — IV rank at the 85th percentile tells you it's elevated relative to the past year.

The Volatility Analysis endpoint returns comprehensive IV context for any ticker:

from flashalpha import FlashAlphaClient

client = FlashAlphaClient(api_key="your_api_key")
vol = client.get_volatility("SPY")

print(f"ATM IV:     {vol['atm_iv']}%")
print(f"RV (20d):   {vol['realized_vol']['rv_20d']}%")
print(f"VRP:        {vol['iv_rv_spreads']['vrp_20d']}%")
print(f"Assessment: {vol['iv_rv_spreads']['assessment']}")

This gives you ATM implied volatility, realized volatility across multiple windows (5d, 10d, 20d, 30d, 60d), and the implied-realized spread — the volatility risk premium. When the VRP is positive, options are pricing in more vol than is being realized. That's when premium sellers have an edge.

For IV rank and percentile scanning across a watchlist, see our IV Rank Scanner tutorial.

Rate Limits and Pricing

Plan Requests/Day IV Access Price
Starter (Free) 50 Exposure endpoints (GEX, DEX, VEX, CHEX) $0
Growth 2,500 Full option chain + IV + /v1/volatility $299/mo
Pro Unlimited All endpoints + SVI surfaces + backtesting $1,499/mo

The Option Quote endpoint (per-strike IV) and Volatility Analysis endpoint require the Growth plan or higher. See full pricing details.

Get Your API Key

Start pulling IV data for any ticker in minutes.

Get API Key → Try the Playground

What to Build Next


Live Market Pulse

Get tick-by-tick visibility into market shifts with full-chain analytics streaming in real time.

Intelligent Screening

Screen millions of option pairs per second using your custom EV rules, filters, and setups.

Execution-Ready

Instantly send structured orders to Interactive Brokers right from your scan results.

Join the Community

Discord

Engage in real time conversations with us!

Twitter / X

Follow us for real-time updates and insights!

GitHub

Explore our open-source SDK, examples, and analytics resources!