Wall Trader API
Everything on the Wall Trader dashboard, as JSON: SPX 0DTE support and resistance, the sold walls, dealer Greek exposure by strike, Trend Matrix, market internals, sectors, the options tape and the community's strategies. Live while the market is open, and any past session minute by minute.
- Base URL:
https://api.walltrader.io/v1 - Try it in the browser: Swagger UI · Reference: ReDoc · Spec: openapi.json
1. Get a key
Sign in to Wall Trader and open Account → API keys (walltrader.io/auth/account#api).
Create a key, give it a name, and copy it: it starts with wt_ and is shown once. You can make several keys (one per app) and
revoke any of them; a revoked key stops working at once.
Keep keys secret. Anyone with your key can read the API as you. Don't put a key in a web page or a public repository.
2. Make a request
Send the key in the Authorization header:
curl -H "Authorization: Bearer $WT_KEY" https://api.walltrader.io/v1/levels
X-API-Key: wt_… works too.
Python
import os, requests
API = "https://api.walltrader.io/v1"
H = {"Authorization": f"Bearer {os.environ['WT_KEY']}"}
lv = requests.get(f"{API}/levels", headers=H, timeout=10).json()
for s in lv["data"]["supports"]:
print(s["label"], s["strike"], s["contracts"])
JavaScript (Node 18+)
const r = await fetch("https://api.walltrader.io/v1/exposure/gex?around=100", {
headers: { Authorization: `Bearer ${process.env.WT_KEY}` },
});
const { meta, data } = await r.json();
console.log(meta.time, "GEX MVC", data.mvc, "total", data.total);
3. Sessions and replay
| Parameter | Meaning |
|---|---|
| (none) | the latest session: live while the market is open (09:30–16:00 New York), else the last session's close |
day=YYYY-MM-DD |
a past session |
at=HH:MM |
a minute of that session, New York time (09:30–16:00) — replay it as it stood then |
symbol=SPX |
where the endpoint says so: SPX (default), SPY, QQQ, IWM, DIA, NDX, RUT |
curl -H "Authorization: Bearer $WT_KEY" "https://api.walltrader.io/v1/levels?day=2026-10-16&at=12:15"
4. What comes back
Every answer has the same shape:
{
"meta": {"endpoint": "levels", "symbol": "SPX", "day": "2026-10-16", "time": "12:15", "live": false, "generated_at": 1792500000},
"data": {
"spot": 7703.52, "group": "grp5", "counts": "open",
"supports": [{"label": "S1", "strike": 7680, "contracts": 1304, "distance_pct": -0.306}, "…"],
"resistances": [{"label": "R1", "strike": 7750, "contracts": 1273, "distance_pct": 0.603}, "…"]
}
}
meta.live is true for the live session. The X-Data-Age header says how many seconds ago the answer was built.
5. Endpoints
| Endpoint | What it gives |
|---|---|
GET /v1/market |
price, open, change, implied vol, expected move left, range band, gamma regime, net GEX, VIX |
GET /v1/market/path |
price and 0DTE implied vol once a minute |
GET /v1/market/vix |
VIX now, previous close, open / high / low, path |
GET /v1/levels |
live S1–S3 / R1–R3 as on the dashboard's main chart, with contracts |
GET /v1/levels/preopen |
the pre-open S1–S3 / R1–R3 from earlier sessions' book |
GET /v1/walls |
every sold wall: calls (resistance), puts (support), contracts, distance |
GET /v1/exposure/{greek} |
gex, dex, vanna, charm by strike: net, calls, puts, total, MVC |
GET /v1/exposure |
net GEX, DEX, vanna, charm once a minute |
GET /v1/trend-matrix |
Trend Matrix rows and the overall score (series=true for every minute) |
GET /v1/rvolm |
relative volume by moneyness |
GET /v1/internals |
NYSE / Nasdaq breadth, TICK, the internals bias |
GET /v1/sectors |
S&P 500 sectors: cap-weighted move vs breadth |
GET /v1/extremes |
how likely the high / low are in |
GET /v1/opening-sigma |
previous close ± 1, 2, 3 σ |
GET /v1/straddle |
the 0DTE at-the-money straddle through the day |
GET /v1/flow/spreads |
the day's vertical spreads on the tape, largest first, and totals by type |
GET /v1/flow/feed |
the dashboard's signal feed, newest first |
GET /v1/strategies |
strategies shared in the community, with their forward tests |
GET /v1/strategies/{id} |
one shared strategy: forward test day by day, trades |
GET /v1/sessions |
sessions with data |
GET /v1/status |
service status (no key needed) |
Every endpoint, parameter and field is in the reference; you can call them from Swagger with Authorize and your key.
6. Freshness and speed
Live answers are rebuilt every few seconds during the session and served from memory, so a request answers in milliseconds. There's no need to poll faster than every 5 seconds. A past session's answers never change.
7. Limits and errors
Each key may make 60 requests a minute. Every answer carries X-RateLimit-Limit, X-RateLimit-Remaining and
X-RateLimit-Reset (seconds); past the limit you get 429 with Retry-After.
Errors are JSON: {"error": {"code": "…", "message": "…"}}.
| Status | Code | When |
|---|---|---|
| 401 | no_key, bad_key |
no key, a revoked key, or an account that can't use the API |
| 400 | bad_request, bad_symbol |
a parameter isn't valid |
| 404 | not_found |
no such strategy |
| 429 | rate_limited |
over 60 requests a minute |
| 503 | not_available |
that session or minute has no data yet |
8. Fine print
The data is for information only and is not investment advice; your use of it is covered by the
Terms and Conditions and the risk disclaimer.
Don't resell or republish the data. The API is versioned: /v1 keeps its fields; new fields may be added.