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
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_opex | True 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_witching | True when is_opex AND month is in {Mar, Jun, Sep, Dec}. |
totals.net_dag | Sum over strikes of DAG = |delta| × gamma × OI × 100 × spot² × 0.01, sign-flipped for puts per dealer-short convention. |
lis | Strike 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[].dag | Per-strike DAG aggregated across calls + puts at that strike. |
strikes[] greek triples | call_*, put_*, and net_* for gex / dex / vex / chex use the same formulas as /v1/exposure/{gex,dex,vex,chex}. |
Errors
| Status | Description |
|---|---|
400 | Invalid expiration format (must be yyyy-MM-dd) |
403 | Requires Growth plan or higher |
404 | Symbol 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
expirationfilter 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
Related reading
- Exposure sheet vs separate GEX/DEX/VEX/CHEX calls - when the combined sheet beats four round-trips, and the extra fields it adds
- GEX/DEX/VEX/CHEX: an 8-year backtest vs VIX - evidence on what the combined exposure greeks predict
Complementary endpoints
- Gamma Exposure (GEX) - the standalone gamma sheet with walls and the gamma flip
- Delta Exposure (DEX) - directional dealer positioning per strike
- Vanna Exposure (VEX) - how dealer gamma shifts as implied vol moves
- Charm Exposure (CHEX) - how positioning decays as expiry approaches
Ready to build?
Get your free API key and start pulling live options data in 30 seconds.