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/

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
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 send it in the X-API-Key request header:

curl
curl -H "X-API-Key: wx_abc123…" "https://atmostorm.com/api/v1/alerts"
Treat keys like passwords — they grant access to your rate bucket. Keys are hashed at rest, so the full value is shown only once, at creation. Rotate or revoke on your dashboard at any time.

#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.

Cross-origin access is read-only (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.

TierRequests / minHow
Anonymous300Per IP
Authenticated3,000Per 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.
units
imperial | metric | si
Convert numeric output. Internally everything is stored SI (Kelvin, m/s, Pa, mm). Currently supported on /observations only, where it defaults to metric; other endpoints return stored SI values.

#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
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

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.

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.