# Dutch court rulings

An open API with all published rulings of Dutch courts: the full text in XML, with area of law, court, case number, date of ruling and a short summary. On 15 October 2026 the index held 3,778,296 ECLIs, of which 967,399 with the text of the ruling. New ones are added every day.

- Publisher: De Rechtspraak (Raad voor de rechtspraak)
- Area: Netherlands · Finest detail: ruling
- Period: 1880 – heden · Refreshed: daily
- Access: Open · Licence: Publiek domein (Public Domain Mark 1.0, volgens data.overheid.nl)
- Join keys: ECLI, zaaknummer, instantie
- Status: ok (2026-10-16) · 967.665 uitspraken met tekst · nieuwste: ECLI:NL:RBDHA:2026:27927
- URL: https://www.rechtspraak.nl/uitspraken/open-data

## What can you do with it?
- **What happened in court today?.** Request the rulings of the past day, newest first. Each entry has a summary and a link to the full text.
- **How many criminal cases does each court publish?.** Filter on criminal law and per court, and count per year. In 2025, 81,704 rulings with text went online (all areas of law). Compare which courts publish a lot or little.
- **Follow a topic over the years.** Fetch the text of all rulings in an area of law and search for a word, such as 'bank helpdesk fraud' or 'rent increase'. That shows when a phenomenon reaches the courts.
- **Compare sentences.** Extract the sentences from rulings on the same offence and compare them per court. Always read a handful of rulings yourself to check your text extraction.

## How to process it
1. **Search the ECLI index.** The search API returns an Atom feed of ECLIs. With return=DOC you only get rulings that have text; max is at most 1,000, use from to page.
   `https://data.rechtspraak.nl/uitspraken/zoeken?max=10&return=DOC&sort=DESC`
2. **Filter on area of law, court and date.** Filters are addresses (URIs) from the value lists. Give a period with date twice. Mind the case: rechtsgebied#strafrecht works, #strafRecht returns 0.
   `https://data.rechtspraak.nl/uitspraken/zoeken?max=10&return=DOC&subject=http://psi.rechtspraak.nl/rechtsgebied%23strafrecht&creator=http://standaarden.overheid.nl/owms/terms/Rechtbank_Amsterdam&date=2026-01-01&date=2026-10-15`
3. **Look at the value lists.** All courts and areas of law with their URIs are in separate XML lists.
   `https://data.rechtspraak.nl/Waardelijst/Rechtsgebieden`
4. **Fetch the ruling itself.** Per ECLI you get one XML file: first the metadata (RDF), then the text. With return=META only the metadata. An unknown ECLI returns 404.
   `https://data.rechtspraak.nl/uitspraken/content?id=ECLI:NL:RBLIM:2026:11142&return=META`
5. **Keep up with the modification date.** Rulings are changed afterwards. Use modified twice to request everything that changed in a period, instead of reloading everything.
   `https://data.rechtspraak.nl/uitspraken/zoeken?max=100&modified=2026-10-14T00:00:00&modified=2026-10-15T00:00:00`

