API Documentation

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/

Responses are JSON by default, GeoJSON for spatial endpoints. Set ?format=geojson or ?format=json to override.

#Quickstart

Get all active NWS alerts in Oklahoma:

curl
curl "https://atmostorm.com/api/v1/alerts?state=OK&active=true"

Observations within 50 km of Norman, OK:

curl
curl "https://atmostorm.com/api/v1/observations?point=35.22,-97.44&radius=50km"

An HRRR point forecast with the next 12 hours:

curl
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 pass it in either a header or a query string:

header
X-API-Key: wx_abc123…
query
https://atmostorm.com/api/v1/alerts?api_key=wx_abc123…
Treat keys like passwords — they grant access to your rate bucket. Rotate or revoke on your dashboard at any time.

#Rate limits

Limits are per-minute, rolling. You'll get a 429 Too Many Requests if you exceed them.

TierRequests / minHow
Anonymous60Per IP
Authenticated600Per 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.

Spatial filters
bbox
w,s,e,n
Bounding box — west, south, east, north (decimal degrees). Example: bbox=-100,33,-95,38.
point
lat,lon
Center a radius search on this lat/lon. Combine with radius.
radius
Nkm | Nmi
Distance from point. Supports km and mi suffixes. Example: radius=100km.
state
string
US state abbreviation (e.g., OK, TX). Shortcut for a bbox.
wfo
string
NWS Weather Forecast Office ID (e.g., OUN, FWD). Alerts scoped to that office's CWA.
Temporal filters
start
ISO 8601
Earliest timestamp to include. Example: 2026-04-19T12:00:00Z.
end
ISO 8601
Latest timestamp to include.
latest
bool
If true, returns only the most recent record per entity (station, alert, etc.).
Pagination & output
limit
int (1–1000)
Max results. Defaults vary by endpoint.
offset
int
Skip N results for pagination.
format
geojson | json
Response shape. Defaults to geojson for spatial endpoints, json otherwise.
units
imperial | metric | si
Convert numeric output. Internally everything is SI (Kelvin, m/s, Pa, mm). Defaults to imperial for US readability.

#Errors

Errors return a JSON body with a detail field:

json
{
  "detail": "Invalid bbox: expected 4 numbers separated by commas"
}
StatusMeaning
400Bad request — malformed params (e.g. invalid bbox)
401Unauthenticated — required for /account and /admin
403Forbidden — admin-only endpoint or wrong key scope
404Not found — no such alert / sounding / etc.
429Rate limit exceeded — back off and retry
5xxServer error — transient, retry with backoff

#Response formats

Spatial endpoints return a GeoJSON FeatureCollection by default:

json
{
  "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:

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:

SourceRefresh
NWS alerts30 s
NWS observations5 min
MRMS radar composite2 min
GOES-16 satellite5 min
SPC outlooks / watches15 min
HRRR modelhourly
Soundings12 h
USGS river gauges15 min

#Terms & attribution

The data we aggregate is public domain or openly licensed. Please keep attribution on the data sources when you display any derived product.

Not a life-safety source. Atmostorm is an independent aggregator and is not a substitute for the National Weather Service. For life-safety decisions, always verify with the NWS directly.