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"
#Every reporting gauge, for a map
All gauges with a reading in the last 6 hours in one compact GeoJSON response (~10,000 points; empty fields left out): the NWS flood category, and flow_class / flow_pct, how the flow compares with the same date in past years (lowest, much_below, below, normal, above, much_above, highest; USGS WaterWatch's classes, from day-of-year percentiles of at least 10 years). Updated every two minutes.
curl "https://atmostorm.com/api/v1/gauges/map"
#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, echo-tops, and the rainfall totals rain-24h and rain-72h (inches) — 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. Seven products: ir (clean IR), visible, clouds (our day/night composite: visible by day, IR by night, clear sky transparent), geocolor, air-mass, dust, and fire-temp — see /satellite/products.
#Satellite map tile
productrequiredts#Available satellite products
#Available satellite frames
Frame timestamps for animating a product: every 5 minutes for ir, visible and clouds (up to six hours), and every 10 minutes for geocolor and the other composites (up to 6 hours, about 30 minutes behind real time). Pass a frame's timestamp as ts on the tile URL.
#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. Typhoons and cyclones outside NHC's basins come from the Joint Typhoon Warning Center with source jtwc; their cone is JTWC's 34-knot danger swath, not a cone of uncertainty.
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"
#Surface fronts and snowfall (WPC)
#Surface fronts, highs and lows
WPC's latest surface analysis (every 3 hours) as analysis, and its 12- and 36-hour forecast maps still ahead as forecasts. Each carries valid, issued and a GeoJSON FeatureCollection: highs and lows as points (kind high | low, pressure in hPa) and fronts as lines (kind cold | warm | stationary | occluded | trough). A front's points run so its symbols go on the left. analysis is null when there's none from the last 12 hours.
curl "https://atmostorm.com/api/v1/fronts"
#Snowfall forecast
WPC's snowfall forecast for the next 24, 48 and 72 hours, expected (50th percentile) and high end (90th): when the periods start, the tile frame, and each product's period. Tiles: /api/v1/radar/tiles/wpcsnow-72h-50/{z}/{x}/{y}.png?ts=<frame> (inches; see /api/v1/radar/products). Empty between snow seasons.
curl "https://atmostorm.com/api/v1/winter/snowfall"
#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?".
The HRRR numbers come from an outside model service. If it can't be reached, the response still arrives with the risk levels and hazards filled in, the HRRR values null, and forecast_available: false.
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"
#A county's storm history (NOAA Storm Events)
Tornadoes since 1950 and hail since 1955 recorded in one county, from NOAA's Storm Events Database: counts, by rating and decade, the strongest, deadliest and most recent tornadoes, the largest hail, and thunderstorm wind, flood and lightning totals. A tornado that crossed county lines counts in each county it touched; recent months arrive a few months behind, as NCEI publishes them.
fipsstateslugcurl "https://atmostorm.com/api/v1/storm-history/county?state=OK&slug=cleveland"
#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
#Service status
The public status page's view: an overall status (operational, degraded or down) and one group per capability (warnings, radar, forecasts…), each with its own status, a plain-language summary, and the sources behind it with how many seconds old their data is. Use this to show or monitor whether Atmostorm is working; use /meta/health for every source in detail.
curl "https://atmostorm.com/api/v1/meta/status"
{
"status": "operational",
"checked_at": "2026-10-07T02:58:21Z",
"groups": [
{
"key": "alerts",
"label": "Warnings & alerts",
"status": "ok",
"summary": "Updating normally.",
"sources": [
{ "label": "NWS warnings and advisories", "status": "ok", "age_seconds": 20 }
]
}
]
}#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.