Endpoints
Every endpoint lives under /api/v1. See the overview for auth, rate limits, and common query parameters.
#Intelligence endpoints
The endpoints that set Atmostorm apart. Instead of returning a raw feed, each one synthesizes across sources to answer a question about a specific place or object — the interpretation layer, not another data mirror. Start here; the rest of this page is the raw-data catalog they're built on.
#Alerts
Active and recent weather alerts from the NWS, normalized with polygons or affected zone arrays. Covers warnings, watches, advisories, and statements.
#List alerts
Returns a GeoJSON FeatureCollection. Accepts every common spatial & temporal filter.
activeeventseveritywfocurl "https://atmostorm.com/api/v1/alerts?state=OK&active=true&severity=Severe"
#Get a single alert
Returns the full alert record including the description text and instruction.
curl "https://atmostorm.com/api/v1/alerts/12345"
#SPC Outlooks
Storm Prediction Center convective outlooks for days 1 through 8 (categorical and probabilistic).
#List outlook polygons
dayoutlook_typecurl "https://atmostorm.com/api/v1/outlooks?day=1&outlook_type=categorical"
#SPC Watches
#List active watches
Tornado and severe thunderstorm watches with hazard parameters (max hail size, max wind, PDS flag).
curl "https://atmostorm.com/api/v1/watches?active=true"
#Mesoscale Discussions
#List SPC mesoscale discussions
Short-fuse convective discussions issued by SPC. Each includes the discussion text and bounding polygon.
curl "https://atmostorm.com/api/v1/discussions?active=true"
#Storm reports
#List storm reports
Tornado, hail, wind, and flood reports aggregated from SPC. Every report has a point geometry and (where available) a magnitude.
report_typemin_magnitudecurl "https://atmostorm.com/api/v1/reports?report_type=tornado&start=2026-04-18T00:00Z"
#Observations
#Surface observations
Surface weather observations from ASOS/AWOS (METAR) and CWOP stations. Returns temperature, dewpoint, wind, pressure, precip, and more.
stationsourcelatestcurl "https://atmostorm.com/api/v1/observations?point=35.22,-97.44&radius=50km&latest=true"
#Soundings
#List recent soundings
Upper-air soundings (RAOB), including derived parameters: CAPE, CIN, LI, PWAT, SRH, STP, SCP.
curl "https://atmostorm.com/api/v1/soundings?bbox=-100,33,-95,38&latest=true"
#Latest sounding at a station
Full vertical profile (pressure, height, T, Td, wind).
curl "https://atmostorm.com/api/v1/soundings/OUN/latest"
#HRRR model
#HRRR point forecast
Hourly forecast at a single point from the High-Resolution Rapid Refresh model. Returns multiple variables for the requested hours ahead of the latest run.
latrequiredlonrequiredhourscurl "https://atmostorm.com/api/v1/models/hrrr/point?lat=35.22&lon=-97.44&hours=12"
#List available model runs
Metadata about which model data is currently cached on disk.
#NWS forecast
#Official NWS point forecast
The official NWS/NDFD 2.5 km gridpoint hourly forecast at a point — temperature, dewpoint, humidity, precip probability, wind, and the plain-language precip-type wording (sky). Resolved through weather.gov's /points lookup and cached. Complements the HRRR point forecast, which carries the convective parameters (CAPE / SRH / shear) the public NWS forecast doesn't publish.
latrequiredlonrequiredhourscurl "https://atmostorm.com/api/v1/forecast/point?lat=35.22&lon=-97.44&hours=24"
#Lightning
#Recent lightning flashes
Total-lightning flash points (in-cloud and cloud-to-ground) from GOES-19 GLM, parsed directly from NOAA's public S3 bucket. Returns a GeoJSON FeatureCollection of point geometries with flash_time,age_seconds (relative to the request time), and optional energy_fj(femtojoules) + area_km2.
minutesbboxstatelimitcurl "https://atmostorm.com/api/v1/lightning?state=OK&minutes=10"
#River gauges
#List river gauge readings
USGS streamflow gauges with current stage, discharge, and (where available) NWS flood-stage thresholds. Each feature carries a has_forecast flag when an NWPS forecast series is available (fetch it below).
curl "https://atmostorm.com/api/v1/gauges?state=OK&latest=true"
#River forecast hydrograph
The NWPS/AHPS forecast stage & flow time series for one gauge — "will it flood, and when?". Returns forecast: null for gauges with no active forecast. Shape: { issued_at, stage_unit, flow_unit, points: [{ valid_time, stage, flow }] }.
curl "https://atmostorm.com/api/v1/gauges/12345/forecast"
#Radar tiles
MRMS radar products, rendered as map tiles suitable for dropping into any MapLibre / Mapbox / Leaflet layer. Six products are served: composite-reflectivity, base-reflectivity, mesh-30min (max hail size), rotation-30min, vil, and echo-tops — see /radar/products.
#Radar map tile
productrequiredzrequiredxrequiredyrequiredtshttps://atmostorm.com/api/v1/radar/tiles/composite-reflectivity/6/14/25.png
#Available radar products
#Available radar frames (timestamps)
Useful for building a loop / animation slider.
#Sample a product at a point
The physical value of an MRMS product at one lat/lon — e.g. "what hail size (MESH) covered this address?". Returns null where the grid is below its threshold / has no data. Value is approximate (lossy grid encoding).
latrequiredlonrequiredproducttscurl "https://atmostorm.com/api/v1/radar/point?product=mesh-30min&lat=35.22&lon=-97.44"
#Satellite tiles
GOES ABI imagery, projected to Web Mercator tiles. Six products: ir (clean IR), visible, geocolor, air-mass, dust, and fire-temp — see /satellite/products.
#Satellite map tile
productrequiredts#Available satellite products
#Available satellite frames
#Location summary
#One-call location snapshot
Aggregates every relevant product at a point: active alerts and watches, mesoscale discussions, current observation, SPC outlooks, recent storm reports, the HRRR point forecast, and a single "status" field summarizing severity. Great for building dashboards.
latrequiredlonrequiredcurl "https://atmostorm.com/api/v1/locations/summary?lat=35.22&lon=-97.44"
#Geocoding
#Forward geocode
qrequiredcurl "https://atmostorm.com/api/v1/geocode/search?q=Norman,+OK"
#Reverse geocode
latrequiredlonrequiredcurl "https://atmostorm.com/api/v1/geocode/reverse?lat=35.22&lon=-97.44"
#Tropical (NHC)
#Tropical weather outlook
NHC formation-probability areas (the GTWO) as a GeoJSON FeatureCollection, plus a metadata.basins block carrying each basin's issuance headline. Present year-round; the areas are simply empty in the off-season.
basincurl "https://atmostorm.com/api/v1/tropical/outlook?basin=AL"
#Active tropical systems
Each active system contributes up to three features tagged feature_kind: cone (forecast cone of uncertainty), track (forecast line), and position (current center, carrying the full intensity metadata). Empty in the off-season.
curl "https://atmostorm.com/api/v1/tropical/storms"
#Excessive rainfall (WPC)
#Excessive Rainfall Outlooks
WPC flash-flood outlooks (MRGL / SLGT / MDT / HIGH), Days 1–3, as a GeoJSON FeatureCollection. Accepts the common spatial filters.
dayactivecurl "https://atmostorm.com/api/v1/eros?day=1&state=TX"
#NWS text products
Latest per-office bulletins. Resolve the office automatically from a point (lat + lon) or pass an office code directly. Both return a clean null body (not a 404) when nothing is stored for that office yet.
#Area Forecast Discussion
The forecaster's reasoning behind the forecast. Returns { office, afd }.
curl "https://atmostorm.com/api/v1/afd?lat=35.22&lon=-97.44"
#Hazardous Weather Outlook
Plain-language summary of hazardous weather over the next 7 days. Returns { office, hwo }.
curl "https://atmostorm.com/api/v1/hwo?office=OUN"
#NEXRAD Level II (single-site)
On-demand, per-radar Level II tiles — the super-res Doppler + dual-pol view the MRMS mosaic flattens away. Six products: reflectivity, velocity, srm (storm-relative velocity), cc, zdr, and sw.
#List radar sites
The serveable WSR-88D sites (id, name, state, lat/lon).
curl "https://atmostorm.com/api/v1/nexrad/sites"
#Single-site radar tile
siterequiredproductrequiredtiltsm_dir / sm_kthttps://atmostorm.com/api/v1/nexrad/KTLX/reflectivity/8/59/106.png
#HRRR forecast tiles
#List HRRR variables
The renderable HRRR fields (CAPE, SRH, shear, STP, 2 m temp/dewpoint, 10 m wind, …), each with its id, label, units, and palette.
curl "https://atmostorm.com/api/v1/hrrr/variables"
#HRRR forecast tile
variablerequiredvalidtshttps://atmostorm.com/api/v1/hrrr/tiles/sbcape/6/14/25.png
#Point briefing
#Plain-language point briefing
The interpretation layer, not another data mirror: a plain-language briefing for a single point — what's happening, what it means, and storm ETA — synthesized from the active alerts, outlooks, and forecast covering that spot.
latrequiredlonrequiredcurl "https://atmostorm.com/api/v1/briefing/point?lat=35.22&lon=-97.44"
#Point risk timeline
The interpretation layer through time: the next N hours at a point, joining the HRRR convective spine (CAPE / CIN / lifted index / wind gust / precip) hour-by-hour to the SPC categorical outlook, the WPC excessive-rainfall outlook, and any active alerts/watches covering the point — plus a summary roll-up. The clearest single answer to "what does the next 12 hours look like here?".
latrequiredlonrequiredhourshrrr_gridscurl "https://atmostorm.com/api/v1/briefing/timeline?lat=35.22&lon=-97.44&hours=12&hrrr_grids=true"
#Storm cell
#Enriched warning + storm intel
A GeoJSON Feature for one warning polygon, enriched with the linked SPC watch and mesoscale discussion, the storm reports filed inside it, and — for storm-based warnings — a motion vector, projected cone, and rotation summary.
curl "https://atmostorm.com/api/v1/storms/12345"
#Critical facilities
#Facilities in a viewport
Hospitals, nursing homes, mobile-home parks, schools, dialysis centers, correctional facilities, and response assets (fire / EMS / police) within a bounding box. Decision-support only — coverage is incomplete for some kinds.
bboxrequiredkindcurl "https://atmostorm.com/api/v1/facilities?bbox=-97.8,35.1,-97.1,35.7&kind=hospital,school"
#Who & what is in the path
For a single alert, the exact per-kind counts and an enumerated list of the facilities inside the warning polygon (geography-native ST_Covers). Returns has_polygon: false for zone-only alerts.
alert_idrequiredcurl "https://atmostorm.com/api/v1/facilities/impact?alert_id=12345"
#Jurisdiction summary
#County warning summary
The active hazards and recent activity for one county — by fips, or by state + slug (the SEO weather-page route).
fipsstateslugcurl "https://atmostorm.com/api/v1/jurisdiction/summary?fips=40027"
#County boundary polygon
A county's exact (unsimplified) boundary as a GeoJSON Feature — for clipping other layers to a county. Identify it by fips, or by state + slug.
curl "https://atmostorm.com/api/v1/jurisdiction/boundary?fips=40027"
#Damage tracks
#Surveyed damage tracks (NWS DAT)
Post-storm surveyed tornado / wind damage paths from the NWS Damage Assessment Toolkit. Geometry in lon/lat (WGS84); lengths and widths in SI meters, per the project convention.
bboxfipsdaysmin_efcurl "https://atmostorm.com/api/v1/damage-tracks?days=30&min_ef=2"
#Live stream (SSE)
#Server-Sent Events feed
A long-lived text/event-stream that pushes a small event whenever an ingestor publishes fresh data (new alerts, radar frames, …) — connect once and refresh reactively instead of polling. Rate-limit-exempt.
curl -N "https://atmostorm.com/api/v1/stream"
#Webhooks
The push counterpart to the geofence engine: register a geofence + URL and Atmostorm POSTs a signed JSON payload whenever an active NWS alert's polygon intersects your area and clears your event/severity filters. This is "tell me when a warning covers this shape" without polling /alerts. Management is session-authenticated (like API keys); delivery is signed and SSRF-guarded.
#Register a webhook
Supply the target url (must be https and resolve to a public address) and a geofence as either a bbox or a GeoJSON geometry. The response includes the signing secret once — store it; listings only show a redacted form.
urlrequiredbboxgeometryevent_typesmin_severitycurl -X POST "https://atmostorm.com/api/v1/account/webhooks" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/hook","bbox":[-99,31,-95,35],"min_severity":"Severe"}'Also: GET /account/webhooks (list, secret redacted), PATCH /account/webhooks/{id} (edit filters / re-enable), POST /account/webhooks/{id}/rotate (new secret), POST /account/webhooks/{id}/test (send a synthetic ping), and DELETE /account/webhooks/{id}.
#Delivery payload & signature
Each delivery is a JSON body with the triggering alert (including its GeoJSON geometry), signed with your secret:
{
"type": "alert.triggered",
"webhook_id": 42,
"delivered_at": "2026-07-25T21:03:00Z",
"alert": {
"id": 12345,
"event": "Tornado Warning",
"severity": "Extreme",
"headline": "...",
"expires": "2026-07-25T21:30:00Z",
"geometry": { "type": "Polygon", "coordinates": [...] }
},
"links": { "self": "https://atmostorm.com/api/v1/alerts/12345" }
}Verify the X-Atmostorm-Signature header — format t=<unix>,v1=<hex> — by recomputing an HMAC-SHA256 over "{t}." + raw_body and comparing in constant time:
import hmac, hashlib
def verify(secret: str, header: str, raw_body: bytes) -> bool:
parts = dict(p.split("=", 1) for p in header.split(","))
signed = f"{parts['t']}.".encode() + raw_body
expected = hmac.new(secret.encode(), signed, hashlib.sha256).hexdigest()
return hmac.compare_digest(parts["v1"], expected)Respond 2xx to acknowledge. Non-2xx or timeout is retried on the next cycle; after 15 consecutive failures the webhook auto-disables (re-enable via PATCH).
#Meta / health
#System health
Per-source ingest status, with last-success timestamps and rolling success rates.
curl "https://atmostorm.com/api/v1/meta/health"
#List data sources
Which feeds are implemented, their cadence, and their status.