API  /  Reference

Reference

Every public endpoint, parameter, response field, tier requirement, and rate limit. Base URL: https://gexboard.com. All paths return JSON.

Authentication

Every request requires an Authorization header with a Bearer token, except /api/v1/spot which is public (it returns the same data the dashboard's logged-out landing preview uses).

Authorization: Bearer gxb_live_AbCdEfGh1JKLmnopQRSTuvwxYZ012345_aBcD

Keys live forever until you regenerate or cancel the addon. Each key is tied to one paid subscriber; do not share keys across teams (see terms). Manage keys at /account.

Rate limits

Per-minute and per-day caps depend on your addon tier. The window is rolling:

TierPer minutePer day
Pro API6050,000
Trader API300unlimited

When you cross a cap, responses return HTTP 429 with a Retry-After header (seconds). Counters reset at the boundary, not on a fixed timer.

Practical guidance: don't poll faster than 1 request per second per ticker — the underlying chain refreshes every ~1 s for 0DTE and ~110 s otherwise, so faster polling burns rate limit without producing fresher data.

Errors

All errors return JSON: {"detail": "..."}. Common codes:

CodeMeaning
400Malformed request — bad query parameter, invalid header.
401Missing or invalid Authorization header.
403Endpoint or ticker requires a higher tier.
404Path not found — verify URL spelling.
410Key revoked / regenerated. Reauthenticate or rotate.
429Rate limit hit. Use Retry-After header.
5xxServer error. Retry with exponential backoff.

Tiers

Each endpoint requires a minimum tier. Pro API addon inherits the Pro plan's data scope; Trader API addon inherits the Trader plan's. Owner customers (debug only) bypass all tier gates.

EndpointMin tierNotes
/api/v1/radarStarter+Ticker + DTE gated by plan.
/api/v1/spotPublicNo auth required.
/api/v1/historyStarter+Lookback gated: 7d / 14d / 30d.
/api/v1/heatmapPro+
/api/v1/greeksTraderDEX, VEX, CEX (Charm/Vanna/Vomma).
/api/v1/premium-mapTrader
/api/v1/volumePro+Requires active 0DTE session.

Radar

GET/api/v1/radarStarter+

Live GEX snapshot for a ticker. Returns Net GEX, Call/Put Walls, Gamma Flip, dealer regime, and per-strike contributions. Same payload the dashboard renders.

Parameters

NameTypeRequiredDescription
tickerstringnoTicker symbol (default SPY). Must be in your tier's whitelist.
dteintnoDTE filter: 0=0DTE, 1=1DTE, 7=Weekly, 30=Monthly. Omit = all expirations. Range 0–365. Starter cannot pass 0 or 1.

Example

curl "https://gexboard.com/api/v1/radar?ticker=SPY&dte=0" \
  -H "Authorization: Bearer $GEXBOARD_API_KEY"
import os, requests
r = requests.get("https://gexboard.com/api/v1/radar",
    params={"ticker": "SPY", "dte": 0},
    headers={"Authorization": f"Bearer {os.environ['GEXBOARD_API_KEY']}"},
    timeout=10)
data = r.json()

Response

{
  "ticker":        "SPY",
  "spot":          737.62,
  "net_gex":       2.4e9,             // signed dollar gamma
  "call_wall":     745,               // strike with max NET call gamma
  "put_wall":      730,               // strike with max NET put gamma
  "gamma_flip":    735.5,             // zero-gamma level
  "dealer_mode":   "positive_gamma",  // or "negative_gamma"
  "strikes":       [
    { "k": 730, "net_gex": -3.2e8, "call_gex": 1.1e8, "put_gex": -4.3e8 },
    ...
  ],
  "updated_at":    "2026-05-08T22:55:30Z"
}

Spot

GET/api/v1/spotPublic

Latest cached spot price for a ticker. Source: Finnhub WebSocket (real-time during market hours) → REST fallback → mock for offline. No authentication required — same data the logged-out landing preview uses.

Parameters

NameTypeRequiredDescription
tickerstringnoTicker symbol (default SPY).

Response

{
  "ticker":      "SPY",
  "spot":        737.62,
  "price":       737.62,           // alias for spot
  "change_amt":  6.04,
  "change_pct":  0.8256,
  "source":      "finnhub",         // or "yahoo", "massive", "mock_change"
  "updated_at":  "2026-05-08T22:55:30Z"
}

History

GET/api/v1/historyStarter+

Time-series history of GEX snapshots for a ticker. Each row is a snapshot at the time the radar engine ran (~1/min during market hours, less frequent otherwise). Tier gates the maximum lookback window.

Parameters

NameTypeRequiredDescription
tickerstringnoTicker symbol (default SPY).
minutesintnoLookback in minutes (default 30, max 43,200 = 30 days). Clamped to your tier's cap (see below).

Lookback caps by tier

TierMax minutesEquivalent
Starter10,0807 days
Pro / Pro API20,16014 days
Trader / Trader API43,20030 days

Response

{
  "ticker": "SPY",
  "rows": [
    { "ts": "2026-05-08T13:30:00Z", "spot": 734.10, "net_gex": 1.8e9,
      "call_wall": 740, "put_wall": 728, "gamma_flip": 733,
      "dealer_mode": "positive_gamma" },
    ...
  ],
  "window_minutes": 30,
  "clamped":        false       // true if your request exceeded tier cap
}

Heatmap

GET/api/v1/heatmapPro+

Strike × expiry GEX matrix from the in-memory chain (refreshed every ~110 s, 24/7). Useful for visualizing concentration and spotting which expiry drives a wall.

Parameters

NameTypeRequiredDescription
tickerstringnoTicker symbol (default SPY). Must be in your tier's whitelist.

Response

{
  "ticker": "SPY",
  "spot":   737.62,
  "strikes": [730, 735, 740, ...],
  "expiries": ["2026-05-09", "2026-05-16", ...],
  "matrix":   [[-3.2e8, 2.1e8, ...], ...],   // rows = strikes, cols = expiries
  "updated_at": "2026-05-08T22:55:30Z"
}

Greeks

GET/api/v1/greeksTrader

Per-strike Greeks Exposure: Delta (DEX), Vanna trigger, Charm flow, Vomma. Includes IV, OI, and computed dealer-hedge contributions. Trader API addon required.

Parameters

NameTypeRequiredDescription
tickerstringnoTicker symbol (default SPY).
dtestringnoDTE filter (preferred): "0", "1", "7", "30", or omit for all expirations.
dte_bucketstringnoLegacy: 0dte / weekly / monthly / quarterly / leaps / all. If both supplied, dte wins.

Response

{
  "ticker": "SPY",
  "spot":   737.62,
  "strikes": [
    { "k": 730, "iv": 0.124, "delta": -0.32, "oi": 12450,
      "dex": -2.95e8, "charm_flow": 1.2e6, "vanna_trigger": 2.4e7,
      "vomma": 8.1e5 },
    ...
  ],
  "net_dex":    5.2e8,
  "net_charm":  -1.4e7,
  "updated_at": "2026-05-08T22:55:30Z"
}

Premium Map

GET/api/v1/premium-mapTrader

Premium concentration by strike: OI × price × 100 (dollar premium). All expirations pre-computed so you can filter client-side without round-trips.

Parameters

NameTypeRequiredDescription
tickerstringnoTicker symbol (default SPY).

Response

{
  "ticker": "SPY",
  "spot":   737.62,
  "by_expiry": {
    "2026-05-09": [
      { "k": 735, "call_premium": 2.4e7, "put_premium": 8.9e6,
        "net_premium": 1.5e7 },
      ...
    ],
    "2026-05-16": [...]
  },
  "updated_at": "2026-05-08T22:55:30Z"
}

Volume

GET/api/v1/volumePro+

Live 0DTE per-contract volume from Massive's per-minute aggregates WebSocket. Returns cumulative volume since session start + last-minute volume per contract.

Note: Volume requires an active 0DTE session for the ticker. A session starts when (a) a paying dashboard user toggles VOL on for the ticker, or (b) admin starts one explicitly. If no session is active, this returns active=false and rows=[]. The dashboard auto-starts sessions during market hours; the API does not (yet).

Parameters

NameTypeRequiredDescription
tickerstringnoTicker symbol (default SPY). Must be in your tier's whitelist.

Response

{
  "ticker": "SPY",
  "spot":   737.62,
  "active": true,
  "rows": [
    { "contract":    "O:SPY260508C00738000",
      "strike":      738.0,
      "type":        "C",            // "C" or "P"
      "volume":      346253,         // cumulative since session start
      "last_minute": 234 },           // volume in latest minute bar
    ...
  ],
  "updated_at": "2026-05-08T22:55:30Z"
}

Need something else?

Webhooks, additional fields, custom rate limits, or Enterprise (with redistribution rights): contact@gexboard.com. Reply within 24h.