Skip to content
Console

Typhoons

These endpoints collect four typhoon products issued by the Central Weather Administration (CWA): track (track), potential track (potential), wind-radius strike probability (probability), and typhoon warnings (warning). There is also an index of active tropical cyclones and GeoJSON for map overlays. The server checks the source once a minute. Historical snapshots are kept for 7 days. Use them for a typhoon page, a track map, and warning notices. The shared format is in the Weather API.

Upstream terms
  • Central Weather Administration (CWA): CWA's own data terms (such as the Open Government Data License) also apply; CWA's official releases take precedence.

Where to show it, examples and commercial-use requests: Data licensing and attribution.

No API Token is required.

  • Every endpoint returns { updated, cyclones: [...] }, except the GeoJSON endpoint. When several tropical cyclones are active, cyclones has several entries.
  • tdNo is the unique id of a tropical cyclone (CWA’s tropical-depression number). It is unique inside one snapshot. The four products match each other by tdNo. An unnamed tropical depression still has a tdNo. In that case name, cwaName, and tyNo are "".
  • Times are Unix seconds. When there is no data, updated is 0.
  • A missing value is null.
  • Coordinates: the index, track, and warnings use two fields, lat and lon. Potential track, strike probability, and GeoJSON use a [longitude, latitude] array. Values are to 4 decimal places.
  • Units: wind speed and gust in m/s; pressure in hPa; movement speed in km/h; radius in km. Movement direction is a 16-point compass abbreviation, for example NNW.
  • When no tropical cyclone is active, cyclones on the index, track, potential, and probability is []. warning usually keeps the latest cancellation (msgType is Cancel).
kind Contents Use
track Typhoon track: past and current fixes, current motion, quadrant wind radii, and forecast fixes at each lead time The most complete numbers. Use the four quadrant radii here to judge the wind radius
potential Potential-track forecast: past track, forecast track, potential-track area (cone of uncertainty), the radius of Beaufort force 7 winds, and each forecast time Draw a potential-track map
probability Wind-radius strike probability: nested contours at 20%, 40%, 60%, 80%, and 100% Draw a probability map, or see which probability region a coordinate falls in
warning Typhoon warning: issue, update, or cancellation, with the warning text, typhoon information, and affected counties and cities Show the current sea or land typhoon warning

One latest fix and intensity per tropical cyclone, taken from track.

GEThttps://api.core-tnn1.exptech.dev/api/v5/meteor/typhoon
ServerTNN-1
Request
curl "https://api.core-tnn1.exptech.dev/api/v5/meteor/typhoon"
Response

Success

{
"updated": 1794614400,
"cyclones": [
{
"tdNo": "27",
"name": "DOLPHIN",
"cwaName": "白海豚",
"year": 2026,
"tyNo": "26",
"t": 1794614400,
"lat": 18.3,
"lon": 128.9,
"wind": 33,
"gust": 43,
"pres": 970,
"speed": 22,
"dir": "WNW"
}
]
}

Not modified (If-None-Match matched). No bodyNo response body

Try it

The token is sent from your browser directly to the API.

FieldTypeDescription
updatednumberTime of the latest fix, Unix seconds. 0 when there is no data
cyclones[].tdNostringTropical-depression number. The unique id
cyclones[].namestringInternational English name. An empty string when unnamed
cyclones[].cwaNamestringChinese name. An empty string when unnamed
cyclones[].yearnumberYear
cyclones[].tyNostringTyphoon number. An empty string while it is still a tropical depression
cyclones[].tnumberTime of this fix, Unix seconds
cyclones[].latnumberCenter latitude
cyclones[].lonnumberCenter longitude
cyclones[].windnumber | nullMaximum sustained wind near the center (m/s)
cyclones[].gustnumber | nullMaximum gust (m/s)
cyclones[].presnumber | nullCentral pressure (hPa)
cyclones[].speednumber | nullMovement speed (km/h)
cyclones[].dirstring | nullMovement direction, a 16-point compass abbreviation

The latest copy of one of the four products, selected by kind. The structure of each is in the sections below.

GEThttps://api.core-tnn1.exptech.dev/api/v5/meteor/typhoon/{kind}
ServerTNN-1
Path parameters
  • kindstringRequired

    Path parameter. track, potential, probability, or warning

Request
curl "https://api.core-tnn1.exptech.dev/api/v5/meteor/typhoon/<kind>"
Response

