ERCOT Market Data

Texas grid prices, load & congestion

Get a key

REST · JSON · v1

One key, six endpoints, no SDK required.

Everything the dashboard draws is available as JSON over HTTPS. Authenticate with a bearer token, pass a range, get back a typed envelope that tells you exactly how fresh the data is and how much quota you have left.

Getting started

Authentication

Every request needs an API key, sent either as a bearer token or in X-API-Key. Keys are shown once when created and stored only as SHA-256 hashes — if you lose one, issue a new key and revoke the old. We cannot recover it for you, by design.

curl https://ercot.tonal-data-analytics.com/api/v1/prices \
  -H "Authorization: Bearer ek_live_YOUR_KEY"

# equivalently
curl https://ercot.tonal-data-analytics.com/api/v1/prices \
  -H "X-API-Key: ek_live_YOUR_KEY"

The delay is the product boundary

Free keys receive the same data, held back 60 minutes from the moment we ingest it. The delay applies to publication time, not delivery time — so tomorrow’s cleared day-ahead prices and the seven-day load forecast are still present on a free key, just an hour after a paid key saw them.

Read meta.realtime rather than inferring freshness from timestamps.

"meta": {
  "range": "24h",
  "generatedAt": "2026-07-27T18:04:11.220Z",
  "plan": "free",
  "realtime": false,
  "delayMinutes": 60,
  "historyDays": 1
}

Reference

Endpoints

openapi.json

Base URL https://ercot.tonal-data-analytics.com/api/v1. All endpoints accept ?range=24h|7d|30d, clamped to the history depth your plan allows.

EndpointReturnsERCOT product
GET /pricesReal-time and day-ahead settlement point pricesNP6-905-CD, NP4-190-CD
GET /loadActual system load against the current forecast vintageNP6-345-CD, NP3-565-CD
GET /renewablesWind and solar, actual against forecast, plus generation mixNP4-732-CD, NP4-737-CD
GET /ancillaryDay-ahead ancillary service clearing pricesNP4-188-CD
GET /congestionBinding transmission constraints by shadow priceNP6-86-CD
GET /snapshotCurrent headline market figuresmultiple

Quota & rate limits

Every response carries your quota state, so you never need a separate call to check it.

X-Quota-Limit:     1000
X-Quota-Used:      26
X-Quota-Remaining: 974

Exceeding the per-minute ceiling returns 429 with Retry-After. Rate-limited requests do not consume monthly quota — only successful responses are counted — so a retry storm costs you nothing but a wait.

Errors

Errors return a JSON body with a stable code. Branch on that, not on the human-readable message.

StatusCodeMeaning
401missing_api_keyNo key supplied.
401invalid_api_keyUnknown or revoked key.
429rate_limitPer-minute ceiling hit. Retry after the header says.
429monthly_quotaMonthly allowance spent. Upgrade or wait for reset.
500internal_errorOur fault — not billed.

Limits by plan

See pricing

Read from the same records the API enforces, so this table cannot drift from reality.

PlanDelayHistoryCalls / monthRequests / min
FreeReal-time30 d1,00010
StarterReal-time90 d50,00060
ProReal-time730 d500,000300
EnterpriseReal-time3650 dUnmetered1,200