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

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

A complete guide to the FlashAlpha live 0DTE flow API - the /v1/flow/zero-dte/* family. One snapshot endpoint with a trade-setup classifier and calibrated pin odds, plus intraday series, dealer hedge-flow, a strike-by-time heatmap, per-strike signed flow, and a cross-symbol leaderboard. A code-first, trader-first reference and a SpotGamma HIRO / Skylit Heatseeker alternative you can call from Python.

T
Tomasz Dobrowolski Quant Engineer
Jun 14, 2026
35 min read
0DTE OptionsFlow DealerHedging GammaExposure Heatmap API DeveloperGuide IntradayFlow

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

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 FlashAlpha's effective open interest and aggressor-classified trades, not a window into any dealer's actual book. The JSON in this guide uses illustrative placeholder numbers. Read the signs, the trends, and the probabilities as a relative, decision-grade read, not as exact order flow.


Why a Live 0DTE Flow Family Exists

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

FlashAlpha solves this with 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 can show the regime, the pin, and the dealer hedge shift moving before the next settled print exists. The full derivation lives in Effective Open Interest: Live GEX from Flow. The /v1/flow/zero-dte/* endpoints in this guide apply that engine specifically to today's expiry.

One call returns the live 0DTE regime, a trade-setup, and calibrated pin odds

Flow-adjusted, scoped to today's expiry, on the Growth plan. Heatmap and per-strike flow on Alpha.

Get API Access

The Family at a Glance

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

EndpointWhat it answersPlan
GET /v1/flow/zero-dte/snapshot/{symbol}What is the live 0DTE regime right now, what setup does it favor, and what are the pin and range odds?Growth+
GET /v1/flow/zero-dte/series/{symbol}How has that regime moved through the session? (charting time series)Growth+
GET /v1/flow/zero-dte/hedge-flow/{symbol}Are dealers buying or selling to stay hedged, bar by bar?Growth+
GET /v1/flow/zero-dte/heatmap/{symbol}Where is gamma / delta / flow concentrating, strike by strike, over time?Alpha+
GET /v1/flow/zero-dte/strike-flow/{symbol}Which strikes are seeing signed aggressor delta-dollars right now?Alpha+
GET /v1/flow/zero-dte/leaderboardWhich symbols have the hottest 0DTE flow across the market?Alpha+

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

1. Snapshot: the Decision Layer

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

{
  "symbol": "SPY",
  "underlying_price": 600.42,
  "as_of": "2026-06-12T18:45:12Z",
  "market_open": true,
  "flow_direction": {
    "label": "amplifying",
    "settled_net_gex": 8.10e8,
    "live_net_gex": 1.42e9,
    "flow_gex_adjustment": 6.10e8,
    "flow_gex_pct_shift": 0.753,
    "contracts_with_flow": 184213,
    "total_abs_delta_contracts": 421880,
    "description": "Today's flow has reinforced dealers' long-gamma position — the pin toward 600 is being strengthened."
  },
  "headline": {
    "narrative": "Pinning toward 600.00 (positive_gamma). Pin score 71/100. 83% pin prob.",
    "trade_angle": "pin_trade",
    "severity": "watch",
    "promoted": {
      "gamma_flip": 598.00,
      "magnet": 600.00,
      "pin_score": 71,
      "pin_probability_pct": 0.83,
      "regime": "positive_gamma",
      "distance_to_flip_sigmas": 1.3,
      "remaining_1sd_pct": 0.0034
    }
  },
  "setup": {
    "primary": {
      "name": "iron_fly",
      "display_name": "Iron Fly",
      "thesis": "Pin setup — spot 0.07% from magnet, positive gamma, walls bracket spot, pin score 71",
      "confidence": "high",
      "conditions_met": ["spot within 0.3% of magnet (0.07%)", "regime = positive_gamma", "pin_score > 65 (71)", "expected_move within wall band"],
      "conditions_failed": [],
      "strikes_hint": { "short_call_strike": 601, "short_put_strike": 600, "long_call_strike": 603, "long_put_strike": 598, "wing_width_suggestion": 2 },
      "risk_flags": []
    },
    "alternatives": [ { "name": "iron_condor", "display_name": "Iron Condor", "confidence": "medium" } ],
    "anti_setups": [ { "name": "long_premium_lotto", "display_name": "Long Premium / Lotto", "thesis": "Avoid — positive gamma + tight walls = unlikely >1σ move into close" } ],
    "evaluator_version": "v1"
  },
  "probabilities": {
    "pin": { "value": 0.83, "calibration_method": "heuristic_v1", "inputs_summary": "d=0.0007 σ=0.0034 t=1.1h regime=positive_gamma conc=44%" },
    "range_1sigma": { "value": 0.6827, "low": 598.38, "high": 602.46, "calibration_method": "normal_cdf_v1" },
    "range_2sigma": { "value": 0.9545, "low": 596.34, "high": 604.50, "calibration_method": "normal_cdf_v1" }
  }
}

Each block answers a different question:

BlockRead it as
flow_directionHas today's flow reinforced or weakened the dealer regime versus the settled book? amplifying = same-sign net GEX, magnitude grew (a stronger pin in positive gamma, more fragility in negative); dampening = magnitude shrank; neutral = a sub-5% shift; no_flow = no intraday flow yet; regime_flip = net GEX changed sign — the one to watch.
headlineThe one-line read for a dashboard pill. trade_angle is pin_trade / range_trade / breakout_risk / low_signal; severity escalates infowatchalert as a pin locks into the close or a flip cross nears.
setupA rules-engine classification of the textbook 0DTE plays the current state supports — primary plus alternatives, plus explicit anti_setups (trades to avoid right now). Every verdict ships its conditions_met / conditions_failed so you can audit the logic. Full walkthrough: the 0DTE setup classifier.
probabilitiesCalibrated odds, not raw scores. pin.value is the probability price closes near the magnet; range_1sigma / range_2sigma are the odds of closing inside ±1σ / ±2σ. Each tags its calibration_method. Full method: 0DTE pin and range probability.

Outside a 0DTE session the rich body is replaced by a small degraded envelope, so always guard for it before reading body:

{ "body": null, "symbol": "SPY", "as_of": "2026-06-14T17:32:33Z",
  "market_open": false, "session_closed": true, "last_session": "2026-06-12",
  "message": "Market closed. Last session: 2026-06-12." }

A symbol with no same-day expiry returns the same shape with no_zero_dte: true and a next_zero_dte_expiry date.

Quick Start: the Snapshot

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 = snap["headline"]
    s = snap["setup"]["primary"]
    print(h["narrative"])
    print(f"  angle={h['trade_angle']}  severity={h['severity']}")
    print(f"  setup={s['display_name']} ({s['confidence']})")
    print(f"  pin prob={snap['probabilities']['pin']['value']:.0%}")
    print(f"  flow={snap['flow_direction']['label']}")
import { FlashAlpha } from 'flashalpha';

const fa = new FlashAlpha('YOUR_KEY');
const snap = await fa.flowZeroDteSnapshot('SPY');

if (!snap.body) {
  console.log(snap.message ?? "no 0DTE session");
} else {
  console.log(snap.headline.narrative);
  console.log(`  setup=${snap.setup.primary.display_name}`);
  console.log(`  pin prob=${(snap.probabilities.pin.value * 100).toFixed(0)}%`);
  console.log(`  flow=${snap.flow_direction.label}`);
}
# Live 0DTE snapshot for SPY
curl -H "X-Api-Key: YOUR_KEY" \
  "https://lab.flashalpha.com/v1/flow/zero-dte/snapshot/SPY"

# Point at tomorrow's expiry (1DTE) instead of today
curl -H "X-Api-Key: YOUR_KEY" \
  "https://lab.flashalpha.com/v1/flow/zero-dte/snapshot/SPX?expiry=2026-06-13"
$ pip install flashalpha  |  npm install flashalpha  |  dotnet add package FlashAlpha  |  go get github.com/FlashAlpha-lab/flashalpha-go

2. Series: Chart the Session

GET /v1/flow/zero-dte/series/{symbol}?bar=30s|1m|5m|15m&minutes=1-390 (Growth+) returns the same regime metrics as a time series, one row per bar, ready to plot. Each bar carries spot, net GEX/DEX, gamma flip, the walls, the magnet, pin score and pin probability, regime, ATM IV, charm-dollars-per-hour, and the cumulative dealer hedge-flow split into calls, puts, and combined.

{
  "symbol": "SPY", "expiration": "2026-06-12", "bar_size": "5m",
  "market_open": true,
  "bars": [
    { "t": "2026-06-12T18:40:00Z", "spot": 600.42,
      "net_gex": 1.42e9, "net_dex": 3.1e6,
      "gamma_flip": 598.00, "call_wall": 603.00, "put_wall": 597.00, "magnet": 600.00,
      "pin_score": 71, "pin_probability_pct": 0.83, "regime": "positive_gamma",
      "atm_iv": 0.094, "charm_dollars_per_hour": 41250.0,
      "hedge_flow_call_cumulative": 18.4e6, "hedge_flow_put_cumulative": -9.1e6,
      "hedge_flow_cumulative_all": 9.3e6 }
  ]
}

This is the endpoint behind an intraday "0DTE positioning" chart: plot magnet and the walls as horizontal lines, pin_score as an area under price, and hedge_flow_cumulative_all on a second axis to see dealer pressure build. minutes is the lookback (1-390, the cash session length); bar downsamples by keeping the last sample in each bucket. Outside a session you get a normal 200 with an empty bars array.

3. Hedge-Flow: Dealer Pressure, Bar by Bar

GET /v1/flow/zero-dte/hedge-flow/{symbol}?side=all|calls|puts&bar=...&minutes=... (Growth+) is the dealer-action layer: the signed delta-dollars dealers are inferred to be transacting each bar to stay hedged on today's chain, plus a running cumulative since the open. A run of same-signed, accelerating bars alongside a same-signed price move is the fingerprint of a gamma squeeze building.

{ "symbol": "SPY", "expiration": "2026-06-12", "side": "all", "bar_size": "5m",
  "bars": [ { "t": "2026-06-12T18:40:00Z", "bar": 1240000, "cumulative": 9300000 } ] }

Split the legs with side=calls vs side=puts to tell upside call-chasing from downside protection-driven hedging, a story the combined total can hide. This endpoint has a full deep-dive: Detecting a Gamma Squeeze in Real Time.

4. Heatmap: Strike x Time

GET /v1/flow/zero-dte/heatmap/{symbol}?bar=1m&metric=gex&mode=raw&minutes=60 (Alpha+) is the strike-by-time value matrix — the grid that products like SpotGamma TRACE and Skylit Heatseeker render, applied to today's chain and returned as plain JSON you can pull from code. strikes_grid is the y-axis, each bar's values array is parallel by index, so you get values[bar][strike] exactly as a heatmap library wants it.

{ "symbol": "SPX", "underlying_price": 6012.4, "expiration": "2026-06-12",
  "metric": "gex", "mode": "raw", "bar_size": "1m", "tier_used": "raw",
  "strikes_grid": [5995, 6000, 6005, 6010, 6015, 6020],
  "bars": [
    { "t": "2026-06-12T18:40:00Z", "spot": 6012.4,
      "values": [-1.2e9, -4.0e8, 2.1e8, 9.5e8, 1.8e9, 3.0e8] }
  ],
  "gap_intervals": [] }

Pick the lens with metric (gex, dex, vex, chex, oi, or signed_flow) and mode=raw for the level or mode=delta for the bar-over-bar change (where new positioning is landing). The complete heatmap guide, including the HIRO / Heatseeker comparison, is here.

5. Strike-Flow: Signed Aggressor Dollars

GET /v1/flow/zero-dte/strike-flow/{symbol}?bar=1m&minutes=60 (Alpha+) gives the per-strike signed aggressor flow underneath the heatmap: for each bar, three parallel arrays of signed_delta_dollars, signed_gamma_dollars, and contracts, indexed against the same strikes_grid. A positive value marks net bullish-delta aggressor flow at that strike (call buying or put selling); a negative value marks bearish-delta flow. This is the model input the hedge-flow and heatmap layers are aggregated from — reach for it when you want to attribute a move to specific strikes.

{ "symbol": "SPX", "underlying_price": 6012.4, "expiration": "2026-06-12", "bar_size": "1m",
  "strikes_grid": [6000, 6005, 6010, 6015],
  "bars": [
    { "t": "2026-06-12T18:40:00Z", "spot": 6012.4,
      "signed_delta_dollars": [-2.1e6, 4.8e6, 9.0e6, 1.2e6],
      "signed_gamma_dollars": [3.0e5, 7.5e5, 1.1e6, 2.0e5],
      "contracts": [-180, 410, 905, 120] } ] }

6. Leaderboard: the Hottest 0DTE Names

GET /v1/flow/zero-dte/leaderboard?metric=heat|pin_risk|abs_flow|charm_intensity&n=1-100 (Alpha+) ranks the whole 0DTE landscape by a single metric, so you can scan the market for the names worth a snapshot call.

metricRanks by
heatRelative flow pressure: cumulative hedge-flow normalized by net GEX. The "something is happening here" sort.
pin_riskCurrent pin score — where is a magnet locking price in.
abs_flowRaw recent activity: absolute call + put hedge-flow in the last bars.
charm_intensityCharm-dollars-per-hour — where time decay is forcing the fastest re-hedging into the close.
{ "metric": "heat", "n": 5, "market_open": true,
  "entries": [
    { "rank": 1, "symbol": "QQQ", "value": 2.41 },
    { "rank": 2, "symbol": "SPY", "value": 1.88 },
    { "rank": 3, "symbol": "IWM", "value": 1.05 } ] }

How a 0DTE Trader Uses the Family in One Session

The endpoints are designed to be used together, not in isolation. A typical same-day workflow:

  1. Open (9:30-10:00 ET) — scan, then focus. Hit the leaderboard with metric=heat to find where today's flow is concentrated, then pull a snapshot on the top names. The headline.trade_angle tells you whether the day looks like a pin, a range, or a breakout.
  2. Setup (10:00-12:00) — let the classifier frame the trade. When a name's setup.primary reaches high confidence with no conditions_failed, the strikes_hint hands you the short and long legs. Cross-check the anti_setups — if your idea is on that list, the model is telling you the conditions are against it.
  3. Midday (12:00-14:30) — watch the flow, not just the level. Poll hedge-flow and the flow_direction block. An amplifying label with a rising cumulative means dealers are chasing — fade-the-range trades get riskier. A dampening label supports the iron condor / iron fly thesis.
  4. Power hour (14:30-16:00) — the pin locks or breaks. severity escalates to alert when a pin tightens into the close or spot tests the gamma flip. Tighten your poll interval; the probabilities.pin.value and charm_intensity are most informative in the final hour.

For the per-strike picture behind any of those decisions, drop to the heatmap and strike-flow endpoints on Alpha.

How It Compares: HIRO, Heatseeker, Unusual Whales

The live 0DTE flow space is dominated by dashboard products. FlashAlpha ships the same class of signal as a developer-first API, and adds a trader-product layer (headline / setup / probabilities) that the raw feeds do not.

CapabilityFlashAlpha 0DTE FlowSpotGamma HIRO / TRACESkylit HeatseekerUnusual Whales
Signed dealer hedge-flow time seriesYes (hedge-flow, calls/puts/all)Yes (HIRO, dashboard)Partial (heat snapshot)No (raw flow, not dealer-hedge)
Strike-by-time heatmap as JSONYes (heatmap, 6 metrics)Dashboard only (TRACE)Dashboard onlyNo
Numeric pin score + calibrated pin oddsYesNoNoNo
Rules-engine trade-setup classifierYes (iron fly / condor / wait + anti-setups)NoNoNo
Cross-symbol 0DTE leaderboardYes (leaderboard)LimitedNoPartial (flow alerts)
REST API + Python/JS/C#/Go/Java SDKsYesLimitedLimitedPartial

For the full vendor breakdown across pricing and historical replay, see Best 0DTE Options Data API in 2026.

Parameters, Tiers and Errors

Every endpoint validates its inputs and returns a clear error code. Worth knowing before you write the poller:

  • bar is one of 30s, 1m, 5m, 15m for series and hedge-flow (default 30s; an unknown value returns 400 invalid_bar). Heatmap and strike-flow accept only 1m today (anything else returns 400 bar_unavailable). Snapshot takes no bar — only ?expiry=.
  • side on hedge-flow is all (default), calls, or puts; anything else is 400 invalid_side.
  • minutes is clamped to 1-390 server-side. ?expiry= must be yyyy-MM-dd (else 400 invalid_expiry); derive it from the US/Eastern market date, not your local calendar day.
  • Below the required plan you get a 403 with {"error":"tier_restricted","current_plan":"…","required_plan":"Growth"} (or "Alpha" for the per-strike endpoints).

API Access and Pricing

The Growth plan unlocks the decision endpoints (snapshot, series, hedge-flow). The Alpha plan adds the model-input endpoints (heatmap, strike-flow, leaderboard).

PlanPriceSnapshot / Series / Hedge-FlowHeatmap / Strike-Flow / LeaderboardRate Limit
Free$0NoNo5 req/day
Basicfrom $63/moNoNo100 req/day
Growthfrom $239/moYesNo2,500 req/day
Alphafrom $1,199/moYesYesUnlimited

Try any endpoint in the interactive API playground with your own key before writing code, or browse the per-endpoint docs at snapshot, series, and hedge-flow.

The live 0DTE flow stack, one base path

Snapshot, series, hedge-flow on Growth. Heatmap, strike-flow, leaderboard on Alpha.

Get API Access

Frequently Asked Questions

It is the /v1/flow/zero-dte/* family: six endpoints that compute live, flow-adjusted analytics for today's same-day options expiry. The snapshot returns the regime plus a plain-English headline, a trade-setup classifier, and calibrated pin and range probabilities; series charts those metrics intraday; hedge-flow estimates dealer hedging delta-dollars; heatmap and strike-flow give the strike-by-time picture; and the leaderboard ranks the hottest 0DTE names. Snapshot, series, and hedge-flow are on the Growth plan; heatmap, strike-flow, and leaderboard are on Alpha.
The older /v1/exposure/zero-dte/{symbol} endpoint is computed from settled open interest — yesterday's end-of-day OPRA book — so on a 0DTE expiry it goes stale by roughly 10:30 ET. The /v1/flow/zero-dte/* family uses effective open interest (settled OI plus an intraday simulator delta, model confidence 0.43), recomputed independently, so it tracks the regime, pin, and dealer hedge shift as the session's flow actually lands. Use the settled endpoint for the morning baseline and the flow family for the live read.
Yes, in capability. The hedge-flow endpoint covers the same signed dealer-hedging read as SpotGamma HIRO, and the heatmap endpoint covers the same strike-by-time grid as SpotGamma TRACE and Skylit Heatseeker — but FlashAlpha ships them as a REST API with SDKs rather than a dashboard, and adds a numeric pin score, calibrated probabilities, and a trade-setup classifier on top. The data is FlashAlpha's own, derived from effective open interest and aggressor-classified trades; it is not resold from any of those vendors.
Any symbol with a same-day expiry. The daily-0DTE majors are SPY, SPX, QQQ, and IWM; weekly Mon/Wed/Fri OPEX names also resolve on their expiry days. On a day with no same-day expiry for a symbol, the snapshot returns a degraded shape with no_zero_dte: true and a next_zero_dte_expiry date, and the time-series endpoints return an empty bars array — always guard for both.
Snapshot, series, and hedge-flow are on the Growth plan (from $239/mo, 2,500 requests/day) and Alpha (from $1,199/mo, unlimited). Heatmap, strike-flow, and leaderboard require Alpha. The Free and Basic tiers do not include the flow family; calling below the required plan returns a 403 tier_restricted with the current and required plan names.

Live Market Pulse

Get fast visibility into market shifts with full-chain analytics over low-latency REST and MCP polling.

Intelligent Screening

Screen millions of option pairs per second using your custom EV rules, filters, and setups.

Export-Ready

Export structured signals to your own execution stack or broker integration - FlashAlpha delivers the analytics, you keep control of order routing.

Join the Community

Discord

Engage in real time conversations with us!

Twitter / X

Follow us for real-time updates and insights!

GitHub

Explore our open-source SDK, examples, and analytics resources!