Exposure Term Structure API - Greek Exposure by DTE Bucket and Expiry - FlashAlpha Lab API
Lab API Term Structure

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

GET /v1/exposure/term-structure/{symbol}
Auth required (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[].bucketBucket name. Buckets are 0-7d / 8-30d / 31-60d / 61-180d / 180d+.
by_dte_bucket[].dte_rangeInclusive [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_countNumber 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_gexThis expiry's |net_gex| as a share of Σ |net_gex| across all expiries (0-100).

Errors

Status Description
403Requires Growth plan or higher
404Symbol 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_gex ranks 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_gex safe-divides to 0, 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 reading

Complementary endpoints

Ready to build?

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