Zero-DTE Heatmap API
A per-strike value matrix over today's 0DTE session - the data behind a strike-by-time heatmap. Strikes are pulled into a top-level strikes_grid and each bar carries a values array that is parallel by index to strikes_grid, the column-major shape heatmap charting libraries expect.
Endpoint
X-Api-Key)
Rate Limited: Yes
Alpha plan+
Parameters
| Name | In | Required | Default | Description |
|---|---|---|---|---|
symbol |
path | yes | - | Underlying symbol. Trimmed and upper-cased. |
metric |
query | no | gex |
Per-strike value to project. One of gex, dex, vex, chex, oi, signed_flow. Invalid returns 400 invalid_metric. |
mode |
query | no | raw |
raw (absolute per-bar value) or delta (bar-over-bar change; bar 0 stays raw). For signed_flow, delta is equivalent to raw. Invalid returns 400 invalid_mode. |
bar |
query | no | 1m |
Bar size. Only 1m is supported in this phase (5m/15m are planned); any other value returns 400 bar_unavailable. |
minutes |
query | no | 60 |
Lookback window in minutes. Clamped to 1-390. |
curl -H "X-Api-Key: YOUR_API_KEY" \
"https://lab.flashalpha.com/v1/flow/zero-dte/heatmap/SPY?metric=gex&mode=raw&bar=1m&minutes=120"
import requests
resp = requests.get(
"https://lab.flashalpha.com/v1/flow/zero-dte/heatmap/SPY",
params={"metric": "gex", "mode": "raw", "bar": "1m", "minutes": 120},
headers={"X-Api-Key": "YOUR_API_KEY"}
)
data = resp.json()
print(data["strikes_grid"])
const resp = await fetch(
"https://lab.flashalpha.com/v1/flow/zero-dte/heatmap/SPY?metric=gex&mode=raw&bar=1m&minutes=120",
{ headers: { "X-Api-Key": "YOUR_API_KEY" } }
);
const data = await resp.json();
console.log(data.strikes_grid);
Response
{
"symbol": "SPY",
"underlying_price": 590.42,
"expiration": "2026-06-05",
"metric": "gex", // echoes the requested metric
"mode": "raw", // echoes the requested mode
"bar_size": "1m", // echoes the requested bar
"as_of": "2026-06-05T18:45:12Z", // UTC
"tier_used": "raw",
"strikes_grid": [585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595],
"bars": [
{
"t": "2026-06-05T18:44:00Z", // bar timestamp (UTC)
"spot": 590.42,
"values": [ -1.2e8, -9.0e7, -4.1e7, 0, 3.3e7, 8.1e8, 2.2e8, 1.1e8, 4.0e7, 1.0e7, -5.0e6 ]
// values[i] is the metric for strikes_grid[i]
}
// ... ascending by t
],
"gap_intervals": [] // reserved for sampler-gap intervals; not yet populated
}
No 0DTE samples in the window returns 200 with empty strikes_grid and bars arrays - there is no no_zero_dte / session_closed envelope.
Key Response Fields
| Field | Type | Description |
|---|---|---|
underlying_price | number | Current underlying spot |
expiration | string | Today's 0DTE expiry (ET) |
metric | string | Echoes the requested metric |
mode | string | Echoes the requested mode (raw / delta) |
bar_size | string | Echoes the requested bar size |
as_of | string | Server time the response was built (UTC) |
tier_used | string | Storage tier the data was read from |
strikes_grid | array | Strikes for the matrix; values[i] maps to strikes_grid[i] |
bars[].t | string | Bar timestamp (UTC) |
bars[].spot | number | Underlying spot at the bar |
bars[].values | array | Per-strike metric values, parallel by index to strikes_grid |
gap_intervals | array | Reserved for sampler-gap intervals; not yet populated |
Errors
| Status | Description |
|---|---|
400 | bar_unavailable - bar is anything other than 1m |
400 | invalid_metric - metric not in gex|dex|vex|chex|oi|signed_flow |
400 | invalid_mode - mode is not raw/delta |
400 | no_strike_data_for_window - rows exist in the window but none carry per-strike data (legacy v1 rows) |
403 | tier_restricted - caller is below the Alpha plan |
About
The heatmap endpoint returns a per-strike value matrix over today's 0DTE session - the data behind a strike-by-time heatmap. Strikes are pulled into a top-level strikes_grid and each bar carries a values array that is parallel by index to strikes_grid (i.e. values[strike_idx]), the column-major shape every heatmap charting library expects.
Choose the projected metric with metric (GEX, DEX, VEX, CHEX, OI, or signed flow) and switch between absolute values and bar-over-bar change with mode.
Common Use Cases
- Render a strike-by-time heatmap directly from
strikes_gridand the per-barvaluesarray, the column-major shape charting libraries expect - Switch the projected layer with
metricacrossgex,dex,vex,chex,oi, andsigned_flowto read whichever exposure drives your setup - Use
mode=deltato highlight where exposure is building or unwinding minute over minute rather than its absolute level - Track how the brightest cells (walls and concentrations) migrate across
strikes_gridasspotmoves, anticipating the next support or resistance - Watch the row nearest
underlying_pricefor the ATM strike most likely to act as the closing pin magnet - Spot a sign flip in a strike's
valuesover time as the bar where that level switches from supportive to repellent dealer positioning
Related
Related reading
- Live 0DTE pin-risk API: the intraday flow-adjusted magnet - reading the heatmap's ATM concentration as a pin signal
- 0DTE SPY: the complete intraday playbook - trading the strike-by-time grid through the session
Complementary endpoints
- Zero-DTE Strike Flow - the single-strike time series behind one heatmap row
- Zero-DTE Flow Series - the aggregate headline metrics across the same session
- Flow Levels - the named walls and magnet the heatmap visualizes
Ready to build?
Get your free API key and start pulling live options data in 30 seconds.