# Overheid.nl search service (SRU)

The search service behind overheid.nl: one SRU address for official announcements (Government Gazette, municipal gazettes, parliamentary papers …), local regulations of municipalities, provinces and water boards, the laws in force and the products and services of government bodies. On 16 October 2026 it held 6.7 million official publications, 344,109 local regulations, 148,592 law texts and 54,667 products. You get metadata in XML with a link to the document.

- Publisher: Kennis- en exploitatiecentrum Officiële Overheidspublicaties
- Area: Netherlands · Finest detail: publication or regulation
- Period: per collectie (officiële publicaties tot vandaag) · Refreshed: daily
- Access: Open · Licence: CC0 1.0 (volgens data.overheid.nl, dataset officiële bekendmakingen)
- Join keys: identifier (gmb-2026-480758), organisatienaam (dcterms.creator), organisatietype, dossiernummer
- Status: ok (2026-10-16) · 2.438 officiële publicaties op 2026-10-16
- URL: https://standaarden.overheid.nl/sru

## What can you do with it?
- **What did your municipality announce today?.** Search by dcterms.creator and publication date. Amsterdam is the creator of 51,402 official publications in 2025; between 14 and 16 October 2026 there were 302.
- **Municipalities publish the most.** In 2025, 695,682 official publications appeared; 560,560 of them (81%) in the municipal gazette. The chart on this page counts them per gazette.
- **Local rules side by side.** The cvdr collection holds all bylaws of municipalities, provinces and water boards. Compare for instance the dog tax or the rules for terraces.
- **Follow a law.** The bwb collection has the laws in force with their versions. Changed since 1 October 2026: 656 regulations.

## How to process it
1. **Ask a query.** x-connection picks the collection (oep, cvdr, bwb, sc), query is CQL. With maximumRecords=0 you only get the count.
   `https://zoekdienst.overheid.nl/sru/Search?version=1.2&operation=searchRetrieve&x-connection=oep&startRecord=1&maximumRecords=0&query=publicationname%3D%3D%22Gemeenteblad%22%20and%20dcterms.available%3E%3D2025-01-01%20and%20dcterms.available%3C%3D2025-12-31`
2. **Fetch records.** Every record is a gzd block with OWMS metadata: title, identifier, type, organisation, date, and in enrichedData the url of the document. For oep at most 1,000 per request.
   `https://zoekdienst.overheid.nl/sru/Search?version=1.2&operation=searchRetrieve&x-connection=oep&startRecord=1&maximumRecords=10&query=dcterms.creator%3D%3D%22Amsterdam%22%20and%20dcterms.available%3E%3D2026-10-14`
3. **Local regulations of one municipality.** In cvdr the municipality name is also in dcterms.creator. Tilburg had 1,105 (16 October 2026), from the building bylaw to the starter loan regulation.
   `https://zoekdienst.overheid.nl/sru/Search?version=1.2&operation=searchRetrieve&x-connection=cvdr&startRecord=1&maximumRecords=10&query=dcterms.creator%3D%3D%22Tilburg%22`
4. **Products and services (Samenwerkende Catalogi).** The sc collection describes what government bodies offer: permits, grants, applications. Tilburg had 89 (16 October 2026).
   `https://zoekdienst.overheid.nl/sru/Search?version=1.2&operation=searchRetrieve&x-connection=sc&startRecord=1&maximumRecords=1&query=authority%3D%3D%22Tilburg%22`

