Radar API method returns everything you need to show an animated weather radar map: the radar frames available
(the past two hours, every 5 minutes, and a nowcast for the next hour), a map tile URL template, the colour legend
and the attribution to show. The tiles are standard 256 pixel Web Mercator PNG tiles with transparent background,
so they work as an overlay in Leaflet, MapLibre, OpenLayers, Google Maps and Mapbox.
Radar currently covers the United States including Alaska, Hawaii, Puerto Rico and Guam (NOAA MRMS), Germany (DWD), the Netherlands (KNMI), France (Météo-France), Czechia (CHMI), Finland (FMI) and Sweden (SMHI), all every 5 minutes, Denmark (DMI, every 10 minutes), and most of Europe (EUMETNET OPERA composite, every 15 minutes, with our nowcast in between). Where national radar and OPERA overlap, the national radar is used. More countries will be added.
Outside radar coverage, use Minutely API (model based) and our
forecast weather maps.
Available on Pro+ and above (including High Volume and Enterprise, and Pro+ or Business trials); on Free and Starter the request returns error 2009. The radar.json request counts as one API call; the map tiles don't. The tile URL in the response
is signed and works for two hours, so request radar.json again (for example when your map opens, or every hour) to refresh it.
The tile URL belongs to your account: share it with your app's users, not with other services. Map tiles are free within
fair use; we may set a daily tile limit per account, and an account over it gets HTTP 429 for further tiles that day.
Showing a map once and refreshing radar.json every few minutes is well within fair use. Need very high tile volumes?
Contact us.
Live example
Live demo: next-hour rain and radar
Example request
https://api.weatherapi.com/v1/radar.json?key=<YOUR_API_KEY>&q=52.52,13.40
q is the place your map is centred on: covered in the response tells you whether radar reaches it.
Response: radar
| Field | Type | Description |
| available | boolean | Whether radar data is available right now. |
| covered | boolean | Whether the location in q is inside radar coverage. |
| tile_url | string | Tile URL template. Replace {z}, {x}, {y} with the tile and {time} with a frame's time. |
| tile_url_expires_epoch | int | When the signed tile URL stops working (Unix time). |
| min_zoom, max_zoom, tile_size | int | Zoom levels with tiles, and tile size in pixels. |
| frames[] | array | Frames oldest first: time (UTC, yyyyMMddHHmm, for the tile URL), time_epoch, type (observed or nowcast). |
| sources[] | array | Radar networks: id, name, latest_epoch, nowcast_minutes, bounds [south, west, north, east]. |
| legend[] | array | Colours: from_mm_h (rain rate from which the colour applies) and color. |
| attribution | string | Credit to show on your map (required by the radar data providers). |
Example response
{
"location": {
"name": "Berlin",
"region": "Berlin",
"country": "Germany",
"lat": 52.52,
"lon": 13.4,
"tz_id": "Europe/Berlin",
"localtime_epoch": 1793724480,
"localtime": "2026-11-03 17:48"
},
"radar": {
"available": true,
"covered": true,
"coverage_note": "Radar now covers: DWD radar (Germany), KNMI radar (Netherlands), NOAA MRMS (United States), NOAA MRMS (Alaska), NOAA MRMS (Guam), NOAA MRMS (Hawaii), NOAA MRMS (Puerto Rico and Caribbean), EUMETNET OPERA (Europe). More countries will be added. /v1/minutely.json uses the forecast model elsewhere.",
"tile_url": "https://api.weatherapi.com/v1/radar/tile/{z}/{x}/{y}.png?t={time}&e=1793731800&k=12345&p=5&s=5d0f3c8e9a7b41c2a6e0d4f19b8c2e7a",
"tile_url_expires_epoch": 1793731800,
"tile_size": 256,
"min_zoom": 0,
"max_zoom": 11,
"sources": [
{ "id": "dwd", "name": "DWD radar (Germany)", "latest_epoch": 1793724000, "nowcast_minutes": 60, "bounds": [45.685, 1.463, 56.219, 18.732] },
{ "id": "knmi", "name": "KNMI radar (Netherlands)", "latest_epoch": 1793724000, "nowcast_minutes": 60, "bounds": [48.895, 0.0, 55.974, 10.856] },
{ "id": "mrms", "name": "NOAA MRMS (United States)", "latest_epoch": 1793724000, "nowcast_minutes": 60, "bounds": [20.01, -129.99, 54.99, -60.01] },
...
{ "id": "opera", "name": "EUMETNET OPERA (Europe)", "latest_epoch": 1793723100, "nowcast_minutes": 105, "bounds": [31.746, -39.536, 73.923, 57.812] }
],
"frames": [
{ "time": "202611031440", "time_epoch": 1793716800, "type": "observed" },
{ "time": "202611031445", "time_epoch": 1793717100, "type": "observed" },
...
{ "time": "202611031635", "time_epoch": 1793723700, "type": "observed" },
{ "time": "202611031640", "time_epoch": 1793724000, "type": "observed" },
{ "time": "202611031645", "time_epoch": 1793724300, "type": "nowcast" },
...
{ "time": "202611031740", "time_epoch": 1793727600, "type": "nowcast" }
],
"legend": [
{ "from_mm_h": 0.1, "color": "#9be7a1" },
{ "from_mm_h": 0.5, "color": "#4cc35a" },
{ "from_mm_h": 1.0, "color": "#169c3b" },
{ "from_mm_h": 2.0, "color": "#f4e04d" },
{ "from_mm_h": 4.0, "color": "#f5a524" },
{ "from_mm_h": 8.0, "color": "#ec5b2c" },
{ "from_mm_h": 16.0, "color": "#c81e1e" },
{ "from_mm_h": 32.0, "color": "#c026d3" },
{ "from_mm_h": 64.0, "color": "#7e22ce" }
],
"attribution": "Radar: NOAA/NSSL MRMS; Deutscher Wetterdienst; KNMI (CC BY 4.0); EUMETNET OPERA (CC BY 4.0). Nowcast: Deutscher Wetterdienst (Germany) and KNMI (Netherlands) and WeatherAPI.com."
}
}
The frames list is shortened here: a full response has 25 observed frames (two hours) and 12 nowcast frames.
Leaflet example
const r = await (await fetch('https://api.weatherapi.com/v1/radar.json?key=YOUR_API_KEY&q=52.52,13.40')).json();
const map = L.map('map').setView([52.52, 13.40], 7);
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '© OpenStreetMap' }).addTo(map);
// one layer per frame, shown in turn
const layers = r.radar.frames.map(f => L.tileLayer(r.radar.tile_url.replace('{time}', f.time),
{ opacity: 0, maxNativeZoom: r.radar.max_zoom, attribution: r.radar.attribution }).addTo(map));
let i = 0;
setInterval(() => { layers.forEach((l, k) => l.setOpacity(k === i ? 0.8 : 0)); i = (i + 1) % layers.length; }, 500);