Community. Driven. Weather. Data. | Always Ad-Free | Developer FriendlyChecking statusDiscord
Become a supporter
Sign in
API

REST API

How the WxAlerts REST API works, what needs a key, the rate limits, the terms, and an index of every route.


Base URL: https://api.wxalerts.org

Plain HTTPS and JSON. Most routes are public: no key needed, because this site is built static and calls the same endpoints from the browser. The rest are served only under /v1 with an API key. Browsers block calls from other websites (CORS allows only wxalerts.org), so call the API from a server, script or app. Each area has its own page; the index lists every route and which kind it is. None of it is exempt from the Terms of Service; the clauses that decide what you may build are collected at the bottom.

For alerts and lightning as they happen, MQTT pushes them instead of you polling for them.

Public and keyed

public routes key-only routes
path /alerts/at /v1/alerts/active
also at /v1/alerts/at, with a key nowhere else: the bare path answers 401
who is counted your address your key
caching shared caches may cache Cache-Control: private

A key is sent as X-API-Key: wx_live_... or Authorization: Bearer wx_live_..., never in the URL. A key on a public route moves that request off your address’s budget and onto the key’s. API keys covers making one, scopes and the per-key limits.

Every route

Read routes only. Account, sign-in and admin routes belong to this site and the app and are not part of the API.

route access page
/alerts/at, /alerts/in-bounds, /alerts/ended-in-bounds, /alerts/highest-severity, /alerts/focus, /alerts/{identifier}, /alerts/page/{short_id}, /alerts/page/{short_id}/rundown public Alerts
/alerts/active, /alerts/active/geojson key only Alerts
/stats/summary, /stats/latency public Statistics
/stats/lightning/daily key only Statistics
/outlooks, /outlooks/{product}/geojson public SPC outlooks
/weather public Weather
/forecast public Forecast
/forecast/sounding key only Point soundings
/forecast/raw key only, by arrangement Raw model data
/conditions, /stations, /stations/{station_id}, /stations/{station_id}/history public Observations
/sky/outlook public Sunrise and sunset outlook
/visibility, /visibility/point key only Low visibility
/storms/active/geojson, /storms/{storm_id}/track, /storms/{storm_id}/forecast-track, /storms/{storm_id}/cone public Storm cells
/storms/active, /storms/{storm_id}, /storms/couplets/{couplet_id}/cone key only Storm cells
/lightning/flashes public Lightning
/lsr/reports public Local storm reports
/tropical/storms, /tropical/storms/{storm_id}, /tropical/storms/{storm_id}/models, /tropical/outlook, /tropical/for-place key only Tropical cyclones
/winter/at, /winter/hazards, /winter/odds, /winter/wssi key only Winter weather

Key-only routes are written with /v1 in front on their pages; public routes without it. The live schema, with every parameter, is at api.wxalerts.org/docs.

Rate limits

Unauthenticated clients get 60 requests per minute. Past that a client is presumptively unreasonable and may be throttled or blocked, per Terms §3.

Enforcement is per source address at 120 requests a minute (burst 60), across every public route together, because one address behind carrier-grade NAT or an office is many clients. Past it you get 429 with a Retry-After and RateLimit-* headers. The gap is not headroom: 60 is still the limit your client is held to. Send an API key and the request is charged to the key instead of your address.

A few routes that return a lot keep a tighter limit of their own, on top of this one, whether or not a key is sent. Their pages say so.

Sixty is more than this data justifies anyway. Alerts change on the order of minutes and the stats summary on the order of seconds, so cache what you can, send If-None-Match and take the 304, and poll on the interval your display actually refreshes at. If you have a case for more, say hello in Discord before you start rather than after you are blocked.

Keyed API access and authenticated MQTT are governed by the API Terms in Terms §20 and §21 and the limits set at issuance.

Errors

Errors carry a JSON body. The key and rate limit errors put a machine-readable code in detail:

{ "detail": { "code": "api_key_required", "message": "This endpoint needs an API key: it is served at /v1/alerts/active. ..." } }
status means
400 a bad request the route explains, such as key_in_query
401 api_key_required (a key-only route without a key) or api_key_invalid
403 insufficient_scope: the key lacks the route’s scope
404 nothing by that id, or a point outside the product’s coverage
422 a parameter is missing or out of range; detail lists which
429 rate_limited: wait Retry-After seconds
503 the data behind the route is not available yet; try again later

Terms

The full text is at /terms. Three clauses decide whether what you are building is allowed:

  • Personal, educational and research use. The license covers those (§4.1). Reselling the feed, redistributing it for gain, or building a commercial service on top of it needs written permission first (§3). The endpoints being open is not that permission; ask first.
  • Attribute, and do not imply endorsement. NWS and NOAA data stays theirs: do not claim it as your own, do not present it as official government output, and do not imply NOAA or the NWS endorses what you built (§4.3, §3). The derived products (processed GLM, ML nowcasts, anything under focus) are ours, and are not official NWS products either. Credit both: NWS/NOAA for the alert, WxAlerts for the processing.
  • No EAS or WEA tones. You may not reproduce, transmit or simulate the WEA attention signal, the EAS Attention Signal or EAS header codes, or anything substantially similar, from API output, including as a notification sound (§3.1). This one is FCC rule, not house style.

May we use Microsoft Clarity to see how pages are used (clicks, scrolling and replays of a visit, with anything you type hidden), plus a random ID linking that to crash reports? Only to find bugs and confusing screens. Never advertising, never sold.