Radar reflectivity
Tiles of Central Weather Administration (CWA) composite radar reflectivity (echo intensity, dBZ). Coverage is 115°E–126.5°E and 18°N–29°N, on a 0.0125° grid. About 7 days are kept. The interval follows CWA releases. Use the list. Use the tiles for rainfall-echo animation and live weather maps.
Shared rules (coordinates, caching, attribution, and full map examples) are in Map tiles.
Data license
Section titled “Data license”AttributionData: Central Weather Administration (CWA), ExpTech Studio (exptech.dev)
- 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.
Authentication
Section titled “Authentication”No API Token is required.
Available times
Section titled “Available times”curl --compressed "https://api.core-tnn1.exptech.dev/api/v2/tiles/radar/list"const res = await fetch("https://api.core-tnn1.exptech.dev/api/v2/tiles/radar/list");if (!res.ok) throw new Error(`HTTP ${res.status}`);const data = await res.json();console.log(data);import requests
res = requests.get( "https://api.core-tnn1.exptech.dev/api/v2/tiles/radar/list", timeout=10,)res.raise_for_status()print(res.json())Success (an empty array [ ] when there is no data). Gzip-compressed when the client supports it
[ 1794641400, 600, 600, 600]Server error (plain-text error message)text/plain
Try it
Response fields
Section titled “Response fields”The response is a delta-encoded array of integers, oldest first, in Unix seconds. See Map tiles for how to decode it.
| Field | Type | Description |
|---|---|---|
[0] | integer | Time of the oldest entry, in Unix seconds. |
[i](i ≥ 1) | integer | Gap from the previous entry, in seconds. Add these up to get each time. |
https://static.core-tnn1.exptech.dev/api/v2/tiles/radar/{time}/{z}/{x}/{y}.webp timeUnix seconds. Must be a value from the list (an exact match; the server does not pick the nearest entry).
zZoom level, 3–12. Outside that range the response is a 1 × 1 transparent GIF.
xXYZ tile column.
yXYZ tile row (north to south).
curl -o output.webp "https://static.core-tnn1.exptech.dev/api/v2/tiles/radar/<time>/<z>/<x>/<y>.webp"const res = await fetch("https://static.core-tnn1.exptech.dev/api/v2/tiles/radar/<time>/<z>/<x>/<y>.webp");if (!res.ok) throw new Error(`HTTP ${res.status}`);const blob = await res.blob();import requests
res = requests.get( "https://static.core-tnn1.exptech.dev/api/v2/tiles/radar/<time>/<z>/<x>/<y>.webp", timeout=10,)res.raise_for_status()with open("output.webp", "wb") as f: f.write(res.content)image/webp, 256 × 256, lossless, transparent background. Only cells with echo (dBZ > 0) are drawn. If z is outside 3–12, the tile is outside coverage, or there is no echo in range, the response is a 1 × 1 transparent GIF (image/gif)binary image/webp
If-None-Match matches the ETag. No contentNo response body
time is not an integer
bad timeThat time does not exist, or the server errored. The body is a single newlineNo response body
Try it
Color scale
Section titled “Color scale”After the fractional part of dBZ is dropped, each integer maps to one color (0–65 dBZ; above 65 uses the color for 65). The main stops:
| dBZ | Color | Notes |
|---|---|---|
| 0–14 | #00FFFF → #0000FF |
Cyan to blue, darker with each dBZ |
| 15–25 | #00FF00 → #009600 |
Green, darker with each dBZ |
| 26–29 | #33AB00 → #CCEA00 |
Yellow-green |
| 30–35 | #FFFF00 → #FFC800 |
Yellow |
| 36–44 | #FFB800 → #FF1800 |
Orange |
| 45–55 | #FF0000 → #960000 |
Red, darker with each dBZ |
| 56–59 | #AB0033 → #EA00CC |
Magenta |
| 60–65 | #FF00FF → #9600FF |
Magenta to purple |
- A missing time returns 500, which is a different status from 404. The body is a single newline. Use only times from the list. Times older than about 7 days drop off the list, and the tiles for them are gone.
- The time must match exactly.
timeis Unix seconds. Do not use milliseconds. - A
z,x, orythat is not an integer does not return 400. It is treated as 0. Check the values yourself. - Set
minzoom: 3andmaxzoom: 12in the map library for zoom levels you do not need. Above 12, scale up level-12 tiles. - The bytes for a tile URL are fixed, so cache them on the client for a long time. The response has no
Cache-Control, but it has anETagfor conditional requests. - The same list path is also available on the tile host, but it is cached for about an hour. Use the list host above for the latest time.
- On the map, credit the source with the suggested attribution in Data license.
