- Live API Reference
- Flow Analytics
- Dealer Risk
Flow Dealer Risk API
Settled vs live dealer GEX and DEX joined into one response, with delta, percent shift, and a directional label.
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. |
ES=F or NQ=F and URL-encode the = as %3D - e.g. /v1/flow/dealer-risk/ES%3DF. Options-on-futures are priced with Black-76 using the CME multiplier ($50/pt ES, $20/pt NQ); CME futures are Growth plan. See the futures hub.
Request
curl -H "X-Api-Key: YOUR_API_KEY" \
"https://lab.flashalpha.com/v1/flow/dealer-risk/SPY"import requests
resp = requests.get(
"https://lab.flashalpha.com/v1/flow/dealer-risk/SPY",
headers={"X-Api-Key": "YOUR_API_KEY"}
)
resp.raise_for_status()
data = resp.json()
print(f"Direction: {data['flow_direction']}")
print(f"GEX shift: {data['flow_gex_pct_shift']:.1%}")
print(data['description'])const resp = await fetch(
"https://lab.flashalpha.com/v1/flow/dealer-risk/SPY",
{ headers: { "X-Api-Key": "YOUR_API_KEY" } }
);
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
const data = await resp.json();
console.log(`Direction: ${data.flow_direction}`);
console.log(`GEX shift: ${(data.flow_gex_pct_shift * 100).toFixed(1)}%`);
console.log(data.description);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:44.1956431Z",
"underlying_price": 760.425,
"expiry": null,
"settled_net_gex": -15604250270,
"live_net_gex": -15611924215,
"flow_gex_adjustment": -7673945,
"flow_gex_pct_shift": -0.000492,
"settled_net_dex": -30462684135,
"live_net_dex": -30692234816,
"flow_dex_adjustment": -229550680,
"flow_dex_pct_shift": -0.007535,
"total_abs_delta_contracts": 90853,
"contracts_with_flow": 1380,
"flow_direction": "neutral",
"description": "Flow has not materially shifted dealer GEX since open (-0.0% < 5% threshold).",
"endpoint_version": "2026.09.30",
"data_as_of": {
"node": "fa5",
"equity_feed": "2026-10-30T13:45:44.171Z",
"equity_options_feed": "2026-10-30T13:45:43Z",
"index_feed": "2026-10-30T13:45:43.102Z",
"index_options_feed": "2026-10-30T13:45:42Z",
"futures_feed": "2026-10-30T13:45:28.31Z",
"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 |
|---|---|---|
settled_net_gex | number | Computed on this morning's OPRA settled OI |
live_net_gex | number | Computed on simulator-effective OI |
flow_gex_adjustment / flow_dex_adjustment | number | live - settled for GEX and DEX, in USD notional |
flow_gex_pct_shift / flow_dex_pct_shift | number, nullable | adjustment / |settled|. null when the settled value is zero and the live value is non-zero (regime created with no baseline) |
total_abs_delta_contracts | number | Sum of absolute per-contract effective-OI changes |
contracts_with_flow | number | Number of contracts whose effective OI moved |
flow_direction | string | no_flow, amplifying, dampening, regime_flip, neutral (when absolute percent shift is below 5%) |
description | string | Human-readable summary of the shift |
symbol | string | Underlying symbol |
as_of | string | Timestamp of the data (ISO 8601, UTC) |
underlying_price | number | Underlying price used for the calculation |
expiry | string | null | The expiry filter from the request, null when it was omitted |
settled_net_dex | number | Computed on this morning's OPRA settled OI |
live_net_dex | number | Computed on simulator-effective OI |
endpoint_version, data_as_of | string, object | Response envelope, see Response envelope. |
Direction Labels
| Label | Meaning |
|---|---|
no_flow | Simulator reported zero per-contract movement on every contract. Distinct from neutral so consumers can tell 'no flow yet' from 'flow exists but is small' |
amplifying | Same sign as settled, magnitude grew (dealers more exposed) |
dampening | Same sign as settled, magnitude shrank (positions resolving) |
regime_flip | Net GEX changed sign, or a regime was created from a zero baseline |
neutral | Absolute percent shift below 5% |
Errors
| Status | Error | When |
|---|---|---|
400 | invalid_expiry | expiry is not a valid yyyy-MM-dd date. |
401 | - | Missing or invalid X-Api-Key. The body is empty; check the status code before parsing JSON. |
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 Dealer Risk
Dealer Risk is the join between settled and live: /v1/exposure/summary's dealer-GEX/DEX numbers are anchored to the morning OPRA-broadcast OI, while the live values use the OI simulator's effective open interest. This endpoint returns both sides plus the deltas, percent shifts, contract-flow magnitude, and a single directional label that classifies the shift as amplifying, dampening, regime_flip, or neutral. The description field is the same shift spelled out in plain English.
Common Use Cases
- Regime-flip alerts - fire when
flow_directionbecomesregime_flip, signalling net GEX has changed sign and the volatility regime has inverted since the open - Flow-direction filter - trade with flow during
amplifying, fade or de-risk duringdampening, and stand down onneutralorno_flow - Quantify intraday repositioning - cite
total_abs_delta_contractsandcontracts_with_flowas the single magnitude and breadth numbers in a daily desk note - Detect a stale snapshot - a high
flow_gex_pct_shiftorflow_dex_pct_shifttells you the morning settled view has stopped being representative and the live numbers should drive decisions - Separate gamma from delta drift - compare
flow_gex_adjustmentagainstflow_dex_adjustmentto see whether flow is reshaping pinning pressure or directional dealer lean - Drop in a pre-built narrative - push
descriptionstraight into a dashboard tile or chat alert with no formatting work
Related
Related reading
- Flow vs exposure endpoints: which GEX API to use - when to read settled exposure versus live flow-adjusted dealer risk
- Effective open interest: live GEX from flow - the simulator methodology behind the live values
Complementary endpoints
- Flow Live Bundle - the raw real-time tape that drives the repositioning
- Flow Summary - rolled-up flow context for the same window
- Flow GEX - the live flow-adjusted gamma surface by strike
- Dealer Premium - signed premium flow that complements the Greek-risk view
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