Atmostorm REST API
A single, consistent API for severe weather data from the NWS, SPC, IEM, NEXRAD, GOES, HRRR, USGS, and more. Everything is GeoJSON-first with spatial filters, real-time-ish update cadence, and free public access.
#Base URL
All endpoints are under /api/v1:
https://atmostorm.com/api/v1/
Spatial endpoints return a GeoJSON FeatureCollection; everything else returns plain JSON. The shape is fixed per endpoint and isn't negotiable via a query parameter.
#Quickstart
Get all active NWS alerts in Oklahoma:
curl "https://atmostorm.com/api/v1/alerts?state=OK&active=true"
Observations within 50 km of Norman, OK:
curl "https://atmostorm.com/api/v1/observations?point=35.22,-97.44&radius=50km"
An HRRR point forecast with the next 12 hours:
curl "https://atmostorm.com/api/v1/models/hrrr/point?lat=35.22&lon=-97.44&hours=12"
#Authentication
The API is free and open. You can call every public endpoint anonymously. Passing an API key increases your rate limit and removes per-IP throttling.
Create a key from your account dashboard (requires a free login) and send it in the X-API-Key request header:
curl -H "X-API-Key: wx_abc123…" "https://atmostorm.com/api/v1/alerts"
#CORS & browser apps
The public data endpoints send Access-Control-Allow-Origin: *, so you can call them directly from a browser app on any origin — no proxy needed. Send your key in the X-API-Key header as usual; it works cross-origin.
The X-RateLimit-* and Retry-After response headers are exposed to cross-origin JavaScript, so your client can read its own budget and back off properly.
GET). Account and auth endpoints are session-based and restricted to atmostorm.com — they aren't part of the public API.#Rate limits
Limits are per-minute, rolling. You'll get a 429 Too Many Requests if you exceed them.
| Tier | Requests / min | How |
|---|---|---|
| Anonymous | 300 | Per IP |
| Authenticated | 3,000 | Per key |
Need more? Email hello@atmostorm.com and describe your use case — we'll work with public-good projects and operational users.
#Common query parameters
Most spatial endpoints share the same filter vocabulary. Mix and match freely — they compose as an AND.
bboxpointradiusstatewfostartendlatestlimitoffsetunits#Errors
Errors return a JSON body with a detail field:
{
"detail": "Invalid bbox: expected 4 numbers separated by commas"
}| Status | Meaning |
|---|---|
| 400 | Bad request — malformed params (e.g. invalid bbox) |
| 401 | Unauthenticated — required for /account and /admin |
| 403 | Forbidden — admin-only endpoint |
| 404 | Not found — no such alert / sounding / etc. |
| 429 | Rate limit exceeded — back off and retry |
| 5xx | Server error — transient, retry with backoff |
#Response formats
Spatial endpoints return a GeoJSON FeatureCollection by default:
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": { "type": "Polygon", "coordinates": [...] },
"properties": {
"id": 42,
"event": "Tornado Warning",
"severity": "Extreme",
"expires": "2026-04-19T22:15:00Z"
}
}
]
}For non-spatial data (e.g. HRRR point forecasts), you get plain JSON:
{
"lat": 35.22,
"lon": -97.44,
"elevation_m": 365.2,
"run": "2026-04-19T12:00:00Z",
"times": ["2026-04-19T13:00:00Z", ...],
"variables": { "t2m_c": [...], "cape_jkg": [...] }
}#Update cadence
Each source runs on its own cadence — we poll, normalize, and deduplicate server-side so you don't have to:
| Source | Refresh |
|---|---|
| NWS alerts | 30 s |
| NWS observations | 5 min |
| MRMS radar composite | 2 min |
| GOES-16 satellite | 5 min |
| SPC outlooks / watches | 15 min |
| HRRR model | hourly |
| Soundings | 12 h |
| USGS river gauges | 15 min |
#Terms & attribution
Almost everything we serve is a US Government work (public domain by statute) or plain meteorological fact, so we claim no rights over it. Our output is released under CC0 1.0 — use it for anything, commercial or not, no permission needed.
Attribution is a request, not a requirement: if you display a derived product, please credit the data sources — it helps people verify what they're looking at.
CC0 covers the data. It doesn't waive these terms of use — the rate limits above, no abuse, and the disclaimer below still govern access to the service.