# Open Raadsinformatie

Agenda's, moties, raadsvoorstellen en verslagen van honderden gemeenten in één doorzoekbare index, met een open zoek-API.

- Uitgever: Open Raadsinformatie, Open State Foundation, Vereniging van Nederlandse Gemeenten
- Gebied: Nederland · Laagste detail: gemeente
- Periode: verschilt per gemeente · Ververst: dagelijks
- Toegang: Open · Licentie: Openbaar
- Koppelsleutels: gemeentecode (GM), vergaderdatum
- Status: grijs
- URL: https://openraadsinformatie.nl

## Wat kun je ermee?
- **Wat zei de raad hierover?.** Zoek een onderwerp in alle gemeenten tegelijk en zie waar het speelt.
- **Moties volgen.** Verzamel moties over een onderwerp en zie welke partijen ze indienen.

## Interessante koppelingen
- Waarom kreeg deze stichting subsidie? → [ams-subsidies](https://www.opendataindex.nl/bron/ams-subsidies.md) via naam organisatie. Zoek de naam in raadsstukken rond de datum van het besluit.

## Vergelijkbare bronnen
- [open-overheid-woo](https://www.opendataindex.nl/bron/open-overheid-woo.md): Woo-besluiten en andere openbaar gemaakte documenten.

## API (REST (JSON) + NDJSON-export)

- Basis: https://openbesluitvorming.nl/api
- Toegang: Geen sleutel of account; alle endpoints zijn alleen-lezen. (getest)
- Formaten: json, ndjson, jpeg
- Omvang: 5608332 documenten van 326 organisaties (308 gemeenten, 13 waterschappen, 8 provincies) volgens /api/stats, 16 okt 2026 (getest)
- Filteren: Geen querytaal: filter met organization, entityType, dateFrom en dateTo; zoek met vrije tekst in query. Fouten zijn JSON met een vaste code (unknown_organization, invalid_date …): kijk naar code, niet naar de Nederlandse tekst.; AND (impliciet), "woordgroep"

### Endpoints
- `GET /search`: Zoeken in vergaderingen, documenten, moties en gesproken woord; gegroepeerd en ontdubbeld, paginahits terug naar documentniveau (matchedPage).
- `GET /entities/{entity_id}`: Eén entiteit volledig: documenttekst als Markdown en downloadUrl; bij een vergadering de agenda, moties met stemmen en opnames met transcript. Id URL-coderen (dubbele punten).
- `GET /entities/{entity_id}/pdf/page/{n}`: Een PDF-pagina als JPEG (96 dpi, scale=2 voor 192 dpi); kop X-Pdf-Page-Count.
- `GET /sources`: Alle bronnen (organisaties) met key, leverancier en soort; implemented=true voor alleen actieve.
- `GET /stats`: Aantal documenten en organisaties (1 uur gecachet).
- `GET /status`: Versheid per organisatie en per leverancier in één aanroep: state, lastSuccessAt, latestContentDate, coverage, cbsId (10 minuten gecachet).
- `GET /export/snapshot?source={key}`: Bulk: de huidige stand van één bron als NDJSON, pagineren met cursor (X-Next-Cursor, X-Has-More).
- `GET /export/changes?source={key}&cursor={c}`: Bulk: wijzigingen sinds een cursor (upserts en deletes met reden), om bij te blijven zonder alles opnieuw te halen.

### Parameters
- `query`: Vrije tekst, geen querytaal: leestekens worden weggehaald en woorden met AND gecombineerd; "tussen aanhalingstekens" is een woordgroep. Verplicht tenzij organization is gegeven. "a b"~10 geeft 400. (uit de beschrijving)
- `organization`: Bron-key uit /sources (soest, amsterdam …), hoofdlettergevoelig; onbekend = 400. (uit de beschrijving)
- `entityType`: Meeting, Document, Motion of Recording, met hoofdletter (motion gaf 400 unknown_entity_type). (getest)
- `sort`: date_desc (standaard), date_asc, title_asc of relevance. (uit de beschrijving)
- `dateFrom`: Vanaf JJJJ-MM-DD (inclusief), op sortDate: de vergaderdatum, niet de schrijf- of publicatiedatum. (uit de beschrijving)
- `dateTo`: Tot en met JJJJ-MM-DD (de hele dag telt mee). (uit de beschrijving)
- `limit`: Resultaten per pagina, standaard 24, hoogstens 100. (uit de beschrijving)
- `offset`: Pagineren; reikt maar een paar honderd tot ongeveer duizend resultaten diep. Dieper: smaller filteren of de export gebruiken. (uit de beschrijving)
- `source`: Bij /export: de bron-key (verplicht). (uit de beschrijving)
- `cursor`: Bij /export: de X-Next-Cursor van de vorige pagina; cursor=motion springt naar de moties. (uit de beschrijving)

### Velden in zoekresultaat en detail (selectie) (13)
`entityId` string, `entityType` string, `organization` string, `sortDate` datetime, `title` string, `summary` string, `downloadUrl` uri, `matchedPage` integer, `totalCount` integer, `markdownText` string, `motion.result` string, `motion.votes` lijst, `recordings.segments` lijst

### Limieten en valkuilen
- 60 eenheden per minuut per client (token bucket). Een zoekvraag kost 1, plus 1 per 250 resultaten boven de 24; een PDF-pagina 1/8. Koppen RateLimit-Limit, -Remaining en -Reset; bij te veel 429 met Retry-After. (uit de beschrijving)
- Export: hoogstens 1.000 records per pagina (standaard 500). robots.txt sluit /api/export/ uit voor crawlers, maar de documentatie noemt de export juist als de route voor hergebruikers die alles willen. (uit de beschrijving)
- Dit is de opvolger van Open Raadsinformatie Classic (api.openraadsinformatie.nl, Elasticsearch). De oude ids zijn niet om te zetten naar de nieuwe; MediaObject heet nu Document. (uit de beschrijving)
- /sources gaf 397 bronnen (360 gemeenten, 21 waterschappen, 12 provincies, 4 verzamelingen), 335 actief. Leveranciers: iBabs 201, Notubiz 148, GemeenteOplossingen 43, Parlaeus 5. (getest)
- /status gaf 317 bronnen ok, 62 niet meer geïmporteerd, 10 opgeheven door herindeling (met opvolger en cbsId), 4 falend. latestContentDate ligt vaak in de toekomst: agenda's staan er voor de vergadering. (getest)
- Stemmen per raadslid alleen waar de raad digitaal stemt (volgens de documentatie 67 van 142 iBabs-gemeenten); Notubiz-bronnen hebben alleen de uitslag. Onthouding en afwezigheid zijn niet te onderscheiden. (uit de beschrijving)
- Transcripten zijn spraakherkenning zonder sprekers: geen citaten op naam. (uit de beschrijving)

### Voorbeeld
```
https://openbesluitvorming.nl/api/search?query=woningbouw&entityType=Motion&limit=3
```

## 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 (2)

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

- **Raadsdocumenten in Open Raadsinformatie per gemeente: het meest Amsterdam (224.023 documenten), dan Haarlem en Den Haag** (oktober 2026). Tabel ori_*. [Voorbeeld](https://www.opendataindex.nl/voorbeeld/ori-documenten-per-gemeente)
  - `https://api.openraadsinformatie.nl/v1/elastic/ori_*/_search?source_content_type=application/json&source=%7B%22size%22%3A0%2C%22query%22%3A%7B%22term%22%3A%7B%22%40type%22%3A%22MediaObject%22%7D%7D%2C%22aggs%22%3A%7B%22i%22%3A%7B%22terms%22%3A%7B%22field%22%3A%22_index%22%2C%22size%22%3A1000%7D%7D%7D%7D`
- **Vergaderingen van raden en commissies die in Open Raadsinformatie staan: 20.868 vergaderingen per jaar in 2025, 3,8 keer zo veel als in 2010** (2025). Tabel ori_*. [Voorbeeld](https://www.opendataindex.nl/voorbeeld/ori-vergaderingen-per-jaar)
  - `https://api.openraadsinformatie.nl/v1/elastic/ori_*/_search?source_content_type=application/json&source=%7B%22size%22%3A0%2C%22query%22%3A%7B%22term%22%3A%7B%22%40type%22%3A%22Meeting%22%7D%7D%2C%22aggs%22%3A%7B%22j%22%3A%7B%22date_histogram%22%3A%7B%22field%22%3A%22start_date%22%2C%22calendar_interval%22%3A%22year%22%2C%22format%22%3A%22yyyy%22%2C%22min_doc_count%22%3A1%7D%7D%7D%7D`
