# 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.

- Uitgever: GOVI (NDOV-loket, Stichting OpenGeo)
- Gebied: Nederland · Laagste detail: halte, rit en voertuig
- Periode: heden (archief op aanvraag) · Ververst: elke minuut
- Toegang: Open · Licentie: CC0 1.0
- Koppelsleutels: stop_id (halte), trip_id (rit)
- Status: ok (2026-10-16) · GTFS-Realtime voertuigposities (597 kB)
- URL: https://govi.nu

## Wat kun je ermee?
- **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 het
1. **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`
2. **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`
3. **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/`
4. **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`
5. **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? → [cbs-kwb](https://www.opendataindex.nl/bron/cbs-kwb.md) via coördinaten van de halte (punt in buurt). 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? → [ndw-verkeer](https://www.opendataindex.nl/bron/ndw-verkeer.md) via tijdstip + locatie. Vergelijk de vertraging van busritten op een traject met de gemeten snelheid op de weg ernaast.

## Vergelijkbare bronnen
- [ns-reisinformatie](https://www.opendataindex.nl/bron/ns-reisinformatie.md): Alleen de trein, via de API van NS zelf, met een sleutel. Wel storingen, drukte en materieel.
- [OVapi en openOV](https://gtfs.ovapi.nl): 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.

## API (GTFS / GTFS-RT (protobuf), NeTEx-bestanden en REST (JSON))

- Basis: https://gtfs.ovapi.nl/nl
- Toegang: 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)
- Formaten: gtfs (zip), protobuf, netex (xml.gz), json
- Omvang: 1439 voertuigen in vehiclePositions.pb, van 8 vervoerders (16 okt 2026, 23:36) (getest)
- Filteren: 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.; 

### Endpoints
- `GET /gtfs-nl.zip`: Dienstregeling 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.pb`: GTFS-Realtime: positie van elk rijdend voertuig met rit, halte en vertraging (192 kB, elke minuut nieuw).
- `GET /tripUpdates.pb`: GTFS-Realtime: verwachte aankomst- en vertrektijden per rit en halte (1,9 MB).
- `GET /trainUpdates.pb`: GTFS-Realtime voor treinen, met gepland en actueel spoor (1,3 MB).
- `GET /alerts.pb`: GTFS-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).

### Parameters
- `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)
`entity.id` tekst, `vehicle.trip.trip_id / route_id / start_date` tekst, `vehicle.position.latitude / longitude` getal, `vehicle.stop_id / current_stop_sequence / current_status` tekst, `vehicle.timestamp` integer, `ovapi_vehicle_position.delay` integer, `ExpectedDepartureTime / TargetDepartureTime` datetime, `TripStopStatus` tekst, `stop_id / stop_name / stop_lat / stop_lon` tekst

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

### Voorbeeld
```
http://v0.ovapi.nl/tpc/30005071
```

## Zo haal je het op

### curl
```bash
curl -sI https://gtfs.ovapi.nl/nl/vehiclePositions.pb
```

### python
```python
import requests
from google.transit import gtfs_realtime_pb2   # pip install gtfs-realtime-bindings

r = requests.get("https://gtfs.ovapi.nl/nl/vehiclePositions.pb",
                 headers={"User-Agent": "mijn-project (mail@voorbeeld.nl)"})
feed = gtfs_realtime_pb2.FeedMessage()
feed.ParseFromString(r.content)
print(len(feed.entity), "voertuigen")
v = feed.entity[0].vehicle
print(v.trip.trip_id, v.position.latitude, v.position.longitude)
```

## Wat je ermee kunt bouwen
- [Dashboard met treinvertragingen en storingen](https://www.opendataindex.nl/bouwen/treinvertragingen-dashboard.md): Een 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.
- [Live kaart van bussen, trams en metro's](https://www.opendataindex.nl/bouwen/ov-live-kaart.md): Een kaart waarop elke bus, tram en metro in Nederland live rondrijdt, gekleurd naar vertraging, uit één open bestand van 180 kB en zonder sleutel.


## Voorbeelden met echte cijfers (1)

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

- **Bussen, trams en metro's met een live positie, per vervoerder: het meest Qbuzz (39 voertuigen), dan Connexxion en EBS** (oktober 2026). Tabel vehiclePositions.pb. [Voorbeeld](https://www.opendataindex.nl/voorbeeld/ndov-voertuigen-vervoerder)
  - `https://gtfs.ovapi.nl/nl/vehiclePositions.pb`
