tickstreamdocs

DOCS

GEX API

Computed dealer gamma exposure over a simple REST endpoint: per-strike GEX, net gamma/delta/vanna/charm, call & put walls and the zero-gamma flip, for futures and single-name stocks.

requiresGEX Levels or above

GEX API

The computed dealer-gamma levels behind our free GEX tool, as clean JSON. Non-naive per-strike gamma exposure, the net gamma/delta/vanna/charm regimes, call & put walls and the zero-gamma flip — for index futures and single-name stocks, on your existing API key.

plan

This endpoint requires the GEX API add-on ($29.99/mo). It's a standalone entitlement — it works alongside any stream or data plan and is unlocked automatically when you subscribe.

GET /v1/gex

Returns the full GEX read for one symbol, computed live from the option chain.

curl "https://api.tick-stream.xyz/v1/gex?underlying=NQ&weight=oi&dte=all" \
  -H "Authorization: Bearer sk_live_…"
import requests
r = requests.get("https://api.tick-stream.xyz/v1/gex",
  params={"underlying": "NQ", "weight": "oi", "dte": "all"},
  headers={"Authorization": "Bearer sk_live_…"})
print(r.json()["callWall"], r.json()["flipLevel"])

Query parameters

underlyingyesSymbol. Futures: NQ ES GC SI CL. Stocks: AAPL NVDA TSLA AMZN META MSFT.
weightnooi (default) weights by open interest — standing positioning. vol weights by today's contract volume — intraday flow.
dtenoall (default), 0 (expires today) or 1 (tomorrow). Filters every field to that expiry group.
atnoEvaluate the surface at a past instant instead of now — ISO-8601 (2026-07-15T19:59:00Z) or unix seconds. See History.
datenoYYYY-MM-DD — the same thing, resolved to 15:59 ET of that session (one minute before the closing print, so the board is still whole).

Unknown parameters return 400 unknown_parameter rather than being ignored. That is deliberate: a misspelled at used to come back as a live snapshot, which is how a history table quietly fills with today's numbers.

Response

{
  "symbol": "NQ", "spot": 29304.0, "ratio": 41.32,
  "weight": "oi", "dte": "all",
  "netGexM": 4099, "regime": "positive",
  "dexM": -10741, "vannaK": 1120, "charmM": -116,
  "flipLevel": 28835,
  "callWall": 29335, "putWall": 28095,
  "hvl": 28095,
  "blindspots": [{ "level": 29010, "gexM": 640, "side": "call" }],
  "levels": [
    {
      "strike": 710, "level": 29335, "gexM": 1700,
      "callGexM": 2300, "putGexM": -589,
      "callOI": 12000, "putOI": 8000, "volume": 790000,
      "side": "call"
    }
  ],
  "updated": 1784680283
}
netGexM / regimeNet gamma exposure at spot in $M per 1% move, and positive/negative regime.
dexMNet dealer delta exposure ($M) — directional hedge pressure at spot.
vannaK / charmMNet vanna and charm — how dealer delta shifts with vol and with time (the end-of-day pin forces).
flipLevelZero-gamma flip, root-found on the spot-parametrized net-GEX curve, in futures price.
callWall / putWallBiggest positive strike above spot / biggest negative below, in futures price.
hvlHigh-gamma level — the single largest-|gamma| strike (the dealer magnet / intraday pivot), in futures price.
blindspotsArray of the strongest secondary gamma peaks between the walls (one above, one below spot): { level, gexM, side }. Reaction levels that aren't the obvious wall.
maxPainThe front expiry's max-pain strike in futures price — where its open interest is worth least to holders.
expectedMove / emUp / emDown / emPct / emDteThe front expiry's ATM straddle mid as the market's own expected move, in futures points, the band around spot, in percent, and the expiry's DTE.
atmIvImplied vol of the front-expiry strike nearest spot (call and put averaged), as a fraction.
pcRatio / gexRatioPut OI over call OI, and put gamma over call gamma, across the selected expiries. Above 1 = put heavy.
c1c3 / g1g3 (+ callLevels[] / putLevels[])The three largest call-gamma strikes above spot and put-gamma strikes below, walls and HVL excluded, in futures price — the secondary resistance and support the walls do not cover. Flat keys so a charting platform can read them with a regex.
levels[]Per strike (±6% of spot): strike, futures level, gexM, the callGexM/putGexM split, callOI/putOI, volume, and side.

History

Pass at or date and the same computation runs against the chain as it stood then. It is not a second model: the live path and the historical path call the same function with a different timestamp, so a historical read cannot drift from what the live endpoint would have said that day.

DepthTwelve years of contract history, clamped to your package. GEX Full gets the full depth; GEX + Greeks reaches back 5 sessions; GEX Levels is live-only.
GranularityOne-minute sampling within the session. The response's asOf is the sample actually served — the nearest at or before your instant, never your instant echoed back.
SymbolsNQ, ES and the single names. GC/SI/CL are live-only: mapping ETF strikes onto those futures needs their own historical tick history, which we do not hold, and we would rather refuse than publish a guessed ratio.
WeightingOpen interest only. weight=vol returns 400 for historical reads — contract volume up to your instant would need a third series per expiration, and using the day's total instead would stamp post-T flow onto a pre-T surface. That is lookahead, in the one product people buy to backtest with.
spotAgeSecsHow stale the futures print behind spot is. Our tick recording has occasional gaps (15 July 2026 has none between 15:53:10 and 15:59), so on some instants the newest trade we hold is minutes old. Disclosed rather than hidden; past 15 minutes the request is refused with stale_futures_price.

Why open interest is daily and that is not a shortcut. OCC publishes open interest once per day, industry-wide — no vendor has intraday OI, ours included. Intraday GEX evolution comes from the intraday greeks series moving over that fixed OI ladder as spot and implied vol change, which is exactly how the live endpoint and our free GEX page compute it.

first call on a date is slow

A cold date costs one open-interest call plus one greeks call per expiration inside 60 DTE — about 90 seconds for a QQQ session. The result is then cached permanently, because a past instant's chain never changes: the second call answers in milliseconds. Backfilling a long range is best done as a background sweep, not inside a request loop.

Method

GEX is computed non-naively: each strike's gamma is evaluated at that strike (Black-Scholes, using each contract's own implied vol and expiry) — its hedging force when price actually trades there — not with today's spot-decayed gamma, which would make far walls invisible and glue levels to spot. Net regimes are evaluated at the current spot; the flip is root-found along the spot axis. Levels are computed on the deep ETF option surface (QQQ for NQ, SPY for ES, etc.) and mapped onto the future via the live price ratio; single names are computed on the name's own chain.

note

GEX levels are context, not signals. Our own 7-year backtests show touching a big strike is not an edge by itself — what carries information is the regime. Refreshed continuously (chains ~90s, quotes live).