Historical Options Analytics API: Replay GEX, VRP & Dealer Positioning Since 2018 | FlashAlpha

Historical Options Analytics API: Replay GEX, VRP & Dealer Positioning Since 2018

FlashAlpha's Historical API lets you replay every live analytics endpoint at any minute in market history - GEX, DEX, VEX, CHEX, VRP, max pain, dealer regime, vol surfaces. 6.7 billion option rows, minute-level intraday, SPY 2018 to today. The only dataset of its kind.

T
Tomasz Dobrowolski Quant Engineer
Apr 15, 2026
21 min read
HistoricalData OptionsAPI GEX VRP Backtesting MachineLearning Quant

Every serious options project eventually hits the same wall: the live API shows you now, but the questions that matter - does this strategy work? what did dealers do during the last drawdown? how did VRP behave before earnings? - all require the past. And historical options data, especially pre-computed historical analytics, is the one thing nobody sells.

Until now. FlashAlpha's Historical API ships today with a single, simple contract: every live analytics endpoint, replayable at any minute since 2018-04-16, returned in the same response shape. One query parameter - at - and you get what GEX, DEX, VEX, CHEX, VRP, max pain, dealer regime, or the full stock summary looked like at that exact minute in history.


What Nobody Else Sells

Go look at the other options data providers. Polygon, ThetaData, ORATS, Intrinio, Tradier - all of them either ship raw ticks or end-of-day snapshots. You can reconstruct parts of the analytics layer yourself if you have the time and the pipeline, but you will spend six months writing the join, the BSM pass, the SVI fit, the per-strike aggregation, the regime classifier, the leak-free percentile calculator - and you will still end up with something that only resembles the live product on a good day.

FlashAlpha's Historical API collapses that work into one HTTP call. The same ExposureCalculator, NarrativeBuilder, VrpCalculator, VolatilityAnalyzer, and AdvancedVolatilityCalculator classes that power the live endpoints at api.flashalpha.com also power the historical service at historical.flashalpha.com. Calculator bug-fixes land in both services simultaneously. What you see live, you see historically - exactly the same shape, exactly the same methodology.

Why This Is Hard

Pre-computed historical analytics require minute-level options quotes with greeks for every strike and expiration, anchored to forward prices, joined to end-of-day open interest, fitted with SVI, and cross-referenced against macro (VIX, VVIX, SKEW, MOVE) - all aligned to the exact timestamp you ask for. 6.7 billion option rows, 2 million+ stock minute-bars, daily SVI fits, daily macro. Nobody else assembled this stack.


The at Parameter Is the Whole Idea

Every analytics endpoint takes one required query parameter: at. That is the as-of timestamp. Pass it and you get the response as it would have been computed at that minute.

FormatExampleSemantics
yyyy-MM-ddTHH:mm:ss2026-03-05T15:30:00Minute-level as-of. ET wall-clock.
yyyy-MM-dd2026-03-05Defaults to 16:00 ET (session close).

Option greeks, bid/ask, stock spot, and everything derived from them are truly intraday - one value per minute from 9:30 to 16:00 ET. Open interest, SVI parameters, and macro are EOD-stamped, applied uniformly across the trading day. That matches the shape of reality: OI doesn't move intraday anyway.

curl -H "X-Api-Key: YOUR_API_KEY" \
  "https://historical.flashalpha.com/v1/exposure/summary/SPY?at=2020-03-16T15:30:00"

One call. That's the full exposure dashboard - net GEX, net DEX, net VEX, net CHEX, gamma flip, regime label, interpretations, ±1% hedging estimates, 0DTE contribution - as of 15:30 ET on March 16, 2020. The day SPY closed -12%. Full case study here →


Every Live Endpoint, Replayable

This is not a subset. The Historical API mirrors the live API endpoint-for-endpoint, response-for-response:

