DEV Community

Cover image for The Live 0DTE Flow API: Hedge-Flow, Heatmaps and Trade Setups
tomasz dobrowolski
tomasz dobrowolski

Posted on • Originally published at flashalpha.com

The Live 0DTE Flow API: Hedge-Flow, Heatmaps and Trade Setups

If you're searching for a 0DTE options flow API, a same-day dealer-hedging feed, an intraday gamma heatmap you can pull from code, or a SpotGamma HIRO / Skylit Heatseeker alternative with a real REST surface, this is the reference. Everything lives under one base path — GET /v1/flow/zero-dte/ on https://lab.flashalpha.com — behind a single X-Api-Key header.

Read this first. The flow family is built on a model. Dealer hedge-flow, the live GEX shift, and the setup/probability layers are estimates derived from effective open interest and aggressor-classified trades — not a window into any dealer's actual book. The JSON below uses placeholder numbers. Read the signs, trends, and probabilities as a relative, decision-grade read, not exact order flow.

Why a live 0DTE flow family exists

Classic same-day analytics are computed from settled open interest — the prior session's end-of-day OPRA book. For a contract expiring in two weeks that's fine; one day of flow barely moves the aggregate. For a contract expiring today it's the wrong input. 0DTE traders open and close all day, and that flow concentrates OI and gamma at strikes that didn't look special at 9:30. A settled-OI snapshot is anchored to yesterday's book and tends to go stale by ~10:30 ET — right when the session gets interesting.