## Interesting combinations
- Do offences that are often recorded also show up often in published rulings? → [politie-misdrijven](https://www.opendataindex.nl/en/bron/politie-misdrijven.md) via jaar + regio van de rechtbank. Count rulings per year that mention an offence and compare with recorded crimes in the municipalities of that court district. These are published rulings only, so compare ratios, not absolute numbers.

## Similar sources
- [open-overheid-woo](https://www.opendataindex.nl/en/bron/open-overheid-woo.md): Also full-text documents, but from government: FOI decisions and released papers, not court rulings.
- [cbs-statline](https://www.opendataindex.nl/en/bron/cbs-statline.md): CBS had counts of settled cases (table 70229ned, 1995 to 2016, discontinued). Numbers, not rulings.

## What to watch out for
- **Not every ruling is included.** The database holds published rulings, not all rulings. Of over 3 million ECLIs only key data are known (number, court, case number, date); 967,399 have text (15 October 2026). A count says something about what was published.
- **Anonymised, and keep it that way.** Names of suspects, victims and witnesses are replaced by labels such as [verdachte] and [slachtoffer 3]. Do not try to re-identify people by combining rulings with other sources.
- **XML, not JSON.** Search returns Atom (XML), a ruling is XML with RDF metadata. Big criminal cases run to hundreds of kilobytes. Only fetch text for the ECLIs you need.
- **The ruling date is not the publication date.** A September ruling may go online in October. sort orders by modification date, the date filter uses the ruling date. Recent years are still growing.
- **rechtspraak.nl refuses scripts.** www.rechtspraak.nl (including the open data documentation) returned 403 to our script. data.rechtspraak.nl and uitspraken.rechtspraak.nl do work.

## API (REST (Atom en XML met RDF))

- Base: https://data.rechtspraak.nl
- Access: No key or account. (tested)
- Formats: atom, xml
- Size: 3779185 ECLIs in the index, of which 967,666 with text (return=DOC), 16 Oct 2026 (tested)
- Filtering: Query parameters, no query language. Filter values are URIs from the value lists; give a range by repeating the parameter (date=…&date=…). There is no full-text search: q and procedure were ignored (total stayed 3,779,185).; =, twee keer = bereik

### Endpoints
- `GET /uitspraken/zoeken`: Search the ECLI index: Atom feed with per entry the ECLI, a title (court, date, case number), the summary and the modification date. The total is in subtitle ("Aantal gevonden ECLI's: N").
- `GET /uitspraken/content?id={ECLI}`: One ruling or opinion as XML: RDF metadata (court, dates, case number, procedure, area of law, citations, relations) plus summary and the full text.
- `GET /uitspraken/content?id={ECLI}&return=META`: Metadata only, without text.
- `GET /Waardelijst/{Instanties|Rechtsgebieden|Proceduresoorten|Formelerelaties}`: The code lists with URI and name; Instanties also with type, start and end date.
- `GET /Waardelijst/NietNederlandseUitspraken`: List of non-Dutch rulings that are referred to (3.5 MB).

### Parameters
- `max`: Number of entries, at most 1,000 (max=2000 did not return more). (experience)
- `from`: Offset, starts at 0. (experience)
- `sort`: ASC or DESC, on modification date. Any other value returns 400 with a JSON validation error. (tested)
- `return`: DOC = only ECLIs with text (967,666). Without return: all ECLIs (3,779,185). return=META returns 400 on search. (tested)
- `type`: Uitspraak (3,703,524) or Conclusie (75,661). (tested)
- `date`: Ruling date YYYY-MM-DD. Once = that day (2026-10-01: 460), twice = a period (1–5 Oct 2026: 1,399). (tested)
- `modified`: Modification date YYYY-MM-DDTHH:MM:SS. Once = from that moment (2,489), twice = a window (1,216 between 15 and 16 Oct 2026). Use this to stay up to date. (tested)
- `subject`: Area of law as URI, e.g. http://psi.rechtspraak.nl/rechtsgebied#strafrecht (# as %23). Case-sensitive: #strafrecht 539,117, #strafRecht 0. (tested)
- `creator`: Court as OWMS URI, e.g. http://standaarden.overheid.nl/owms/terms/Hoge_Raad_der_Nederlanden (with DOC 50,995). (tested)
- `replaces`: Old LJN number; returns the ECLI that replaces it (an unknown value gave 0). (tested)

### Fields in the feed and in a ruling (selection) (13)
`entry/id` string, `entry/title` string, `entry/summary` string, `entry/updated` datetime, `dcterms:creator` uri, `dcterms:date` date, `dcterms:issued` date, `psi:zaaknummer` string, `psi:procedure` uri, `dcterms:subject` uri, `dcterms:spatial` string, `dcterms:hasVersion` lijst, `uitspraak / conclusie` xml

### Limits and pitfalls
- No documented rate limit. A count (max=1) takes about 0.1 to 0.2 s; fetch texts only for the ECLIs you need (large criminal cases are hundreds of kB). (tested)
- You can count without fetching everything: max=1 and read the number from subtitle. (tested)
- An unknown sequence number for an existing court (ECLI:NL:RBROT:2026:999999) returned 404; an unknown court code returned 200 with an empty RDF. Check there is a dcterms:identifier. (tested)
- Areas of law overlap (a ruling can have several); courts don't. Count per court if you want totals to add up. (experience)
- The Instanties value list also contains abolished courts; 78 have no end date, including some historical ones. (experience)
- www.rechtspraak.nl (including the open data explanation) returns 403 to scripts (Akamai). data.rechtspraak.nl has no robots.txt (404) and works; don't work around it. (tested)

### Example
```
https://data.rechtspraak.nl/uitspraken/zoeken?max=3&return=DOC&sort=DESC&subject=http://psi.rechtspraak.nl/rechtsgebied%23strafrecht
```

## How to fetch it

### curl
```bash
curl "https://data.rechtspraak.nl/uitspraken/zoeken?max=5&return=DOC&sort=DESC&subject=http://psi.rechtspraak.nl/rechtsgebied%23strafrecht"
```

### python
```python
import requests
import xml.etree.ElementTree as ET

A = "{http://www.w3.org/2005/Atom}"
r = requests.get("https://data.rechtspraak.nl/uitspraken/zoeken", params={
    "max": 5, "return": "DOC", "sort": "DESC",
    "subject": "http://psi.rechtspraak.nl/rechtsgebied#strafrecht"})
feed = ET.fromstring(r.content)
print(feed.find(A + "subtitle").text)
for e in feed.findall(A + "entry"):
    print(e.find(A + "id").text, "·", (e.find(A + "summary").text or "")[:80])
```


## Examples with real figures (2)

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

- **Published rulings per court: most Rechtbank Den Haag (19,301 rulings), then Rechtbank Zeeland-West-Brabant and Rechtbank Rotterdam** (2025). Table uitspraken/zoeken. [Example](https://www.opendataindex.nl/en/voorbeeld/rechtspraak-uitspraken-per-gerecht)
  - `https://data.rechtspraak.nl/uitspraken/zoeken?max=1&return=DOC&date=2025-01-01&date=2025-12-31&creator=http%3A%2F%2Fstandaarden.overheid.nl%2Fowms%2Fterms%2FRechtbank_Den_Haag`
  - `https://data.rechtspraak.nl/uitspraken/zoeken?max=1&return=DOC&date=2025-01-01&date=2025-12-31`
- **Published court rulings: 81,786 rulings per year in 2025, 15 times as much as in 2000** (2025). Table uitspraken/zoeken. [Example](https://www.opendataindex.nl/en/voorbeeld/rechtspraak-uitspraken-per-jaar)
  - `https://data.rechtspraak.nl/uitspraken/zoeken?max=1&return=DOC&date=2025-01-01&date=2025-12-31`
