# Zoekdienst Overheid.nl (SRU)

De zoekdienst achter overheid.nl: één SRU-adres voor de officiële bekendmakingen (Staatscourant, Gemeenteblad, Kamerstukken …), de lokale regelgeving van gemeenten, provincies en waterschappen, de geldende wetten en de producten en diensten van overheden. Op 16 oktober 2026 stonden er 6,7 miljoen officiële publicaties in, 344.109 lokale regelingen, 148.592 wetsteksten en 54.667 producten. Je krijgt metadata in XML met een link naar het document.

- Uitgever: Kennis- en exploitatiecentrum Officiële Overheidspublicaties
- Gebied: Nederland · Laagste detail: publicatie of regeling
- Periode: per collectie (officiële publicaties tot vandaag) · Ververst: dagelijks
- Toegang: Open · Licentie: CC0 1.0 (volgens data.overheid.nl, dataset officiële bekendmakingen)
- Koppelsleutels: 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

## Wat kun je ermee?
- **Wat heeft jouw gemeente vandaag bekendgemaakt?.** Zoek op dcterms.creator en de publicatiedatum. Amsterdam staat in 2025 als maker bij 51.402 officiële publicaties; tussen 14 en 16 oktober 2026 waren het er 302.
- **De gemeenten zijn de grootste publicist.** In 2025 verschenen 695.682 officiële publicaties; 560.560 daarvan (81%) in het Gemeenteblad. De grafiek op deze pagina telt ze per blad.
- **Lokale regels naast elkaar.** De collectie cvdr bevat alle verordeningen van gemeenten, provincies en waterschappen. Vergelijk bijvoorbeeld de hondenbelasting of de regels voor terrassen.
- **Een wet volgen.** De collectie bwb heeft de geldende wetsteksten met hun versies. Gewijzigd sinds 1 oktober 2026: 656 regelingen.

## Zo verwerk je het
1. **Een zoekvraag stellen.** x-connection kiest de collectie (oep, cvdr, bwb, sc), query is CQL. Met maximumRecords=0 krijg je alleen het aantal.
   `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. **Records ophalen.** Elk record is een gzd-blok met OWMS-metadata: titel, identifier, soort, organisatie, datum en in enrichedData de url naar het document. Bij oep hoogstens 1.000 per verzoek.
   `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. **Lokale regelgeving van één gemeente.** In cvdr staat de gemeentenaam ook in dcterms.creator. Tilburg had er 1.105 (16 oktober 2026), van de Bouwverordening tot de Verordening Starterslening.
   `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. **Producten en diensten (Samenwerkende Catalogi).** De collectie sc beschrijft wat overheden aanbieden: vergunningen, subsidies, aanvragen. Tilburg had er 89 (16 oktober 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`

