DocsAPI ReferenceDirectional TradingGEX, Vanna & Charm
GEX, Vanna & Charm
Dealer exposure by strike with the key levels traders actually watch: call/put walls, gamma flip and vanna levels.
Gamma exposure
GET
/gexParameters
symbolstringrequiredTicker, e.g. SPY, SPX, QQQ, NVDA.
expirationsstringComma-separated YYYY-MM-DD dates to aggregate. See
meta.availableExpirations or /v1/expirations.expirationsCountnumberNearest N expirations when no explicit dates are given (1-4, default 3).
formulastringnominal (default), per_1pct or per_1dollar.curl -H "Authorization: Bearer qw_live_YOUR_KEY" \
"https://quantwheel.com/api/v1/gex?symbol=SPY&expirationsCount=3"200 OK
{
"symbol": "SPY",
"stockPrice": 622.41,
"totalGEX": -1240000000,
"gammaZone": "negative",
"gammaInflection": 620.5,
"callWall": { "strike": 630, "gex": 320000000 },
"putWall": { "strike": 615, "gex": -410000000 },
"data": [
{ "strike": 615, "callGEX": 140000000, "putGEX": -550000000, "netGEX": -410000000,
"callOI": 42000, "putOI": 91000 }
// ... one row per strike
],
"meta": { "availableExpirations": ["2026-07-31", "2026-08-01", "..."] },
"asOf": "2026-07-30T14:40:00.000Z"
}| Level | Meaning |
|---|---|
| callWall | Strike with the largest call GEX - resistance / pin magnet. |
| putWall | Strike with the largest put GEX - downside support and acceleration point. |
| gammaInflection | Spot level where net GEX flips sign and the dealer regime changes. null when no flip level exists in the current strike range. |
| gammaZone | Current regime: positive (dealers dampen moves) or negative (dealers amplify). |
Vanna & charm levels
GET
/vannaSecond-order dealer positioning, aggregated over the tactical 0-45 DTE book (pass expiration=YYYY-MM-DD to pin a single expiration). The keyLevels block is what the desktop overlay draws: the vanna flip, bull drift target, bear max danger and the CSP deceleration zone.
200 OK
{
"symbol": "SPY",
"stockPrice": 622.41,
"totalVanna": 420000000,
"totalCharm": -110000000,
"keyLevels": {
"vannaRegime": "positive",
"vannaFlip": 618.5,
"bullDriftTarget": 631,
"bearMaxDanger": 611,
"bearDeceleration": 606,
"bullBearRatio": 1.34
},
"minDte": 0,
"maxDte": 45,
"mode": "aggregate",
"expiration": null,
"availableExpirations": ["2026-07-31", "..."],
"asOf": "2026-07-30T14:40:00.000Z"
}Flip & wall events
GET
/gex/eventsParameters
tickersstringComma-separated tickers, e.g. SPY,TSLA. Default: all covered.
eventTypestringall (default), flip or wall.minDte / maxDtenumberFilter by the expiration's days-to-expiry.
limitnumberMax events (default 50, cap 200).
200 OK (abridged)
{
"events": [
{
"id": "evt_01j...",
"ticker": "SPY",
"eventType": "flip",
"expiration": "2026-07-31",
"timestamp": "2026-07-30T15:02:00.000Z",
"previousState": "positive",
"newState": "negative",
"inflectionPoint": 620.5,
"spotPrice": 621.1,
"callWallStrike": 630,
"putWallStrike": 615
},
{
"id": "evt_01k...",
"ticker": "SPY",
"eventType": "wall",
"expiration": "2026-07-31",
"timestamp": "2026-07-30T14:47:00.000Z",
"wallType": "call",
"previousStrike": 628,
"newStrike": 630,
"spotPrice": 621.4
}
]
}Data freshness
Live GEX/vanna responses are computed from the current options chain and cached ~60 seconds per symbol. asOf is always the compute time - cache on it, not on wall-clock time.