# Waterinfo and Water Web Services

Rijkswaterstaat's measurements in the major rivers, along the coast and in the North Sea: water level, discharge, water temperature, waves and more. A new value every ten minutes, and for some stations a series going back to 1900. Waterinfo is the website, the Water Web Services are the API behind it.

- Publisher: Rijkswaterstaat
- Area: Netherlands · Finest detail: monitoring location, per 10 minutes
- Period: 1900 – heden (verschilt per meetpunt) · Refreshed: hourly
- Access: Open · Licence: Publiek domein (Public Domain Mark)
- Join keys: locatiecode, grootheid (WATHTE, Q, T), tijdstip
- Status: ok (2026-10-16) · waterhoogte Hoek van Holland 38 cm t.o.v. NAP (ongecontroleerd)
- URL: https://waterinfo.rws.nl

## What can you do with it?
- **How much higher than the tide?.** Besides the measurement, Rijkswaterstaat provides the astronomical water level: what the tide alone would give. The difference is the surge caused by wind and air pressure. In a storm you see the surge build up over hours.
- **The Rhine at Lobith.** Follow the discharge in cubic metres per second where the Rhine enters the Netherlands. Put a dry summer next to a wet winter and you see how far apart they are.
- **Sea level since 1900.** Calculate annual mean water levels at Hoek van Holland from 1900. Mind the switch in method from manual readings to automatic ten-minute values.
- **Wind and water level.** Join the highest water level per day to the wind KNMI measured at Hoek van Holland. Which wind direction and strength give the highest surge?

## How to process it
1. **Fetch the catalogue.** One POST with JSON returns all monitoring locations (2,499 on 15 October 2026) and the combinations of quantity, unit and compartment. That is how you find a location code, for example hoekvanholland or lobith.bovenrijn.tolkamer. The response is about 1.75 MB.
   `curl -X POST -H 'Content-Type: application/json' -d '{"CatalogusFilter":{"Grootheden":true,"Eenheden":true,"Compartimenten":true}}' https://ddapi20-waterwebservices.rijkswaterstaat.nl/METADATASERVICES/OphalenCatalogus`
2. **Request the latest value.** OphalenLaatsteWaarnemingen returns the last value per series. Old series come along too (the last manual reading from 1900, 1953 …). Keep only ProcesType meting and take the newest timestamp.
   `curl -X POST -H 'Content-Type: application/json' -d '{"LocatieLijst":[{"Code":"hoekvanholland"}],"AquoPlusWaarnemingMetadataLijst":[{"AquoMetadata":{"Compartiment":{"Code":"OW"},"Grootheid":{"Code":"WATHTE"}}}]}' https://ddapi20-waterwebservices.rijkswaterstaat.nl/ONLINEWAARNEMINGENSERVICES/OphalenLaatsteWaarnemingen`
3. **Fetch a period, with ProcesType.** OphalenWaarnemingen returns all values between start and end. Set ProcesType to meting, otherwise you also get the forecast and the astronomical tide.
   `curl -X POST -H 'Content-Type: application/json' -d '{"Locatie":{"Code":"lobith.bovenrijn.tolkamer"},"AquoPlusWaarnemingMetadata":{"AquoMetadata":{"Compartiment":{"Code":"OW"},"Grootheid":{"Code":"Q"},"ProcesType":"meting"}},"Periode":{"Begindatumtijd":"2026-10-14T00:00:00.000+01:00","Einddatumtijd":"2026-10-14T01:00:00.000+01:00"}}' https://ddapi20-waterwebservices.rijkswaterstaat.nl/ONLINEWAARNEMINGENSERVICES/OphalenWaarnemingen`
4. **Count first, then fetch.** OphalenAantalWaarnemingen counts how many values there are per year or month. One year of ten-minute values is 52,561 values per series. Fetch long series one year at a time.
   `curl -X POST -H 'Content-Type: application/json' -d '{"LocatieLijst":[{"Code":"hoekvanholland"}],"AquoMetadataLijst":[{"Compartiment":{"Code":"OW"},"Grootheid":{"Code":"WATHTE"}}],"Groeperingsperiode":"Jaar","Periode":{"Begindatumtijd":"2020-01-01T00:00:00.000+01:00","Einddatumtijd":"2026-01-01T00:00:00.000+01:00"}}' https://ddapi20-waterwebservices.rijkswaterstaat.nl/ONLINEWAARNEMINGENSERVICES/OphalenAantalWaarnemingen`

