Zero-DTE Heatmap API - Strike x Time 0DTE Value Matrix - FlashAlpha Lab API
Lab API Heatmap

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

GET /v1/flow/zero-dte/heatmap/{symbol}
Auth required (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_pricenumberCurrent underlying spot
expirationstringToday's 0DTE expiry (ET)
metricstringEchoes the requested metric
modestringEchoes the requested mode (raw / delta)
bar_sizestringEchoes the requested bar size
as_ofstringServer time the response was built (UTC)
tier_usedstringStorage tier the data was read from
strikes_gridarrayStrikes for the matrix; values[i] maps to strikes_grid[i]
bars[].tstringBar timestamp (UTC)
bars[].spotnumberUnderlying spot at the bar
bars[].valuesarrayPer-strike metric values, parallel by index to strikes_grid
gap_intervalsarrayReserved for sampler-gap intervals; not yet populated

Errors

Status Description
400bar_unavailable - bar is anything other than 1m
400invalid_metric - metric not in gex|dex|vex|chex|oi|signed_flow
400invalid_mode - mode is not raw/delta
400no_strike_data_for_window - rows exist in the window but none carry per-strike data (legacy v1 rows)
403tier_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_grid and the per-bar values array, the column-major shape charting libraries expect
  • Switch the projected layer with metric across gex, dex, vex, chex, oi, and signed_flow to read whichever exposure drives your setup
  • Use mode=delta to 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_grid as spot moves, anticipating the next support or resistance
  • Watch the row nearest underlying_price for the ATM strike most likely to act as the closing pin magnet
  • Spot a sign flip in a strike's values over time as the bar where that level switches from supportive to repellent dealer positioning

Related reading

Complementary endpoints

Ready to build?

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