## Interesting combinations
- From motion to law → [tweedekamer-opendata](https://www.opendataindex.nl/en/bron/tweedekamer-opendata.md) via dossiernummer. Follow a file in the House's data warehouse and use the same file number to find the parliamentary papers and the final publication in the Bulletin of Acts.
- What did the council decide, and when was it announced? → [openraadsinformatie](https://www.opendataindex.nl/en/bron/openraadsinformatie.md) via gemeentenaam en datum. Find a council decision in Open Raadsinformatie and the matching bylaw in the municipal gazette or in cvdr.

## Similar sources
- [open-overheid-woo](https://www.opendataindex.nl/en/bron/open-overheid-woo.md): Documents released under the Open Government Act (decisions, notes, mails), not the official announcements.
- [openraadsinformatie](https://www.opendataindex.nl/en/bron/openraadsinformatie.md): Council papers and meetings of municipal councils; decisions are made there and announced in the municipal gazette.
- [tweedekamer-opendata](https://www.opendataindex.nl/en/bron/tweedekamer-opendata.md): Everything around the House of Representatives, with votes and people. Parliamentary papers are in both; the SRU service gives them as official publications.

## What to watch out for
- **SRU 1.2 is being phased out.** According to the KOOP manual (June 2025), KOOP is moving to SRU 2.0. The SRU 2.0 addresses (repository.overheid.nl/sru, zoekservice.overheid.nl/sru) have a robots.txt that excludes everything; we only use the 1.2 address, which has no robots.txt.
- **Metadata only.** The search service returns descriptions with a link. The documents themselves (XML, PDF) live on repository.overheid.nl, whose robots.txt excludes everything.
- **Field names are quirky.** Search on publicationname, not w.publicatienaam (that gives "Invalid search field"), and on dcterms.modified, not dt.modified. Errors come as diagnostics XML with HTTP 200.
- **At most 1,000 per request.** For oep, maximumRecords above 1,000 returns "maximumRecords is 1000". Paginate with startRecord.
- **Not every collection works.** oep, cvdr, bwb and sc responded; op and vb returned "Cannot determine …" and tr an empty response (16 October 2026).

## API (SRU 1.2 (XML, CQL))

- Base: https://zoekdienst.overheid.nl/sru/Search
- Access: No key or account. (tested)
- Formats: xml
- Size: 6721686 official publications in collection oep (dcterms.modified >= 1900-01-01, 16 Oct 2026); cvdr 344,112 regulation versions, bwb 148,602, sc 54,671 (tested)
- Filtering: CQL (Contextual Query Language): index operator value, combined with and/or/not; sort with sortby index/ascending|descending. Index names may omit the prefix (publicationname = overheidop.publicationname). Dates as YYYY-MM-DD.; ==, =, any, all, adj, >, >=, <, <=, and, or, not, sortby

### Endpoints
- `GET ?operation=searchRetrieve&x-connection=oep`: Official publications: Government Gazette, Bulletin of Acts, municipal, provincial and water board gazettes, parliamentary papers, proceedings, questions, Treaty Series.
- `GET ?operation=searchRetrieve&x-connection=cvdr`: Local and regional regulations (CVDR): bylaws of municipalities, provinces and water boards, each version a record.
- `GET ?operation=searchRetrieve&x-connection=bwb`: National legislation database (BWB): laws and regulations with validity period and links to the XML version.
- `GET ?operation=searchRetrieve&x-connection=sc`: Samenwerkende Catalogi: products and services of government bodies (permits, applications, grants).
- `GET ?operation=explain&x-connection=oep`: Description of the service: all searchable indexes.

### Parameters
- `version`: Always 1.2. (tested)
- `operation`: searchRetrieve (search) or explain (description). (from the description)
- `x-connection`: The collection: oep, cvdr, bwb or sc. op and vb returned "Cannot determine …", tr an empty response. (tested)
- `query`: The query in CQL, e.g. publicationname=="Gemeenteblad" and dcterms.available>=2025-01-01. Sort inside the query itself: … sortby dcterms.available/descending. (tested)
- `startRecord`: First record (starts at 1). The response gives nextRecordPosition. (tested)
- `maximumRecords`: Number of records; 0 = only numberOfRecords. For oep at most 1,000. (tested)
- `sortKeys`: SRU 1.2 parameter, but sortKeys=dcterms.available,,0 did not sort. Use sortby in the query. (tested)

### Fields in a gzd record (selection) (14)
`dcterms:identifier` string, `dcterms:title` string, `dcterms:type` string, `dcterms:creator` string, `dcterms:available` date, `dcterms:modified` date, `dcterms:subject` string, `overheidop:publicationname` string, `overheid:organisationtype` string, `overheidop:dossiernummer` string, `overheidrg:inwerkingtredingDatum` date, `overheidbwb:geldigheidsperiode_startdatum` date, `enrichedData/url` uri, `enrichedData/publicatieurl_xml` uri

### Limits and pitfalls
- oep: maximumRecords at most 1,000 (above that the message "maximumRecords is 1000"). cvdr returned all 1,461 hits with 5,000. (tested)
- No documented rate limit. Counts with maximumRecords=0 are fast and small (about 500 bytes). (tested)
- Errors come as <diagnostics> with HTTP 200: always check there is a <numberOfRecords>. An unknown index gives "Unsupported Parameter", as does cql.allRecords on oep and sc. (tested)
- Search on publicationname, not w.publicatienaam, and on dcterms.modified, not dt.modified. In sc the creator is called authority (authority=="Tilburg"); dcterms.creator gives an error there. (tested)
- == and = gave the same result; exact returned 0 hits where adj found 647. Values of dcterms.type are lowercase ("andere vergunning"). (tested)
- In cvdr every version of a regulation is a record (CVDR102368_1, _2 …): count unique regulations on the part before the underscore. (tested)
- The cvdr and bwb texts are XML on repository.officiele-overheidspublicaties.nl (no robots.txt, 404). The SRU 2.0 addresses (repository.overheid.nl/sru, zoekservice.overheid.nl/sru) exclude everything in robots.txt. (tested)
- The explain response itself says that during 2021 only SRU 2.0 would be supported. On 16 October 2026 version 1.2 still worked; expect a migration. (tested)

### Example
```
https://zoekdienst.overheid.nl/sru/Search?version=1.2&operation=searchRetrieve&x-connection=oep&startRecord=1&maximumRecords=2&query=dcterms.creator%3D%3D%22Utrecht%22%20sortby%20dcterms.available%2Fdescending
```

## How to fetch it

### curl
```bash
curl "https://zoekdienst.overheid.nl/sru/Search?version=1.2&operation=searchRetrieve&x-connection=oep&startRecord=1&maximumRecords=5&query=dcterms.creator%3D%3D%22Utrecht%22%20and%20dcterms.available%3E%3D2026-10-01"
```

### python
```python
import re, requests

url = "https://zoekdienst.overheid.nl/sru/Search"
for blad in ["Gemeenteblad", "Staatscourant", "Provinciaal blad", "Waterschapsblad"]:
    q = f'publicationname=="{blad}" and dcterms.available>=2025-01-01 and dcterms.available<=2025-12-31'
    xml = requests.get(url, params={"version": "1.2", "operation": "searchRetrieve", "x-connection": "oep",
                                    "startRecord": 1, "maximumRecords": 0, "query": q}).text
    print(blad, re.search(r"<numberOfRecords>(\d+)", xml).group(1))
```

## What you can build with it
- [Council decision alert: a ping when your municipality decides something](https://www.opendataindex.nl/en/bouwen/raadsbesluiten-alert.md): A script that searches your municipality's official announcements for your topic every day, reports only what is new, and adds what the council discussed about it earlier.


## Examples with real figures (1)

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

- **Official publications by gazette: most Gemeenteblad (municipal gazette) (560,560 publications), then Staatscourant (government gazette) and Waterschapsblad (water board gazette)** (2025). Table SRU 1.2, collectie oep. [Example](https://www.opendataindex.nl/en/voorbeeld/overheid-sru-publicaties-per-blad)
  - `https://zoekdienst.overheid.nl/sru/Search?version=1.2&operation=searchRetrieve&x-connection=oep&startRecord=1&maximumRecords=0&query=publicationname%3D%3D%22Gemeenteblad%22%20and%20dcterms.available%3E%3D2025-01-01%20and%20dcterms.available%3C%3D2025-12-31`
  - `https://zoekdienst.overheid.nl/sru/Search?version=1.2&operation=searchRetrieve&x-connection=oep&startRecord=1&maximumRecords=0&query=dcterms.available%3E%3D2025-01-01%20and%20dcterms.available%3C%3D2025-12-31`
