The 0DTE Gamma Heatmap API: Strike-by-Time GEX, a HIRO and Heatseeker Alternative | FlashAlpha

The 0DTE Gamma Heatmap API: Strike-by-Time GEX, a HIRO and Heatseeker Alternative

A strike-by-time gamma heatmap is the chart SpotGamma TRACE and Skylit Heatseeker are known for. The FlashAlpha /v1/flow/zero-dte/heatmap endpoint returns the same strike x time matrix for today's 0DTE chain as plain JSON - six metrics (GEX, DEX, VEX, CHEX, OI, signed flow), raw or delta mode - so you can render it in your own stack or feed it to a model. A developer-first HIRO and Heatseeker alternative. Alpha plan.

T
Tomasz Dobrowolski Quant Engineer
Jun 14, 2026
22 min read
0DTE Heatmap GammaExposure GEX OptionsFlow API DeveloperGuide SpotGamma Heatseeker

If you want a 0DTE gamma heatmap API, an intraday GEX-by-strike matrix, a SpotGamma TRACE alternative, or a Skylit Heatseeker alternative you can pull from code instead of staring at a dashboard, this is the endpoint. GET /v1/flow/zero-dte/heatmap/{symbol} returns a strike-by-time value matrix for the chain expiring today, on the Alpha plan. For the whole live-0DTE surface this sits inside, start with the pillar, The Live 0DTE Flow API.

Read this first. The heatmap is built on FlashAlpha's flow model — effective open interest plus aggressor-classified trades — not a dealer's actual book. The values are estimates. The JSON below uses illustrative placeholder numbers. Read the bands, the shifts, and the signs as a relative map of where positioning sits, not as exact dealer inventory.


What a Strike-by-Time Gamma Heatmap Shows

A single GEX snapshot tells you where dealer gamma sits right now. A heatmap adds the second dimension every 0DTE trader actually wants: how that profile is moving through the session. Strikes run down one axis, time runs across the other, and color encodes the metric at each cell. Read across a row to see how one strike's gamma builds or bleeds; read down a column to see the whole profile at one instant; watch the bright bands migrate to see the magnet and the walls shift in real time.

That migration is the signal. When a bright positive-gamma band locks onto a strike and stays there, that strike is pinning. When the band that was bracketing price thins out, the walls are weakening and a breakout gets easier. On a 0DTE chain this all happens within hours, which is why a static morning chart misses it and a live matrix does not.

The strike-by-time 0DTE heatmap, as JSON you can render anywhere

Six metrics, raw or delta mode. No dashboard lock-in. Alpha plan.

Get API Access

The Endpoint

GET /v1/flow/zero-dte/heatmap/{symbol}?bar=1m&metric=gex&mode=raw&minutes=60 (Alpha plan). The response pulls the strikes out into a top-level strikes_grid, and each bar's values array is parallel by index — so you index it as values[bar][strike], exactly the shape a heatmap plotting library wants. That layout is roughly 30% smaller on the wire than per-cell objects.

{
  "symbol": "SPX",
  "underlying_price": 6012.4,
  "expiration": "2026-06-12",
  "metric": "gex",
  "mode": "raw",
  "bar_size": "1m",
  "as_of": "2026-06-12T18:45:12Z",
  "market_open": true,
  "tier_used": "raw",
  "strikes_grid": [5995, 6000, 6005, 6010, 6015, 6020],
  "bars": [
    { "t": "2026-06-12T18:43:00Z", "spot": 6011.8,
      "values": [-1.1e9, -3.8e8, 1.9e8, 9.0e8, 1.7e9, 2.8e8] },
    { "t": "2026-06-12T18:44:00Z", "spot": 6012.1,
      "values": [-1.2e9, -4.0e8, 2.1e8, 9.5e8, 1.8e9, 3.0e8] }
  ],
  "gap_intervals": []
}
FieldWhat it means
strikes_gridThe y-axis: every strike in the matrix, ascending. Index j here lines up with index j in every bar's values.
bars[].tThe x-axis: the timestamp of this column (UTC).
bars[].spotUnderlying spot at that bar — overlay it as a line to see price walk through the gamma field.
bars[].valuesThe metric value at each strike for that bar, parallel to strikes_grid. This is the color channel.
tier_usedWhich storage tier served the data (raw intraday). Informational.
gap_intervalsAny windows where the sampler did not write (rare). Render them as blanks rather than interpolating.

