Quickstart
Three steps from zero to your first API call. Plan to spend about a minute on this.
Add API access & copy your key One-time charge prorated against your current billing cycle
Go to gexboard.com/account and find the API Access card. Click Add API Access. After Stripe confirms your payment, your key is shown once — copy it immediately to a password manager or .env file.
Your key looks like this:
Treat it like a password. Anyone with this key can read your GEXBoard data — and consume your rate limit.
Set the Authorization header Bearer token · same as Stripe / GitHub / OpenAI
Every request needs an Authorization: Bearer <your-key> header. No query string auth, no other transport. Use HTTPS only — http:// is not supported.
Don't hardcode the key in source. Read from environment variable, secrets manager, or .env:
# .env file (gitignored)
GEXBOARD_API_KEY=gxb_live_AbCdEfGh1JKLmnopQRSTuvwxYZ012345_aBcD
export GEXBOARD_API_KEY="gxb_live_…" curl "https://gexboard.com/api/v1/radar?ticker=SPY" \ -H "Authorization: Bearer $GEXBOARD_API_KEY"
import os from dotenv import load_dotenv load_dotenv() KEY = os.environ["GEXBOARD_API_KEY"]
Make your first call GET /api/v1/radar?ticker=SPY
Pull the live GEX snapshot for SPY. This is the same payload your dashboard sees — Net GEX, Call Wall, Put Wall, Gamma Flip, dealer regime, and per-strike contributions.
curl "https://gexboard.com/api/v1/radar?ticker=SPY&dte=0" \ -H "Authorization: Bearer $GEXBOARD_API_KEY" \ -H "Accept: application/json"
import os import requests KEY = os.environ["GEXBOARD_API_KEY"] r = requests.get( "https://gexboard.com/api/v1/radar", params={"ticker": "SPY", "dte": 0}, headers={"Authorization": f"Bearer {KEY}"}, timeout=10, ) r.raise_for_status() data = r.json() print("Net GEX: ", data["net_gex"]) print("Call Wall: ", data["call_wall"]) print("Put Wall: ", data["put_wall"]) print("Gamma Flip: ", data["gamma_flip"]) print("Regime: ", data["dealer_mode"])
Expected response (truncated):
{
"ticker": "SPY",
"spot": 737.62,
"net_gex": 2.4e9,
"call_wall": 745,
"put_wall": 730,
"gamma_flip": 735.5,
"dealer_mode": "positive_gamma",
"strikes": [...],
"updated_at": "2026-05-08T22:55:30Z"
}
That's it. You're calling the same engine your dashboard uses, with the same per-second freshness during 0DTE sessions.
Common gotchas
Authorization header. Verify the value starts with Bearer (with a space) and the key starts with gxb_live_. Don't include the angle brackets from documentation./api/v1/greeks, /api/v1/premium-map, and the 30-day history range require Trader API. Upgrade in /account or use a Pro-tier endpoint.Retry-After header in seconds. Back off and resume.updated_at should be within 1–3 seconds of "now" for 0DTE and within 30 seconds for non-0DTE chains. Pre/post-market and weekends, the snapshot reflects the most recent close. Don't poll faster than 1/sec — you'll burn rate limit without getting fresher data.