Developers
Last updated 25 September 2026
The forecasts, alerts, river gauges and tides behind this site, as JSON anyone can call, and every alert, calendar and article as a feed. No key and no account. The rules are short: cache what you fetch, identify yourself, and credit the agencies the data comes from.
Terms of use
- Free, including commercial use. Call these endpoints from an app, a website, a script or a newsroom tool, and show what they return, as long as the credit below goes with it.
- Not for decisions about safety. Everything here is a copy of what government agencies publish, read on a schedule, and it can be late or missing. Warnings reach the public through the National Weather Service, Wireless Emergency Alerts and NOAA Weather Radio; an app that relays alerts must not suggest it replaces them. The terms of use apply to the API as they do to the site.
- Do not present it as official. Nothing here is a product of the National Weather Service or any agency, and it must not be labeled as one.
-
No warranty and no service level. The endpoints listed on this page are
the ones meant to stay put. If one has to change, the change is listed here first.
Anything under
/api/that is not on this page is internal: it can change or disappear without notice, and it does not answer other sites' browsers.
Usage expectations
-
Cache. Every answer carries a
Cache-Controlheader saying how long it stays good: a minute for alerts, five to ten minutes for forecasts, an hour or a day for reference lists. Asking again sooner returns the same answer. - Keep it modest. There is no hard quota today. A few requests a minute per user of your product, or a few hundred an hour for a server that polls, is fine. Clients that put unusual load on the site, crawl coordinates in bulk or ignore the cache headers may be blocked without notice. For bulk data, go to the agency's own source, linked under each endpoint.
-
Identify yourself. From a server, send a
User-Agentthat names your product and a way to reach you, as the National Weather Service asks of its own API users. Browsers send their own and cannot change it; that is fine. -
From a browser. The endpoints below send
Access-Control-Allow-Origin: *, so a page on any site can read them. - Coordinates are decimal degrees, WGS 84, longitude negative in the west. Up to four decimals are used; more are rounded.
Attribution
The data is public, but the agencies ask to be named, and this site asks to be linked. Show a line such as "Data: NOAA National Weather Service, via WeatherOverTime" with a link to weatherovertime.com, naming the source each endpoint lists:
| Data | Credit | Terms |
|---|---|---|
| Forecasts, alerts | NOAA National Weather Service | Public domain: "The information on National Weather Service (NWS) Web pages are in the public domain, unless specifically noted otherwise, and may be used without charge for any lawful purpose" (weather.gov/disclaimer). |
| National Blend of Models | NOAA National Weather Service, National Blend of Models | Public domain, as above. |
| River gauges | NOAA National Water Prediction Service | Public domain, as above. |
| Tides | NOAA Center for Operational Oceanographic Products and Services (CO-OPS) | Public domain; NOAA asks that it be credited. |
| Station climate | NOAA National Centers for Environmental Information, GHCN-Daily and 1991-2020 Normals | Public domain; NCEI asks that it be credited. |
Endpoints
All are GET on https://weatherovertime.com and answer JSON.
Temperatures are degrees Celsius, winds kilometers per hour, precipitation millimeters and
times ISO 8601 unless a field says otherwise. An error is an HTTP status with a JSON body
such as {"error": "bad_point", "message": "Pass lat and lon."}: 400 for a
malformed request, 404 for nothing there, 502 when the agency did not answer (try again
in a minute).
/api/forecast/point?lat=&lon=
The National Weather Service's forecast grid for the point, compacted: every element of
the grid as hourly series (grid.series), the weather and hazard grids, the
named twelve-hour periods with the forecaster's words, and the hourly forecast.
point gives the forecast office, grid cell, time zone, radar, county and
zone codes, and the nearest town.
GET /api/forecast/point?lat=41.5868&lon=-93.625
{
"source": "nws",
"point": { "lat": 41.5868, "lon": -93.625, "wfo": "DMX", "gridX": 73, "gridY": 49,
"tz": "America/Chicago", "radar": "KDMX", "zone": "IAZ060", "county": "IAC153",
"near": { "city": "Des Moines", "state": "IA", "km": 0, "bearing": 0 } },
"grid": { "updated": "...", "validFrom": "...", "validHours": 170, "series": { ... } },
"periods": [ { "name": "This Afternoon", "start": "2026-09-25T13:00:00-05:00",
"temperatureC": 17.8, "pop": 83, "windKmh": [12.9, 12.9], "windDir": "ESE",
"short": "Rain Showers", "detailed": "Rain showers. Mostly cloudy, ..." } ],
"hourly": [ { "start": "2026-09-25T13:00:00-05:00", "temperatureC": 16.7, "dewpointC": 16.1,
"rh": 97, "pop": 83, "windKmh": 11.3, "windDir": "ESE", "short": "Rain Showers" } ],
"fetchedAt": "2026-09-25T18:34:06.137Z"
}
/api/forecast/alerts?lat=&lon=
Every National Weather Service warning, watch, advisory and statement in force at the point: a warning by its drawn outline, a watch or advisory by its zone. Each has the full text and instructions, CAP severity, urgency and certainty, onset, end and expiry, the hail, gust and tornado tags a warning carries, and the storm's motion.
GET /api/forecast/alerts?lat=29.21&lon=-81.02
{ "alerts": [ { "id": "urn:oid:2.49.0.1.840.0....", "event": "Rip Current Statement",
"severity": "Moderate", "urgency": "Expected", "certainty": "Likely",
"sent": "...", "onset": "...", "ends": "...", "expires": "...",
"senderName": "NWS Melbourne FL", "areaDesc": "Coastal Volusia, FL",
"headline": "...", "description": "...", "instruction": "...",
"tags": [], "hail": null, "gust": null, "tornado": null, "motion": null } ],
"fetchedAt": "2026-09-25T18:34:06.137Z" }
/api/alerts
The whole country at once, for a map: each alert with its polygons (simplified,
[lon, lat] rings; a zone product's outline drawn from its zones) and its UGC
codes. About a megabyte and a half compressed on a busy day, so fetch it once a minute
at most. ?bbox=west,south,east,north limits it to alerts touching a box.
GET /api/alerts?bbox=-98,36,-90,44
{ "updated": "2026-09-25T18:34:09.100Z", "count": 12,
"alerts": [ { "id": "https://api.weather.gov/alerts/urn:oid:...", "event": "Flood Warning",
"severity": "Severe", "sent": "...", "effective": "...", "expires": "...",
"areaDesc": "...", "polygons": [ [ [ -93.61, 41.60 ], ... ] ],
"ugc": [ "IAC153" ], ... } ] }
/api/forecast/nbm?lat=&lon=
The Blend's latest run at the grid cell holding the point, as time series: temperature,
apparent temperature, dew point, humidity, wind, gusts, sky cover, the chance of rain,
snow, freezing rain and sleet, hourly and six-hourly precipitation and snow, thunder
chances, CAPE, mixing height, visibility, and the daily maximum and minimum. Each series
is {"t": [epoch ms, ...], "v": [values, ...]}.
GET /api/forecast/nbm?lat=41.5868&lon=-93.625
{ "run": "2026-09-25T12:00:00Z", "domain": "conus",
"cell": { "col": 1335, "row": 755, "lat": 41.5868, "lon": -93.625 },
"series": { "temp": { "t": [ 1790341200000, ... ], "v": [ 17.1, ... ] }, "maxt": { ... }, ... } }
/api/forecast/climate?station=
For a GHCN-Daily station id (USW00014933 is Des Moines International
Airport): the 1991-2020 normal high, low and precipitation and the record high, low and
precipitation with their years, for each of the 366 calendar days, and the period of
record. Rebuilt weekly.
GET /api/forecast/climate?station=USW00014933
{ "station": "USW00014933", "first": "1945-07-01", "last": "2026-09-17",
"normalHigh": [ ... 366 values ... ], "normalLow": [ ... ], "normalPrecip": [ ... ],
"recordHigh": [ ... ], "recordHighYear": [ ... ], "recordLow": [ ... ], ... }
/api/rivers/near?lat=&lon= and /api/rivers/gauges
near: the river gauges closest to a point, nearest first, with the latest
stage, its flood category now and forecast, and the flood stage. gauges:
every NWS river gauge in the country in one columnar table (about 1.7 MB), with the
observation, forecast crest, flow and the action, flood, moderate and major stages.
GET /api/rivers/near?lat=41.5868&lon=-93.625
{ "gauges": [ { "lid": "DEMI4", "river": "Raccoon River", "location": "Des Moines Fleur Dr",
"state": "IA", "km": 1.6, "status": "no_flooding", "forecastStatus": "action",
"observed": 5.2, "units": "ft", "flood": 12 } ] }
/api/tides/near?lat=&lon= and /api/tides/stations
near: the closest NOAA tide station to a point with its next highs and
lows, in feet above mean lower low water, and its page on this site.
stations: every tide prediction station as a columnar table (id, name,
state, latitude, longitude, and whether it measures the water too).
GET /api/tides/near?lat=32.78&lon=-79.93
{ "tides": { "station": { "id": "8665530", "name": "Charleston", "state": "SC",
"km": 0.6, "path": "/tides/south-carolina/charleston-8665530/" },
"events": [ { "t": "2026-09-25T11:23:00.000Z", "ft": 5.838, "high": true }, ... ] } }
/api/sites
Each WSR-88D and TDWR radar the site shows: identifier, name, position and elevation.
GET /api/sites
[ { "id": "KABR", "name": "Aberdeen", "lon": -98.41305, "lat": 45.45583, "elevM": 397 }, ... ]
Feeds
Atom 1.0 and RSS 2.0, for a feed reader or anything that reads either. Each item's id is permanent: an alert's is its CAP identifier, so an update to an alert is a new item and a reader never shows the same product twice. Alert feeds are cached a minute.
| Feed | Address (.atom or .rss) |
|---|---|
| Every alert in the United States | /feeds/alerts.atom |
| A state's alerts | /feeds/alerts/iowa.atom |
| A county's alerts | /feeds/alerts/iowa/polk-county.atom |
| Alerts at a forecast page's town | /feeds/alerts/at/us/iowa/des-moines.atom |
| Alerts at a coordinate | /feeds/alerts/at/@41.5868,-93.625.atom |
| This day in weather history, one item a day | /feeds/weather-history.atom |
| The blog | /feeds/blog.atom |
| The meteorology course | /feeds/learn.atom |
The state and county parts are the alerts pages' own: the address of
/alerts/iowa/polk-county/ gives
/feeds/alerts/iowa/polk-county.atom. The town part is the forecast page's
address without /forecast/. Pages with a feed announce it in their
<head>, so most readers find it from the page itself.
Calendars
iCalendar (RFC 5545) files to subscribe to in Apple Calendar, Google Calendar, Outlook or
any calendar app, so they keep themselves current. Open one with webcal://
in place of https:// to subscribe rather than import a copy.
| Calendar | Address |
|---|---|
| Alerts for a state, county or place, each from when it takes effect to when it ends | /feeds/alerts/iowa/polk-county.ics /feeds/alerts/at/us/iowa/des-moines.ics |
Sunrise and sunset for the next year: first light to sunrise, sunset to last light. Add ?only=sunrise or ?only=sunset for one of the two. |
/feeds/sun/us/iowa/des-moines.ics |
| High and low tides at a NOAA station for the next three months | /feeds/tides/8665530.ics |
A calendar app refreshes a subscription on its own schedule, from every 15 minutes to once a day, so an alert calendar is for planning, not for warnings.
What is not offered
The radar data itself (/data/), the radar archive, map tiles, the address
search and the lightning feed are not open to other sites: each costs this site real
storage reads or passes through to a service that did not agree to carry other sites'
traffic. Their sources are open, and better used directly: NEXRAD Level II and GOES on the
NOAA Open Data Dissemination program,
the National Weather Service API,
and the Census Geocoder.
Contact
Questions, a use that needs more than this page allows, or a change you need notice of: contact@weatherovertime.com.