Six Metrics: Choosing the Lens

The metric parameter swaps what the color channel represents. Same grid, different question.

metricReads as
gexGamma exposure per strike. The default. Bright positive bands are pin/stabilizing zones; deep negative bands are accelerant zones.
dexDelta exposure — directional dealer positioning by strike.
vexVega exposure — where the chain is sensitive to a vol move.
chexCharm exposure — where time decay is forcing the fastest delta re-hedging into the close.
oiEffective open interest by strike — the raw positioning mass.
signed_flowNet signed aggressor flow — where customers are actively buying (positive) or selling (negative) right now.

Raw vs Delta Mode: Level vs Change

The mode parameter is the one that separates a static picture from a flow read:

  • mode=raw shows the level of the metric at each cell — the standing gamma/OI/flow profile. Use it to see where the walls and magnet sit.
  • mode=delta shows the bar-over-bar change — where positioning is landing this minute. This is the closest analog to a HIRO-style "what just changed" read: a strike lighting up in delta mode is where fresh flow is concentrating, often before it is obvious in the raw level.

A common workflow is to render both: raw mode as the background field, delta mode as the overlay that flags the active strikes.

Pull It and Plot It

The matrix layout drops straight into any heatmap library. Here it is pulled and rendered with matplotlib in a dozen lines:

import numpy as np
import matplotlib.pyplot as plt
from flashalpha import FlashAlpha

fa = FlashAlpha("YOUR_KEY")
d = fa.flow_zero_dte_heatmap("SPX", metric="gex", mode="raw", bar="1m", minutes=120)

strikes = d["strikes_grid"]                       # y-axis
times   = [b["t"][11:16] for b in d["bars"]]      # x-axis (HH:MM)
spot    = [b["spot"] for b in d["bars"]]
# values[bar][strike] -> transpose to grid[strike][bar] for imshow
grid = np.array([b["values"] for b in d["bars"]]).T

plt.imshow(grid, aspect="auto", origin="lower", cmap="RdBu_r",
           extent=[0, len(times), strikes[0], strikes[-1]])
plt.plot(np.arange(len(times)) + 0.5, spot, color="black", lw=1)  # spot overlay
plt.colorbar(label=f"{d['metric'].upper()} ({d['mode']})")
plt.title(f"{d['symbol']} 0DTE {d['metric'].upper()} heatmap")
plt.show()
import { FlashAlpha } from 'flashalpha';

const fa = new FlashAlpha('YOUR_KEY');
const d = await fa.flowZeroDteHeatmap('SPX', { metric: 'gex', mode: 'delta', bar: '1m', minutes: 120 });

// Plotly-ready: z is values[bar][strike], so transpose for [strike][bar]
const z = d.strikes_grid.map((_, j) => d.bars.map(b => b.values[j]));
const trace = {
  type: "heatmap", colorscale: "RdBu", reversescale: true,
  x: d.bars.map(b => b.t), y: d.strikes_grid, z,
};
Plotly.newPlot("chart", [trace], { title: `${d.symbol} 0DTE ${d.metric}` });
# Raw GEX level, last hour, 1-minute bars
curl -H "X-Api-Key: YOUR_KEY" \
  "https://lab.flashalpha.com/v1/flow/zero-dte/heatmap/SPX?metric=gex&mode=raw&bar=1m&minutes=60"

# Where is fresh positioning landing? signed_flow in delta mode
curl -H "X-Api-Key: YOUR_KEY" \
  "https://lab.flashalpha.com/v1/flow/zero-dte/heatmap/SPY?metric=signed_flow&mode=delta&bar=1m"
