303.524 datasets geïndexeerd1.418 uitgevers
Open Data IndexDe index van open data over Nederland
Bronnen›Onderwijs

DUO open onderwijsdata

Alle scholen en opleidingen met adres, en per schoolvestiging het aantal leerlingen, schooladviezen, doorstroomtoetsscores, examencijfers en prognoses. Van basisschool tot universiteit. DUO publiceert het als downloads en als API (56 datasets met 274 tabellen in de datastore op 16 oktober 2026).

OnderwijsBevolkingOpenAPIDownloadNederland · schoolvestiging
Actueel · bijgewerkt 10 uur geleden · gecontroleerd 17:23
duo.nl
Schermafbeelding van duo.nl

Wat er allemaal in zit348

Alle datasets in de catalogus van DUO, per onderwerp zoals DUO ze indeelt, met elk bestand erbij, elke nacht opgehaald. Elke tabel heeft een eigen pagina met het aantal rijen, de kolommen en de API-aanroep.

348in totaal
276tabellen
56datasets
19,7 mln.rijen in totaal
154bijgewerkt in de afgelopen 30 dagen

Arbeidsovereenkomst en cao5

Basisonderwijs74

Hoger onderwijs38

Inburgering3

Middelbaar beroepsonderwijs43

Speciaal onderwijs en leerproblemen55

Voortgezet onderwijs33

Zonder groep165

Leerlingen in het basisonderwijs: 1,36 miljoen in 2025/26, 10% minder dan in 1996/97

Leerlingen in het basisonderwijs, 1996/97 – 2025/26, in miljoen. Het hoogste punt was 2008/09 (1,55).

Bron: DUO, Historische leerlingentellingen PO gemeente per jaar · opgehaald 25 oktober 2026 · selectie: onderwijssoort BO; peildatum 1 oktoberOpen de tabel Los blok

Mbo-studenten per opleidingsrichting: het meest Zorg en welzijn (141.737 studenten), dan Economie en administratie en Techniek en procesindustrie

Mbo-studenten per opleidingsrichting, oktober 2025, in studenten. Totaal: 475.113; de grootste 12 van 17 categorieën staan in de grafiek. Zorg en welzijn is 30% van het totaal. Inschrijvingen op 1 oktober 2025 (voorlopige cijfers volgens DUO). 567 cellen met 1 tot 4 studenten zijn afgeschermd en niet meegeteld.

Bron: DUO, Mbo-studenten per sectorkamer en leerweg (studenten per sectorkamer, leerweg, niveau en woonprovincie) · opgehaald 25 oktober 2026 · selectie: kolom JAAR_2025; per hoofdgroep naamOpen de tabel Los blok

Wat je ermee kunt bouwen1

Wat kun je ermee?4 ideeën

Om te beginnen

Welk advies krijgen kinderen op jouw basisschool?

Tel per vestiging de schooladviezen per jaar (sinds 2010) en vergelijk de school met andere scholen in de gemeente.

Om te beginnen

Krimp en groei per school

Leerlingen per vestiging staan er van 2010 tot en met 2025. Zoek scholen die in tien jaar de helft van hun leerlingen kwijtraakten.

Voor gevorderden

Schooladvies naast de buurt

Koppel vestigingen via postcode of gemeentenummer aan inkomen en opleiding uit de CBS-kerncijfers. Krijgen kinderen in armere buurten lagere adviezen?

Voor gevorderden

Waar komen de leerlingen vandaan?

Het bestand naar postcode4 laat per vestiging zien uit welke postcodegebieden de leerlingen komen. Zo meet je hoe ver ouders reizen voor een school.