CategoryEndpointWhat you replay
Market data/v1/stockquote/{ticker}Stock bid/ask/mid/last at the minute
Market data/v1/optionquote/{ticker}Contract-level quotes + BSM greeks + OI
Market data/v1/surface/{symbol}50×50 implied-vol surface grid
Exposure/v1/exposure/gex/{symbol}Gamma exposure by strike
Exposure/v1/exposure/dex/{symbol}Delta exposure by strike
Exposure/v1/exposure/vex/{symbol}Vanna exposure by strike
Exposure/v1/exposure/chex/{symbol}Charm exposure by strike
Exposure/v1/exposure/summary/{symbol}Full composite dashboard + regime + hedging
Exposure/v1/exposure/levels/{symbol}Gamma flip, call wall, put wall, max gamma strikes
Exposure/v1/exposure/narrative/{symbol}Verbal analysis + prior-day GEX delta + VIX context
Exposure/v1/exposure/zero-dte/{symbol}0DTE regime, pin risk, expected move, decay
Max pain/v1/maxpain/{symbol}Pain curve, pin probability, dealer alignment
Composite/v1/stock/{symbol}/summaryPrice, vol, flow, exposure, macro - in one response
Volatility/v1/volatility/{symbol}RV ladder, IV-RV spread, skew, term structure
Volatility/v1/adv_volatility/{symbol}SVI params, forwards, total variance surface, arbitrage flags
VRP/v1/vrp/{symbol}Full VRP dashboard with leak-free percentiles
Coverage/v1/tickersWhat symbols and date ranges are loaded

Every one of these endpoints exists in live form today. Every one of them is now replayable at any minute since 2018-04-16 for SPY. More symbols backfill on demand.


Leak-Free By Design

The feature that most "historical options" services get wrong is the one that matters most for research: no future leakage. If you ask FlashAlpha for VRP percentile at 2022-06-14T15:30:00, the percentile is computed only from rows dated before 2022-06-14. The percentile at that moment reflects what was knowable at that moment. Ask for the same symbol six months later and the percentile will be different - because six months of new data went into the rolling window.

This matters because most backtests silently cheat. If your "historical VRP percentile" uses a percentile computed against the full 2018-2026 dataset, every 2019 observation is scored against knowledge that didn't exist in 2019. That's look-ahead bias. It inflates Sharpe ratios. It makes dead strategies look live. FlashAlpha's Historical API makes the honest version the default - it's actually harder to cheat than to do it right. Deep dive on leak-free percentiles →


Three Things You Can Build This Week

1. Backtest a GEX-Regime Strategy

Every strategy that conditions on dealer positioning ("short premium when dealers are long gamma", "fade gaps when GEX is negative", "buy straddles when we cross gamma flip") needs historical regime labels per minute. That's /v1/exposure/summary/{symbol} replayed across your training window.

import httpx, pandas as pd
from datetime import datetime, timedelta

dates = pd.bdate_range("2022-01-01", "2024-12-31")
rows = []
for d in dates:
    ts = d.strftime("%Y-%m-%dT15:30:00")
    r = httpx.get(
        "https://historical.flashalpha.com/v1/exposure/summary/SPY",
        params={"at": ts},
        headers={"X-Api-Key": API_KEY},
    ).json()
    rows.append({
        "date": d, "net_gex": r["exposures"]["net_gex"],
        "regime": r["regime"], "gamma_flip": r["gamma_flip"],
        "spot": r["underlying_price"],
    })
df = pd.DataFrame(rows)

That's the full research dataframe. Join next-day returns, condition on regime, measure the edge. Full backtesting walkthrough →

2. Train a Model on Dealer Positioning Features

For ML workflows, the Historical API is the feature store you were about to build yourself. Every minute of SPY since 2018-04-16 gives you net GEX, gamma flip distance, VRP z-score, net DEX, 0DTE contribution, vol surface shape, macro regime - about 40 dealer-positioning features per timestamp, all aligned to a single at key.

Pull the grid you want - daily close, half-hourly, or every minute - dump to parquet, and feed into XGBoost, a tabular transformer, or whatever architecture you prefer. The engineering bottleneck on options-ML projects has historically been the feature pipeline, not the model. This collapses it to a for-loop.

Feature density

8 years × 252 trading days × 390 minutes ≈ 786K minute-level sample rows for SPY alone, each with ~40 dealer-positioning features - roughly 31 million feature observations total. Before FlashAlpha, assembling this with correct greeks and leak-free percentiles was a multi-engineer, multi-quarter project. Now it's a weekend script.