## Interesting combinations
- Which wind gives the highest water level? → [knmi-daggegevens](https://www.opendataindex.nl/en/bron/knmi-daggegevens.md) via datum (station 330, Hoek van Holland). Take the highest measured water level per day and join it to FHX (highest hourly mean wind) and DDVEC (wind direction) from KNMI station 330.
- Which floodplains flood at this water level? → [ahn](https://www.opendataindex.nl/en/bron/ahn.md) via hoogte t.o.v. NAP. Both are in centimetres or metres relative to NAP. Lay the measured river level over the elevation model and see which land lies lower. This is a first estimate: dikes and flow are not taken into account.

## Similar sources
- [PEGELONLINE (Wasserstraßen- und Schifffahrtsverwaltung)](https://www.pegelonline.wsv.de): Water levels on German rivers, with a simple REST API. Emmerich lies just upstream of Lobith: that is where you see the Rhine coming.
- [PSMSL (Permanent Service for Mean Sea Level)](https://psmsl.org): Monthly and annual mean sea levels worldwide, already cleaned. Less detail, easier for trends.
- [knmi-daggegevens](https://www.opendataindex.nl/en/bron/knmi-daggegevens.md): Weather instead of water. Needed to explain high water levels.

## What to watch out for
- **Times without summer time.** The API uses fixed Dutch winter time (+01:00), also in summer. You must give start and end times that way too, or you get an error.
- **Unchecked, checked, final.** Every value has a Statuswaarde. Recent measurements are unchecked. On 15 October 2026 the 2025 values for Hoek van Holland were checked.
- **Nothing before 1900.** A start date before 1900 gives an error, even if you only want to know whether data exists.
- **Large responses.** One year of water levels at Hoek van Holland is about 32 MB of JSON, because measurement, forecast and astronomical tide are all included and every value carries the full metadata.
- **Old example code no longer works.** The old address waterwebservices.rijkswaterstaat.nl redirects to a page about the switch. Use ddapi20-waterwebservices.rijkswaterstaat.nl. Many scripts and packages online still use the old address.

## API (REST (POST met JSON), DDAPI 2.0)

- Base: https://ddapi20-waterwebservices.rijkswaterstaat.nl
- Access: No key or account (tested). (tested)
- Formats: json
- Size: 2499 monitoring locations in the catalogue, with 202 quantity/unit/compartment combinations (137 quantities) and 21,085 location × measurement links (16 Oct 2026) (tested)
- Filtering: No query language: the JSON body names the location(s), the Aquo metadata (compartment, quantity, process type …) and the period.; 

### Endpoints
- `POST /METADATASERVICES/OphalenCatalogus`: Whole catalogue (~1.75 MB): LocatieLijst, AquoMetadataLijst, AquoMetadataLocatieLijst (which measurement where), status values, reference levels, commissioning bodies.
- `POST /ONLINEWAARNEMINGENSERVICES/OphalenLaatsteWaarnemingen`: Latest value per series for one or more locations and quantities (LocatieLijst + AquoPlusWaarnemingMetadataLijst).
- `POST /ONLINEWAARNEMINGENSERVICES/OphalenWaarnemingen`: All values in a period for one location and quantity (Locatie + AquoPlusWaarnemingMetadata + Periode).
- `POST /ONLINEWAARNEMINGENSERVICES/OphalenAantalWaarnemingen`: Number of values per year or month (Groeperingsperiode), separately per ProcesType and instrument.
- `POST /ONLINEWAARNEMINGENSERVICES/CheckWaarnemingenAanwezig`: Are there values in this period? Answer {"WaarnemingenAanwezig": "true"} (a string, not a boolean).

### Parameters
- `Locatie.Code / LocatieLijst[].Code`: Location code from the catalogue, lower case: hoekvanholland, lobith.bovenrijn.tolkamer. Unknown code: 400 with 'Locatie … niet gevonden'. (tested)
- `AquoMetadata.Compartiment.Code`: OW = surface water (also LT air, BS soil …). (tested)
- `AquoMetadata.Grootheid.Code`: WATHTE water level, Q discharge, T temperature, Hm0 wave height … (137 codes). (tested)
- `AquoMetadata.ProcesType`: Without it you get measurement, forecast and astronomical tide mixed together. (tested)
- `Periode.Begindatumtijd / Einddatumtijd`: ISO 8601 with time and zone (2026-10-15T00:00:00.000+01:00; Z and +02:00 are converted). Date only: 400. End is inclusive. (tested)
- `Groeperingsperiode`: Only for OphalenAantalWaarnemingen. (experience)
- `CatalogusFilter`: Which lists the catalogue returns, each true/false: Grootheden, Eenheden, Compartimenten, Hoedanigheden, Parameters, ProcesTypes, Typeringen, Organen, BioTaxon, Groeperingen, WaardeBewerkingsMethoden. (from the description)

### Fields in the OphalenWaarnemingen response (selection) (7)
`Locatie.Code / Naam / Lat / Lon` tekst / getal, `AquoMetadata.Grootheid / Eenheid / Hoedanigheid` code + omschrijving, `MetingenLijst[].Tijdstip` datetime, `MetingenLijst[].Meetwaarde.Waarde_Numeriek` getal, `WaarnemingMetadata.Statuswaarde` tekst, `WaarnemingMetadata.Kwaliteitswaardecode` tekst, `AquoMetadata.WaardeBepalingsMethode` code + omschrijving

### Limits and pitfalls
- No limit seen, but every value comes with full metadata: one year of Hoek van Holland water levels (3 series × ~52,600) is ~32 MB. Request per year or month and count first with OphalenAantalWaarnemingen. (experience)
- Dates before 1900 give a parse error. (experience)
- Response times are always in +01:00, also in summer. Convert to Europe/Amsterdam yourself. (tested)
- OphalenLaatsteWaarnemingen also returns closed series (last manual reading from 1900, 1953 …): take the newest timestamp. (experience)
- Sometimes two series for the same quantity (BemonsteringsSoort SB continuous and NVT with Bemonsteringshoogte -999999999); at Lobith NVT gave a tenth of SB. Use SB. (experience)
- Errors come as JSON with a Dutch message ('Het parsen van Begindatumtijd is mislukt …', 'Locatie … niet gevonden'). No OpenAPI; GET on the paths returns 404 problem+json. (tested)
- The old host waterwebservices.rijkswaterstaat.nl redirects to a migration page; old scripts must move to DDAPI 2.0. (experience)

### Example
```
https://ddapi20-waterwebservices.rijkswaterstaat.nl/ONLINEWAARNEMINGENSERVICES/OphalenWaarnemingen
```

## How to fetch it

### curl
```bash
curl -X POST -H 'Content-Type: application/json' -d '{"LocatieLijst":[{"Code":"hoekvanholland"}],"AquoPlusWaarnemingMetadataLijst":[{"AquoMetadata":{"Compartiment":{"Code":"OW"},"Grootheid":{"Code":"WATHTE"}}}]}' https://ddapi20-waterwebservices.rijkswaterstaat.nl/ONLINEWAARNEMINGENSERVICES/OphalenLaatsteWaarnemingen
```

### python
```python
import requests

r = requests.post(
    "https://ddapi20-waterwebservices.rijkswaterstaat.nl/ONLINEWAARNEMINGENSERVICES/OphalenWaarnemingen",
    json={
        "Locatie": {"Code": "lobith.bovenrijn.tolkamer"},
        "AquoPlusWaarnemingMetadata": {"AquoMetadata": {
            "Compartiment": {"Code": "OW"}, "Grootheid": {"Code": "Q"}, "ProcesType": "meting"}},
        "Periode": {"Begindatumtijd": "2026-10-14T00:00:00.000+01:00",
                    "Einddatumtijd": "2026-10-14T01:00:00.000+01:00"},
    },
)
for m in r.json()["WaarnemingenLijst"][0]["MetingenLijst"]:
    print(m["Tijdstip"], m["Meetwaarde"]["Waarde_Numeriek"], "m³/s")
```

## What you can build with it
- [Alert when the river near you is too high or too low](https://www.opendataindex.nl/en/bouwen/waterstand-alert.md): A small script that fetches the Rijkswaterstaat water level every few hours, adds the forecast for the coming days and sends an alert when the river leaves the normal band of the past ten years. With KNMI rainfall as context.


## Examples with real figures (1)

For each example the finding, the reference date and the call that fetches exactly these figures.

- **Rhine discharge at Lobith (monthly mean): 683 cubic metres per second in September 2026, 61% less than in September 2025** (september 2026). Table lobith.bovenrijn.tolkamer Q. [Example](https://www.opendataindex.nl/en/voorbeeld/rws-waterinfo-rijn-lobith)
  - `curl -X POST -H 'Content-Type: application/json' -d '{"Locatie":{"Code":"lobith.bovenrijn.tolkamer"},"AquoPlusWaarnemingMetadata":{"AquoMetadata":{"Compartiment":{"Code":"OW"},"Grootheid":{"Code":"Q"},"ProcesType":"meting"}},"Periode":{"Begindatumtijd":"2026-09-01T00:00:00.000+01:00","Einddatumtijd":"2026-10-01T00:00:00.000+01:00"}}' https://ddapi20-waterwebservices.rijkswaterstaat.nl/ONLINEWAARNEMINGENSERVICES/OphalenWaarnemingen`
