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.
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.
What to Build Next
- Build an IV Rank Scanner — scan your watchlist for elevated IV daily
- Track IV Crush Around Earnings — monitor IV spikes and collapses
- Build a Full Volatility Surface — deep dive into vol surface construction and SVI fitting
- Options Chain API Guide — IV is included in every chain response
- Complete API Overview — full developer guide