Community. Driven. Weather. Data. | Always Ad-Free | Developer FriendlyChecking statusDiscord
Become a supporter
Sign in
API

Tropical cyclones

Active tropical cyclones from the National Hurricane Center, with forecast track, cone, coastal watches and warnings, model guidance, the seven-day formation outlook, and which storms reach a given point.


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 AL142026 or CP042026. 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_kt on model tracks, which stays in knots as the models give it.
  • Times are UTC, ISO 8601.
  • Geometry is GeoJSON in WGS84, four decimal places.
  • classification is one of TD (tropical depression), TS (tropical storm), HU (hurricane), MH (major hurricane, 96 kt and up), PTC (potential tropical cyclone), PC (post-tropical), SD (subtropical depression) or SS (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_track is 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_advisory is the advisory the forecast came from. It lags advisory_number across intermediate advisories, which carry no new forecast.

  • cone is a GeoJSON MultiPolygon, or null when 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_warnings is 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" }
    }

    type is hurricane_warning (HWR), hurricane_watch (HWA), tropical_storm_warning (TWR) or tropical_storm_watch (TWA). advisory is the advisory that set them.

  • past_track is every known position since the storm formed, oldest first: NHC’s best track fixes plus each advisory’s own position.

  • links go to NHC’s public advisory, forecast discussion and graphics page for the storm. Any can be null.

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 }
      ]
    },
    "..."
  ]
}
  • cycle is the synoptic time the guidance was run from.
  • id is a stable name to colour by: consensus, gfs, ecmwf, ukmet, hafs_a, hafs_b, cmc. label is 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, and ecmwf does not appear at present because NHC’s public file carries no European track.
  • aid is the ATCF aid the track was read from (AVNI, HFAI, …).
  • points run every 6 or 12 hours from tau 0 (hours after cycle) 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_kt is the model’s peak wind in knots, null where 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. ..."
    }
  ]
}
  • id is <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_pct are NHC’s chances of a tropical cyclone forming within 48 hours and within seven days.
  • category is low, medium or high, from the seven-day chance, as NHC colours the area (under 40, 40 to 60, over 60 percent). NHC’s “near zero” counts as low.
  • invest is the invest number (AL94) when NHC names one, else null.
  • geometry is the area NHC shades; center is the point it marks with an X. Either can be null.
  • discussion is 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:

  1. the point is inside its latest cone (in_cone);
  2. 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);
  3. 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.

May we use Microsoft Clarity to see how pages are used (clicks, scrolling and replays of a visit, with anything you type hidden), plus a random ID linking that to crash reports? Only to find bugs and confusing screens. Never advertising, never sold.