
OV-data via het NDOV-loket
Het NDOV-loket verzamelt de dienstregelingen en actuele ritinformatie van de Nederlandse vervoerders, van Arriva en Connexxion tot GVB, RET en NS. Stichting OpenGeo draait het loket onder de naam GOVI en zet de data als CC0 open: dienstregelingen in NeTEx, het haltebestand en live posities en vertragingen. Er is ook een kant-en-klare GTFS-versie voor heel Nederland.

Bussen, trams en metro's met een live positie, per vervoerder: het meest Qbuzz (39 voertuigen), dan Connexxion en EBS
Bussen, trams en metro's met een live positie, per vervoerder, oktober 2026, in voertuigen. Totaal: 95; de grootste 7 van 7 categorieën staan in de grafiek. Qbuzz is 41% van het totaal. Momentopname van zondag 25 oktober 2026 om 03:33: bus, tram en metro met een live positie. Treinen staan in een apart bestand.
Wat je ermee kunt bouwen2
DashboardDashboard met treinvertragingen en storingenEen pagina die elke minuut laat zien hoeveel treinen er rijden, welke te laat zijn en welke storingen er spelen, gebouwd op het open GTFS-Realtime-bestand van openOV en, met een gratis sleutel, de storingen van NS.2 bronnenOm te beginnen
KaartLive kaart van bussen, trams en metro'sEen kaart waarop elke bus, tram en metro in Nederland live rondrijdt, gekleurd naar vertraging, uit één open bestand van 180 kB en zonder sleutel.1 bronnenOm te beginnenWat kun je ermee?4 ideeën
Hoe ver is de dichtstbijzijnde halte?
Leg de haltes uit de GTFS-dienstregeling op een kaart met adressen of buurten. Tel per buurt hoeveel haltes er binnen 400 meter liggen en hoe vaak daar per uur iets vertrekt.
Live kaart van alle bussen
Het bestand met voertuigposities wordt doorlopend vernieuwd. Op 15 oktober 2026 rond half elf 's avonds stonden er 1.658 voertuigen in.
Welke lijnen rijden het vaakst te laat?
Sla de trip updates een paar weken op en vergelijk verwachte met geplande tijden. Voor een langere periode levert Stichting OpenGeo op aanvraag historische voertuigdata, volgens de FAQ ruim tien jaar.
Wat verdwijnt er uit de dienstregeling?
Vergelijk de NeTEx- of GTFS-dienstregeling van nu met die van een jaar eerder. Tel per gemeente de ritten die er niet meer zijn.
Zo verwerk je het5 stappen
Begin met GTFS
openOV zet de NDOV-data om naar GTFS voor heel Nederland. Het zip-bestand is groot: 251 MB op 14 oktober 2026. Vraag eerst met een HEAD-verzoek de Last-Modified op en download alleen als er iets nieuws is.
curl -I https://gtfs.ovapi.nl/nl/gtfs-nl.zip
Live posities en vertragingen
In dezelfde map staan GTFS-Realtime-bestanden in protobuf: vehiclePositions.pb (posities), tripUpdates.pb (verwachte tijden), alerts.pb en trainUpdates.pb.
https://gtfs.ovapi.nl/nl/vehiclePositions.pb
De brondata in NeTEx en het haltebestand
data.ndovloket.nl is een open map. Onder netex/ staat per vervoerder een dagelijks NeTEx-bestand, onder haltes/ het centrale haltebestand (CHB) als gezipte XML.
https://data.ndovloket.nl/
Realtime uit de bron via ZeroMQ
Wie de ruwe stromen wil (KV6-posities, KV17-ritwijzigingen, NS InfoPlus, SIRI), abonneert zich via ZeroMQ op een envelop zoals /ARR/KV6posinfo. Best effort, maximaal één verbinding per afnemer per stroom.
tcp://pubsub.besteffort.ndovloket.nl:7658
Wees zuinig
openOV vraagt je te laten zien wie je bent in de User-Agent, If-Modified-Since te gebruiken en gzip aan te zetten. Dienstregelingen veranderen zelden vaker dan eens per dag; de nieuwe dienstregeldag begint om 03:00 UTC.
Interessante koppelingen


