Exposure Basket API
A weighted cross-symbol aggregate of GEX, DEX, VEX and CHEX across up to 50 user-supplied symbols, with per-constituent contributions and regime tags, and any symbols that lacked data reported back in missing_symbols.
Endpoint
X-Api-Key)
Rate Limited: Yes
Growth plan+
Parameters
| Name | In | Required | Default | Description |
|---|---|---|---|---|
symbols |
query | yes | - | Comma-separated symbols. Max 50, duplicates de-duped. |
weights |
query | no | equal weight | Comma-separated; same length as symbols. Defaults to equal weight. Negative values rejected; sum-zero rejected. |
curl -H "X-Api-Key: YOUR_API_KEY" \
"https://lab.flashalpha.com/v1/exposure/basket?symbols=AAPL,MSFT,NVDA&weights=0.4,0.3,0.3"
import requests
resp = requests.get(
"https://lab.flashalpha.com/v1/exposure/basket",
headers={"X-Api-Key": "YOUR_API_KEY"},
params={"symbols": "AAPL,MSFT,NVDA", "weights": "0.4,0.3,0.3"}
)
data = resp.json()
print(f"Aggregate net GEX: {data['aggregate']['net_gex']:,}")
const resp = await fetch(
"https://lab.flashalpha.com/v1/exposure/basket?symbols=AAPL,MSFT,NVDA&weights=0.4,0.3,0.3",
{ headers: { "X-Api-Key": "YOUR_API_KEY" } }
);
const data = await resp.json();
console.log("Aggregate net GEX: " + data.aggregate.net_gex.toLocaleString());
Response
{
"as_of": "2026-05-29T15:30:00Z",
"constituent_count": 3,
"missing_symbols": [],
"aggregate": {
"net_gex": 1640000000,
"net_dex": -210000000,
"net_vex": 580000000,
"net_chex": 420000000
},
"constituents": [
{ "symbol": "AAPL", "weight": 0.40, "underlying_price": 210.45, "net_gex": 920000000, "net_dex": -120000000, "net_vex": 340000000, "net_chex": 260000000, "contribution_pct": 42.13, "regime": "positive_gamma" },
{ "symbol": "MSFT", "weight": 0.30, "underlying_price": 432.80, "net_gex": 410000000, "net_dex": -60000000, "net_vex": 140000000, "net_chex": 90000000, "contribution_pct": 18.77, "regime": "positive_gamma" }
]
}
Key Response Fields
| Field | Description |
|---|---|
constituent_count | Number of symbols that actually contributed (after drops). |
missing_symbols[] | Symbols requested but with no MarketDataStore data (invalid, illiquid, or still warming). |
aggregate.net_* | Σ wᵢ × net_{greek}_i after weight renormalisation. |
constituents[].weight | Renormalised weight applied to this symbol (sums to 1 across the response). |
constituents[].contribution_pct | |wᵢ × net_gex_i| / Σ |wⱼ × net_gex_j|, expressed 0-100. Uses weighted GEX (not raw |net_gex|) so a tiny-weight, large-GEX symbol does not dominate the display when its influence on the aggregate is small. |
constituents[].regime | positive_gamma when net_gex ≥ 0, else negative_gamma. |
Errors
| Status | Description |
|---|---|
400 | missing_symbols / too_many_symbols / invalid_weights / weight_count_mismatch |
403 | Requires Growth plan or higher |
404 | no_data - none of the requested symbols had data |
About
The basket endpoint rolls GEX, DEX, VEX and CHEX up across up to 50 symbols into a single weighted aggregate, targeting the multi-symbol scanners Growth persona. Weights default to equal across the basket; when supplied they are normalised to sum to 1. Symbols with no available data are dropped, the surviving weights are re-normalised, and the dropped tickers are returned in missing_symbols.
Each constituent reports its renormalised weight, underlying price, per-greek values, a contribution percentage based on weighted GEX, and a positive- or negative-gamma regime tag. The endpoint does not pre-validate index/ETF tier gating per constituent, and one HTTP call counts as a single quota debit regardless of how many symbols are passed.
Common Use Cases
- Aggregate a basket in one call - roll a watchlist or sector basket into a single weighted net GEX / DEX / VEX / CHEX read for one quota debit regardless of symbol count
- Apply portfolio weights - supplied weights are renormalised so the aggregate reflects your actual book rather than an equal-weight proxy
- Rank the dominant names -
contribution_pct(weighted GEX share) surfaces which constituents drive basket-level exposure and which are noise - Read each holding's gamma regime - the positive- or negative-gamma regime tag per constituent shows where the basket is dampened versus trending
- Frame dispersion trades - compare constituent regimes and contributions against index-level exposure to spot where single names diverge from the basket
- Watch the tier-gating caveat - the endpoint does not pre-validate index/ETF tier gating per constituent, so confirm entitlement before relying on every symbol's row
Related
Related reading
- Dealer positioning: a quantitative approach - the framework for reading aggregated dealer exposure
Complementary endpoints
- Gamma Exposure (GEX) - the single-symbol gamma sheet behind each constituent
- Exposure Sheet - the full per-strike greek sheet for any one name in the basket
- Dispersion - index-vs-constituent vol divergence to pair with basket exposure
Ready to build?
Get your free API key and start pulling live options data in 30 seconds.