Items
Temperature at 1000 hPa
Connect
Temperature at 1000 hPa
-
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/ecmwf-aifs/ecmwf-aifs-pressure-levels/t_1000/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("ecmwf-aifs/ecmwf-aifs-pressure-levels/t_1000") 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/ecmwf-aifs/ecmwf-aifs-pressure-levels/t_1000/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/ecmwf-aifs/ecmwf-aifs-pressure-levels/t_1000/tiles/WebMercatorQuad/{z}/{x}/{y}.png?time={Time}&reftime={Reftime}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/ecmwf-aifs/ecmwf-aifs-pressure-levels/t_1000/tiles/WebMercatorQuad/{z}/{x}/{y}.png?time={Time}&reftime={Reftime}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.reftimeRequired for this collection, whose data comes in runs. The run a time belongs to, in the same format. A valid time belongs to one run, so send a run's reference time together with one of its valid times. 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/ecmwf-aifs-pressure-levels/x-georiva.runsis a list of runs, newest first. Each has areference_timeand itsvalid_times. Send a run'sreference_timeasreftimeand one of itsvalid_timesastime. (extent.temporal.valuesholds only the newest run's times.)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/ecmwf-aifs-pressure-levels/"; const TILES = "https://georiva.climtech.africa/titiler/central/ecmwf-aifs/ecmwf-aifs-pressure-levels/t_1000/tiles/WebMercatorQuad/{z}/{x}/{y}.png?time={Time}&reftime={Reftime}"; const iso = (t) => t.replace("+00:00", "Z"); fetch(EDR) .then((r) => r.json()) .then((doc) => { // One entry per (run, valid time) pair. const steps = doc["x-georiva"].runs.flatMap((run) => run.valid_times.map((t) => ({ time: t, reftime: run.reference_time })) ); const select = document.getElementById("time"); steps.forEach((s, i) => select.add(new Option(`${s.reftime} → ${s.time}`, i))); // Extra options fill the {Time} and {Reftime} placeholders. const pick = (i) => ({ Time: iso(steps[i].time), Reftime: iso(steps[i].reftime), }); 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/ecmwf-aifs-pressure-levels/"; const TILES = "https://georiva.climtech.africa/titiler/central/ecmwf-aifs/ecmwf-aifs-pressure-levels/t_1000/tiles/WebMercatorQuad/{z}/{x}/{y}.png?time={Time}&reftime={Reftime}"; const iso = (t) => t.replace("+00:00", "Z"); const tilesFor = (s) => TILES.replace("{Time}", iso(s.time)) .replace("{Reftime}", iso(s.reftime)); fetch(EDR) .then((r) => r.json()) .then((doc) => { // One entry per (run, valid time) pair. const steps = doc["x-georiva"].runs.flatMap((run) => run.valid_times.map((t) => ({ time: t, reftime: run.reference_time })) ); const select = document.getElementById("time"); steps.forEach((s, i) => select.add(new Option(`${s.reftime} → ${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 and run. 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/ecmwf-aifs-pressure-levels/Example
curl "https://georiva.climtech.africa/api/edr/collections/ecmwf-aifs-pressure-levels/"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. x-georiva.runsForecast runs, newest first, each with its reference_time and valid_times. 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.