Exposure Term Structure API
Per-greek exposure aggregated by DTE bucket and also rolled up per expiry, returning in one call the same shape as four full-chain exposure requests, grouped by time.
Endpoint
X-Api-Key)
Rate Limited: Yes
Growth plan+
Parameters
| Name | In | Required | Default | Description |
|---|---|---|---|---|
symbol |
path | yes | - | Underlying symbol |
curl -H "X-Api-Key: YOUR_API_KEY" \
"https://lab.flashalpha.com/v1/exposure/term-structure/SPY"
import requests
resp = requests.get(
"https://lab.flashalpha.com/v1/exposure/term-structure/SPY",
headers={"X-Api-Key": "YOUR_API_KEY"}
)
data = resp.json()
for b in data["by_dte_bucket"]:
print(f"{b['bucket']}: net GEX {b['net_gex']:,}")
const resp = await fetch(
"https://lab.flashalpha.com/v1/exposure/term-structure/SPY",
{ headers: { "X-Api-Key": "YOUR_API_KEY" } }
);
const data = await resp.json();
data.by_dte_bucket.forEach(b =>
console.log(b.bucket + ": net GEX " + b.net_gex.toLocaleString()));
Response
{
"symbol": "SPY",
"underlying_price": 597.50,
"as_of": "2026-05-29T15:30:00Z",
"by_dte_bucket": [
{ "bucket": "0-7d", "dte_range": [0, 7], "net_gex": 920000000, "net_dex": -120000000, "net_vex": 85000000, "net_chex": 380000000, "contract_count": 412 },
{ "bucket": "8-30d", "dte_range": [8, 30], "net_gex": 1280000000, "net_dex": -200000000, "net_vex": 540000000, "net_chex": 340000000, "contract_count": 1810 }
],
"by_expiry": [
{ "expiration": "2026-05-30", "dte": 1, "is_opex": false, "is_triple_witching": false, "net_gex": 320000000, "net_dex": -50000000, "net_vex": 25000000, "net_chex": 180000000, "pct_of_chain_gex": 10.91 },
{ "expiration": "2026-06-18", "dte": 20, "is_opex": true, "is_triple_witching": true, "net_gex": 980000000, "net_dex": -160000000, "net_vex": 420000000, "net_chex": 260000000, "pct_of_chain_gex": 33.42 }
]
}
Key Response Fields
| Section / Field | Description |
|---|---|
by_dte_bucket[].bucket | Bucket name. Buckets are 0-7d / 8-30d / 31-60d / 61-180d / 180d+. |
by_dte_bucket[].dte_range | Inclusive [lower, upper] DTE bounds (final bucket carries int.MaxValue as the upper bound). |
by_dte_bucket[].net_* | Sum of GEX / DEX / VEX / CHEX over every contract whose DTE falls in the bucket. |
by_dte_bucket[].contract_count | Number of contracts feeding the bucket. |
by_expiry[] | One row per expiry, ordered ascending. is_opex / is_triple_witching use the holiday-adjusted rule. |
by_expiry[].pct_of_chain_gex | This expiry's |net_gex| as a share of Σ |net_gex| across all expiries (0-100). |
Errors
| Status | Description |
|---|---|
403 | Requires Growth plan or higher |
404 | Symbol not found or no data |
About
The term-structure endpoint slices a symbol's options chain by time rather than by strike, aggregating GEX, DEX, VEX and CHEX into standard DTE buckets and rolling the same greeks up per individual expiry. A single call returns what would otherwise require four separate full-chain exposure requests, already grouped along the time axis.
Buckets that match no contracts are omitted rather than emitted as zero rows, and pct_of_chain_gex falls back to 0 for every row when the chain's total |net_gex| is zero (a safe-divide guard). The per-expiry rollup carries OPEX and triple-witching flags so you can spot where the chain's gamma concentration sits in time.
Common Use Cases
- Plot the exposure term-structure curve - the per-DTE-bucket rows draw a gamma curve across the chain so you can see whether positioning is front- or back-loaded in time
- Find the dominant expiry -
pct_of_chain_gexranks each expiry's share of total chain gamma to pinpoint where dealer concentration sits - Separate pinning from structural positioning - isolate the near-dated 0-7d buckets that drive expiry pinning from longer-dated, slower-moving exposure
- Flag event expiries in time - the per-expiry OPEX and triple-witching flags mark where gamma concentration coincides with scheduled unwinds
- Handle sparse buckets safely - empty buckets are omitted rather than zero-filled and
pct_of_chain_gexsafe-divides to0, so charts stay clean on thin chains - Pair with skew and VRP across tenors - read the gamma curve alongside skew term structure and VRP history to align positioning with the vol term structure
Related
Related reading
- GEX/DEX/VEX/CHEX: an 8-year backtest vs VIX - what the exposure greeks predict across the term structure
Complementary endpoints
- Gamma Exposure (GEX) - the per-strike gamma sheet behind each bucket's totals
- Exposure Sheet - the full per-strike greek sheet aggregated here by expiry
- Skew Term Structure - how implied skew evolves across the same tenors
- VRP History - realized-vs-implied premium to frame the term structure
Ready to build?
Get your free API key and start pulling live options data in 30 seconds.