Success (track as the example)

{
"updated": 1794614400,
"cyclones": [
{
"tdNo": "27",
"name": "DOLPHIN",
"cwaName": "白海豚",
"year": 2026,
"tyNo": "26",
"analysis": [
{
"t": 1794528000,
"lat": 16.9,
"lon": 131.2,
"wind": 28,
"gust": 38,
"pres": 980
},
{
"t": 1794614400,
"lat": 18.3,
"lon": 128.9,
"wind": 33,
"gust": 43,
"pres": 970
}
],
"now": {
"speed": 22,
"dir": "WNW",
"move": [
"以每小時22公里速度,向西北西進行",
"WNW 22 KM/HR"
],
"c15": {
"avg": 180,
"ne": 200,
"se": 180,
"sw": 160,
"nw": 180
},
"c25": null
},
"forecast": [
{
"tau": 6,
"t": 1794636000,
"lat": 18.8,
"lon": 127.9,
"wind": 35,
"gust": 45,
"pres": 965,
"speed": 20,
"dir": "WNW",
"r15": 180,
"r70": 80,
"state": null
}
]
}
]
}

Not modified (If-None-Match matched). No bodyNo response body

Try it
Path parameters

The token is sent from your browser directly to the API.

FieldTypeDescription
updatednumberTime of the latest fix, Unix seconds. 0 when there is no data
cyclones[].tdNo、name、cwaName、year、tyNostring / numberSame as Active tropical cyclones
cyclones[].analysis[]object[]Past and current fixes, oldest first
tnumberFix time, Unix seconds
lat、lonnumberCenter coordinates
wind、gust、presnumber | nullMaximum sustained wind near the center, maximum gust (m/s), and central pressure (hPa)
cyclones[].now.speednumber | nullCurrent movement speed (km/h)
cyclones[].now.dirstring | nullCurrent movement direction
cyclones[].now.movestring[] | nullMovement description [Chinese, English]
cyclones[].now.c15object | nullRadius of Beaufort force 7 winds (km): avg is the average, and ne, se, sw, nw are the four quadrants. null when the storm is too weak
cyclones[].now.c25object | nullRadius of Beaufort force 10 winds (km). Same shape as c15
cyclones[].forecast[].taunumberForecast lead time (hours)
cyclones[].forecast[].tnumberForecast time, Unix seconds
cyclones[].forecast[].lat、lonnumberForecast center coordinates
cyclones[].forecast[].wind、gust、presnumber | nullForecast intensity
cyclones[].forecast[].speed、dirnumber | null / string | nullForecast movement speed (km/h) and direction
cyclones[].forecast[].r15number | nullRadius of Beaufort force 7 winds (km)
cyclones[].forecast[].r70number | null70% probability radius (km)
cyclones[].forecast[].statestring[] | nullWeakening or transition description [Chinese, English]

To decide whether a place is inside the wind radius, use the four quadrant radii on now.c15 / now.c25. The wind circle on potential is a symmetric circle, suitable only as a sketch.

{
"updated": 1794614400,
"cyclones": [
{
"tdNo": "27",
"name": "白海豚",
"past": [[131.2, 16.9], [128.9, 18.3]],
"forecast": [[128.9, 18.3], [127.9, 18.8], [125.6, 19.9]],
"cone": [[128.4, 18.0], [127.3, 18.4], [124.8, 19.3], [126.1, 20.6], [128.9, 18.3], [128.4, 18.0]],
"circle": [[130.6, 18.3], [128.9, 20.0], [127.2, 18.3], [128.9, 16.6], [130.6, 18.3]],
"current": [128.9, 18.3],
"points": [
{ "label": "11月14日14時", "lng": 127.9, "lat": 18.8 },
{ "label": "11月15日08時", "lng": 125.6, "lat": 19.9 }
]
}
]
}
FieldTypeDescription
updatednumberData time, Unix seconds. 0 when there is no data
cyclones[].tdNostringTropical-depression number. An empty string when it cannot be matched
cyclones[].namestringName from the source data, for example the Chinese name or TD27
cyclones[].pastnumber[][]Past track [[longitude, latitude], ...]
cyclones[].forecastnumber[][]Forecast track
cyclones[].conenumber[][]Outline of the potential-track area (cone of uncertainty)
cyclones[].circlenumber[][] | nullRadius of Beaufort force 7 winds (a symmetric circle, for illustration). null when the storm is weaker
cyclones[].currentnumber[] | nullCurrent center [longitude, latitude]
cyclones[].points[]object[]Each forecast time: label is the time text, plus lng and lat
{
"updated": 1794614400,
"cyclones": [
{
"tdNo": "27",
"levels": [
{ "p": 100, "coords": [[128.6, 18.0], [129.2, 18.4], [128.9, 18.9], [128.6, 18.0]] },
{ "p": 20, "coords": [[126.0, 17.2], [130.4, 17.6], [129.8, 21.0], [125.1, 20.5], [126.0, 17.2]] }
]
}
]
}
FieldTypeDescription
updatednumberData time, Unix seconds. 0 when there is no data
cyclones[].tdNostringTropical-depression number
cyclones[].levels[].pnumberStrike probability (%): 20, 40, 60, 80, 100
cyclones[].levels[].coordsnumber[][]Closed contour for that probability [[longitude, latitude], ...]

