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:
| Tier | Per minute | Per day |
|---|---|---|
| Pro API | 60 | 50,000 |
| Trader API | 300 | unlimited |
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:
| Code | Meaning |
|---|---|
| 400 | Malformed request — bad query parameter, invalid header. |
| 401 | Missing or invalid Authorization header. |
| 403 | Endpoint or ticker requires a higher tier. |
| 404 | Path not found — verify URL spelling. |
| 410 | Key revoked / regenerated. Reauthenticate or rotate. |
| 429 | Rate limit hit. Use Retry-After header. |
| 5xx | Server 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.
| Endpoint | Min tier | Notes |
|---|---|---|
| /api/v1/radar | Starter+ | Ticker + DTE gated by plan. |
| /api/v1/spot | Public | No auth required. |
| /api/v1/history | Starter+ | Lookback gated: 7d / 14d / 30d. |
| /api/v1/heatmap | Pro+ | |
| /api/v1/greeks | Trader | DEX, VEX, CEX (Charm/Vanna/Vomma). |
| /api/v1/premium-map | Trader | |
| /api/v1/volume | Pro+ | Requires active 0DTE session. |
Radar
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
| Name | Type | Required | Description |
|---|---|---|---|
| ticker | string | no | Ticker symbol (default SPY). Must be in your tier's whitelist. |
| dte | int | no | DTE 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
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
| Name | Type | Required | Description |
|---|---|---|---|
| ticker | string | no | Ticker 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
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
| Name | Type | Required | Description |
|---|---|---|---|
| ticker | string | no | Ticker symbol (default SPY). |
| minutes | int | no | Lookback in minutes (default 30, max 43,200 = 30 days). Clamped to your tier's cap (see below). |
Lookback caps by tier
| Tier | Max minutes | Equivalent |
|---|---|---|
| Starter | 10,080 | 7 days |
| Pro / Pro API | 20,160 | 14 days |
| Trader / Trader API | 43,200 | 30 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
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
| Name | Type | Required | Description |
|---|---|---|---|
| ticker | string | no | Ticker 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
Per-strike Greeks Exposure: Delta (DEX), Vanna trigger, Charm flow, Vomma. Includes IV, OI, and computed dealer-hedge contributions. Trader API addon required.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| ticker | string | no | Ticker symbol (default SPY). |
| dte | string | no | DTE filter (preferred): "0", "1", "7", "30", or omit for all expirations. |
| dte_bucket | string | no | Legacy: 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
Premium concentration by strike: OI × price × 100 (dollar premium). All expirations pre-computed so you can filter client-side without round-trips.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| ticker | string | no | Ticker 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
Live 0DTE per-contract volume from Massive's per-minute aggregates WebSocket. Returns cumulative volume since session start + last-minute volume per contract.
active=false and rows=[]. The dashboard auto-starts sessions during market hours; the API does not (yet).
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| ticker | string | no | Ticker 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.