River levels and discharge in one API

Each country publishes its river gauges in its own format, with its own ids, units and update times. This API reads them and gives you one shape for all of them: the latest water level and discharge, the change over a day, the warning state where a country publishes one, and up to 30 days of history.

Where it covers

About 22,000 gauges reporting in Germany (federal waterways and North Rhine-Westphalia), France, England, Scotland, the Netherlands, Flanders, Luxembourg, Czechia, Ireland, Switzerland, Sweden, Finland, Canada and the USA, and in Catalonia, the Guadalquivir basin, Lombardy, Veneto, Emilia-Romagna and South Tyrol. Levels update as often as each country publishes them, from every 15 minutes to once a day. Sweden publishes discharge only.

Gauges near a point

curl "https://geo.runningcat.dev/v1/rivers?lon=6.869&lat=45.924&radiusKm=10&limit=5" \
  -H "Authorization: Bearer YOUR_KEY"
{
  "gauges": [
    { "id": "hubeau:V000201201", "name": "L'Arve à Chamonix-Mont-Blanc [Pont de l'Aiguille] - Station amont",
      "river": "L'Arve", "lon": 6.86815, "lat": 45.9199, "distanceKm": 0.46,
      "time": "2026-11-07T17:30:00.000Z", "levelCm": 13, "change24hCm": null,
      "dischargeM3s": 2.85, "warningCm": null, "alarmCm": null, "state": null }
  ]
}
levelCm
Water level in cm above the gauge's own zero (in the Netherlands above NAP, in Switzerland above sea level), so compare it with the same gauge's history
dischargeM3s
Flow in m³/s, where the gauge measures it
change24hCm
How much the level changed over about a day
state
normal, warning or alarm where the country publishes thresholds, otherwise null

In a box, along a route, over time

  • GET /v1/rivers?bbox=west,south,east,north lists up to 1,000 gauges in a box of up to 16 square degrees, for a map layer.
  • POST /v1/route/rivers with a GeoJSON route returns the gauges within 0.1 to 20 km of it, for paddling, rafting or a ride along a river.
  • GET /v1/rivers/{id}/history?days=30 returns the readings of one gauge for up to 30 days.

Why one API instead of a dozen

Every service has its own way to list stations, page through readings and name the river; some answer in millimetres or litres per second, some in local time without an offset. Here every gauge has the same fields, an id that names its source, and times in UTC, and the same key gives the weather, air quality and map data around it.

Price

Every request counts as one. The free plan gives 500 requests a day, also for commercial apps; Developer is $14.99 a month for 5,000 a day.

Credits: WSV PEGELONLINE (Germany, DL-DE Zero 2.0); LANUK North Rhine-Westphalia (DL-DE Zero 2.0); Hub'Eau / eaufrance (France, Licence Ouverte 2.0); Environment Agency (England) and SEPA (Scotland), containing public sector information licensed under the Open Government Licence v3.0; Rijkswaterstaat (Netherlands); Vlaamse Milieumaatschappij, waterinfo.be (Flanders); Administration de la gestion de l'eau (Luxembourg, CC0); FOEN / BAFU (Switzerland); SMHI (Sweden, CC BY 4.0); Syke, Finnish Environment Institute (Finland, CC BY 4.0); Environment and Climate Change Canada; U.S. Geological Survey (USA, public domain); Czech Hydrometeorological Institute (CC BY 4.0); Office of Public Works, Ireland, waterlevel.ie (CC BY 4.0); Agència Catalana de l'Aigua (Catalonia); Autonomous Province of Bolzano – South Tyrol (CC0); ARPA Lombardia (CC0); Arpae Emilia-Romagna (CC BY 4.0); ARPAV, Veneto (CC BY 4.0); Confederación Hidrográfica del Guadalquivir (SAIH) with gauge places from MITECO (CC BY 4.0).

The free plan gives 500 requests a day, for commercial apps too. Create an account with Google or your email and make your keys right away.