The fix is a simulation-aware effective open interest: settled OPRA OI plus an intraday simulator delta (model confidence 0.43). The /v1/flow/* family is computed independently of the settled /v1/exposure/* family, so it shows the regime, the pin, and the dealer hedge shift moving before the next settled print exists.

The family at a glance

Six endpoints, one base path. The first three are decision-ready signals on Growth; the last three are model-input granularity on Alpha.

Endpoint What it answers Plan
snapshot/{symbol} Live 0DTE regime, favored setup, pin & range odds Growth+
series/{symbol} How that regime moved through the session Growth+
hedge-flow/{symbol} Are dealers buying or selling to stay hedged, bar by bar? Growth+
heatmap/{symbol} Where is gamma/delta/flow concentrating, strike by strike, over time? Alpha+
strike-flow/{symbol} Which strikes see signed aggressor delta-dollars right now? Alpha+
leaderboard Which symbols have the hottest 0DTE flow across the market? Alpha+

Supported symbols: any name with a same-day expiry — the daily majors SPY, SPX, QQQ, IWM, plus weekly Mon/Wed/Fri OPEX names on their expiry days. Outside a 0DTE session every endpoint degrades gracefully, so your poller never special-cases the weekend.

1. Snapshot — the decision layer

GET /v1/flow/zero-dte/snapshot/{symbol} (Growth+) is the one most traders start and end with. It recomputes the full regime on effective OI and adds four decision-grade blocks on top of the raw body: flow_direction, headline, setup, probabilities. Pass ?expiry=YYYY-MM-DD to point at a 1DTE/2DTE expiry.

{
  "symbol": "SPY", "underlying_price": 600.42, "market_open": true,
  "flow_direction": {
    "label": "amplifying", "live_net_gex": 1.42e9, "flow_gex_pct_shift": 0.753,
    "description": "Today's flow reinforced dealers' long-gamma position — the pin toward 600 is strengthening."
  },
  "headline": {
    "narrative": "Pinning toward 600.00 (positive_gamma). Pin score 71/100. 64% pin prob.",
    "trade_angle": "pin_trade", "severity": "watch",
    "promoted": { "magnet": 600.00, "pin_score": 71, "pin_probability_pct": 0.64, "regime": "positive_gamma" }
  },
  "setup": {
    "primary": {
      "display_name": "Iron Fly", "confidence": "high",
      "conditions_met": ["spot within 0.3% of magnet", "regime = positive_gamma", "pin_score > 65"],
      "strikes_hint": { "short_call_strike": 601, "short_put_strike": 600, "long_call_strike": 603, "long_put_strike": 598 }
    },
    "anti_setups": [{ "display_name": "Long Premium / Lotto", "thesis": "Avoid — positive gamma + tight walls = unlikely >1σ move into close" }]
  },
  "probabilities": {
    "pin": { "value": 0.64, "calibration_method": "heuristic_v1" },
    "range_1sigma": { "value": 0.6827, "low": 598.38, "high": 602.46 }
  }
}
Enter fullscreen mode Exit fullscreen mode

Read each block:

  • flow_direction — has today's flow reinforced or weakened the dealer regime vs settled? amplifying / dampening / neutral / no_flow / regime_flip (the one to watch — net GEX changed sign).
  • headline — the one-line dashboard pill. trade_angle is pin / range / breakout / low-signal; severity escalates info → watch → alert.
  • setup — a rules-engine read of the textbook 0DTE plays the state supports: primary + alternatives + explicit anti_setups. Every verdict ships its conditions_met / conditions_failed so you can audit it.
  • probabilities — calibrated odds, not raw scores. pin.value is the probability price closes near the magnet; range_1σ/2σ are the odds of closing in band. Each tags its calibration_method.

Outside a session the rich body is replaced by a small degraded envelope (body: null, session_closed: true), so always guard before reading body.

from flashalpha import FlashAlpha
fa = FlashAlpha("YOUR_KEY")
snap = fa.flow_zero_dte_snapshot("SPY")

if snap.get("body") is None:
    print(snap.get("message", "no 0DTE session"))
else:
    h, s = snap["headline"], snap["setup"]["primary"]
    print(h["narrative"])
    print(f"  setup={s['display_name']} ({s['confidence']})  angle={h['trade_angle']}")
    print(f"  pin prob={snap['probabilities']['pin']['value']:.0%}  flow={snap['flow_direction']['label']}")
Enter fullscreen mode Exit fullscreen mode

2. Series — chart the session

GET .../series/{symbol}?bar=30s|1m|5m|15m&minutes=1-390 (Growth+) returns the same regime metrics as a time series, one row per bar: spot, net GEX/DEX, gamma flip, walls, magnet, pin score & probability, regime, ATM IV, charm-dollars-per-hour, and cumulative dealer hedge-flow split into calls/puts/combined. This is the endpoint behind an intraday "0DTE positioning" chart.

3. Hedge-flow — dealer pressure, bar by bar

GET .../hedge-flow/{symbol}?side=all|calls|puts (Growth+) is the signed delta-dollars dealers are inferred to be transacting each bar to stay hedged, plus a running cumulative. A run of same-signed, accelerating bars alongside a same-signed price move is the fingerprint of a gamma squeeze building. Split legs with side=calls vs side=puts to separate upside call-chasing from downside protection-driven hedging.

4–5. Heatmap & strike-flow — the per-strike picture

heatmap/{symbol} (Alpha+) is the strike-by-time value matrix — the grid SpotGamma TRACE and Skylit Heatseeker render — returned as JSON. strikes_grid is the y-axis; each bar's values is parallel by index, so you get values[bar][strike]. Pick the lens with metric (gex/dex/vex/chex/oi/signed_flow) and mode=raw (level) or mode=delta (where new positioning is landing).

strike-flow/{symbol} (Alpha+) gives the signed aggressor flow underneath: per bar, three parallel arrays — signed_delta_dollars, signed_gamma_dollars, contracts — against the same strikes_grid. This is the model input the hedge-flow and heatmap layers aggregate from.

6. Leaderboard — the hottest names

GET .../leaderboard?metric=heat|pin_risk|abs_flow|charm_intensity&n=1-100 (Alpha+) ranks the whole 0DTE landscape by one metric, so you scan the market for names worth a snapshot call. heat = hedge-flow normalized by net GEX (the "something's happening here" sort).

One session, end to end

  1. Open (9:30–10:00 ET)leaderboard with metric=heat to find where flow is concentrated, then snapshot the top names. headline.trade_angle says pin / range / breakout.
  2. Setup (10:00–12:00) — when setup.primary hits high confidence with no conditions_failed, strikes_hint hands you the legs. If your idea is in anti_setups, the model is telling you conditions are against it.
  3. Midday (12:00–14:30) — poll hedge-flow and flow_direction. amplifying + rising cumulative = dealers chasing, fade-the-range gets riskier. dampening supports the condor/fly thesis.
  4. Power hour (14:30–16:00)severity hits alert as a pin tightens or spot tests the flip. Tighten the poll interval; pin.value and charm_intensity are most informative in the final hour.

vs HIRO, Heatseeker, Unusual Whales

The space is dominated by dashboards. FlashAlpha ships the same class of signal as a developer-first API and adds a trader-product layer (headline / setup / probabilities) the raw feeds don't: signed dealer hedge-flow time series (HIRO's read), the strike-by-time heatmap as JSON (TRACE/Heatseeker's grid), a numeric pin score + calibrated odds, a rules-engine setup classifier, a cross-symbol leaderboard, and SDKs in Python/JS/C#/Go/Java. The data is FlashAlpha's own — not resold from any of those vendors.

Pricing

Plan Price Snapshot / Series / Hedge-Flow Heatmap / Strike-Flow / Leaderboard Rate limit
Free $0 No No 5/day
Basic from $63/mo No No 100/day
Growth from $239/mo Yes No 2,500/day
Alpha from $1,199/mo Yes Yes Unlimited

Below the required plan returns 403 tier_restricted with current and required plan names. Try any endpoint in the playground before writing code:
flashalpha.com

Top comments (0)