- Live API Reference
- Market Data
- Stock Summary
Stock Summary API
Price, volatility, options flow, dealer exposure and macro context for one symbol in a single call.
Endpoint
Returns a comprehensive stock summary: price, ATM IV, historical volatility, vol risk premium, 25-delta skew, IV term structure, options flow (OI, volume, put/call ratios), exposure data (GEX/DEX/VEX/CHEX, gamma flip, walls, max pain, hedging estimates, 0DTE, top strikes, regime), and macro context (VIX, VVIX, SKEW, SPX, MOVE, VIX term structure, VIX futures basis, Fear & Greed index).
X-Api-Key: live data; without: previous-day snapshot)
Rate Limited: Yes, for authenticated requests
Plan: Free+
Parameters
| Name | In | Type | Required | Default | Description |
|---|---|---|---|---|---|
symbol |
path | string | required | - | Underlying symbol (e.g. SPY) |
Access by tier
- Authenticated (any plan) - live summaries with the plan's field restrictions.
- Unauthenticated (no API key) - stock and index summaries use the newest available snapshot captured before today in US Eastern time, with public field restrictions.
- Futures (
ES=F,NQ=F...) - live from Growth. Below Growth, including anonymous callers, the summary uses the newest snapshot captured before today in US Eastern time, with the plan's field restrictions.
Plan-gated fields are null below their plan. Basic and higher: exposure.net_dex, net_vex, net_chex, max_pain and the vanna and charm lines of exposure.interpretation. Growth and higher: exposure.hedging_estimate, zero_dte, top_strikes, volatility.skew_25d and volatility.iv_term_structure. Alpha and higher: volatility.vrp. Anonymous calls keep max_pain. An invalid X-Api-Key is treated like no key and gets the delayed snapshot.
Delayed summaries never include data captured today, and carry snapshot_as_of: { "captured_at": "<UTC timestamp>", "delayed": true }. Live responses do not carry snapshot_as_of. If no eligible snapshot exists the endpoint returns 404 without a live fallback. Share-class tickers such as BRK.B are not captured for delayed summaries.
Request
# Live data (authenticated)
curl -H "X-Api-Key: YOUR_API_KEY" \
"https://lab.flashalpha.com/v1/stock/SPY/summary"
# Previous day snapshot (unauthenticated)
curl "https://lab.flashalpha.com/v1/stock/SPY/summary"import requests
resp = requests.get(
"https://lab.flashalpha.com/v1/stock/SPY/summary",
headers={"X-Api-Key": "YOUR_API_KEY"}
)
resp.raise_for_status()
s = resp.json()
print(f"{s['symbol']} mid {s['price']['mid']} | ATM IV {s['volatility']['atm_iv']}% | regime {s['exposure']['regime']}")const resp = await fetch("https://lab.flashalpha.com/v1/stock/SPY/summary", {
headers: { "X-Api-Key": "YOUR_API_KEY" }
});
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
const s = await resp.json();
console.log(`${s.symbol} mid ${s.price.mid} | ATM IV ${s.volatility.atm_iv}% | regime ${s.exposure.regime}`);Try it live
Runs on live market data. API key optional: with a key you get live data and use 1 request from your daily quota; without one you get the previous-day snapshot.
Response
{
"symbol": "SPY",
"as_of": "2026-10-30T13:46:19.908Z",
"market_open": true,
"price": {
"bid": 760.42,
"ask": 760.43,
"mid": 760.425,
"last": 760.425,
"last_update": "2026-10-30T13:46:19.908Z"
},
"volatility": {
"atm_iv": 15.62,
"hv_20": 10.1,
"hv_60": 9.34,
"vrp": 5.52,
"skew_25d": {
"expiry": "2026-11-02",
"days_to_expiry": 3,
"put_25d_iv": 13.26,
"atm_iv": 12.2,
"call_25d_iv": 10.97,
"skew_25d": 2.29,
"smile_ratio": 1.209
},
"iv_term_structure": [
{
"expiry": "2026-11-02",
"iv": 11.9,
"days_to_expiry": 3
},
{
"expiry": "2026-11-03",
"iv": 12.91,
"days_to_expiry": 4
}
]
},
"options_flow": {
"total_call_oi": 5798169,
"total_put_oi": 12363230,
"total_call_volume": 360128,
"total_put_volume": 594935,
"pc_ratio_oi": 2.132,
"pc_ratio_volume": 1.652,
"active_expirations": 34
},
"exposure": {
"net_gex": -15590837688,
"net_dex": -30636744498,
"net_vex": 18751443351,
"net_chex": 1336248,
"gamma_flip": 769.9207,
"gamma_flip_status": "available",
"call_wall": 800,
"put_wall": 760,
"max_pain": 765,
"highest_oi_strike": 500,
"regime": "negative_gamma",
"interpretation": {
"gamma": "Dealers short gamma - moves amplified, trend following likely",
"vanna": "Vol up = dealers buy delta - downside dampened if vol spikes",
"charm": "Time decay pushing dealers to buy - supportive into close"
},
"hedging_estimate": {
"spot_down_1pct": {
"dealer_shares": -20502795,
"dealer_contracts": null,
"direction": "sell",
"notional_usd": -15590837688
},
"spot_up_1pct": {
"dealer_shares": 20502795,
"dealer_contracts": null,
"direction": "buy",
"notional_usd": 15590837688
}
},
"zero_dte": {
"net_gex": -6944676276,
"pct_of_total": 44.5,
"expiration": "2026-10-30"
},
"top_strikes": [
{
"strike": 760,
"net_gex": -2460871111,
"call_oi": 72447,
"put_oi": 199241,
"total_oi": 271688
},
{
"strike": 750,
"net_gex": -2182572916,
"call_oi": 81365,
"put_oi": 384765,
"total_oi": 466130
}
],
"oi_weighted_dte": 100.8
},
"macro": {
"vix": {
"value": 18.95,
"change": 1.75,
"change_pct": 10.17,
"as_of": "2026-10-30T13:46:16.406Z"
},
"vvix": {
"value": 107.36,
"change": 9.35,
"change_pct": 9.54,
"as_of": "2026-10-30T13:46:01.572Z"
},
"skew": {
"value": 151.03,
"change": 2.29,
"change_pct": 1.54,
"as_of": "2026-10-29T21:00:20Z"
},
"spx": {
"value": 7627.34,
"change": -93.05,
"change_pct": -1.21,
"as_of": "2026-10-30T13:46:19Z"
},
"move": {
"value": 97.116,
"change": 2.57,
"change_pct": 2.71,
"as_of": "2026-10-30T13:02:30Z"
},
"vix_term_structure": {
"levels": {
"vix9d": 15.87,
"vix": 18.71,
"vix3m": 19.37,
"vix6m": 21.24
},
"near_slope_pct": 17.9,
"structure": "contango"
},
"vix_futures": {
"front_month": 19.37,
"spot": 18.71,
"spread": 0.66,
"basis_pct": 3.53,
"basis": "contango"
},
"fear_and_greed": {
"score": 31,
"rating": "fear"
}
},
"endpoint_version": "2026.09.30",
"data_as_of": {
"node": "fa5",
"equity_feed": "2026-10-30T13:46:21.94Z",
"equity_options_feed": "2026-10-30T13:46:21Z",
"index_feed": "2026-10-30T13:46:20.636Z",
"index_options_feed": "2026-10-30T13:46:18Z",
"futures_feed": "2026-10-30T13:46:18.513Z",
"futures_options_feed": "2026-10-30T13:46:18.184Z",
"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.
Response without an API key (delayed snapshot)
Called without X-Api-Key. Plan-gated fields are null and snapshot_as_of is added.
{
"symbol": "SPY",
"as_of": "2026-10-29T22:46:15.437Z",
"market_open": false,
"price": {
"bid": 763.8,
"ask": 763.86,
"mid": 763.83,
"last": 763.83,
"last_update": "2026-10-29T22:46:15.437Z"
},
"volatility": {
"atm_iv": 14.24,
"hv_20": 10.1,
"hv_60": 9.34,
"vrp": null,
"skew_25d": null,
"iv_term_structure": null
},
"options_flow": {
"total_call_oi": 5684135,
"total_put_oi": 12189899,
"total_call_volume": 4656372,
"total_put_volume": 5277039,
"pc_ratio_oi": 2.145,
"pc_ratio_volume": 1.133,
"active_expirations": 35
},
"exposure": {
"net_gex": -12461151901,
"net_dex": null,
"net_vex": null,
"net_chex": null,
"gamma_flip": 768.9985,
"gamma_flip_status": "available",
"call_wall": 800,
"put_wall": 760,
"max_pain": 765,
"highest_oi_strike": 500,
"regime": "negative_gamma",
"interpretation": {
"gamma": "Dealers short gamma - moves amplified, trend following likely",
"vanna": null,
"charm": null
},
"hedging_estimate": null,
"zero_dte": null,
"top_strikes": null,
"oi_weighted_dte": 102
},
"macro": {
"vix": {
"value": 17.2,
"change": 0.29,
"change_pct": 1.71,
"as_of": "2026-10-29T20:15:01Z"
},
"vvix": {
"value": 98.01,
"change": 1.4,
"change_pct": 1.45,
"as_of": "2026-10-29T20:15:01Z"
},
"skew": {
"value": 151.03,
"change": 2.29,
"change_pct": 1.54,
"as_of": "2026-10-29T21:00:20Z"
},
"spx": {
"value": 7720.39,
"change": -23.59,
"change_pct": -0.3,
"as_of": "2026-10-29T20:32:46Z"
},
"move": {
"value": 93.5385,
"change": -1.01,
"change_pct": -1.07,
"as_of": "2026-10-29T20:17:30Z"
},
"vix_term_structure": {
"levels": {
"vix9d": 15.87,
"vix": 17.2,
"vix3m": 19.37,
"vix6m": 21.24
},
"near_slope_pct": 8.38,
"structure": "contango"
},
"vix_futures": {
"front_month": 19.37,
"spot": 17.2,
"spread": 2.17,
"basis_pct": 12.62,
"basis": "contango"
},
"fear_and_greed": {
"score": 35,
"rating": "fear"
}
},
"data_as_of": {
"node": "fa2",
"equity_feed": "2026-10-29T22:46:26.081Z",
"equity_options_feed": "2026-10-29T21:15:01Z",
"index_feed": "2026-10-29T20:15:01.369Z",
"index_options_feed": "2026-10-29T21:00:01Z",
"futures_feed": "2026-10-29T22:46:14.361Z",
"futures_options_feed": "2026-10-29T22:46:14.444Z",
"flow_feed": null,
"oi_feed": "2026-10-28T20:00:00Z",
"macro_feed": "2026-10-29T20:15:01Z"
},
"endpoint_version": "2026.09.30",
"snapshot_as_of": {
"captured_at": "2026-10-29T22:46:26.5822921Z",
"delayed": true
}
}Response Fields
| Field | Type | Description |
|---|---|---|
price | object | Current bid/ask/mid/last from live market data |
volatility.atm_iv | number | null | At-the-money implied vol (%) from the contract IVs of the first expiry at least 7 days out (the nearest expiry if none is), averaging the out-of-the-money contracts around spot. No SVI fit |
volatility.hv_20 / hv_60 | number | 20-day and 60-day realized (historical) volatility (%) |
volatility.vrp | number | null | Vol risk premium = ATM IV - HV20 |
volatility.skew_25d | object | null | 25-delta put/call skew from the contract IVs of the nearest expiry that has 25-delta puts and calls (put IV, ATM IV, call IV, skew spread, smile ratio). No SVI fit. Growth+ |
volatility.iv_term_structure | array | null | ATM IV for each active expiration, from contract IVs (values outside 5-200% are dropped as bad quotes). Growth+ |
options_flow | object | Aggregate OI, volume and put/call ratios across all active expirations |
exposure.gamma_flip | number | Underlying price where aggregate GEX crosses from negative to positive (nullable). Certified when gamma_flip_status is available |
exposure.call_wall / put_wall | number | Strikes with the highest call / put GEX concentration |
exposure.max_pain | number | null | Strike where total option holder loss is maximized |
exposure.highest_oi_strike | number | Strike with the highest total open interest |
exposure.regime | string | positive_gamma or negative_gamma from spot vs the published gamma flip; unknown when the flip is withheld |
exposure.interpretation | object | Plain-English read of the gamma regime, vanna and charm effects |
exposure.hedging_estimate | object | null | Estimated dealer hedging flow (shares + notional) for ±1% spot moves |
exposure.zero_dte | object | null | 0DTE contribution to total GEX (net GEX, % of total, expiration date) |
exposure.top_strikes | array | null | Top 5 strikes by absolute net GEX with OI breakdown |
exposure.oi_weighted_dte | number | OI-weighted average days to expiry across all active options |
macro.vix_term_structure | object | VIX9D, VIX, VIX3M, VIX6M levels with near-term slope and contango/backwardation |
macro.vix_futures | object | VIX futures basis approximated from VIX3M vs VIX spot (spread, basis %, contango/backwardation) |
macro.fear_and_greed | object | CNN Fear & Greed Index score (0-100) and rating |
symbol | string | Underlying symbol |
as_of | string | Timestamp of the data (ISO 8601, UTC) |
market_open | boolean | true during US market hours |
price.bid | number | Price: bid |
price.ask | number | Price: ask |
price.mid | number | Price: mid |
price.last | number | Price: last |
price.last_update | string | Price: last update |
volatility | object | Volatility |
volatility.skew_25d.expiry | string | Expiration date (yyyy-MM-dd) |
volatility.skew_25d.days_to_expiry | number | Calendar days to expiration |
volatility.skew_25d.put_25d_iv | number | Skew 25d: put 25d IV |
volatility.skew_25d.call_25d_iv | number | Skew 25d: call 25d IV |
volatility.skew_25d.smile_ratio | number | Skew 25d: smile ratio |
volatility.skew_25d.atm_iv | number | IV of the contract closest to spot in the same expiry (%) |
volatility.skew_25d.skew_25d | number | 25-delta put IV minus 25-delta call IV (vol points) |
volatility.iv_term_structure[].expiry | string | Expiration date (yyyy-MM-dd) |
volatility.iv_term_structure[].iv | number | Implied volatility |
volatility.iv_term_structure[].days_to_expiry | number | Calendar days to expiration |
options_flow.total_call_oi | number | Options flow: total call OI |
options_flow.total_put_oi | number | Options flow: total put OI |
options_flow.total_call_volume | number | Options flow: total call volume |
options_flow.total_put_volume | number | Options flow: total put volume |
options_flow.pc_ratio_oi | number | Options flow: put/call ratio OI |
options_flow.pc_ratio_volume | number | null | Options flow: put/call ratio volume |
options_flow.active_expirations | number | Options flow: active expirations |
exposure | object | Exposure |
macro | object | Macro |
exposure.hedging_estimate.spot_down_1pct.dealer_contracts | number | null | Spot down 1pct: dealer contracts |
exposure.hedging_estimate.spot_up_1pct.dealer_contracts | number | null | Spot up 1pct: dealer contracts |
endpoint_version, data_as_of | string, object | Response envelope, see Response envelope. |
Fields of exposure
| Field | Type | Description |
|---|---|---|
exposure.net_gex | number | null | Net gamma exposure (USD per 1% spot move) |
exposure.net_dex | number | null | Net delta exposure (USD delta notional). Basic+ |
exposure.net_vex | number | null | Net vanna exposure (USD of delta per 1.00 change in IV, that is per 100 vol points). Basic+ |
exposure.net_chex | number | null | Net charm exposure (shares of delta per day, not USD). Basic+ |
exposure.gamma_flip_status | string | available when the level is certified. A numeric gamma_flip with any of sensitive_root, uncertain_root_path, quality_budget, uncertain_gamma_variance, insufficient_local_coverage or insufficient_quote_quality is an unverified level: the root exists but failed that publication gate, and regime is unknown. Any other status means no supportable root and gamma_flip is null. |
exposure.interpretation.gamma | string | Interpretation: gamma |
exposure.interpretation.vanna | string | null | Interpretation: vanna. Basic+ |
exposure.interpretation.charm | string | null | Interpretation: charm. Basic+ |
exposure.hedging_estimate.spot_down_1pct | object | Hedging estimate: spot down 1pct |
exposure.hedging_estimate.spot_down_1pct.dealer_shares | number | Spot down 1pct: dealer shares |
exposure.hedging_estimate.spot_down_1pct.direction | string | Spot down 1pct: direction |
exposure.hedging_estimate.spot_down_1pct.notional_usd | number | Spot down 1pct: notional (USD) |
exposure.hedging_estimate.spot_up_1pct | object | Hedging estimate: spot up 1pct |
exposure.hedging_estimate.spot_up_1pct.dealer_shares | number | Spot up 1pct: dealer shares |
exposure.hedging_estimate.spot_up_1pct.direction | string | Spot up 1pct: direction |
exposure.hedging_estimate.spot_up_1pct.notional_usd | number | Spot up 1pct: notional (USD) |
exposure.zero_dte.net_gex | number | Net gamma exposure (USD per 1% spot move) |
exposure.zero_dte.pct_of_total | number | 0DTE: (%) of total |
exposure.zero_dte.expiration | string | Expiration date (yyyy-MM-dd) |
exposure.top_strikes[].strike | number | Strike price |
exposure.top_strikes[].net_gex | number | Net gamma exposure (USD per 1% spot move) |
exposure.top_strikes[].call_oi | number | Call open interest |
exposure.top_strikes[].put_oi | number | Put open interest |
exposure.top_strikes[].total_oi | number | Top strikes: total OI |
Fields of macro
| Field | Type | Description |
|---|---|---|
macro.vix | object | VIX value with daily change and change % |
macro.vix.value | number | VIX: value |
macro.vix.change | number | VIX: change |
macro.vix.change_pct | number | VIX: change (%) |
macro.vix.as_of | string | Timestamp of the data (ISO 8601, UTC) |
macro.vvix | object | VVIX value with daily change and change % |
macro.vvix.value | number | Vvix: value |
macro.vvix.change | number | Vvix: change |
macro.vvix.change_pct | number | Vvix: change (%) |
macro.vvix.as_of | string | Timestamp of the data (ISO 8601, UTC) |
macro.skew | object | SKEW value with daily change and change % |
macro.skew.value | number | Skew: value |
macro.skew.change | number | Skew: change |
macro.skew.change_pct | number | Skew: change (%) |
macro.skew.as_of | string | Timestamp of the data (ISO 8601, UTC) |
macro.spx | object | SPX value with daily change and change % |
macro.spx.value | number | SPX: value |
macro.spx.change | number | SPX: change |
macro.spx.change_pct | number | SPX: change (%) |
macro.spx.as_of | string | Timestamp of the data (ISO 8601, UTC) |
macro.move | object | MOVE value with daily change and change % |
macro.move.value | number | Move: value |
macro.move.change | number | Move: change |
macro.move.change_pct | number | Move: change (%) |
macro.move.as_of | string | Timestamp of the data (ISO 8601, UTC) |
macro.vix_term_structure.levels | object | VIX term structure: levels |
macro.vix_term_structure.levels.vix9d | number | Levels: vix9d |
macro.vix_term_structure.levels.vix | number | Levels: VIX |
macro.vix_term_structure.levels.vix3m | number | Levels: vix3m |
macro.vix_term_structure.levels.vix6m | number | Levels: vix6m |
macro.vix_term_structure.near_slope_pct | number | VIX term structure: near slope (%) |
macro.vix_term_structure.structure | string | VIX term structure: structure |
macro.vix_futures.front_month | number | VIX futures: front month |
macro.vix_futures.spot | number | VIX futures: spot |
macro.vix_futures.spread | number | VIX futures: spread |
macro.vix_futures.basis_pct | number | VIX futures: basis (%) |
macro.vix_futures.basis | string | VIX futures: basis |
macro.fear_and_greed.score | number | Fear and greed: score |
macro.fear_and_greed.rating | string | Fear and greed: rating |
Notes
- Macro fields (
vix,vvix, ...) may benullif the external data source is unavailable. exposureisnullif no options/greeks data is loaded for the symbol.- HV is the annualized standard deviation of daily log returns (√252).
atm_iv,skew_25dandiv_term_structurecome from listed contract implied volatilities, not an SVI fit;vix_futures.basisis approximated from VIX3M vs VIX spot, not actual futures prices.
Errors
| Status | Error | When |
|---|---|---|
404 | symbol_not_found | No data for the symbol (unknown symbol, or no live data). Outside US market hours the message also says the market is closed. |
404 | no_cached_data | Delayed request (no key, or futures below Growth) and no snapshot captured before today exists. There is no live fallback. The message suggests sending a key, or upgrading to Growth for futures. |
429 | Quota exceeded | Daily quota used up. Retry-After gives the seconds until the reset at 00:00 UTC. Rejected requests (including 403) count toward the quota. |
This route never returns 401: a missing or invalid key gets the delayed snapshot. Rate-limit (429) errors use the common error format, see Error Responses.
What Is the Stock Summary Endpoint?
The Stock Summary endpoint is the one-call snapshot of a symbol. Instead of stitching together a quote, a volatility read, an exposure call and a macro feed, you get price, implied and realized volatility, skew, the IV term structure, options flow, dealer exposure with its key levels, and the macro backdrop in a single JSON document. It is the same snapshot that powers the stock pages on flashalpha.com, and without an API key it serves the previous-day snapshot, so you can explore the shape of the data before signing up.
Common Use Cases
- Build a symbol dashboard - render price, ATM IV, VRP, regime and key levels from one request
- Screen for regime changes - compare
exposure.regimeandgamma_flipacross a watchlist each morning - Size premium-selling trades - read
volatility.vrpandskew_25dbefore choosing strikes - Add macro context - pair a symbol view with VIX term structure and Fear & Greed without a second data source
- Prototype without a key - call the endpoint anonymously to get the previous-day snapshot while you design your integration
Related
Related reading
- Real-time options data: polling vs streaming - how often to refresh a snapshot like this one
Complementary endpoints
- Stock Quote - just the live bid/ask/mid/last when you do not need the full snapshot
- Exposure Summary - the full dealer exposure breakdown behind the
exposureblock - Volatility Analysis - deeper realized vol, skew and term structure analytics