Zo verwerk je het6 stappen

  1. Zoek de dataset in de catalogus

    De catalogus is een CKAN-portaal. Zoek op een woord en kijk bij elke dataset welke bestanden (resources) erbij horen.

    https://onderwijsdata.duo.nl/api/3/action/package_search?q=advies&rows=5
  2. Vraag rijen op via de datastore

    Elk CSV-bestand staat ook in de datastore. Met resource_id, filters en sort haal je alleen wat je nodig hebt. Dit voorbeeld: schooladviezen van één school in 2024.

    https://onderwijsdata.duo.nl/api/3/action/datastore_search?resource_id=454c5dd4-6815-4b52-ae2f-b9eebc6afa6d&filters=%7B%22INSTELLINGSCODE%22%3A%2200AP%22%2C%22PEILJAAR%22%3A2024%7D
  3. Of download het hele bestand

    Voor een volledige analyse is de CSV handiger. Sommige downloadlinks in de catalogus wijzen naar een interne server (beheer-ggm-ckan-prd…); vervang de host door onderwijsdata.duo.nl.

    https://onderwijsdata.duo.nl/dataset/d6903313-8c64-4b12-b4ac-07e5655ef9f4/resource/454c5dd4-6815-4b52-ae2f-b9eebc6afa6d/download/brin6_advies.csv
  4. Koppel aan adressen

    Leerlingbestanden hebben alleen instellingscode en vestigingscode. Naam, adres, postcode en gemeentenummer staan in de adressenbestanden (bijvoorbeeld alle vestigingen in het basisonderwijs).

    https://onderwijsdata.duo.nl/api/3/action/datastore_search?resource_id=dcc9c9a5-6d01-410b-967f-810557588ba4&limit=5
  5. Haal de kleine aantallen eruit

    Een -1 betekent 1 tot 4 leerlingen (afgeschermd). Tel die niet mee als getal; reken met een onder- en bovengrens of laat ze weg.

  6. Erkende opleidingen in het hoger onderwijs

    Het Overzicht Erkenningen ho (CC BY) geeft per instelling, vestiging en opleiding de erkenning, accreditatiedata, studielast, graad en status, actueel en historisch: 74.173 rijen op 16 oktober 2026. Deze dataset staat alleen in de catalogus van DUO, niet op data.overheid.nl.

    https://onderwijsdata.duo.nl/api/3/action/datastore_search?resource_id=28a4d89b-c223-4dbc-8deb-9d02a533f215&limit=5

Interessante koppelingen

Vergelijkbare bronnen

  • CBS StatLine

    CBS heeft onderwijscijfers per gemeente en landelijk, niet per school.

  • Scholen op de kaart nog niet uitgelegd

    Schoolprofielen voor ouders, op basis van onder meer DUO-gegevens. Een website, geen dataset.

Waar je op moet letten

  • Aantallen onder de 5 zijn afgeschermd

    In de API staat dan -1, in sommige bestanden '<5'. Bij kleine scholen is dat een groot deel van de cellen.

  • Niet elke dataset is actueel

    De registratie van scholen en opleidingen (RIO) wordt elke dag ververst, leerlingtellingen eens per jaar (peildatum 1 oktober). Examencijfers per vestiging in de API lopen tot schooljaar 2017 (stand 15 oktober 2026).

  • Codes zonder uitleg in de API

    Het veld ADVIES is een getal (bijvoorbeeld 5, 7 of 11), geen tekst. Zoek de betekenis op bij DUO voor je telt.

  • Geen SQL op de datastore

    datastore_search_sql geeft 'Geen toegang'. Groeperen en tellen doe je zelf, na het ophalen.

  • Niet alles staat ook op data.overheid.nl

    Een paar datasets staan alleen in de DUO-catalogus, zoals het Overzicht Erkenningen ho en Sectorale Ontwikkelpaden (welke opleidingen bij een ontwikkelpad horen en of er SLIM-subsidie mogelijk is). Bij Sectorale Ontwikkelpaden staat geen licentie in de catalogus (16 oktober 2026): licentie niet vastgesteld.

APICKAN (Action API v3 + datastore) · gelezen 16 okt 2026

StandaardCKAN (Action API v3 + datastore)documentatie
Toegang zonder sleutel

Geen sleutel of account nodig getest

Omvang274

tabellen in de datastore (van 290 bestanden in 56 datasets) getest

Formaten

jsoncsv

Basisadres

https://onderwijsdata.duo.nl/api/3/action

