BYTETOOLS

RainViewer API

Free weather radar API with no key: a manifest of past and forecast radar frames worldwide, each resolving to standard map tiles you can overlay. Tested example included.

No API key requiredCORS enabledHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-21

What is the RainViewer API?

RainViewer publishes a manifest of global weather radar frames with no API key. It lists past frames and a short nowcast forecast, each with a timestamp and a path that combines with the tile host to produce standard slippy map tiles.

Radar imagery is normally the point at which a free weather integration stops, because national radar feeds are fragmented, differently projected and rarely free. RainViewer solves that by mosaicking radar from hundreds of national networks into a single global layer and publishing it as ordinary XYZ map tiles — the same format Leaflet, MapLibre and OpenLayers already speak.

The manifest is a directory, not the data. It hands you a `host` and a set of frame `path` values, which you concatenate with the standard `/{size}/{z}/{x}/{y}/{colour}/{options}.png` tile pattern to build a URL. Two things matter operationally: the `nowcast` array holds forecast frames extrapolated forward, typically half an hour ahead, which is what powers "rain arriving in 20 minutes" features; and frame paths are short-lived, so the manifest must be re-fetched every few minutes rather than cached with the tiles.

Quick facts

Base URL
https://api.rainviewer.com/public
Authentication
No API key for the public weather maps manifest and its tiles. RainViewer sells commercial plans for higher volume and additional layers.
Rate limit
No published limit on the manifest. Radar refreshes every ten minutes, which is the natural polling interval.
Pricing
Free for the public layer, with attribution. Commercial plans exist for heavier use.
CORS
Enabled — callable directly from browser JavaScript
Official docs
Read the docs

How to use the RainViewer API

Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.

1. Fetch the radar frame manifest

GET https://api.rainviewer.com/public/weather-maps.json

curl
curl 'https://api.rainviewer.com/public/weather-maps.json'
JavaScript (fetch)
const res = await fetch("https://api.rainviewer.com/public/weather-maps.json");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://api.rainviewer.com/public/weather-maps.json", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200
{
  "version": "2.0",
  "generated": 1787298333,
  "host": "https://tilecache.rainviewer.com",
  "radar": {
    "past": [
      {
        "time": 1787290800,
        "path": "/v2/radar/7ed4e09ccf4e"
      },
      {
        "time": 1787291400,
        "path": "/v2/radar/5849132ed45e"
      },
      {
        "time": 1787292000,
        "path": "/v2/radar/5c6eb398e2ca"
      },
      {
        "time": 1787292600,
        "path": "/v2/radar/103c5203870a"
      },
      {
        "time": 1787293200,
        "path": "/v2/radar/1cfaccc7c894"
      },
      {
        "time": 1787293800,
        "path": "/v2/radar/afd718a315e6"
      },
      {
        "time": 1787294400,
        "path": "/v2/radar/79aba361727c"
      },
      {
        "time": 1787295000,
        "path": "/v2/radar/fa884e99a02d"
      },
      {
        "time": 1787295600,
        "path": "/v2/radar/bae0086d05ce"
      },
      {
        "time": 1787296200,
        "path": "/v2/radar/374269f9931e"
      },
      {
        "time": 1787296800,
        "path": "/v2/radar/7577f06dea3c"
      },
      {
        "time": 1787297400,
        "path": "/v2/radar/cb076dd193e4"
      },
      {
        "time": 1787298000,
        "path": "/v2/radar/b0437d5379ba"
      }
    ],
    "nowcast": []
  },
  "satellite": {
    "infrared": []
  }
}

Parameters

ParameterTypeRequiredDescription
(none)n/aOptionalThe manifest endpoint takes no parameters.
(tile path)pathOptionalBuilt from `host` + frame `path` + `/{size}/{z}/{x}/{y}/{colour}/{options}.png` to fetch an individual tile. /256/6/32/21/2/1_1.png

Response fields

versionstring
Manifest schema version.
generatedinteger
Unix timestamp of manifest generation.
hoststring
Tile server base URL — currently a tilecache host. Read it from the response rather than hard-coding it.
radar.pastarray
Historical radar frames, oldest first. Each has a Unix `time` and a `path` fragment.
radar.nowcastarray
Extrapolated forecast frames, typically covering the next half hour in ten-minute steps.
radar.past[].time / pathinteger / string
Frame timestamp and the path fragment to splice into a tile URL.
satelliteobject
Infrared satellite frames in the same past/nowcast shape, for cloud cover rather than precipitation.

What you can build with the RainViewer API

  • Overlay animated rainfall radar on a web map
  • Build a rain-arriving-soon alert from the nowcast frames
  • Add radar to a hiking or cycling route planner
  • Show a looping radar animation on a weather dashboard

Common errors and how to fix them

Tile 404s

Frame paths expire as the manifest rolls forward.

Fix: Re-fetch the manifest every few minutes and rebuild tile URLs. Never persist a frame path.

Blank or transparent tiles

Radar coverage is not global — oceans and much of Africa have none.

Fix: Expect empty tiles outside covered regions and design the map so absence does not read as no rain.

Wrong tile host

The host is published in the manifest and can change.

Fix: Read `host` from every manifest fetch rather than hard-coding the tilecache domain.

Attribution missing

The free tier requires crediting RainViewer.

Fix: Add the attribution to your map. Commercial use at volume needs one of their paid plans.

RainViewer API — frequently asked questions

Is the RainViewer API free?

The public weather maps manifest and its tiles are free with no key, subject to attribution. RainViewer sells commercial plans for higher volume and additional layers.

How do I turn the manifest into an image?

Concatenate the `host`, the frame's `path`, and the standard tile pattern `/{size}/{z}/{x}/{y}/{colour}/{options}.png`. The result is an ordinary XYZ tile any mapping library can consume.

What is the nowcast array?

Forecast radar frames extrapolated forward, typically half an hour ahead in ten-minute steps. It is what powers rain-arriving-soon notifications.

Why do my tiles stop working after a while?

Frame paths are short-lived and roll forward as new radar arrives. Re-fetch the manifest every few minutes rather than caching tile URLs.

Tools that pair with this API

RainViewer is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.