levels is ordered from highest probability to lowest (100 is the innermost ring). To see which probability a coordinate is in, test point-in-polygon starting from the contour with the highest p.

CWA usually has one typhoon warning at a time, so cyclones has length 0 or 1.

{
"updated": 1794615000,
"cyclones": [
{
"tdNo": "27",
"active": true,
"id": "CWA-Weather_typhoon-warning_202611140830000000",
"sent": 1794615000,
"status": "Actual",
"msgType": "Cancel",
"scope": "Public",
"event": "颱風",
"urgency": "Past",
"severity": "Minor",
"certainty": "Observed",
"effective": 1794615000,
"onset": 1794615000,
"expires": 1794618600,
"headline": "解除颱風警報",
"senderName": "中央氣象署",
"typhoon": {
"no": "26",
"name": "DOLPHIN",
"cwaName": "白海豚",
"reportNo": "12",
"category": "END",
"analysis": { "t": 1794614400, "lat": 18.3, "lon": 128.9, "wind": 33, "gust": 43, "pres": 970, "r15": 180, "scale": ["中度颱風", "TYPHOON"] },
"prediction": { "t": 1794700800, "lat": 20.1, "lon": 125.0, "wind": 30, "gust": 40, "pres": 975, "r15": 160, "scale": null }
},
"sections": [
{ "title": "命名與位置", "text": "中度颱風白海豚(國際命名 DOLPHIN)……" }
],
"areas": [
{ "name": "臺北市", "code": "63000000" }
]
}
]
}
FieldTypeDescription
updatednumberIssue time of the latest warning, Unix seconds. 0 when there is no data
cyclones[].tdNostringTropical-depression number. An empty string when it cannot be matched to a current tropical cyclone (common for an old cancellation)
cyclones[].activebooleanWhether the warning body was parsed
cyclones[].idstringWarning id
cyclones[].sentnumber | nullIssue time, Unix seconds
cyclones[].statusstringFor example Actual
cyclones[].msgTypestringAlert means issued, Update means updated, Cancel means cancelled
cyclones[].scope、event、urgency、severity、certaintystringScope, event, urgency, severity, and certainty of the warning, kept as the source text
cyclones[].effective、onset、expiresnumber | nullEffective, onset, and expiry times, Unix seconds
cyclones[].headlinestringHeadline, for example a sea typhoon warning or a cancellation
cyclones[].senderNamestringIssuing office
cyclones[].typhoon.nostringTyphoon number (the same as tyNo, which is separate from tdNo)
cyclones[].typhoon.name、cwaNamestringEnglish name and Chinese name
cyclones[].typhoon.reportNostringWarning report number
cyclones[].typhoon.categorystringWarning category, kept as the source text. For example END on a cancellation
cyclones[].typhoon.analysisobject | nullCurrent fix: t, lat, lon, wind, gust, pres, r15 (radius of Beaufort force 7 winds, km), scale (intensity [Chinese, English])
cyclones[].typhoon.predictionobject | nullForecast fix. Same structure as analysis
cyclones[].sections[]object[]Sections of the warning text: title and text
cyclones[].areas[]object[]Affected counties and cities: name, and code for the county or city

Historical snapshot times for one product, as delta-encoded Unix seconds, oldest first. See Delta-encoded time lists for how to decode them.

GEThttps://api.core-tnn1.exptech.dev/api/v5/meteor/typhoon/{kind}/list
ServerTNN-1
Path parameters
  • kindstringRequired

    Path parameter. track, potential, probability, or warning