Endpoints 8

  • GET/package_listNamen van alle 56 datasets (bv. adressen_bo, 03_voex-v1, historische-leerlingenaantallen-po).
  • GET/package_search?q=…&fq=…&rows=…Zoeken in de catalogus; met rows=0 alleen het aantal. Geeft per dataset ook alle resources (bestanden) met id, formaat en datastore_active.
  • GET/package_show?id={naam}Eén dataset: beschrijving, licentie, metadata_modified en de resources met hun resource_id en download-URL.
  • GET/resource_show?id={resource_id}Eén bestand: naam, formaat, last_modified, download-URL.
  • GET/group_listDe acht onderwerpgroepen (basisonderwijs, voorgezet-onderwijs, hoger-onderwijs, inburgering …).
  • GET/group_show?id={groep}Eén groep met titel en beschrijving.
  • GET/datastore_search?resource_id={id}De rijen van één tabel, met filters, vrij zoeken, sorteren, kolomkeuze en paginering. Het antwoord noemt ook de kolommen met type.
  • GET/dataset/{dataset-id}/resource/{resource_id}/download/{bestand}.csvHet hele bestand als CSV (pad zonder /api/3/action, op https://onderwijsdata.duo.nl).

Filteren getest

Geen querytaal: gelijk-aan-filters als JSON in filters (waarde of lijst van waarden), plus vrij zoeken met q. Geen groter-dan of kleiner-dan; datastore_search_sql is uitgeschakeld.

= (filters)IN (lijst in filters)q (vrij zoeken)

Parameters 10

resource_idVerplicht bij datastore_search: de id van het bestand (uit package_show).getest
filtersGelijk-aan-filter per kolom als JSON, ook met een lijst: {"PEILJAAR":[2023,2024]}. Kolomnamen exact zoals in fields (soms met spaties: "BEVOEGD GEZAG NUMMER").getest
qVrij zoeken in alle kolommen, of per kolom: {"PLAATSNAAM":"utrecht"} (woordovereenkomst, niet hoofdlettergevoelig).getest
fieldsAlleen deze kolommen, kommagescheiden.getest
sortSorteren, bv. PEILJAAR desc.getest
limitAantal rijen; standaard 100 (CKAN). 40.000 werd gewoon geleverd; limit=0 geeft alleen total en kolommen.getest
offsetPaginering; het antwoord heeft _links.next met de volgende pagina.getest
records_formatobjects (standaard), lists of csv (rijen als één CSV-tekst, zonder kop).getest
include_totalfalse slaat het tellen over (sneller bij grote tabellen).getest
q / fq / rows / start / sort (package_search)Solr-zoeken in de catalogus: fq=groups:basisonderwijs (24 datasets), sort=metadata_modified desc.getest

Velden in de datastore (selectie: schooladviezen en adressen basisonderwijs) 8

NaamTypeBetekenis
INSTELLINGSCODEtextBRIN-code van de school (4 tekens, bv. 00AP)
VESTIGINGSCODEtextVestiging: in leerlingbestanden 2 tekens (00), in adressenbestanden BRIN+2 (32JK00)
PEILJAARnumericJaar van de telling (peildatum 1 oktober)
ADVIESnumericSchooladvies als getalcode; de betekenis staat in de bestandsbeschrijving op duo.nl, niet in de API
AANTAL_LEERLINGENnumericAantal leerlingen; -1 = 1 tot 4 (afgeschermd)
GEMEENTENUMMERtextGemeentecode zonder GM, als tekst met voorloopnullen ("1699")
POSTCODEtextPostcode van de vestiging (adressenbestanden)
_idintRijnummer in de datastore

Limieten en valkuilen

  • Geen sleutel en geen gedocumenteerde rate limit. Standaard 100 rijen per aanroep; een limit van 40.000 werd geleverd. Pagineer met offset of _links.next. getest
  • Alleen een deel van de CKAN-acties staat open (package_list, package_search, package_show, resource_show, group_list, group_show, datastore_search). getest
  • Andere CKAN-acties (status_show, organization_list, tag_list, datastore_info, help_show) geven HTTP 200 met de HTML van de website, geen JSON-fout. Controleer altijd of het antwoord JSON is. datastore_search_sql geeft 400 "Action name not known". getest
  • distinct=true telt goed (total 15 peiljaren in de schooladviezen) maar gaf maar één rij terug. Gebruik voor unieke waarden liever een kleine kolomselectie met een hoge limit. getest
  • AVG: aantallen van 1 tot 4 staan als -1 in de API (in sommige bestanden als <5). Niet optellen als getal. getest
  • Negen download-URL's in de catalogus wijzen naar een interne host (beheer-ggm-ckan-prd.apps.prd.duo.rijksapps.nl) die buiten DUO niet bestaat; vervang de host door onderwijsdata.duo.nl. getest
  • Leerlingbestanden hebben alleen BRIN en vestigingscode; naam, adres en gemeente koppel je via de adressenbestanden (adressen_bo, adressen_vo …). Gemeentenummer zonder GM: plak er GM en voorloopnullen voor om met CBS te koppelen. ervaring
  • Resource-id's veranderen niet bij een nieuwe levering; metadata_modified van de dataset en last_modified van de resource geven de versheid (adressen worden dagelijks ververst). ervaring

Probeer het HTTP 200 · 694 ms · 16 okt

https://onderwijsdata.duo.nl/api/3/action/datastore_search?resource_id=454c5dd4-6815-4b52-ae2f-b9eebc6afa6d&filters={"PEILJAAR"%3A2024}&sort=AANTAL_LEERLINGEN desc&limit=3
{
  "help": "https://onderwijsdata.duo.nl/api/3/action/help_show?name=datastore_search",
  "success": true,
  "result": {
    "filters": {
      "PEILJAAR": 2024
    },
    "include_total": true,
    "limit": 3,
    "records_format": "objects",
    "resource_id": "454c5dd4-6815-4b52-ae2f-b9eebc6afa6d",
    "sort": "AANTAL_LEERLINGEN desc",
    "total_estimation_threshold": null,
    "records": [
      {
        "_id": 104633,
        "INSTELLINGSCODE": "05VX",
        "VESTIGINGSCODE": "00",
        "TYPE_PO": "BO",
        "PEILJAAR": 2024,
        "ADVIES": 12,
        "AANTAL_LEERLINGEN": 234
      },
      {
        "_id": 492855,
        "INSTELLINGSCODE": "17ON",
        "VESTIGINGSCODE": "00",
        "TYPE_PO": "BO",
        "PEILJAAR": 2024,
        "ADVIES": 12,
        "AANTAL_LEERLINGEN": 78
      }
    ],
    "fields": [
      {
        "id": "_id",
        "type": "int"
      },
      {
        "id": "INSTELLINGSCODE",

Ingekort antwoord, opgeslagen bij het oogsten. Klik op het adres voor het echte, actuele antwoord.

Gelezen uit CKAN Action API (platformdocumentatie) · CKAN datastore_search: filters, q, sort, fields, distinct · DUO: uitleg per onderwerp en bestandsbeschrijvingen. Labels: uit de beschrijving staat in wat de api zelf publiceert. getest uit onze eigen kleine aanroep. platform geldt voor elk api van dit platform, volgens de documentatie. ervaring zelf ondervonden bij het bouwen van open data index.

Zo haal je het op

curl -G "https://onderwijsdata.duo.nl/api/3/action/datastore_search" --data-urlencode "resource_id=454c5dd4-6815-4b52-ae2f-b9eebc6afa6d" --data-urlencode "filters={\"PEILJAAR\":2024}" --data-urlencode "limit=5"

Meer van DUO in onze index

461 datasets in DUO open onderwijsdata, data.overheid.nl. Dit zijn de laatst gewijzigde.

Alles over DUO

Meer in dit thema

Bekijk hoe deze pagina is opgebouwd
bron: duo-onderwijsdata
blokken: []
secties:
  - ideeen
  - verwerken
  - koppelingen
  - vergelijkbaar
  - beperkingen
  - code
cache:
  tag: bron:duo-onderwijsdata
  ververs: na statuscheck, als de bron nieuwer is
statuscheck:
  methode: "CKAN-catalogus: nieuwste gewijzigde dataset (metadata_modified)"
  verwacht: dagelijks

Bron: content/bronnen/duo-onderwijsdata.yaml · Markdown