- Live API Reference
- Flow Analytics
- Flow Levels
Flow Levels API
Live, intraday-adjusted versions of the key technical levels: gamma flip, call wall, put wall, and max pain - 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 re-signs the gamma flip and walls by the session dealer-inventory change inferred from the classified tape, Lee-Ready style; live_max_pain stays OI-based. Requires Alpha+. 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/levels/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/levels/SPY"import requests
resp = requests.get(
"https://lab.flashalpha.com/v1/flow/levels/SPY",
headers={"X-Api-Key": "YOUR_API_KEY"}
)
resp.raise_for_status()
data = resp.json()
print(f"Live gamma flip: {data['live_gamma_flip']}")
print(f"Live call wall: {data['live_call_wall']}")
print(f"Live put wall: {data['live_put_wall']}")const resp = await fetch(
"https://lab.flashalpha.com/v1/flow/levels/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 gamma flip: ${data.live_gamma_flip}`);
console.log(`Live call wall: ${data.live_call_wall}`);
console.log(`Live put wall: ${data.live_put_wall}`);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:45.6227323Z",
"underlying_price": 760.35,
"expiry": null,
"live_gamma_flip": 770.0162,
"gamma_flip_status": "available",
"live_call_wall": 800,
"live_put_wall": 760,
"live_max_pain": 765,
"endpoint_version": "2026.09.30",
"data_as_of": {
"node": "fa5",
"equity_feed": "2026-10-30T13:45:45.819Z",
"equity_options_feed": "2026-10-30T13:45:45Z",
"index_feed": "2026-10-30T13:45:44.115Z",
"index_options_feed": "2026-10-30T13:45:44Z",
"futures_feed": "2026-10-30T13:45:45.387Z",
"futures_options_feed": "2026-10-30T13:45:27.486Z",
"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.
Response Fields
| Field | Type | Description |
|---|---|---|
symbol | string | Underlying symbol |
as_of | string | ISO 8601 timestamp |
underlying_price | number | Current price of underlying |
live_gamma_flip | number | Strike where live net GEX crosses zero (the gamma flip point) |
live_call_wall | number | Strike with highest live call GEX - the call wall (resistance) |
live_put_wall | number | Strike with highest live put GEX - the put wall (support) |
live_max_pain | number | Max pain strike using effective OI |
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. |
endpoint_version, data_as_of | string, object | Response envelope, see Response envelope. |
Any field may be null if the underlying profile cannot resolve it (e.g., no gamma flip exists in the strike range).
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. |
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 Levels
Flow Levels returns the live versions of the four key technical levels traders anchor to: gamma flip, call wall, put wall, and max pain. The settled versions in /v1/exposure/levels are computed on the morning OPRA-broadcast OI and stay fixed all session. This endpoint runs the same level-detection logic on the OI simulator's effective OI, so when a wall starts losing OI or a new strike accumulates positioning, the levels move with it. Same definitions, intraday-adjusted inputs.
Common Use Cases
- Trade against live walls, not stale ones - read
live_call_wallas intraday resistance andlive_put_wallas support, and re-anchor entries/targets as they migrate off the morning levels - Flip regime on
live_gamma_flip- fade extensions and trade mean-reversion above it; respect momentum and trend below it, switching bias the moment spot crosses the live flip - Alert when the flip crosses spot - diff
live_gamma_flipagainstunderlying_priceand fire when the sign flips, catching the dampening-to-amplifying handoff in real time - Set EOD targets on
live_max_pain- treat the live max pain strike as the close-of-day magnet and plan exits toward it as expiry approaches - Confirm setups before sizing up - validate a long against a nearby
live_put_wallor a short againstlive_call_wallso you only press trades the dealer book supports - Surface a "levels are shifting" signal - diff each live field against the settled
/v1/exposure/levelsvalues and flag the largest deltas as early evidence of intraday repositioning - Handle null levels gracefully - any field can be
nullwhen the profile can't resolve it (e.g. no flip in range), so gate dependent logic instead of assuming a number
Related
Related reading
- Intraday gamma-flip tracker: live flow levels - build a session-long tracker on these exact fields
- Live GEX vs settled GEX explained - why effective-OI levels move while the morning ones stay frozen
Complementary endpoints
- Key Levels - the settled morning baseline to diff these live levels against
- Live Flow GEX - the per-strike profile these walls and the flip are derived from
- Flow Pin Risk - scores how strongly price is being pulled toward the live max-pain magnet
- Live Flow DEX - directional dealer positioning to pair with the gamma walls
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