Dutch Case Law API (Rechtspraak): ECLI lookup, uitspraken
Coming soon to the StoreLook up Dutch court decisions (uitspraken) by ECLI, or search them by court, legal area, date and keywords: court, decision and publication dates, case numbers, legal areas, procedure, the court's own summary (inhoudsindicatie), appeal / cassation / Advocate-General relations, referenced laws, and optionally the full text. Built for AI agents doing legal and compliance research, and for people who want Rechtspraak data as clean JSON.
Pricing (pay per event): $0.005 per decision returned (decision). An unknown ECLI, bad input or an empty search costs nothing.
Questions agents ask
- “Find Hoge Raad rulings on tenancy law (huurrecht) since 2024 and summarise what each one decided, with links.”
Example
Input
{ "query": "huurrecht", "courts": ["HR"], "dateFrom": "2024-01-01", "maxResults": 20 }Output
{
"schema_version": "1",
"ecli": "ECLI:NL:HR:2014:952",
"title": "ECLI:NL:HR:2014:952 Hoge Raad , 22-04-2014 / 12/05369",
"court": "Hoge Raad",
"court_code": "HR",
"court_id": "http://standaarden.overheid.nl/owms/terms/Hoge_Raad_der_Nederlanden",
"document_type": "uitspraak",
"decision_date": "2014-04-22",
"publication_date": "2014-04-22",
"modified": "2025-03-22T08:54:18",
"case_numbers": ["12/05369"],
"seat": null,
"legal_areas": ["Strafrecht"],
"procedures": ["Cassatie"],
"language": "nl",
"summary": "Belediging. Art. 137c Sr. Onder “zich in het openbaar uitlaten” a.b.i. art. 137c, Sr, welke bepaling beoogt de openbare orde te beschermen, dient te worden verstaan “het ter kennis van het publiek brengen”. ...",
"relations": [
{
"ecli": "ECLI:NL:PHR:2013:2630",
"relation": "conclusie",
"direction": "earlier",
"outcome": "gevolgd",
"label": "Conclusie: ECLI:NL:PHR:2013:2630, Gevolgd",
"url": "https://uitspraken.rechtspraak.nl/details?id=ECLI:NL:PHR:2013:2630"
},
{
"ecli": "ECLI:NL:GHAMS:2012:BY1475",
"relation": "cassatie",
"direction": "earlier",
"outcome": "bekrachtiging/bevestiging",
"label": "In cassatie op : ECLI:NL:GHAMS:2012:BY1475, Bekrachtiging/bevestiging",
"url": "https://uitspraken.rechtspraak.nl/details?id=ECLI:NL:GHAMS:2012:BY1475"
}
],
"references": [
{
"type": "law",
"label": "Wetboek van Strafrecht 137c",
"identifier": "jci1.31:c:BWBR0001854&artikel=137c",
"bwb_id": "BWBR0001854",
"article": "137c",
"url": "https://wetten.overheid.nl/jci1.31:c:BWBR0001854&artikel=137c"
}
],
"published_in": ["Rechtspraak.nl", "NJB 2014/985", "RvdW 2014/698", "NJ 2014/336 met annotatie van N. Keijzer", "SR-Updates.nl 2014-0195", "NbSr 2014/185"],
"replaces": [],
"replaced_by": null,
"has_text": true,
"text_chars": 24215,
"text": null,
"text_truncated": null,
"source_url": "https://uitspraken.rechtspraak.nl/details?id=ECLI:NL:HR:2014:952",
"data_url": "https://data.rechtspraak.nl/uitspraken/content?id=ECLI:NL:HR:2014:952",
"warnings": [],
"retrieved_at": "2026-11-05T22:45:19+00:00",
"duration_seconds": 0.11
}What you get
| Field | Type | Meaning |
|---|---|---|
schema_version | string | Output schema version. |
ecli | string | European Case Law Identifier of the decision, e.g. ECLI:NL:HR:2024:123. |
title | string | null | Rechtspraak's display title: ECLI, court, decision date and case numbers. |
court | string | null | Court (instantie) name, e.g. Hoge Raad, Raad van State, Rechtbank Amsterdam. |
court_code | string | null | Court code from the ECLI, e.g. HR, RVS, CRVB, GHAMS, RBAMS. |
court_id | string | null | The court's identifier URI in the Rechtspraak value list. |
document_type | string | null | "uitspraak" (decision) or "conclusie" (Advocate-General's opinion). |
decision_date | string | null | Date of the decision or opinion (uitspraakdatum), YYYY-MM-DD. |
publication_date | string | null | Date the text was published on rechtspraak.nl, YYYY-MM-DD. |
modified | string | null | Last change to the metadata or text, ISO 8601 (Rechtspraak local time). |
case_numbers | array | Case numbers (zaaknummers) as published, e.g. ["22/01066"]. |
seat | string | null | Place of session (zittingsplaats), when given. |
legal_areas | array | Legal areas (rechtsgebieden), e.g. ["Strafrecht"]. |
procedures | array | Procedure types, e.g. ["Cassatie"], ["Hoger beroep"]. |
language | string | null | Language code of the metadata record (nl); English translations say so in the summary. |
summary | string | null | The court's own summary (inhoudsindicatie) as plain text; null when none. |
relations | array | Formal relations to other decisions: {ecli, relation (hogerBeroep, cassatie, conclusie, ...), direction (earlier = the other decision is from an earlier instance, later = a later one), outcome (e.g. bekrachtiging/bevestiging, vernietiging, contrair), label, url}. |
references | array | References to legislation and case law: {type (law, case_law, eu_law, local_regulation), label, identifier (BWB jci or ECLI), bwb_id, article, url}. |
published_in | array | Where the decision is published (vindplaatsen), e.g. ["Rechtspraak.nl", "NJ 2014/336"]. |
replaces | array | Old identifiers (LJN) this ECLI replaces. |
replaced_by | string | null | ECLI that replaces this one, if it was withdrawn. |
has_text | boolean | Whether rechtspraak.nl publishes the decision text (false = metadata only). |
text_chars | integer | null | Length of the full plain text in characters (null without text). |
text | string | null | The decision as plain text (includeText only): '## ' section headings, numbering kept, footnotes at the end; cut at maxTextChars. |
text_truncated | boolean | null | True when text was cut at maxTextChars; null without includeText. |
source_url | string | The decision on uitspraken.rechtspraak.nl. |
data_url | string | The official Open Data XML this row was read from. |
warnings | array | Caveats in plain words: text cut, metadata only, replaced ECLI, keyword scan limit. |
retrieved_at | string | When the row was made (ISO 8601, UTC). |
duration_seconds | number | How long fetching this decision took. |
Use with AI agents (MCP)
Add this URL to your MCP client (Claude, Cursor, VS Code, ...) to load the Actor as a tool through the Apify hosted MCP server. It signs you in with OAuth or accepts Authorization: Bearer <APIFY_TOKEN>. It works once the Actor is live on the Apify Store.
https://mcp.apify.com?tools=bosco_labs/dutch-case-law
For “Find Hoge Raad rulings on tenancy law (huurrecht) since 2024 and summarise what each one decided, with links.” the agent passes:
{ "query": "huurrecht", "courts": ["HR"], "dateFrom": "2024-01-01", "maxResults": 20 }
stable snake_case fields, ISO dates, null for unknown, a rechtspraak.nl link per decision and per related decision. warnings says in plain words when text was cut, an ECLI has metadata only or was replaced, or a keyword scan hit its limit. An empty search ends with a status message saying why and what to try.
Or call the Apify API: POST https://api.apify.com/v2/acts/bosco_labs~dutch-case-law/run-sync-get-dataset-items with the input as JSON body. Cost: $0.005 per decision returned.
Input fields
| Field | Type | Meaning |
|---|---|---|
ecli | string | One or more Dutch ECLIs, separated by commas or spaces, e.g. "ECLI:NL:HR:2024:123" or "ECLI:NL:HR:2024:123, ECLI:NL:RVS:2024:1000" (max 100). Lower case and uitspraken.rechtspraak.nl links also work. One row per ECLI; an unknown ECLI fails at no charge. Empty = search with the fields below (both can be combined: ECLI rows come first). |
query | string | Words to find in the decision's title and summary (inhoudsindicatie), case-insensitive. Commas separate alternatives, words within one alternative must all appear: "huur, pacht" = huur OR pacht; "ontslag op staande voet" = all four words. Summaries are in Dutch, so use Dutch words. The official API has no full-text search: this filters the newest-updated decisions that match the other filters (up to 10,000 scanned). Empty = no keyword filter. |
courts | array | Court codes as used in the ECLI, e.g. ["HR"] for the Hoge Raad (Supreme Court); others: PHR (Procureur-Generaal/AG opinions), RVS (Raad van State), CRVB, CBB, GHAMS, GHARL, GHDHA, GHSHE (courts of appeal), RBAMS, RBDHA, RBROT, RBMNE ... (district courts). Full Dutch names also work. Empty = all courts. |
legalAreas | array | Rechtsgebied names, e.g. ["Strafrecht"], ["Belastingrecht", "Arbeidsrecht"]; English also works: criminal, civil, administrative, tax, employment, immigration, insolvency, family, competition, environmental. A main area includes its sub-areas. Empty = all areas. |
dateFrom | string | Earliest decision date (uitspraakdatum), YYYY-MM-DD, e.g. "2024-01-01". Empty = no lower limit (to today if dateTo is empty). |
dateTo | string | Latest decision date, inclusive, YYYY-MM-DD, e.g. "2024-12-31". Empty = today when dateFrom is set, else no limit. |
documentType | string | "uitspraak" = court decisions only, "conclusie" = opinions of the Advocate-General at the Hoge Raad only. Empty = both. |
maxResults | integer | Most decisions to return from a search, most recently published or updated first, e.g. 20 (default). One charge per decision returned. |
includeText | boolean | true = add the full decision as plain text (section headings as '## ', numbered paragraphs kept), cut at maxTextChars. Default false: metadata and summary only (small rows). Same price. |
maxTextChars | integer | With includeText: cap on the text per decision in characters, e.g. 20000 (default). Longer text is cut and flagged (text_truncated, text_chars gives the full length). |
Sources, licence and limits
Where does the data come from? Only from the Open Data service of the Dutch judiciary (Rechtspraak, data.rechtspraak.nl): the ECLI index and the decision XML. Nothing is added, rewritten or summarised; the summary is the court's own inhoudsindicatie.
Which courts? Everything Rechtspraak publishes: Hoge Raad and its Procureur-Generaal (PHR), Raad van State, Centrale Raad van Beroep, College van Beroep voor het bedrijfsleven, the four courts of appeal, the eleven district courts, the Caribbean courts and several disciplinary tribunals, from the 1990s on. Courts publish only a selection of their decisions, so absence from Rechtspraak does not mean a case does not exist.
Personal data? Courts pseudonymise decisions before publishing them: parties and other private persons appear as [eiser], [verdachte], [adres] and so on. This Actor returns the published text as is, adds nothing, links nothing to other sources and offers no search by person. Do not use it to try to re-identify anyone.
How current is it? Live: every run reads data.rechtspraak.nl. New decisions appear the day Rechtspraak publishes them, usually days to weeks after the decision date.
Is this legal advice? No. It returns published decisions and their metadata; it does not interpret them. English translations of some landmark decisions are unofficial (the courts say so in the summary); the Dutch text is authentic.
Limits: 100 ECLIs or 200 search results per run; no full-text search (see above); no filter by procedure type (the API has none; procedures is in every row); text cut at maxTextChars. Rechtspraak asks users to stay under 10 requests per second, so this Actor reads one decision at a time.
Content: decisions of the Dutch courts via Rechtspraak Open Data, https://www.rechtspraak.nl/uitspraken/open-data (court decisions carry no copyright, art. 11 Auteurswet). Text is converted from XML to plain text and long texts are cut where maxTextChars says; nothing else is changed.