Zero-DTE (0DTE) Analytics API
Real-time 0DTE analytics for intraday options trading. Gamma regime, expected move, pin risk scoring, dealer hedging estimates, theta decay acceleration, and per-strike breakdown - all for same-day expiration contracts.
ES=F or NQ=F and URL-encode the = as %3D - e.g. /v1/exposure/zero-dte/ES%3DF. Options-on-futures are priced with Black-76 using the CME multiplier ($50/pt ES, $20/pt NQ); CME index futures are Growth-tier. See the futures hub.
Endpoint
X-Api-Key)
Rate Limited: Yes
Growth+
Parameters
| Name | In | Required | Default | Description |
|---|---|---|---|---|
symbol |
path | yes | - | Underlying symbol (e.g. SPY, QQQ, SPX) |
strike_range |
query | no | 0.03 |
Fraction of spot to include in strikes array (0.001-0.10). Aggregates always use full chain. |
expiry |
query | no | today's 0DTE | Target expiry (yyyy-MM-dd). Selects 1DTE / 2DTE / any expiry via the same 0DTE selector; omit for today's same-day expiry. |
no_zero_dte on days SPX has no same-day expiry (check the flag).
curl -H "X-Api-Key: YOUR_API_KEY" \
"https://lab.flashalpha.com/v1/exposure/zero-dte/SPY"
import requests
resp = requests.get(
"https://lab.flashalpha.com/v1/exposure/zero-dte/SPY",
headers={"X-Api-Key": "YOUR_API_KEY"}
)
data = resp.json()
print(f"0DTE GEX: ${data['exposures']['net_gex']:,.0f}")
print(f"Pin Score: {data['pin_risk']['pin_score']}/100")
print(f"Expected Move: ±${data['expected_move']['remaining_1sd_dollars']:.2f}")
const resp = await fetch(
"https://lab.flashalpha.com/v1/exposure/zero-dte/SPY",
{ headers: { "X-Api-Key": "YOUR_API_KEY" } }
);
const data = await resp.json();
console.log(`0DTE GEX: $${data.exposures.net_gex.toLocaleString()}`);
console.log(`Pin Score: ${data.pin_risk.pin_score}/100`);
console.log(`Expected Move: +/-$${data.expected_move.remaining_1sd_dollars.toFixed(2)}`);
Response
{
"symbol": "SPY",
"underlying_price": 590.42,
"expiration": "2026-03-19",
"as_of": "2026-03-19T14:45:12Z",
"market_open": true,
"time_to_close_hours": 1.25,
"time_to_close_pct": 80.8,
"regime": {
"label": "positive_gamma",
"description": "Dealers long gamma - moves dampened, mean reversion likely",
"gamma_flip": 588.50,
"spot_vs_flip": "above",
"spot_to_flip_pct": 0.33
},
"exposures": {
"net_gex": 1842000000,
"net_dex": 48200000000,
"net_vex": -320000000,
"net_chex": 95000000,
"pct_of_total_gex": 62.4,
"total_chain_net_gex": 2952000000
},
"expected_move": {
"implied_1sd_dollars": 2.18,
"implied_1sd_pct": 0.37,
"remaining_1sd_dollars": 1.05,
"remaining_1sd_pct": 0.18,
"upper_bound": 591.47,
"lower_bound": 589.37,
"straddle_price": 1.62,
"atm_iv": 0.123
},
"pin_risk": {
"magnet_strike": 590,
"magnet_gex": 580000000,
"distance_to_magnet_pct": 0.07,
"pin_score": 82,
"max_pain": 590,
"oi_concentration_top3_pct": 41.2,
"description": "Strong pin at 590. 82/100 pin score with 41% of OI in top 3 strikes."
},
"hedging": {
"spot_up_half_pct": { "dealer_shares_to_trade": -156100, "direction": "sell", "notional_usd": -92158000 },
"spot_down_half_pct": { "dealer_shares_to_trade": 156100, "direction": "buy", "notional_usd": 92158000 },
"spot_up_1pct": { "dealer_shares_to_trade": -312200, "direction": "sell", "notional_usd": -184316000 },
"spot_down_1pct": { "dealer_shares_to_trade": 312200, "direction": "buy", "notional_usd": 184316000 }
},
"decay": {
"net_theta_dollars": -4820000,
"theta_per_hour_remaining": -3856000,
"charm_regime": "time_decay_dealers_buy",
"charm_description": "Time decay pushing dealers to buy - supportive into close",
"gamma_acceleration": 2.4,
"description": "0DTE theta bleeding $3,856/hr. Gamma 2.4x higher than equivalent 7DTE."
},
"vol_context": {
"zero_dte_atm_iv": 12.3,
"seven_dte_atm_iv": 14.8,
"iv_ratio_0dte_7dte": 0.83,
"vix": 16.2,
"vanna_exposure": -320000000,
"vanna_interpretation": "vol_up_dealers_sell",
"description": "0DTE IV at 12.3% vs 7DTE at 14.8%. Negative vanna - vol spike triggers dealer selling."
},
"flow": {
"total_volume": 842000,
"call_volume": 520000,
"put_volume": 322000,
"total_oi": 1240000,
"call_oi": 680000,
"put_oi": 560000,
"pc_ratio_volume": 0.619,
"pc_ratio_oi": 0.824,
"volume_to_oi_ratio": 0.679
},
"levels": {
"call_wall": 595,
"call_wall_gex": 420000000,
"put_wall": 585,
"put_wall_gex": -380000000,
"highest_oi_strike": 590,
"highest_oi_total": 48200,
"max_positive_gamma": 592,
"max_negative_gamma": 586
},
"strikes": [
{
"strike": 590,
"call_gex": 450000000, "put_gex": -380000000, "net_gex": 70000000,
"call_dex": 12500000, "put_dex": -15000000, "net_dex": -2500000,
"call_oi": 25000, "put_oi": 30000,
"call_volume": 15000, "put_volume": 12000,
"call_iv": 0.18, "put_iv": 0.19,
"call_delta": 0.50, "put_delta": -0.50,
"call_gamma": 0.025, "put_gamma": 0.025,
"call_theta": -1.0, "put_theta": -1.0
}
]
}
Key Response Fields
| Field | Type | Description |
|---|---|---|
time_to_close_hours | number | Hours until 4:00 PM ET. The single most important 0DTE context variable. |
time_to_close_pct | number | Percentage of trading day elapsed (0=open, 100=close) |
regime.label | string | positive_gamma, negative_gamma, or undetermined. See gamma regime |
regime.gamma_flip | number | 0DTE-specific gamma flip (separate from full-chain) |
exposures.pct_of_total_gex | number | 0DTE GEX as % of full-chain GEX. >50% = 0DTE dominates intraday |
expected_move.remaining_1sd_* | number | Shrinks in real-time as close approaches |
expected_move.straddle_price | number | ATM 0DTE straddle mid - direct market-implied expected move |
pin_risk.pin_score | number | 0-100 composite pin risk score: OI concentration (30%), magnet proximity (25%), time remaining (25%), gamma magnitude (20%) |
pin_risk.max_pain | number | Strike where total option holder intrinsic value is minimized. See /v1/maxpain for full analysis with pain curve, dealer alignment, and pin probability. |
hedging.spot_*_half_pct | object | Dealer hedging for ±0.5% moves - more relevant for 0DTE than ±1% |
decay.theta_per_hour_remaining | number | net_theta_dollars / time_to_close_hours - accelerates as denominator shrinks |
decay.gamma_acceleration | number | 0DTE ATM gamma / 7DTE ATM gamma. Typically 2-5x, can hit 10x+ near close - see gamma acceleration |
decay.charm_regime | string | time_decay_dealers_buy or time_decay_dealers_sell - see charm regime |
vol_context.iv_ratio_0dte_7dte | number | <1.0 = 0DTE is “cheap” vs term structure; >1.0 = event premium |
flow.volume_to_oi_ratio | number | >1.0 = heavy day-trading (intraday flow exceeds overnight positioning) |
levels.call_wall | number | 0DTE strike with highest call GEX - intraday resistance |
levels.put_wall | number | 0DTE strike with highest put GEX - intraday support |
No 0DTE Expiry
If the symbol has no 0DTE expiry today (e.g. SPY on Tuesday/Thursday):
{
"symbol": "SPY",
"underlying_price": 590.42,
"expiration": null,
"as_of": "2026-03-17T15:30:00Z",
"market_open": true,
"no_zero_dte": true,
"message": "No 0DTE expiry for SPY today (Tuesday). Next expiry: 2026-03-18.",
"next_zero_dte_expiry": "2026-03-18"
}
Errors
| Status | Description |
|---|---|
403 | Requires Growth plan or higher |
404 | Symbol not found or no data |
Notes
- SPY has 0DTE every trading day. SPX 0DTE coverage is limited - the endpoint returns
no_zero_dteon days SPX has no same-day expiry (check the flag andnext_zero_dte_expiry). theta_per_hour_remainingisnullwhentime_to_close_hoursis 0 (market closed)- Near close (<5 minutes), a
warningsarray is included noting potential greek instability strike_rangeonly filters thestrikesarray - all aggregate calculations use the full 0DTE chain- All calculations are pure static (no external calls beyond the initial data fetch)
What Is 0DTE Trading?
Zero days to expiration (0DTE) options expire on the same day they are traded. These contracts have extreme gamma - small moves in the underlying produce outsized changes in delta, forcing dealers into aggressive hedging activity. 0DTE options now account for over 40% of total SPX options volume on many trading days, making them the single largest driver of intraday price action.
Because 0DTE gamma is typically 2-5x higher than equivalent 7DTE gamma, dealer hedging flows are amplified. When 0DTE dominates total GEX (>50%), intraday support/resistance levels, pin risk, and expected move are all driven primarily by same-day expiration positioning.
Common Use Cases
- Detect the intraday gamma regime - read
gamma_regimeto know whether 0DTE dealers are dampening or amplifying moves, and gate mean-reversion vs momentum tactics on it - Score pin risk into the close - use the
pin_scoreandpin_striketo find the magnet strike OI concentration is pulling price toward, and decide whether to hold or close before settlement - Calibrate the remaining expected move - read
expected_moveto size straddle/strangle ranges that shrink as the close approaches and avoid stops inside the implied band - Estimate dealer hedging flow - use the ±0.5% and ±1% hedging scenarios to anticipate how many shares dealers buy or sell on the next move and size positions against that wall
- Time theta harvesting - follow the accelerating decay curve to choose when to sell premium and when to take profit before gamma risk dominates
- Gauge 0DTE vol cheapness - compare same-day IV against 7DTE IV to judge whether 0DTE premium is rich, cheap, or carrying event risk before structuring a trade
- Feed intraday models - pipe
pin_score,gamma_regime, andexpected_moveinto an algo to trigger same-day setups programmatically
Related
Related reading
- Pin risk score 0-100: reading the 0DTE pin magnet - how the score maps to a tradeable pin into the close
Complementary endpoints
- Flow Pin Risk - live, flow-adjusted pin magnet that updates intraday as OI shifts
- Max Pain - confirm the 0DTE pin strike against the settled max-pain level
- Key Levels - gamma flip, call wall, and put wall framing the same-day range
- Live Flow GEX - intraday dealer gamma driving 0DTE hedging pressure
Ready to build?
Get your free API key and start pulling live options data in 30 seconds.