Zero-DTE Flow Snapshot API - Live 0DTE Dealer Positioning - FlashAlpha Lab API
Lab API Snapshot

Zero-DTE Flow Snapshot API

Current live 0DTE dealer-positioning shape for a symbol, computed on effective OI (settled + intraday simulator delta), returning the full zero-DTE exposure response plus a flow_direction block describing how flow has shifted dealer GEX across the symbol's whole chain (all expiries) since open.

Endpoint

GET /v1/flow/zero-dte/snapshot/{symbol}
Auth required (X-Api-Key) Rate Limited: Yes Growth plan+

Parameters

Name In Required Default Description
symbol path yes - Underlying symbol (e.g. SPY, SPX, QQQ, IWM)
curl -H "X-Api-Key: YOUR_API_KEY" \
  "https://lab.flashalpha.com/v1/flow/zero-dte/snapshot/SPY"
import requests

resp = requests.get(
    "https://lab.flashalpha.com/v1/flow/zero-dte/snapshot/SPY",
    headers={"X-Api-Key": "YOUR_API_KEY"}
)
data = resp.json()
print(data["flow_direction"]["label"])
const resp = await fetch(
  "https://lab.flashalpha.com/v1/flow/zero-dte/snapshot/SPY",
  { headers: { "X-Api-Key": "YOUR_API_KEY" } }
);
const data = await resp.json();
console.log(data.flow_direction.label);

Response

The response is the same JSON shape as /v1/exposure/zero-dte/{symbol} (regime, exposures, expected_move, pin_risk, hedging, decay, vol_context, flow, levels, liquidity, strikes) PLUS an extra flow_direction block. The flow_direction block is shown below.

{
  "symbol": "SPY",
  "underlying_price": 522.34,
  "as_of": "2026-05-27T15:30:12Z",
  "market_open": true,
  // ...all ZeroDteResponse fields...
  "flow_direction": {
    "label": "amplifying",           // no_flow | neutral | amplifying | dampening | regime_flip
    "settled_net_gex": -1.2e9,
    "live_net_gex": -1.45e9,
    "flow_gex_adjustment": -2.5e8,
    "flow_gex_pct_shift": 0.208,     // null when settled GEX is 0
    "contracts_with_flow": 412,
    "total_abs_delta_contracts": 18432,
    "description": "Flow has amplified dealer GEX by 20.8% since open. ..."
  }
}

Two degraded shapes also return 200 OK so clients can switch on the flags. When the symbol has no 0DTE expiry today: { "symbol": "TSLA", "no_zero_dte": true, "next_zero_dte_expiry": "2026-05-29", "message": "..." }. When the market is closed: { "symbol": "SPY", "session_closed": true, "last_session": "2026-05-23", "message": "..." }.

Key Response Fields

Field Type Description
flow_direction.labelstringOne of no_flow, neutral, amplifying, dampening, regime_flip
flow_direction.settled_net_gexnumberNet GEX of the symbol's whole chain (all expiries) on the morning settled OI
flow_direction.live_net_gexnumberNet GEX of the symbol's whole chain (all expiries) on effective (settled + intraday) OI
flow_direction.flow_gex_adjustmentnumberLive minus settled net GEX (the flow contribution, whole chain)
flow_direction.flow_gex_pct_shiftnumber/nullPercent shift in GEX from flow; null when settled GEX is 0
flow_direction.contracts_with_flowintegerNumber of contracts, across all expiries, that saw intraday flow
flow_direction.total_abs_delta_contractsintegerTotal absolute intraday delta contracts, across all expiries
flow_direction.descriptionstringHuman-readable summary of the flow shift

Scope: today's expiry vs the whole chain

The two parts of the response cover different contracts:

  • body (exposures.net_gex, regime, levels, pin_risk, ...) covers today's expiry only - the 0DTE book.
  • flow_direction covers every expiry of the requested symbol - the whole chain. For SPXW that is every SPXW expiry (dailies, weeklies, month-end); it does not include the AM-settled SPX monthlies.

So flow_direction.live_net_gex is usually much larger than body.exposures.net_gex, and the two can have opposite signs: dealers can be short gamma in today's book while the whole chain is net long, or the reverse. Use body.exposures.net_gex and body.regime.label for the 0DTE regime; use flow_direction to see how intraday flow has moved dealer gamma across the whole chain. flow_direction.label, flow_gex_adjustment and flow_gex_pct_shift are all computed on that same whole-chain base.

For a 0DTE-only flow view, use /v1/flow/gex/{symbol}?expiry=<today>; its live_net_gex matches body.exposures.net_gex.

Errors

Status Description
403tier_restricted - caller's plan is below Growth
404symbol_not_found - symbol is unknown or has no live data

About

The Zero-DTE Flow snapshot gives a live, intraday-aware view of today's 0DTE dealer-positioning landscape. It is computed on effective OI - settled open interest plus the simulator's intraday delta - so the response reflects how dealer GEX has shifted since open.

This differs from /v1/exposure/zero-dte/, which uses the morning OPRA broadcast and goes stale by 10:30 AM ET. The added flow_direction block summarizes whether intraday flow is amplifying, dampening, or flipping dealer gamma across the symbol's whole chain (all expiries, not only today's - see Scope).

Common Use Cases

  • Read the live 0DTE regime from body.exposures.net_gex and body.regime.label (today's expiry, effective OI) without the 10:30 AM staleness of the settled exposure endpoint, switching strategy on its sign
  • Check flow_direction.label to see whether intraday flow is amplifying, dampening, or producing a regime_flip of whole-chain dealer GEX, and gate trade-with versus fade decisions on it
  • Quantify the flow contribution with flow_gex_adjustment and flow_gex_pct_shift to judge how far the morning settled view has drifted
  • Lean on the embedded pin_risk block alongside the live regime to find the magnet strike price is most likely to settle into at the close
  • Confirm the move budget with the expected_move block before sizing same-day directional or premium-selling structures
  • Branch on the no_zero_dte and session_closed flags to handle off-session requests or symbols with no 0DTE expiry today

Related reading

Complementary endpoints

Ready to build with FlashAlpha?

Get your free API key and start pulling live options data in 30 seconds.

No credit card required Setup in 60 seconds Secure & reliable