Items
Precipitation
Connect
Precipitation
-
STAC
Use this variable over STAC
STAC is the catalogue standard for geospatial data. This variable is one STAC collection, and each timestep is an item with its own data files.
https://georiva.climtech.africa/api/stac/collections/chirps/chirps-monthly/precip/Browse it
STAC Browser shows the catalogue, collections and items in a web page, with no code.
Example
from pystac_client import Client client = Client.open("https://georiva.climtech.africa/api/stac/") collection = client.get_collection("chirps/chirps-monthly/precip") items = collection.get_items(datetime="2026-01-01/2026-03-31") for item in items: print(item.id, item.datetime)curl "https://georiva.climtech.africa/api/stac/collections/chirps/chirps-monthly/precip/items/?limit=10&datetime=2026-01-01T00:00:00Z/2026-03-31T00:00:00Z"Good to know
- Items come newest first, 100 at a time by default.
limitgoes up to 1000; follow thenextlink for more. datetimetakes one instant or a range,start/end, in ISO 8601 UTC.- Each item's
assetslists its data files; the cloud-optimised GeoTIFF is the one to read.
- Items come newest first, 100 at a time by default.
-
WMTS
Use this layer over WMTS
WMTS is the standard way to bring these layers into desktop GIS. One organisation-wide URL lists every layer you can see.
Which URL do I use?
Service URL For desktop GIS such as QGIS. Paste it where the client asks for a WMTS server; it lists every layer you can see and answers tile requests. Capabilities The same catalogue as a document you can read directly. For scripts and tooling: layer identifiers, the Time and Reftime dimensions and their values, the styles, and the tile URL templates. https://georiva.climtech.africa/api/wmts/central/WMTSCapabilities.xmlIn it, each layer is named
catalog:collection:variableand carries its own tile template, so you can build a tile URL without guessing the path.QGIS
- Open Layer ▸ Add Layer ▸ Add WMS/WMTS Layer…
- Choose New, give the connection a name and paste this URL:
https://georiva.climtech.africa/titiler/central/wmts - Choose Connect. The layer list fills from the service.
- Select a layer and choose Add.
Other WMTS clients
Any client that asks for a WMTS or "OGC tile" server takes the same URL. Tiles are PNG in the WebMercatorQuad grid.
Looking for WMS?
GeoRiva does not serve WMS. WMTS covers the same use in desktop GIS and is faster to render because tiles are cached.
-
XYZ tiles
https://georiva.climtech.africa/titiler/central/chirps/chirps-monthly/precip/tiles/WebMercatorQuad/{z}/{x}/{y}.png?time={Time}Use these tiles in a web map
The XYZ URL serves PNG map tiles in the standard web-map grid. It needs a time to draw, so a client has to know which times exist.
https://georiva.climtech.africa/titiler/central/chirps/chirps-monthly/precip/tiles/WebMercatorQuad/{z}/{x}/{y}.png?time={Time}Parameters
{z}/{x}/{y}Tile position. Your map library fills these in. timeRequired. ISO 8601 UTC, such as 2026-03-23T12:00:00Z. It must equal the time of an existing item exactly; otherwise the tile is a 404.styleOptional. A style name; leave it out for the variable's default. Which times exist?
Read them from the EDR collection document. It lists every time in one response, with no paging.
https://georiva.climtech.africa/api/edr/collections/chirps-monthly/extent.temporal.valuesis the list, oldest first. Each value is a validtime.The list covers the whole collection, not only this variable. A time this variable has no data for returns 404, so skip it. Timestamps end in
+00:00; send them asZ, because a raw+in a query string is read as a space.Example
// Needs a <div id="map"> and a <select id="time">. const map = L.map("map").setView([0, 20], 4); const EDR = "https://georiva.climtech.africa/api/edr/collections/chirps-monthly/"; const TILES = "https://georiva.climtech.africa/titiler/central/chirps/chirps-monthly/precip/tiles/WebMercatorQuad/{z}/{x}/{y}.png?time={Time}"; const iso = (t) => t.replace("+00:00", "Z"); fetch(EDR) .then((r) => r.json()) .then((doc) => { const steps = doc.extent.temporal.values.map((t) => ({ time: t })); const select = document.getElementById("time"); steps.forEach((s, i) => select.add(new Option(s.time, i))); // Extra options fill the {Time} placeholders. const pick = (i) => ({ Time: iso(steps[i].time), }); const layer = L.tileLayer(TILES, pick(0)).addTo(map); select.onchange = () => { Object.assign(layer.options, pick(select.value)); layer.redraw(); }; });// Needs `map` (a maplibregl.Map) and a <select id="time">. const EDR = "https://georiva.climtech.africa/api/edr/collections/chirps-monthly/"; const TILES = "https://georiva.climtech.africa/titiler/central/chirps/chirps-monthly/precip/tiles/WebMercatorQuad/{z}/{x}/{y}.png?time={Time}"; const iso = (t) => t.replace("+00:00", "Z"); const tilesFor = (s) => TILES.replace("{Time}", iso(s.time)); fetch(EDR) .then((r) => r.json()) .then((doc) => { const steps = doc.extent.temporal.values.map((t) => ({ time: t })); const select = document.getElementById("time"); steps.forEach((s, i) => select.add(new Option(s.time, i))); map.on("load", () => { map.addSource("data", { type: "raster", tiles: [tilesFor(steps[0])], tileSize: 256, }); map.addLayer({ id: "data", type: "raster", source: "data" }); }); // A raster source has no per-request parameters: give it a new URL. select.onchange = () => map.getSource("data").setTiles([tilesFor(steps[select.value])]); });If a tile does not draw
- 422: a required parameter, usually
time, is missing. - 400: the timestamp is not ISO 8601 UTC, often a
+that became a space. - 404 "File not found in storage": no item has exactly this time. Take it from the items list.
- 422: a required parameter, usually
-
EDR metadata only
Read this collection over EDR
The EDR collection document is a catalogue entry for the whole collection: its variables, units, extent and times. It covers every variable in the collection, not only the one you are viewing.
https://georiva.climtech.africa/api/edr/collections/chirps-monthly/Example
curl "https://georiva.climtech.africa/api/edr/collections/chirps-monthly/"Fields to read
parameter_namesThe collection's variables, with units. extent.spatialBounding box and CRS. extent.temporal.valuesEvery valid time, in one response with no paging. The XYZ guide uses this list to build a time picker for map tiles.
Not available yet
EDR data queries, such as position and area, are not available yet. The collection document may list a position link; it does not work.