3. Replay Any Historical Moment as a Research Artifact

Write blog posts. Teach a class. Build a "this week in 2020" email. Show clients what dealers were doing during the COVID crash, the 2022 bear market, the August 2024 VIX spike, the September 2025 volatility event. One curl, one timestamp, one real response. This is the content moat - and it's now a free side effect of the API.


Coverage Today

SymbolsSPY (more backfill on request)
Date range2018-04-16 → 2026-04-02 (extended each pipeline run)
Option rows6.7 billion
Stock minute-bars2 million+
Intraday granularity1 minute (quotes + greeks + spot)
EOD layerOpen interest, SVI params, forwards, macro
Minimum tierAlpha ($1,499/mo)
Base URLhttps://historical.flashalpha.com

Authentication uses the same X-Api-Key as live. Quota is shared with the live API - Historical calls count against your daily plan bucket. 403 tier_restricted on any request from a non-Alpha user.

Coverage is self-describing. GET /v1/tickers returns the loaded symbols, date ranges, and any gaps in the pipeline - backed by the history_coverage table written by the Data Quality step at the end of every backfill run. No surprises; if a symbol or date isn't ready, the coverage endpoint tells you before you waste a call.


Same Calculators, Same Shape, Same Bug-Fixes

This is worth repeating because it's the real moat: the historical service and the live service share the calculator layer. Every endpoint delegates to the same pure-static classes - ExposureCalculator, NarrativeBuilder, VrpCalculator, VolatilityAnalyzer, AdvancedVolatilityCalculator, StockSummaryBuilder.Build, VolSurfaceGridBuilder. When a calculator bug gets fixed, it gets fixed in both places the same day. When a field gets added to the live response, it appears historically too (modulo data availability).

That means you can validate strategies historically and deploy them live without a rewrite. Same response shape, same field names, same regime labels, same interpretation text. The minute-level deploy is a config flip: swap the base URL from historical.flashalpha.com back to api.flashalpha.com and change at to "now."


Known Gaps (Up Front)

A small number of live fields aren't reconstructible historically. They're all documented in the full spec, but the summary:

  • Minute-level volume: not stored; call_volume, put_volume, total_volume always 0. Greeks, bid/ask, and OI are all populated normally.
  • VIX futures and CNN Fear & Greed: live reads external sources that aren't archived historically. These fields return null.
  • Option bid/ask sizes: minute-resolution options table doesn't carry sizes. Bid/ask themselves are populated.
  • Prior-day OI diffs inside narrative.top_oi_changes: not computed yet; empty array. Net GEX deltas, VIX, and the rest of the narrative are populated.
  • svi_vol per contract in /v1/optionquote: SVI params are loaded at the expiry level; per-contract derivation is gated behind "backtest_mode". implied_vol (BSM) is populated.
  • 0DTE greeks at very-near expiry: queued for backfill. The 0DTE chain is still listed for OI/strike analysis.

None of these affect the core exposure or VRP workflows. Everything else is real, minute-accurate, and matches the live shape.


Why Alpha-Tier

Historical is gated at Alpha (the $1,499/mo plan) because the underlying cost structure is real: 6.7 billion option rows live in a partitioned QuestDB cluster, the pipeline pulls fresh data from ThetaData daily, and SVI fits burn compute for every trading day. This isn't a rate-limit-gate - it's a "we built something expensive and we need the economics to work" gate. If you're building at that scale, it pays for itself in the first research sprint. If you're not there yet, the live API free tier is still the best way to prototype.


Further Reading

Historical API · Alpha tier · from $1,199/mo
Replay any analytics endpoint at any minute since 2018
Same response shape as live, leak-free percentiles, 6.7B option rows for SPY, more symbols on demand.
View pricing →
Data freshness: intraday data through the previous trading day's close, refreshed by the daily pipeline run. Live coverage status at /v1/tickers.

Upgrade to Alpha Full API Spec Check Coverage

Live Market Pulse

Get tick-by-tick visibility into market shifts with full-chain analytics streaming in real time.

Intelligent Screening

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

Execution-Ready

Instantly send structured orders to Interactive Brokers right from your scan results.

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!