- Live API Reference
- Flow Analytics
- Flow GEX
Flow GEX API
Live gamma exposure: net total, sign label, gamma flip, and per-strike profile recomputed on effective OI.
Endpoint
X-Api-Key)
Rate Limited: Yes
Plan: Growth+
Parameters
| Name | In | Type | Required | Default | Description |
|---|---|---|---|---|---|
symbol |
path | string | required | - | Underlying symbol |
expiry |
query | date | all expiries | Filter chain to a single expiry (yyyy-MM-dd). Omit to aggregate across all expiries. Invalid values return 400 invalid_expiry. |
|
polarity |
query | enum | convention |
convention (default, calls +, puts -, unchanged) or flow. flow signs each strike's gamma by the session dealer-inventory change inferred from quote-rule NBBO aggressor classification, Lee-Ready style (dealer_pos = sells − buys), so net_gex > 0 = dealers net long gamma. Requires Alpha+. Adds per-strike call_net_customer/put_net_customer and call_dealer_pos/put_dealer_pos. Bad value returns 400 invalid_polarity. See flow-signed GEX. |
ES=F or NQ=F and URL-encode the = as %3D - e.g. /v1/flow/gex/ES%3DF. Flow analytics recompute on intraday effective OI; options-on-futures are priced with Black-76 ($50/pt ES, $20/pt NQ). CME futures and flow are Growth plan. See the futures hub.
Request
curl -H "X-Api-Key: YOUR_API_KEY" \
"https://lab.flashalpha.com/v1/flow/gex/SPY"import requests
resp = requests.get(
"https://lab.flashalpha.com/v1/flow/gex/SPY",
headers={"X-Api-Key": "YOUR_API_KEY"}
)
resp.raise_for_status()
data = resp.json()
print(f"Live net GEX: ${data['live_net_gex']:,.0f} ({data['live_net_gex_label']})")
print(f"Live gamma flip: {data['live_gamma_flip']}")const resp = await fetch(
"https://lab.flashalpha.com/v1/flow/gex/SPY",
{ headers: { "X-Api-Key": "YOUR_API_KEY" } }
);
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
const data = await resp.json();
console.log(`Live net GEX: $${data.live_net_gex.toLocaleString()} (${data.live_net_gex_label})`);
console.log(`Live gamma flip: ${data.live_gamma_flip}`);Try it live
Runs on live market data and uses 1 request from your daily quota.
Response
{
"symbol": "SPY",
"as_of": "2026-10-30T13:45:47.2083178Z",
"underlying_price": 760.35,
"expiry": null,
"live_net_gex": -15446059518,
"live_net_gex_label": "negative",
"live_gamma_flip": 769.9331,
"gamma_flip_status": "available",
"strikes": [
{
"strike": 50,
"call_gex": 450.3069,
"put_gex": -7203.52,
"net_gex": -6753.21,
"call_oi": 67,
"put_oi": 69735,
"call_volume": 0,
"put_volume": 0,
"call_oi_change": null,
"put_oi_change": null
},
{
"strike": 55,
"call_gex": 18.4497,
"put_gex": -152.0019,
"net_gex": -133.5522,
"call_oi": 2,
"put_oi": 8040,
"call_volume": 0,
"put_volume": 0,
"call_oi_change": null,
"put_oi_change": null
}
],
"endpoint_version": "2026.09.30",
"data_as_of": {
"node": "fa4",
"equity_feed": "2026-10-30T13:45:47.251Z",
"equity_options_feed": "2026-10-30T13:45:45Z",
"index_feed": "2026-10-30T13:45:46.086Z",
"index_options_feed": "2026-10-30T13:45:45Z",
"futures_feed": "2026-10-30T13:45:42.97Z",
"futures_options_feed": "2026-10-30T13:45:43.095Z",
"flow_feed": "2026-10-30T13:45: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.
Responses can exceed 100 KB; narrow with expiry.
Response Fields
| Field | Type | Description |
|---|---|---|
symbol | string | Underlying symbol |
as_of | string | ISO 8601 timestamp |
underlying_price | number | Current price of underlying |
live_net_gex | number | Sum of net_gex across strikes, computed on effective OI |
live_net_gex_label | string | positive or negative |
live_gamma_flip | number | Strike where the cumulative live profile crosses zero |
strikes | array | Per-strike GEX, OI, and volume on effective OI |
strikes[].call_oi_change / put_oi_change | number | Day-over-day delta from prior settled snapshot (nullable) |
expiry | string | null | The expiry filter from the request, null when it was omitted |
gamma_flip_status | string | available when gamma_flip is a certified level; any other value means the level is unverified or missing. See GEX. |
strikes[].strike | number | Strike price |
strikes[].call_gex | number | Call gamma exposure (USD) |
strikes[].put_gex | number | Put gamma exposure (USD) |
strikes[].net_gex | number | Net gamma exposure (USD) |
strikes[].call_oi | number | Call open interest |
strikes[].put_oi | number | Put open interest |
strikes[].call_volume | number | Call volume |
strikes[].put_volume | number | Put volume |
endpoint_version, data_as_of | string, object | Response envelope, see Response envelope. |
Errors
| Status | Error | When |
|---|---|---|
400 | invalid_expiry | expiry is not a valid yyyy-MM-dd date. |
400 | invalid_polarity | polarity is not convention or flow. |
401 | - | Missing or invalid X-Api-Key. The body is empty; check the status code before parsing JSON. |
403 | tier_restricted | polarity=flow on a plan below Alpha. |
403 | tier_restricted | Your plan is below Growth. The body includes current_plan and required_plan. |
404 | no_data | No data for the symbol, or for the requested expiry. |
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. |
About Flow GEX
Flow GEX is the live counterpart to /v1/exposure/gex. The settled endpoint uses morning OPRA-broadcast OI and stays frozen all session; this endpoint runs the exact same gamma-exposure math on the OI simulator's effective open interest, so the per-strike profile, net total, and gamma flip all drift intraday as positioning fills, exits, and rolls. Use it when you need a dealer-gamma snapshot that actually reflects mid-session reality.
Flow Polarity: Dealer-Position Signing
By default GEX is convention-signed (calls positive, puts negative), which describes the market's structural gamma but never says which side dealers are actually on. Add ?polarity=flow to sign each strike's gamma by the session dealer-inventory change inferred from quote-rule NBBO aggressor classification, Lee-Ready style (dealer_pos = sells − buys), so net_gex > 0 means the session left dealers longer gamma (pinning, volatility suppression) and net_gex < 0 means shorter gamma (volatility amplification). It accumulates from zero at the 09:30 ET open, so it is a change since the open rather than an absolute dealer book: read against the convention view, agreement means today's tape is reinforcing the structural regime and disagreement means it is pushing against it. Convention mode is Growth+; polarity=flow requires Alpha+. Omit the parameter and the response is unchanged.
curl -H "X-Api-Key: YOUR_API_KEY" \
"https://lab.flashalpha.com/v1/flow/gex/SPY?polarity=flow"import requests
resp = requests.get(
"https://lab.flashalpha.com/v1/flow/gex/SPY",
headers={"X-Api-Key": "YOUR_API_KEY"},
params={"polarity": "flow"}
)
resp.raise_for_status()
data = resp.json()
print(f"Flow-signed net GEX: ${data['live_net_gex']:,.0f} ({data['live_net_gex_label']})")const resp = await fetch(
"https://lab.flashalpha.com/v1/flow/gex/SPY?polarity=flow",
{ headers: { "X-Api-Key": "YOUR_API_KEY" } }
);
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
const data = await resp.json();
console.log(`Flow-signed net GEX: $${data.live_net_gex.toLocaleString()} (${data.live_net_gex_label})`);In flow mode the response adds a top-level "polarity": "flow" plus the per-strike call_net_customer/put_net_customer (customer buys minus sells) and call_dealer_pos/put_dealer_pos (dealer inventory, -net_customer) diagnostics. Strikes with no classified trades contribute 0. It uses no open interest, no opening-fraction constant, and no decay heuristics, and it works historically via ?at=. Full explainer: flow-signed GEX: are dealers actually long or short gamma?
Common Use Cases
- Gate strategy on
live_net_gex_label- switch to mean-reversion playbooks when it readspositiveand trend/breakout playbooks when it flipsnegative, all on live effective OI rather than the morning snapshot - Alert when
live_gamma_flipcrosses spot - diff the live flip strike againstunderlying_priceand fire the moment dealers shift from dampening to amplifying moves - Render a live GEX-by-strike heatmap - plot
strikes[].net_gexacross the chain to expose the walls and pockets that act as intraday support/resistance - Size hedging pressure from
live_net_gex- a larger absolute net GEX implies tighter dealer hedging and smaller realized ranges, so calibrate stops and targets to the magnitude - Spot repositioning via
call_oi_change/put_oi_change- per-strike day-over-day OI deltas reveal where new gamma is being built or unwound since the settled snapshot - Diff against settled GEX - contrast per-strike call/put GEX with
/v1/exposure/gexto quantify how far intraday flow has moved the dealer book
Related
Related reading
- Flow vs exposure endpoints: which GEX API to use - when to reach for live flow GEX vs the settled exposure endpoint
- Effective open interest: live GEX from flow - how the OI simulator produces the effective OI this endpoint runs on
Complementary endpoints
- Gamma Exposure (GEX) - the settled morning baseline to diff this live profile against
- Live Flow Levels - the flip and walls distilled out of this same live profile
- Flow Summary - a one-call digest of live positioning across the flow endpoints
- Live Flow DEX - directional dealer positioning to pair with live gamma
Unlock DEX, VEX and CHEX with Basic
Everything in Free, plus:
- DEX, VEX and CHEX exposure
- Full max pain
- ETF & index symbols SPY, QQQ, SPX, VIX
Go full-chain with Growth
Everything in Basic, plus:
- Full-chain GEX Every expiration
- 0DTE analytics
- Exposure summary & AI narrative
- CME futures & live screener
Add history and vol surfaces with Alpha
Everything in Growth, plus:
- Historical API replay Since 2017
- SVI vol surfaces
- VRP analytics
- Greeks surfaces Vanna, charm, volga and speed grids