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.
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 'https://api.rainviewer.com/public/weather-maps.json'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);import requests
res = requests.get("https://api.rainviewer.com/public/weather-maps.json", timeout=20)
res.raise_for_status()
print(res.json()){
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
(none) | n/a | Optional | The manifest endpoint takes no parameters. |
(tile path) | path | Optional | Built 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
Slippy Map Tile Calculator
Work out the XYZ tile for any coordinate and zoom, or the bounding box of a tile, with the Bing quadkey, pixel offset and metres per pixel.
Coordinate Converter
Convert GPS coordinates between decimal degrees, degrees-minutes-seconds and decimal minutes instantly. Paste any format like 40°26'46"N and copy the result.
GeoJSON Validator
Validate GeoJSON against RFC 7946 and get the exact JSON path of every problem: unclosed rings, swapped coordinates, missing properties and more.
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.