Stock Summary API - Price, Volatility, Exposure and Macro in One Call | FlashAlpha
  1. 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).

GET /v1/stock/{symbol}/summary
Auth optional (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.

GET

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.

Response
{
  "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
priceobject Current bid/ask/mid/last from live market data
volatility.atm_ivnumber | 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_60number 20-day and 60-day realized (historical) volatility (%)
volatility.vrpnumber | null Vol risk premium = ATM IV - HV20
volatility.skew_25dobject | 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_structurearray | null ATM IV for each active expiration, from contract IVs (values outside 5-200% are dropped as bad quotes). Growth+
options_flowobject Aggregate OI, volume and put/call ratios across all active expirations
exposure.gamma_flipnumber Underlying price where aggregate GEX crosses from negative to positive (nullable). Certified when gamma_flip_status is available
exposure.call_wall / put_wallnumber Strikes with the highest call / put GEX concentration
exposure.max_painnumber | null Strike where total option holder loss is maximized
exposure.highest_oi_strikenumber Strike with the highest total open interest
exposure.regimestring positive_gamma or negative_gamma from spot vs the published gamma flip; unknown when the flip is withheld
exposure.interpretationobject Plain-English read of the gamma regime, vanna and charm effects
exposure.hedging_estimateobject | null Estimated dealer hedging flow (shares + notional) for ±1% spot moves
exposure.zero_dteobject | null 0DTE contribution to total GEX (net GEX, % of total, expiration date)
exposure.top_strikesarray | null Top 5 strikes by absolute net GEX with OI breakdown
exposure.oi_weighted_dtenumber OI-weighted average days to expiry across all active options
macro.vix_term_structureobject VIX9D, VIX, VIX3M, VIX6M levels with near-term slope and contango/backwardation
macro.vix_futuresobject VIX futures basis approximated from VIX3M vs VIX spot (spread, basis %, contango/backwardation)
macro.fear_and_greedobject CNN Fear & Greed Index score (0-100) and rating
symbolstringUnderlying symbol
as_ofstringTimestamp of the data (ISO 8601, UTC)
market_openbooleantrue during US market hours
price.bidnumberPrice: bid
price.asknumberPrice: ask
price.midnumberPrice: mid
price.lastnumberPrice: last
price.last_updatestringPrice: last update
volatilityobjectVolatility
volatility.skew_25d.expirystringExpiration date (yyyy-MM-dd)
volatility.skew_25d.days_to_expirynumberCalendar days to expiration
volatility.skew_25d.put_25d_ivnumberSkew 25d: put 25d IV
volatility.skew_25d.call_25d_ivnumberSkew 25d: call 25d IV
volatility.skew_25d.smile_rationumberSkew 25d: smile ratio
volatility.skew_25d.atm_ivnumberIV of the contract closest to spot in the same expiry (%)
volatility.skew_25d.skew_25dnumber25-delta put IV minus 25-delta call IV (vol points)
volatility.iv_term_structure[].expirystringExpiration date (yyyy-MM-dd)
volatility.iv_term_structure[].ivnumberImplied volatility
volatility.iv_term_structure[].days_to_expirynumberCalendar days to expiration
options_flow.total_call_oinumberOptions flow: total call OI
options_flow.total_put_oinumberOptions flow: total put OI
options_flow.total_call_volumenumberOptions flow: total call volume
options_flow.total_put_volumenumberOptions flow: total put volume
options_flow.pc_ratio_oinumberOptions flow: put/call ratio OI
options_flow.pc_ratio_volumenumber | nullOptions flow: put/call ratio volume
options_flow.active_expirationsnumberOptions flow: active expirations
exposureobjectExposure
macroobjectMacro
exposure.hedging_estimate.spot_down_1pct.dealer_contractsnumber | nullSpot down 1pct: dealer contracts
exposure.hedging_estimate.spot_up_1pct.dealer_contractsnumber | nullSpot up 1pct: dealer contracts
endpoint_version, data_as_ofstring, objectResponse envelope, see Response envelope.

Fields of exposure

Field Type Description
exposure.net_gexnumber | nullNet gamma exposure (USD per 1% spot move)
exposure.net_dexnumber | nullNet delta exposure (USD delta notional). Basic+
exposure.net_vexnumber | nullNet vanna exposure (USD of delta per 1.00 change in IV, that is per 100 vol points). Basic+
exposure.net_chexnumber | nullNet charm exposure (shares of delta per day, not USD). Basic+
exposure.gamma_flip_statusstringavailable 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.gammastringInterpretation: gamma
exposure.interpretation.vannastring | nullInterpretation: vanna. Basic+
exposure.interpretation.charmstring | nullInterpretation: charm. Basic+
exposure.hedging_estimate.spot_down_1pctobjectHedging estimate: spot down 1pct
exposure.hedging_estimate.spot_down_1pct.dealer_sharesnumberSpot down 1pct: dealer shares
exposure.hedging_estimate.spot_down_1pct.directionstringSpot down 1pct: direction
exposure.hedging_estimate.spot_down_1pct.notional_usdnumberSpot down 1pct: notional (USD)
exposure.hedging_estimate.spot_up_1pctobjectHedging estimate: spot up 1pct
exposure.hedging_estimate.spot_up_1pct.dealer_sharesnumberSpot up 1pct: dealer shares
exposure.hedging_estimate.spot_up_1pct.directionstringSpot up 1pct: direction
exposure.hedging_estimate.spot_up_1pct.notional_usdnumberSpot up 1pct: notional (USD)
exposure.zero_dte.net_gexnumberNet gamma exposure (USD per 1% spot move)
exposure.zero_dte.pct_of_totalnumber0DTE: (%) of total
exposure.zero_dte.expirationstringExpiration date (yyyy-MM-dd)
exposure.top_strikes[].strikenumberStrike price
exposure.top_strikes[].net_gexnumberNet gamma exposure (USD per 1% spot move)
exposure.top_strikes[].call_oinumberCall open interest
exposure.top_strikes[].put_oinumberPut open interest
exposure.top_strikes[].total_oinumberTop strikes: total OI

Fields of macro

Field Type Description
macro.vixobjectVIX value with daily change and change %
macro.vix.valuenumberVIX: value
macro.vix.changenumberVIX: change
macro.vix.change_pctnumberVIX: change (%)
macro.vix.as_ofstringTimestamp of the data (ISO 8601, UTC)
macro.vvixobjectVVIX value with daily change and change %
macro.vvix.valuenumberVvix: value
macro.vvix.changenumberVvix: change
macro.vvix.change_pctnumberVvix: change (%)
macro.vvix.as_ofstringTimestamp of the data (ISO 8601, UTC)
macro.skewobjectSKEW value with daily change and change %
macro.skew.valuenumberSkew: value
macro.skew.changenumberSkew: change
macro.skew.change_pctnumberSkew: change (%)
macro.skew.as_ofstringTimestamp of the data (ISO 8601, UTC)
macro.spxobjectSPX value with daily change and change %
macro.spx.valuenumberSPX: value
macro.spx.changenumberSPX: change
macro.spx.change_pctnumberSPX: change (%)
macro.spx.as_ofstringTimestamp of the data (ISO 8601, UTC)
macro.moveobjectMOVE value with daily change and change %
macro.move.valuenumberMove: value
macro.move.changenumberMove: change
macro.move.change_pctnumberMove: change (%)
macro.move.as_ofstringTimestamp of the data (ISO 8601, UTC)
macro.vix_term_structure.levelsobjectVIX term structure: levels
macro.vix_term_structure.levels.vix9dnumberLevels: vix9d
macro.vix_term_structure.levels.vixnumberLevels: VIX
macro.vix_term_structure.levels.vix3mnumberLevels: vix3m
macro.vix_term_structure.levels.vix6mnumberLevels: vix6m
macro.vix_term_structure.near_slope_pctnumberVIX term structure: near slope (%)
macro.vix_term_structure.structurestringVIX term structure: structure
macro.vix_futures.front_monthnumberVIX futures: front month
macro.vix_futures.spotnumberVIX futures: spot
macro.vix_futures.spreadnumberVIX futures: spread
macro.vix_futures.basis_pctnumberVIX futures: basis (%)
macro.vix_futures.basisstringVIX futures: basis
macro.fear_and_greed.scorenumberFear and greed: score
macro.fear_and_greed.ratingstringFear and greed: rating

Notes

  • Macro fields (vix, vvix, ...) may be null if the external data source is unavailable.
  • exposure is null if no options/greeks data is loaded for the symbol.
  • HV is the annualized standard deviation of daily log returns (√252).
  • atm_iv, skew_25d and iv_term_structure come from listed contract implied volatilities, not an SVI fit; vix_futures.basis is approximated from VIX3M vs VIX spot, not actual futures prices.

Errors

Status Error When
404symbol_not_foundNo data for the symbol (unknown symbol, or no live data). Outside US market hours the message also says the market is closed.
404no_cached_dataDelayed 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.
429Quota exceededDaily 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.regime and gamma_flip across a watchlist each morning
  • Size premium-selling trades - read volatility.vrp and skew_25d before 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 reading

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 exposure block
  • Volatility Analysis - deeper realized vol, skew and term structure analytics

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