Weather Radar API New

Radar API (radar.json): animated weather radar map tiles for the past two hours and a one-hour nowcast, with legend and attribution. US and Europe; Pro+ and above.

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
Loading the radar map…

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

FieldTypeDescription
availablebooleanWhether radar data is available right now.
coveredbooleanWhether the location in q is inside radar coverage.
tile_urlstringTile URL template. Replace {z}, {x}, {y} with the tile and {time} with a frame's time.
tile_url_expires_epochintWhen the signed tile URL stops working (Unix time).
min_zoom, max_zoom, tile_sizeintZoom levels with tiles, and tile size in pixels.
frames[]arrayFrames oldest first: time (UTC, yyyyMMddHHmm, for the tile URL), time_epoch, type (observed or nowcast).
sources[]arrayRadar networks: id, name, latest_epoch, nowcast_minutes, bounds [south, west, north, east].
legend[]arrayColours: from_mm_h (rain rate from which the colour applies) and color.
attributionstringCredit 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: '&copy; 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);

Quick and Easy Signup for Weather API

WeatherAPI.com makes it super easy to integrate our realtime, daily, hourly and 15 min interval weather forecast data, historical weather, marine weather, bulk request, air quality data, pollen, evapotranspiration, autocomplete, time zone, astronomy and sports data into your new or existing project.