The educational system in the Netherlands is complex, and many public bodies are tasked with keeping schools and students on the right track. However, data regarding this task is made available to the general public in a way it is not easily processable, which makes checks by the public (and press) more difficult.

The OpenOnderwijs API alleviates this problem by providing a unified interface to data on education collected from several institutions with different responsibilities with regard to the Dutch educational system, such as DUO, Onderwijsinspectie and Vensters voor Verantwoording.

The OpenOnderwijs API is built on open source technology, such as Scrapy for scraping school data (the scrapers can be found at Github), Sphinx for the documentation, and ElasticSearch for efficient data storage and retrieval. Also, all school addresses are geocoded using the BAG42 service, an Dutch initiative aiming to integrate high quality, official data sources with “regular” geocoding.

Currently included data

  • DUO
    • Boards (bevoegde gezagen)
      • Addresses (geocoded)
      • General information: board id (bevoegd gezag nummer), denomination, etc.
      • Financial key indicators (financiële kengetallen)
    • Schools (hoofdvestigingen)
      • Addresses (geocoded)
      • Geo- and administrative regions (COROP, RMC, RPA, etc.)
      • General information: board id, BRIN, website, etc.
      • Dropouts (voortijdig schoolverlaters)
      • Collaborations (samenwerkingsverbanden): Light support (lichte ondersteuning) & Fitting education (passend onderwijs)
      • Staff numbers and FTE per age, gender, function group and employment (onderwijspersoneel)
      • (PO) Special Education Students per cluster (Leerlingen speciaal onderwijs naar cluster)
      • (VO) Prognosis of student numbers (prognose aantal leerlingen)
      • (VO) Staff numbers per course and level, per age and gender (onderwijspersoneel in aantal personen per gegeven vak, graad)
      • (VO) Teaching hours per course and level, per age and gender (aantal gegeven lesuren per vak, graad)
    • Branches (vestigingen)
      • Addresses (geocoded)
      • Geo- and administrative regions (COROP, RMC, RPA, etc.)
      • General information: board id, BRIN, branch id, website, etc.
      • Origin of students per year (Leerlingen per vestiging naar postcode leerling en leerjaar)
      • Students per education structure (Leerlingen per vestiging naar onderwijstype, lwoo indicatie, sector, afdeling, opleiding)
      • Student flow (Doorstromers van primair naar voortgezet onderwijs)
      • (VO) Exam candidates per year, education structure and gender (Examenkandidaten en geslaagden)
      • (VO) School and central exam results per year and education structure (Geslaagden, gezakten en gemiddelde examencijfers)
      • (PO) Students per year, birthyear, education type, advice (Leerlingen per vestiging naar leerjaar, geboortejaar, onderwijssoort, schooladvies)
      • (PO) Students as registered in BRON (Basisregister Onderwijs)
      • (PO) Students by finegrained structure (Leerlingen per samenwerkingsverband en onderwijstype)
      • (VO) Secondary education students in adult education (voortgezet algemeen volwassenenonderwijs)
    • Collaborations (samenwerkingsverbanden)
      • Addresses (geocoded)

Access data

The API section describes how the data in the OpenOnderwijs API can be accessed through a REST interface.

Alternatively, Mark Marijnissen made a tool available on GitHub ( that pulls data from the API and merges that data into CSV files.

API features

  • Data sources are scraped on a regular basis
  • Each item is validated against a simple set of rules (e.g. a zip code should not be longer than 6 characters)
  • Data is available through a simple REST API and as downloadable tarrballs
  • The API exposes powerful search capabilities


Add some links to relevant parts in the documentation. Determine what ‘regular basis’ will mean.

Table Of Contents

Previous topic

OpenOnderwijs API Documentation

Next topic