Request
curl "https://api.core-tnn1.exptech.dev/api/v5/meteor/typhoon/<kind>/list"
Response

Success

[
1794528000,
21600,
21600,
21600,
21600
]

Not modified (If-None-Match matched). No bodyNo response body

Try it
Path parameters

The token is sent from your browser directly to the API.

FieldTypeDescription
[0]numberTime of the oldest snapshot, in Unix seconds
[i](i ≥ 1)numberGap from the previous time, in seconds

The snapshot time is the time of the data itself: the latest fix time for track, the source data time for potential and probability, and the warning issue time (sent) for warning. When there are no snapshots, the response is [].

The snapshot of one product at a chosen time. The structure matches the latest data for that product. It is served only on static.core. api.core returns 404 for this path.

GEThttps://static.core-tnn1.exptech.dev/api/v5/meteor/typhoon/{kind}/{time}
ServerTNN-1
Path parameters
  • kindstringRequired

    Path parameter. track, potential, probability, or warning

  • timeintegerRequired

    Path parameter. A 10-digit Unix timestamp in seconds. It must be a value that appeared in /{kind}/list

Request
curl "https://static.core-tnn1.exptech.dev/api/v5/meteor/typhoon/<kind>/<time>"
Response

Success (probability as the example)

{
"updated": 1794614400,
"cyclones": [
{
"tdNo": "27",
"levels": [
{
"p": 100,
"coords": [
[
128.6,
18
],
[
129.2,
18.4
],
[
128.9,
18.9
],
[
128.6,
18
]
]
}
]
}
]
}

Not modified (If-None-Match matched). No bodyNo response body

time is not an integer, or there is no snapshot at that time (including past the retention window). No bodyNo response body

Try it
Path parameters

The token is sent from your browser directly to the API.

Same fields as the matching kind under Typhoon data.

A GeoJSON FeatureCollection built from the latest potential and probability. Add it directly to MapLibre, Leaflet, and other maps.

GEThttps://api.core-tnn1.exptech.dev/api/v5/meteor/typhoon/geojson
ServerTNN-1
Request
curl "https://api.core-tnn1.exptech.dev/api/v5/meteor/typhoon/geojson"
Response

Success

{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [
[
128.9,
18.3
],
[
127.9,
18.8
],
[
125.6,
19.9
]
]
},
"properties": {
"kind": "forecast",
"tdNo": "27"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
127.9,
18.8
]
},
"properties": {
"kind": "forecastPoint",
"label": "11月14日14時",
"tdNo": "27"
}
},
{
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
128.6,
18
],
[
129.2,
18.4
],
[
128.9,
18.9
],
[
128.6,
18
]
]
]
},
"properties": {
"kind": "probability",
"p": 100,
"tdNo": "27"
}
}
]
}

Not modified (If-None-Match matched). No bodyNo response body

Try it

The token is sent from your browser directly to the API.

properties.kind on each feature says what it is. Every feature also has properties.tdNo.

properties.kind Geometry Contents
past LineString Past track
forecast LineString Forecast track
cone Polygon Potential-track area
circle15 Polygon Radius of Beaufort force 7 winds (a symmetric circle)
current Point Current center
forecastPoint Point A forecast time. properties.label is the time text
probability Polygon Strike-probability contour. properties.p is the probability (%)

When there is no typhoon, features is [].

Use the GeoJSON overlay directly as a MapLibre GL JS source, then filter on kind for the shapes to draw, for example the potential-track area:

map.addSource("typhoon", {
type: "geojson",
data: "https://api.core-tnn1.exptech.dev/api/v5/meteor/typhoon/geojson",
});
map.addLayer({
id: "typhoon-cone",
type: "fill",
source: "typhoon",
filter: ["==", ["get", "kind"], "cone"],
paint: { "fill-color": "#f97316", "fill-opacity": 0.2 },
});
  • Every time is Unix seconds. A missing value is null.
  • Historical snapshots are kept for 7 days, and each product keeps at least its latest entry, so the last copy is still available after typhoon season ends (usually a cancellation).
  • tdNo on potential, probability, and warning is matched to track by the server, using the name, number, or position. When it cannot be matched, the value is an empty string.
  • Source: typhoon data in CWA open data.
  • Which server to call is in the Weather API. Timestamp snapshots go to static.core. Everything else goes to api.core. Use the TNN-1 URLs directly.