Base URL: https://api.wxalerts.org
Hurricanes, tropical storms and depressions as the National Hurricane Center
advises on them, for the Atlantic (AL), the eastern Pacific (EP) and the
central Pacific (CP). Everything here is NHC’s forecast restated, never a
forecast of our own.
GET /v1/tropical/storms
GET /v1/tropical/storms/CP042026
GET /v1/tropical/storms/CP042026/models
GET /v1/tropical/outlook
GET /v1/tropical/for-place?lat=11.4&lon=-165
Needs an API key (outlooks:read), and is served only
under /v1. The bare paths answer 401 api_key_required. Requests count
against the key’s rate limit. Browsers block
calls from other websites (CORS allows only wxalerts.org), so call it from a
server, script or app.
Conventions
- Storm id is NHC’s ATCF id: basin, two digit storm number, year, so
AL142026orCP042026. It is case insensitive in the path. - Speeds are mph, converted from NHC’s knots with NHC’s own rounding
(nearest 5 mph), so they match the advisory text. Pressure is millibars.
The one exception is
vmax_kton model tracks, which stays in knots as the models give it. - Times are UTC, ISO 8601.
- Geometry is GeoJSON in WGS84, four decimal places.
classificationis one ofTD(tropical depression),TS(tropical storm),HU(hurricane),MH(major hurricane, 96 kt and up),PTC(potential tropical cyclone),PC(post-tropical),SD(subtropical depression) orSS(subtropical storm). A code NHC adds that the API does not know is passed through upper cased.
Active storms
GET /v1/tropical/storms returns a bare list of every active system, sorted
by basin and then id. It is [] when there are none, which is most of the
year.
[
{
"id": "CP042026",
"name": "Pena",
"classification": "TS",
"basin": "CP",
"advisory_number": "12",
"issued_at": "2026-11-09T15:00:00Z",
"lat": 11.4,
"lon": -159.5,
"max_wind_mph": 40,
"gusts_mph": 50,
"min_pressure_mb": 1004,
"movement_dir_deg": 265,
"movement_mph": 9,
"headline": "PENA PERSISTS AS A TROPICAL CYCLONE FOR NOW"
}
]
| field | |
|---|---|
advisory_number |
a string, because intermediate advisories carry a letter ("12A") |
issued_at |
when that advisory was issued |
lat, lon |
the centre at the advisory |
max_wind_mph, gusts_mph |
sustained wind and gusts |
movement_dir_deg |
the direction the storm is moving toward, degrees clockwise from north. Note this is the opposite of the “from” convention used for wind |
movement_mph |
forward speed |
headline |
NHC’s one line summary of the advisory |
One storm
GET /v1/tropical/storms/{storm_id} returns every field above plus the
forecast, the history and the map shapes. A storm NHC has stopped advising on
is still served for 30 days with "active": false; after that, and for an id
never stored, the answer is 404.
{
"id": "CP042026",
"name": "Pena",
"...": "every field from /tropical/storms",
"active": true,
"forecast_advisory": "12",
"forecast_track": [
{ "valid_at": "2026-11-09T12:00:00Z", "lat": 11.4, "lon": -159.5, "max_wind_mph": 40, "classification": "TS" },
{ "valid_at": "2026-11-10T00:00:00Z", "lat": 11.4, "lon": -161.6, "max_wind_mph": 40, "classification": "TS" },
"...",
{ "valid_at": "2026-11-14T12:00:00Z", "lat": 14.7, "lon": -184.7, "max_wind_mph": 40, "classification": "TS" }
],
"cone": {
"type": "MultiPolygon",
"coordinates": [[[[-179.99, 15.279], [-179.9576, 15.2666], "..."]], [[[179.9872, 11.6149], "..."]]]
},
"watches_warnings": { "type": "FeatureCollection", "features": [] },
"past_track": [
{ "at": "2026-11-02T12:00:00Z", "lat": 7.7, "lon": -129.8, "max_wind_mph": 25 },
"...",
{ "at": "2026-11-09T15:00:00Z", "lat": 11.4, "lon": -159.5, "max_wind_mph": 40 }
],
"links": {
"advisory": "https://www.nhc.noaa.gov/text/HFOTCPCP4.shtml",
"discussion": "https://www.nhc.noaa.gov/text/HFOTCDCP4.shtml",
"graphics": "https://www.nhc.noaa.gov/graphics_cp4.shtml"
}
}
-
forecast_trackis NHC’s official forecast points, from tau 0 (the synoptic time, three hours before the advisory) out to 120 hours. Points are 12 hourly at first, then 24 hourly. Each carries the forecast intensity and classification at that time. Longitudes stay in -180 to 180, like the cone and the model tracks, so a point past the date line comes back as an east longitude (Pena’s last point is 175.3). Unwrap a track that crosses it before drawing a line, or the line spans the whole map. -
forecast_advisoryis the advisory the forecast came from. It lagsadvisory_numberacross intermediate advisories, which carry no new forecast. -
coneis a GeoJSON MultiPolygon, ornullwhen NHC has not drawn one. It is the cone of uncertainty: the area the centre is likely to stay inside, not the size of the storm. A cone that crosses the date line is split there into two polygons, with longitudes kept in -180 to 180. -
watches_warningsis a FeatureCollection of the coastal watches and warnings in effect, empty when there are none (as for Pena, which is far from land). NHC draws them as stretches of coastline, so each geometry is a MultiLineString, one feature per type:{ "type": "Feature", "geometry": { "type": "MultiLineString", "coordinates": ["..."] }, "properties": { "type": "hurricane_warning", "code": "HWR", "advisory": "30" } }typeishurricane_warning(HWR),hurricane_watch(HWA),tropical_storm_warning(TWR) ortropical_storm_watch(TWA).advisoryis the advisory that set them. -
past_trackis every known position since the storm formed, oldest first: NHC’s best track fixes plus each advisory’s own position. -
linksgo to NHC’s public advisory, forecast discussion and graphics page for the storm. Any can benull.
Model guidance
GET /v1/tropical/storms/{storm_id}/models returns the forecast tracks of
the main guidance models at the newest cycle stored, read from NHC’s public
ATCF guidance file. NHC’s official forecast is not among them; that is the
storm route above.
{
"storm_id": "CP042026",
"cycle": "2026-11-09T18:00:00Z",
"models": [
{
"id": "consensus",
"label": "Consensus",
"aid": "TVCN",
"points": [
{ "tau": 0, "lat": 11.4, "lon": -160.0, "vmax_kt": null },
{ "tau": 12, "lat": 11.5, "lon": -162.5, "vmax_kt": null },
"...",
{ "tau": 96, "lat": 12.9, "lon": 178.8, "vmax_kt": null },
"..."
]
},
{
"id": "gfs",
"label": "GFS",
"aid": "AVNI",
"points": [
{ "tau": 0, "lat": 11.4, "lon": -160.0, "vmax_kt": 35 },
"...",
{ "tau": 168, "lat": 16.0, "lon": 161.7, "vmax_kt": 18 }
]
},
"..."
]
}
cycleis the synoptic time the guidance was run from.idis a stable name to colour by:consensus,gfs,ecmwf,ukmet,hafs_a,hafs_b,cmc.labelis what to call it on screen (Consensus,GFS,European,UK Met,HAFS-A,HAFS-B,Canadian). The consensus comes first. A model with no track this cycle is left out, andecmwfdoes not appear at present because NHC’s public file carries no European track.aidis the ATCF aid the track was read from (AVNI,HFAI, …).pointsrun every 6 or 12 hours fromtau0 (hours aftercycle) to as far as the model goes, at most 168. Longitudes stay in -180 to 180, so a track crossing the date line jumps from -178.7 to 178.8.vmax_ktis the model’s peak wind in knots,nullwhere the aid gives no intensity (the consensus is a track only).
A storm with no guidance yet answers {"storm_id": "...", "cycle": null, "models": []}, not a 404. An unknown storm is a 404.
Seven-day outlook
GET /v1/tropical/outlook is NHC’s tropical weather outlook: areas where a
storm may form in the next seven days, across all three basins.
{
"issued_at": "2026-11-09T17:18:00Z",
"areas": [
{
"id": "EP-1",
"basin": "EP",
"title": "Eastern East Pacific",
"invest": null,
"chance_2day_pct": 0,
"chance_7day_pct": 0,
"category": "low",
"geometry": { "type": "MultiPolygon", "coordinates": [[[[-90.6113, 10.0343], "..."]]] },
"center": { "type": "Point", "coordinates": [-90.6178, 10.0391] },
"discussion": "Shower and thunderstorm activity has diminished near the small area of low pressure located several hundred miles offshore of El Salvador and Nicaragua. ..."
}
]
}
idis<basin>-<number>. NHC numbers areas afresh in every issuance, so an id names an area within one outlook only; do not track it across issuances.chance_2day_pct,chance_7day_pctare NHC’s chances of a tropical cyclone forming within 48 hours and within seven days.categoryislow,mediumorhigh, from the seven-day chance, as NHC colours the area (under 40, 40 to 60, over 60 percent). NHC’s “near zero” counts aslow.investis the invest number (AL94) when NHC names one, elsenull.geometryis the area NHC shades;centeris the point it marks with an X. Either can benull.discussionis the outlook text’s paragraph for this area.
areas is empty when NHC expects nothing to form.
Storms that reach a point
GET /v1/tropical/for-place?lat=&lon= lists each active storm that reaches
the point, nearest first. It is [] when nothing does, which is the answer
almost everywhere almost always.
| parameter | |
|---|---|
lat |
required, -90 to 90 |
lon |
required, -180 to 180 |
Out of range values are a 422.
[
{
"storm_id": "CP042026",
"name": "Pena",
"in_cone": true,
"closest_approach_mi": 16,
"closest_approach_at": "2026-11-10T20:15:00Z",
"ts_wind_prob_pct": 30,
"hurricane_wind_prob_pct": null,
"earliest_ts_wind_at": "2026-11-10T16:00:00Z",
"in_watch_or_warning": null
}
]
A storm is listed when any of these holds:
- the point is inside its latest cone (
in_cone); - the point’s five-day chance of tropical storm force winds (34 kt) is at least 5 percent, the lowest band NHC draws, and that chance is credited to this storm (see below);
- the point is within 60 km of one of its coastal watch or warning segments.
So a point can be listed while outside the cone (wind field reaching beyond the track) and inside the cone with no wind probability at all.
| field | |
|---|---|
closest_approach_mi, closest_approach_at |
the nearest the forecast track comes to the point, in statute miles, and when. Found by walking the track in 15 minute steps from the advisory position, joining forecast points with straight lines. NHC’s caveat applies: the line between forecast points is not itself a forecast |
ts_wind_prob_pct |
five-day chance of 34 kt (39 mph) winds at the point. NHC publishes probabilities in bands, and this is the band’s lower bound: a point in the 10 to 20 percent band reports 10 |
hurricane_wind_prob_pct |
the same for 64 kt (74 mph) winds. null when the chance is under 5 percent, NHC’s lowest band |
earliest_ts_wind_at |
earliest reasonable arrival of 34 kt winds, interpolated between NHC’s arrival isochrones and rounded to the hour |
in_watch_or_warning |
the highest coastal watch or warning within reach: hurricane_warning, then tropical_storm_warning, then hurricane_watch, then tropical_storm_watch (any warning outranks any watch). null for none |
Who gets the probability. NHC publishes one wind probability grid for
all storms together. The point’s probability is credited to the storm whose
forecast track comes closest, if that is within 600 miles. Any other storm
listed for the same point (by cone or by warning) carries null for
ts_wind_prob_pct, hurricane_wind_prob_pct and earliest_ts_wind_at.
Freshness
The source is polled every 15 minutes while a storm is active or a hurricane season is on (15 May to 30 November), hourly otherwise. NHC issues full advisories every six hours, with intermediate ones in between when watches or warnings are up.

