Exposure Sheet API - Per-Strike GEX/DEX/VEX/CHEX in One Call - FlashAlpha Lab API
Lab API Exposure Sheet

Exposure Sheet API

A unified per-strike rowset joining GEX, DEX, VEX, CHEX and DAG in one response, plus chain totals, the Line-in-the-Sand inflection strike, all gamma peaks, and OPEX / triple-witching flags when an expiration filter is supplied.

Endpoint

GET /v1/exposure/sheet/{symbol}
Auth required (X-Api-Key) Rate Limited: Yes Growth plan+

Parameters

Name In Required Default Description
symbol path yes - Underlying symbol
expiration query no all Single-expiry filter (yyyy-MM-dd). Triggers is_opex / is_triple_witching flags.
min_oi query no 0 Drops strikes whose call_oi + put_oi < min_oi.
curl -H "X-Api-Key: YOUR_API_KEY" \
  "https://lab.flashalpha.com/v1/exposure/sheet/SPY?expiration=2026-06-18"
import requests

resp = requests.get(
    "https://lab.flashalpha.com/v1/exposure/sheet/SPY",
    headers={"X-Api-Key": "YOUR_API_KEY"},
    params={"expiration": "2026-06-18"}
)
data = resp.json()
print(f"Net GEX: {data['totals']['net_gex']:,}")
const resp = await fetch(
  "https://lab.flashalpha.com/v1/exposure/sheet/SPY?expiration=2026-06-18",
  { headers: { "X-Api-Key": "YOUR_API_KEY" } }
);
const data = await resp.json();
console.log("Net GEX: " + data.totals.net_gex.toLocaleString());

Response

{
  "symbol": "SPY",
  "underlying_price": 597.50,
  "as_of": "2026-05-29T15:30:00Z",
  "expiration": "2026-06-18",
  "is_opex": true,
  "is_triple_witching": true,
  "totals": {
    "net_gex": 2850000000,
    "net_dex": -450000000,
    "net_vex": 1200000000,
    "net_chex": 850000000,
    "net_dag": 1425000000
  },
  "lis": { "strike": 595.0, "magnitude": 1.0 },
  "peaks": [
    { "strike": 600, "net_gex": 850000000, "strength": 1.00, "side": "call_wall" },
    { "strike": 590, "net_gex": -420000000, "strength": 0.49, "side": "put_wall" }
  ],
  "strikes": [
    {
      "strike": 595,
      "call_gex": 145000000, "put_gex": -89000000, "net_gex": 56000000,
      "call_dex": 9800000, "put_dex": -7200000, "net_dex": 2600000,
      "call_vex": 320000, "put_vex": -180000, "net_vex": 140000,
      "call_chex": 4500, "put_chex": -2200, "net_chex": 2300,
      "dag": 18900000,
      "call_oi": 15820, "put_oi": 12340
    }
  ]
}

Key Response Fields

Section / Field Description
is_opexTrue when expiration is the holiday-adjusted monthly OPEX (3rd Friday, shifted to Thursday when Friday is a US equity holiday, e.g. Juneteenth).
is_triple_witchingTrue when is_opex AND month is in {Mar, Jun, Sep, Dec}.
totals.net_dagSum over strikes of DAG = |delta| × gamma × OI × 100 × spot² × 0.01, sign-flipped for puts per dealer-short convention.
lisStrike with the largest |d²(net_gex)/dK²| using a non-uniform-spaced central second difference. null when the chain has <3 strikes or every second-difference is zero. magnitude is currently always 1.0 (reserved for future relative-magnitude scoring; the strike itself is the load-bearing output today).
peaks[]Local maxima of |net_gex| whose strength ≥ 0.1 (fraction of max |net_gex| in the chain). side: call_wall when net_gex ≥ 0, otherwise put_wall.
strikes[].dagPer-strike DAG aggregated across calls + puts at that strike.
strikes[] greek triplescall_*, put_*, and net_* for gex / dex / vex / chex use the same formulas as /v1/exposure/{gex,dex,vex,chex}.

Errors

Status Description
400Invalid expiration format (must be yyyy-MM-dd)
403Requires Growth plan or higher
404Symbol not found or no data

About

The exposure sheet collapses what would otherwise be four or five separate full-chain exposure calls into a single per-strike rowset, joining GEX, DEX, VEX, CHEX and delta-adjusted gamma (DAG) side by side. Each strike carries call, put and net values for every greek, so you can render a complete dealer-positioning table without stitching responses together.

Alongside the strike rows it returns chain totals, the Line-in-the-Sand inflection strike (the largest curvature point in net GEX), and every qualifying gamma peak rather than just the single dominant wall. When an expiration filter is supplied it also flags OPEX and triple-witching dates using the holiday-adjusted calendar. All aggregates are derived from settled OI; use /v1/flow/* for the simulator-aware live versions.

Common Use Cases

  • Render a unified positioning sheet - pull GEX, DEX, VEX, and CHEX per strike in one request instead of four separate calls, and key a dealer-positioning table off the combined rows
  • Anchor on the Line-in-the-Sand strike - the inflection strike (largest curvature in net GEX) marks where the volatility regime flips; fade above, respect momentum below
  • Plot every gamma peak - the full peak array surfaces all call and put walls as support/resistance, not just the single dominant wall
  • Cross-check greeks per strike - read GEX magnitude against same-strike DEX and CHEX to separate true pin risk from directional or decay-driven flow
  • Isolate event expiries - supply an expiration filter to surface the OPEX and triple-witching flags and size around concentrated event positioning
  • Use settled-OI aggregates as the baseline - the chain totals derive from settled OI; diff them against /v1/flow/* live versions to gauge intraday repositioning

Related reading

Complementary endpoints

Ready to build?

Get your free API key and start pulling live options data in 30 seconds.