## Interessante koppelingen
- Van motie tot wet → [tweedekamer-opendata](https://www.opendataindex.nl/bron/tweedekamer-opendata.md) via dossiernummer. Volg een dossier in het Gegevensmagazijn van de Kamer en zoek met hetzelfde dossiernummer de Kamerstukken en de uiteindelijke publicatie in het Staatsblad.
- Wat besloot de raad, en wanneer werd het bekendgemaakt? → [openraadsinformatie](https://www.opendataindex.nl/bron/openraadsinformatie.md) via gemeentenaam en datum. Zoek een raadsbesluit in Open Raadsinformatie en de bijbehorende verordening in het Gemeenteblad of in cvdr.

## Vergelijkbare bronnen
- [open-overheid-woo](https://www.opendataindex.nl/bron/open-overheid-woo.md): Documenten die op grond van de Woo openbaar zijn gemaakt (besluiten, notities, mails), niet de officiële bekendmakingen.
- [openraadsinformatie](https://www.opendataindex.nl/bron/openraadsinformatie.md): Raadsstukken en vergaderingen van gemeenteraden; daar wordt besloten, in het Gemeenteblad wordt het bekendgemaakt.
- [tweedekamer-opendata](https://www.opendataindex.nl/bron/tweedekamer-opendata.md): Alles rond de Tweede Kamer met stemmingen en personen. De Kamerstukken staan in beide; de SRU-dienst geeft ze als officiële publicatie.

## Waar je op moet letten
- **SRU 1.2 verdwijnt.** Volgens de KOOP-handleiding (juni 2025) gaat KOOP over op SRU 2.0. De SRU 2.0-adressen (repository.overheid.nl/sru, zoekservice.overheid.nl/sru) hebben een robots.txt die alles uitsluit; wij gebruiken alleen het 1.2-adres zonder robots.txt.
- **Alleen metadata.** De zoekdienst geeft beschrijvingen met een link. De documenten zelf (XML, PDF) staan op repository.overheid.nl, waarvan robots.txt alles uitsluit.
- **Veldnamen zijn eigenwijs.** Zoek op publicationname, niet op w.publicatienaam (dat geeft "Invalid search field"), en op dcterms.modified, niet dt.modified. Een fout komt als diagnostics-XML met HTTP 200.
- **Hoogstens 1.000 per verzoek.** Bij oep geeft maximumRecords boven de 1.000 de melding "maximumRecords is 1000". Pagineer met startRecord.
- **Niet elke collectie werkt.** oep, cvdr, bwb en sc gaven antwoord; op en vb gaven "Cannot determine …" en tr een leeg antwoord (16 oktober 2026).

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

- Basis: https://zoekdienst.overheid.nl/sru/Search
- Toegang: Geen sleutel of account. (getest)
- Formaten: xml
- Omvang: 6721686 officiële publicaties in collectie oep (dcterms.modified >= 1900-01-01, 16 okt 2026); cvdr 344.112 regelingversies, bwb 148.602, sc 54.671 (getest)
- Filteren: CQL (Contextual Query Language): index operator waarde, gecombineerd met and/or/not; sorteren met sortby index/ascending|descending. Indexnamen mogen zonder voorvoegsel (publicationname = overheidop.publicationname). Datums als JJJJ-MM-DD.; ==, =, any, all, adj, >, >=, <, <=, and, or, not, sortby

### Endpoints
- `GET ?operation=searchRetrieve&x-connection=oep`: Officiële publicaties: Staatscourant, Staatsblad, Gemeenteblad, Provinciaal blad, Waterschapsblad, Kamerstukken, Handelingen, Kamervragen, Tractatenblad.
- `GET ?operation=searchRetrieve&x-connection=cvdr`: Lokale en regionale regelgeving (CVDR): verordeningen van gemeenten, provincies en waterschappen, elke versie een record.
- `GET ?operation=searchRetrieve&x-connection=bwb`: Basiswettenbestand: landelijke wetten en regelingen met geldigheidsperiode en links naar de XML-toestand.
- `GET ?operation=searchRetrieve&x-connection=sc`: Samenwerkende Catalogi: producten en diensten van overheden (vergunningen, aanvragen, subsidies).
- `GET ?operation=explain&x-connection=oep`: Beschrijving van de dienst: alle zoekbare indexen.

### Parameters
- `version`: Altijd 1.2. (getest)
- `operation`: searchRetrieve (zoeken) of explain (beschrijving). (uit de beschrijving)
- `x-connection`: De collectie: oep, cvdr, bwb of sc. op en vb gaven "Cannot determine …", tr een leeg antwoord. (getest)
- `query`: De zoekvraag in CQL, bv. publicationname=="Gemeenteblad" and dcterms.available>=2025-01-01. Sorteren in de query zelf: … sortby dcterms.available/descending. (getest)
- `startRecord`: Eerste record (begint bij 1). Het antwoord geeft nextRecordPosition. (getest)
- `maximumRecords`: Aantal records; 0 = alleen numberOfRecords. Bij oep hoogstens 1.000. (getest)
- `sortKeys`: SRU 1.2-parameter, maar sortKeys=dcterms.available,,0 sorteerde niet. Gebruik sortby in de query. (getest)

### Velden in een gzd-record (selectie) (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

### Limieten en valkuilen
- oep: maximumRecords hoogstens 1.000 (daarboven de melding "maximumRecords is 1000"). cvdr gaf met 5.000 gewoon alle 1.461 treffers. (getest)
- Geen gedocumenteerde rate limit. Tellingen met maximumRecords=0 zijn snel en klein (ongeveer 500 bytes). (getest)
- Fouten komen als <diagnostics> met HTTP 200: controleer altijd of er een <numberOfRecords> is. Een onbekende index geeft "Unsupported Parameter", ook cql.allRecords bij oep en sc. (getest)
- Zoek op publicationname, niet op w.publicatienaam, en op dcterms.modified, niet dt.modified. Bij sc heet de maker authority (authority=="Tilburg"); dcterms.creator geeft daar een fout. (getest)
- == en = gaven hetzelfde; exact gaf 0 treffers waar adj er 647 vond. Waarden van dcterms.type zijn kleine letters ("andere vergunning"). (getest)
- In cvdr is elke versie van een regeling een record (CVDR102368_1, _2 …): tel unieke regelingen op het deel voor de underscore. (getest)
- De teksten van cvdr en bwb staan als XML op repository.officiele-overheidspublicaties.nl (geen robots.txt, 404). De SRU 2.0-adressen (repository.overheid.nl/sru, zoekservice.overheid.nl/sru) sluiten in robots.txt alles uit. (getest)
- De explain-respons zegt zelf: "In de loop van 2021 zal alleen nog SRU versie 2.0 ondersteund worden." Op 16 oktober 2026 werkte 1.2 nog; reken op een overstap. (getest)

### Voorbeeld
```
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
```

## Zo haal je het op

### 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))
```

## Wat je ermee kunt bouwen
- [Raadsbesluiten-alert: een seintje als je gemeente iets besluit](https://www.opendataindex.nl/bouwen/raadsbesluiten-alert.md): Een script dat elke dag de officiële bekendmakingen van je gemeente doorzoekt op jouw onderwerp, alleen het nieuwe meldt, en erbij zet wat de raad er eerder over besprak.


## Voorbeelden met echte cijfers (1)

Per voorbeeld de bevinding, de peildatum en de aanroep die precies deze cijfers ophaalt.

- **Officiële publicaties per blad: het meest Gemeenteblad (560.560 publicaties), dan Staatscourant en Waterschapsblad** (2025). Tabel SRU 1.2, collectie oep. [Voorbeeld](https://www.opendataindex.nl/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`
