Flow GEX API - Live Gamma Exposure Per Strike | FlashAlpha
  1. Flow GEX

Flow GEX API

Live gamma exposure: net total, sign label, gamma flip, and per-strike profile recomputed on effective OI.

Endpoint

GET /v1/flow/gex/{symbol}
Auth required (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.
Works with CME futures. Pass 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.

GET

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
symbolstringUnderlying symbol
as_ofstringISO 8601 timestamp
underlying_pricenumberCurrent price of underlying
live_net_gexnumberSum of net_gex across strikes, computed on effective OI
live_net_gex_labelstringpositive or negative
live_gamma_flipnumberStrike where the cumulative live profile crosses zero
strikesarrayPer-strike GEX, OI, and volume on effective OI
strikes[].call_oi_change / put_oi_changenumberDay-over-day delta from prior settled snapshot (nullable)
expirystring | nullThe expiry filter from the request, null when it was omitted
gamma_flip_statusstringavailable when gamma_flip is a certified level; any other value means the level is unverified or missing. See GEX.
strikes[].strikenumberStrike price
strikes[].call_gexnumberCall gamma exposure (USD)
strikes[].put_gexnumberPut gamma exposure (USD)
strikes[].net_gexnumberNet gamma exposure (USD)
strikes[].call_oinumberCall open interest
strikes[].put_oinumberPut open interest
strikes[].call_volumenumberCall volume
strikes[].put_volumenumberPut volume
endpoint_version, data_as_ofstring, objectResponse envelope, see Response envelope.

Errors

Status Error When
400invalid_expiryexpiry is not a valid yyyy-MM-dd date.
400invalid_polaritypolarity is not convention or flow.
401-Missing or invalid X-Api-Key. The body is empty; check the status code before parsing JSON.
403tier_restrictedpolarity=flow on a plan below Alpha.
403tier_restrictedYour plan is below Growth. The body includes current_plan and required_plan.
404no_dataNo data for the symbol, or for the requested expiry.
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.

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 reads positive and trend/breakout playbooks when it flips negative, all on live effective OI rather than the morning snapshot
  • Alert when live_gamma_flip crosses spot - diff the live flip strike against underlying_price and fire the moment dealers shift from dampening to amplifying moves
  • Render a live GEX-by-strike heatmap - plot strikes[].net_gex across 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/gex to quantify how far intraday flow has moved the dealer book

Related reading

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

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