Hebben buurten met minder inkomen slechter openbaar vervoer?
Bepaal per halte in welke buurt hij ligt, tel vertrekken per buurt en leg dat naast inkomen en autobezit uit de kerncijfers.


Staat de bus in dezelfde file als de auto?
Vergelijk de vertraging van busritten op een traject met de gemeten snelheid op de weg ernaast.
Vergelijkbare bronnen
- NNS reisinformatie
Alleen de trein, via de API van NS zelf, met een sleutel. Wel storingen, drukte en materieel.
- OOOVapi en openOV nog niet uitgelegd
De GTFS- en GTFS-Realtime-bestanden op deze pagina komen hiervandaan, gemaakt uit de NDOV-data door Bliksem Labs.
Waar je op moet letten
- Best effort, geen garantie
De open stromen hebben geen service-afspraak. Wie een gegarandeerde verbinding wil, tekent een gebruikersovereenkomst met GOVI. Technische ondersteuning is er niet; vragen gaan naar de OpenOV Discord.
- Niet elke vervoerder levert alles
Volgens GOVI leveren de grote vervoerders gepland en actueel, maar van bijvoorbeeld FlixBus, de Westerschelde Ferry en Duitse vervoerders is er alleen een dienstregeling. Kijk in het overzicht op de datasetpagina.
- Geen historie in de open bestanden
De realtime-bestanden tonen alleen het nu. Wie punctualiteit wil meten, moet zelf opslaan of historische data aanvragen.
- Doe je niet voor als vervoerder
De openOV-licentie staat alles toe, behalve zeggen dat je een van de vervoerders vertegenwoordigt. Fouten in de data meld je op ovdata.nl.
APIGTFS / GTFS-RT (protobuf), NeTEx-bestanden en REST (JSON) · gelezen 16 okt 2026
Geen sleutel of account voor de bestanden, GTFS-RT en v0.ovapi.nl. Wel een herkenbare User-Agent (gebruiksregel van openOV). Een gegarandeerde realtime-verbinding vraagt een getekende NDOV-gebruikersovereenkomst. getest
voertuigen in vehiclePositions.pb, van 8 vervoerders (16 okt 2026, 23:36) getest
gtfs (zip)protobufnetex (xml.gz)json
Basisadres
https://gtfs.ovapi.nl/nl
Endpoints 6
- GET
/gtfs-nl.zipDienstregeling van heel Nederland in GTFS (241 MB; dagelijks, laatst 16 okt 2026 18:58 UTC). Bevat o.a. stops.txt (7 MB), routes.txt, trips.txt (75 MB), stop_times.txt (1,17 GB uitgepakt), shapes.txt (289 MB), calendar_dates.txt, transfers.txt en feed_info.txt. - GET
/vehiclePositions.pbGTFS-Realtime: positie van elk rijdend voertuig met rit, halte en vertraging (192 kB, elke minuut nieuw). - GET
/tripUpdates.pbGTFS-Realtime: verwachte aankomst- en vertrektijden per rit en halte (1,9 MB). - GET
/trainUpdates.pbGTFS-Realtime voor treinen, met gepland en actueel spoor (1,3 MB). - GET
/alerts.pbGTFS-Realtime: storingen en mededelingen (461 kB). - GET
/archive/Oudere GTFS-bestanden per datum (NL-JJJJMMDD.gtfs.zip, 170–210 MB elk, vanaf 1 januari 2026).
De API's van deze bron 3 · uit de documentatie van de aanbieder uit de beschrijving
NDOV-loket open map (bron in NeTEx)
De brondata zoals vervoerders die aanleveren, CC0. Gewone bestandsmap, geen robots.txt.
https://data.ndovloket.nl- GET
/netex/<vervoerder>/NeTEx-dienstregeling per vervoerder (arr, cxx, ebs, gvb, htm, keolis, qbuzz, ret …), bv. GVB 4,6 MB gezipt per week - GET
/haltes/ExportCHB_<datum>.xml.gzCentraal Haltebestand (CHB), dagelijks, 13 MB; plus PassengerStopAssignmentExportCHB (1,0 MB) - GET
/ns/Dienstregeling NS (ns-latest.zip, 9,1 MB) en stationsgegevens - GET
/tarieven/Tarieven per vervoerder - GET
/docs/Koppelvlakdocumentatie (KV78Turbo, InfoPlus, BISON …)
Realtime via ZeroMQ (best effort)
Ruwe realtime-stromen; abonneren op een envelope zoals /ARR/KV6posinfo. Hoogstens één verbinding per afnemer per stroom; misbruik leidt tot een blokkade.
tcp://pubsub.besteffort.ndovloket.nl- SUB
:7658BISON KV6 (posities), KV15 (berichten), KV17 (ritwijzigingen) per vervoerder - SUB
:7817KV78Turbo (verwachte doorkomsttijden) - SUB
:7664NS InfoPlus (o.a. DVS vertrektijden, treinposities) - SUB
:7666SIRI
OVapi KV78Turbo (REST, JSON)
Verwachte vertrektijden per halte, lijn of rit als JSON, gemaakt uit KV78Turbo. Alleen http (https geeft een certificaatfout). Ondersteunt gzip.
http://v0.ovapi.nl- GET
/tpc/{TimingPointCode}Haltegegevens en de komende ~20 doorkomsten (Passes) met verwachte en geplande tijden; meerdere codes met komma's - GET
/tpc/Alle 38.395 haltecodes (125 kB gezipt) - GET
/stopareacode/{code}Alle haltes in een haltegebied; /stopareacode/ geeft er 4.595 - GET
/line/{lijn}Lijn met haltes en actuele ritten, bv. GVB_24_1; /line/ geeft er 4.164 - GET
/journey/{rit}Eén rit met alle haltes, bv. GVB_20261016_24_51324_0
Filteren getest
Geen querytaal: de feeds zijn hele bestanden voor heel Nederland. Filter zelf op agency, route of stop_id. Bij v0.ovapi.nl kies je een halte, lijn of rit in het pad.
Parameters 3
If-None-Match / If-Modified-Since | Gebruiksregel van openOV: vraag alleen opnieuw op als er iets veranderd is. Ongewijzigd geeft 304 zonder inhoud (getest op gtfs-nl.zip). | getest |
Accept-Encoding | gzip; verplicht volgens de gebruiksregels van openOV, ook nuttig bij v0.ovapi.nl. | uit de beschrijving |
User-Agent | Zeg wie je bent, met contactgegevens; zo kan openOV zonder registratie werken. | uit de beschrijving |
Velden in GTFS-RT, GTFS en v0.ovapi.nl (selectie) 9
| Naam | Type | Betekenis |
|---|---|---|
entity.id | tekst | Datum:vervoerder:lijn:rit, bv. 2026-10-16:CXX:M340:242 (vehiclePositions) |
vehicle.trip.trip_id / route_id / start_date | tekst | Rit in de GTFS-dienstregeling; koppel met trips.txt |
vehicle.position.latitude / longitude | getal · graden WGS84 | Positie van het voertuig |
vehicle.stop_id / current_stop_sequence / current_status | tekst | Halte waar het voertuig is of naartoe rijdt |
vehicle.timestamp | integer · Unix-tijd (s) | Tijdstip van de positie |
ovapi_vehicle_position.delay | integer · s | Vertraging bij de volgende halte; negatief = te vroeg (OVapi-uitbreiding) |
ExpectedDepartureTime / TargetDepartureTime | datetime · lokale tijd | Verwachte en geplande vertrektijd (v0.ovapi.nl, Passes) |
TripStopStatus | tekst | Status van de doorkomst, bv. DRIVING (v0.ovapi.nl) |
stop_id / stop_name / stop_lat / stop_lon | tekst | Haltes in stops.txt (GTFS) |
Limieten en valkuilen
- Geen snelheidslimiet gedocumenteerd, wel spelregels: herkenbare User-Agent, If-Modified-Since/If-None-Match, gzip. Dienstregelingen veranderen zelden vaker dan dagelijks; de nieuwe dienstregeldag begint om 03:00 UTC. uit de beschrijving
- ZeroMQ: maximaal één verbinding per afnemer per stroom, best effort, zonder service-afspraak. uit de beschrijving
- v0.ovapi.nl vraagt in de wiki om meerdere objecten in één aanroep te bundelen (komma's) en niet dezelfde haltes in een kort interval af te tappen; wie veel wil, draait KV78Turbo zelf. uit de beschrijving
- GTFS-RT is protobuf, geen JSON. Lees het met gtfs-realtime-bindings (Python, Node) en het .proto-bestand van OVapi voor de extra velden; zonder bibliotheek kan het ook met een eenvoudige varint-lezer. getest
- Geen treinen in vehiclePositions: op 16 okt 2026 23:36 stonden er alleen CXX, ARR, QBUZZ, GVB, EBS, RET, HTM en KEOLIS in. Treinen staan in trainUpdates.pb (zonder posities). getest
- Het GTFS-bestand is groot (241 MB, stop_times 1,17 GB uitgepakt). Vraag eerst met HEAD de Last-Modified of ETag op. In de hoofdmap staan ook govi (deels, met KV8) en openov-nl (zonder AVV en Thalys). getest
- Halte-coördinaten in /stopareacode/ van v0.ovapi.nl zijn niet altijd goed: Papendrecht, Pieter Zeemanlaan stond op 47,97 N 3,31 O (in Frankrijk). Neem coördinaten uit het CHB of de GTFS-stops. getest
- De wiki van v0.ovapi.nl noemt nog de oude GOVI-licentie (niet langer dan 30 minuten bewaren); de NDOV-data zelf zijn inmiddels CC0. Bij twijfel: bewaar de bronbestanden van data.ndovloket.nl. uit de beschrijving
- Geen robots.txt op gtfs.ovapi.nl, data.ndovloket.nl en v0.ovapi.nl (404). getest
Probeer het HTTP 200 · 371 ms · 16 okt
http://v0.ovapi.nl/tpc/30005071
{
"30005071": {
"Stop": {
"Longitude": 4.8918076,
"Latitude": 52.37493,
"TimingPointTown": "unknown",
"TimingPointName": "Dam",
"TimingPointCode": "30005071",
"StopAreaCode": null
},
"Passes": {
"NL_20261016_24_51324_0": {
"IsTimingStop": false,
"DestinationName50": "Centraal Station",
"DataOwnerCode": "NL",
"OperatorCode": "GVB",
"FortifyOrderNumber": 0,
"TransportType": "TRAM",
"Latitude": 52.37493,
"Longitude": 4.8918076,
"JourneyNumber": 51324,
"JourneyPatternCode": 1868939642,
"LocalServiceLevelCode": 20261016,
"LineDirection": 1,
"OperationDate": "2026-10-16",
"TimingPointCode": "30005071"
},
"NL_20261016_2_5068_0": {
"IsTimingStop": false,
"DestinationName50": "Centraal Station",
"DataOwnerCode": "NL",
"OperatorCode": "GVB",
"FortifyOrderNumber": 0,
"TransportType": "TRAM",
"Latitude": 52.37493,
"Longitude": 4.8918076,
"JourneyNumber": 5068,
"JourneyPatternCode": 1504650659,
"LocalServiceLevelCode": 20261016,
"LineDirection": 1,Ingekort antwoord, opgeslagen bij het oogsten. Klik op het adres voor het echte, actuele antwoord.
Gelezen uit openOV: herkomst van de GTFS-feeds, licentie en gebruiksregels (User-Agent, If-Modified-Since, gzip) · Protobuf-uitbreidingen van OVapi op GTFS-Realtime (vertraging, perron, realtime_trip_id) · NDOV-loket: realtime via ZeroMQ, poorten en envelopes per vervoerder · Wiki van de KV78Turbo-API op v0.ovapi.nl (haltes, lijnen, ritten). 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 -sI https://gtfs.ovapi.nl/nl/vehiclePositions.pb
Meer in dit thema
Bekijk hoe deze pagina is opgebouwd
bron: ndov-ov-data blokken: [] secties: - ideeen - verwerken - koppelingen - vergelijkbaar - beperkingen - code cache: tag: bron:ndov-ov-data ververs: na statuscheck, als de bron nieuwer is statuscheck: methode: Last-Modified van de GTFS-Realtime voertuigposities (gtfs.ovapi.nl) verwacht: elke minuut
Bron: content/bronnen/ndov-ov-data.yaml · Markdown



