Help us double down on what's working, instead of guessing. Takes 5 seconds, totally optional.
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.
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.
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.
Endpoint
What it answers
Plan
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/leaderboard
Which 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.
Has 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.
headline
The one-line read for a dashboard pill. trade_angle is pin_trade / range_trade / breakout_risk / low_signal; severity escalates info → watch → alert as a pin locks into the close or a flip cross nears.
setup
A 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.
probabilities
Calibrated 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:
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.
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.
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.
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.
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.
metric
Ranks by
heat
Relative flow pressure: cumulative hedge-flow normalized by net GEX. The "something is happening here" sort.
pin_risk
Current pin score — where is a magnet locking price in.
abs_flow
Raw recent activity: absolute call + put hedge-flow in the last bars.
charm_intensity
Charm-dollars-per-hour — where time decay is forcing the fastest re-hedging into the close.
The endpoints are designed to be used together, not in isolation. A typical same-day workflow:
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.
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.
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.
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.
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).
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.