API reference
Quickstart
The Vatio API is REST over HTTPS; every response is JSON (CSV on history endpoints).
One uniform shape covers all seven US grids — swap the {iso} path segment. The
base URL is http://localhost:8000. Grab your API key from the
dashboard,
then send it on every request as the X-API-Key header.
# get your free key from the dashboard, then pull the latest SP15 price $ curl http://localhost:8000/v1/caiso/lmp/realtime?hub=SP15 \ -H "X-API-Key: vt_live_…"
The machine-readable schema is at /openapi.json.
Authentication
Every request is authenticated with your secret API key, sent as the
X-API-Key header:
X-API-Key: vt_live_…
Create, reveal and revoke keys in your dashboard — each key is shown once, so store it securely. Keep it secret: anyone with your key can spend your quota.
Plans & limits
Your plan controls four things: how many calls per month, requests per second, how fresh the data is (free is 15-minutes delayed; paid is live), and how far back history goes. See pricing.
| Plan | Price | Calls / mo | Rate | Data | History |
|---|---|---|---|---|---|
free | $0 | 1,000 | 1 / s | 15-min delayed | 7 days |
indie | $29 | 50,000 | 5 / s | Live | 90 days |
business | $99 | 500,000 | 20 / s | Live + websocket | 2 years |
scale | Contact | Custom | 100 / s | Live + websocket | 10 years |
Track your month-to-date usage any time in your dashboard.
Errors & rate limits
Standard HTTP status codes; the body is always
{"detail": "…"}. Exceed your per-second rate and you'll get
429 — back off and retry.
| Code | Meaning |
|---|---|
400 | Bad request — e.g. an unknown hub. |
401 | Missing or invalid API key / session token. |
404 | No data available yet for that query. |
422 | Invalid parameters (e.g. password under 8 chars). |
429 | Rate limit exceeded for your plan. |
503 | Billing not configured (Stripe keys absent). |
Grids & coverage
Every data endpoint is the same shape across grids — just swap the {iso}
path segment. Authenticate with your API key (X-API-Key). Timestamps are UTC;
prices are $/MWh, power is MW. Free callers see data ≥ 15 min old.
{iso} | Operator | Prices (LMP) | Demand | Fuel mix |
|---|---|---|---|---|
caiso | California ISO | ✅ live | ✅ | ✅ |
ercot | ERCOT (Texas) | rolling out | ✅ | ✅ |
pjm | PJM | rolling out | ✅ | ✅ |
miso | Midcontinent ISO | rolling out | ✅ | ✅ |
nyiso | New York ISO | rolling out | ✅ | ✅ |
isone | ISO New England | rolling out | ✅ | ✅ |
spp | Southwest Power Pool | rolling out | ✅ | ✅ |
Demand and the full fuel mix are live for all seven grids (hourly, via
EIA-930). Prices are CAISO-only today (5-minute, via OASIS) and roll out
to the other grids one at a time — price endpoints return 404 for grids that
aren't wired yet. Hubs per grid are listed by /v1/public/isos.
Prices (LMP)
Latest real-time price (RTD LMP) for a hub.
| Param | Type | Notes |
|---|---|---|
hub | string | Defaults to the ISO's primary hub. CAISO: NP15, SP15, ZP26. |
$ curl http://localhost:8000/v1/caiso/lmp/realtime?hub=SP15 \ -H "X-API-Key: vt_live_…"
200{ "iso": "caiso", "hub": "SP15", "market": "RTD", "interval_start": "2026-06-27T18:05:00Z", "price": -15.63, "unit": "$/MWh" }
Historical price series for a hub, oldest-first. Window is clamped to your plan's history depth.
| Param | Type | Notes |
|---|---|---|
hub | string | Defaults to the ISO's primary hub. |
start | ISO-8601 | Default: 24h before end. |
end | ISO-8601 | Default: now (minus plan delay). |
limit | int | 1–5000, default 500. |
format | string | json (default) or csv. |
200{ "iso": "caiso", "hub": "SP15", "market": "RTD", "unit": "$/MWh", "delayed_minutes": 0, "count": 2,
"data": [
{ "interval_start": "2026-06-27T18:20:00Z", "price": -16.71 },
{ "interval_start": "2026-06-27T18:25:00Z", "price": -17.04 }
] }
Demand
Latest system demand (actual + forecast), in MW.
200{ "iso": "ercot", "interval_start": "2026-06-27T18:00:00Z", "actual_mw": 67160.0, "forecast_mw": 66890.0, "unit": "MW" }
Historical demand series. Same start / end / limit / format params as /lmp/history.
200{ "iso": "ercot", "unit": "MW", "delayed_minutes": 0, "count": 168,
"data": [ { "interval_start": "2026-06-27T17:00:00Z", "actual_mw": 66740.0, "forecast_mw": 66510.0 } ] }
Generation (fuel mix)
Generation by fuel type, in MW — the full mix (gas, nuclear, coal, hydro, wind, solar, battery, oil, other). Hourly for every grid.
Latest generation mix for a grid.
200{ "iso": "ercot", "interval_start": "2026-06-27T16:00:00Z",
"mix": { "nuclear": 4900, "coal": 8200, "gas": 38000, "wind": 9100, "solar": 14500, "battery": 1200, "other": 600 },
"total_mw": 76500, "unit": "MW" }
Historical fuel-mix series. Accepts start / end / limit / format=csv (one column per fuel).
200{ "iso": "ercot", "fuels": ["nuclear","coal","gas","wind","solar","battery","other"], "unit": "MW", "delayed_minutes": 0, "count": 24,
"data": [ { "interval_start": "2026-06-27T15:00:00Z", "mix": { "gas": 37500, "wind": 9400, "solar": 15200 } } ] }
Renewables (solar + wind)
A convenience view of the two variable renewables, derived from the fuel mix.
200{ "iso": "caiso", "interval_start": "2026-06-27T18:05:00Z", "solar_mw": 19672.0, "wind_mw": 3261.0, "unit": "MW" }
Historical solar + wind series. Same params as /lmp/history (incl. format=csv).
Output formats
All responses are JSON by default. Every */history endpoint also accepts
?format=csv for a download that drops straight into pandas or a spreadsheet:
$ curl http://localhost:8000/v1/ercot/generation/history?format=csv \ -H "X-API-Key: vt_live_…" -o ercot_generation.csv
CSV columns mirror the JSON fields (for fuel mix, one column per fuel).
Preview endpoints (no key)
These power the public live dashboard and landing demo. They're 15-minute delayed and need no key — handy for a quick look before you sign up.
Catalog of grids for the dashboard picker — slug, code, hubs, and whether prices are live.
Snapshot plus series for prices, demand and the fuel mix for one grid, in a single call. iso = any slug, hours = 1–168.
One metric (demand or price) across every grid, for the compare chart.
CAISO landing snapshot: hub prices plus demand, solar and wind.