$ values[bar][strike] is parallel to strikes_grid  |  transpose for most plotters

FlashAlpha vs SpotGamma TRACE vs Skylit Heatseeker

SpotGamma's TRACE and Skylit's Heatseeker both popularized the intraday strike-by-time heatmap, and both are excellent dashboards. The gap they leave is programmatic access: you watch their chart, you do not pull their matrix. FlashAlpha closes that gap.

FlashAlpha 0DTE HeatmapSpotGamma TRACESkylit Heatseeker
DeliveryREST API + SDKs (JSON matrix)DashboardDashboard
Render in your own stackYesNoNo
Metrics selectable6 (GEX/DEX/VEX/CHEX/OI/signed flow)Fixed setHeat / flow
Raw level + delta (change) modeYesPartialPartial
Pairs with numeric pin score + setup classifierYesNoNo
Feed to a model / backtestYes (structured JSON)NoNo

The point is not that the heatmap is better looking — it is that it is callable. You can render it in your own dashboard, alert on a band crossing a strike, or feed the matrix straight into a model.

The Layer Underneath: Strike-Flow

The heatmap aggregates a metric per strike. When you want the signed aggressor detail that feeds it — net delta-dollars, gamma-dollars, and contract counts per strike per bar — call the companion endpoint, GET /v1/flow/zero-dte/strike-flow/{symbol}, also on Alpha. It returns three parallel arrays against the same strikes_grid, covered in the strike-flow and leaderboard guide.

API Access and Pricing

The heatmap and strike-flow endpoints are on the Alpha plan — they are the model-input granularity of the 0DTE flow family. The decision endpoints (snapshot, series, hedge-flow) sit one tier down on Growth.

PlanPrice0DTE Heatmap / Strike-FlowRate Limit
Free$0No5 req/day
Basicfrom $63/moNo100 req/day
Growthfrom $239/moNo2,500 req/day
Alphafrom $1,199/moYesUnlimited

Calling below Alpha returns a 403 tier_restricted. Try the shape in the interactive API playground or the heatmap endpoint docs first.

Frequently Asked Questions

Yes. GET /v1/flow/zero-dte/heatmap/{symbol} returns a strike-by-time value matrix for today's 0DTE chain as JSON. You choose the metric (GEX, DEX, VEX, CHEX, OI, or signed flow) and the mode (raw level or bar-over-bar delta). The strikes are a top-level array and each bar's values line up with it by index, so it drops straight into any heatmap plotting library. It is on the Alpha plan.
Raw mode shows the level of the metric at each strike-time cell — the standing profile, where the walls and magnet sit. Delta mode shows the bar-over-bar change — where positioning is landing this minute. Delta mode is the closest analog to a "what just changed" read and often flags an active strike before it is obvious in the raw level. Many traders render raw as the background and delta as the overlay.
It covers the same strike-by-time heatmap those products are known for, but as a developer API rather than a dashboard. You pull the matrix as JSON and render it in your own stack, alert on it, or feed it to a model — and it pairs with FlashAlpha's numeric pin score, calibrated probabilities, and trade-setup classifier. The data is FlashAlpha's own, derived from effective open interest and aggressor-classified trades; it is not resold from SpotGamma or Skylit.
The response has a single strikes_grid array (ascending strikes) and one bar per timestamp. Each bar's values array is parallel by index, so values[j] is the metric at strikes_grid[j] for that bar. To feed a typical heatmap plotter you transpose to grid[strike][bar]. The gap_intervals array marks any windows the sampler skipped, which you should render as blanks rather than interpolate.
The 0DTE heatmap and strike-flow endpoints are on the Alpha plan (from $1,199/mo, unlimited requests). They are the model-input granularity of the flow family; the decision endpoints (snapshot, series, hedge-flow) are one tier down on Growth. Calling the heatmap below Alpha returns a 403 tier_restricted with the required plan name.

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!