Transportation — entry 060 of 69

Transport for The Netherlands

Verified Sep 2026

Community-maintained, keyless REST API republishing the Dutch national KV78Turbo real-time transit feed (arrivals/departures per stop, line, or journey) covering nearly every Dutch operator. The service is HTTP-only in practice — its TLS certificate doesn't match the v0.ovapi.nl hostname — and the maintainers ask heavy users to request their own KV78 feed license from OpenOV rather than scraping this mirror.

OVapi is a free, keyless JSON API for live public transport in the Netherlands. It has real-time data for trams, buses, metro, and trains. You can look up a line, a stop (TPC), or a journey.

transitopen-datanetherlandsreal-timecommunity
AuthenticationNone requiredCall it straight away — no key, no signup.
HTTPSNot supportedPlain HTTP only — avoid sending anything sensitive.
CORSEnabledCallable directly from browser JavaScript.
PricingFreeNo paid tier — free for the documented use case.
FormatsJSONResponses can be requested as JSON.

GreatAPIs Score

Score88out of 100
Authentication25/25No authentication required
Pricing20/20Free to use
Docs14/20Documentation URL provided
Formats9/15Single response format
Freshness20/20Verified within 6 months

Embed this badge

Scored 88 on greatapis.com
<a href="https://greatapis.com/api/transport-for-the-netherlands-transportation/"><img src="https://greatapis.com/badge/transport-for-the-netherlands-transportation.svg" alt="Scored 88 on greatapis.com"></a>

Auth quickstart

  1. No API key is needed. Send plain GET requests.
Stored keyNo key stored

Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.

Read live trips on one tram line

GEThttp://v0.ovapi.nl/line/GVB_1_1

200 application/json;charset=utf-8

{"GVB_1_1":{"Line":{"LineWheelchairAccessible":"UNKNOWN","TransportType":"TRAM","DestinationName50":"Azartplein","DataOwnerCode":"NL","DestinationCode":"AZP","LinePublicNumber":"1","LinePlanningNumber":"1","LineName":"Lijn 1","LineDirection":1},"Actuals":{"NL_20260929_1_574_0":{"IsTimingStop":true,"DestinationName50":"Azartplein","DataOwnerCode":"NL","OperatorCode":"GVB","FortifyOrderNumber":0,"TransportType":"TRAM","Latitude":52.35372,"Longitude":4.77478,"JourneyNumber":574,"JourneyPatternCode":1912917788,"LocalServiceLevelCode":20260929,"LineDirection":1,"OperationDate":"2026-09-29","TimingPointCode":"30004402","WheelChairAccessible":"UNKNOWN","LineName":"Lijn 1","LinePublicNumber":"1","LastUpdateTimeStamp":"2026-09-28T19:25:35+0200","DestinationCode":"AZP","ExpectedDepartureTime":"2026-09-29T06:00:00","UserStopOrderNumber":1,"ProductFormulaType":"EMPTY","TimingPointName":"Matterhorn","LinePlanningNumber":"1","TimingPointDataOwnerCode":"ALGEMEEN","TimingPointTown":"unknown","TripStopStatus":"PLANNED","UserStopCode":"04402","JourneyStopType":"FIRST","TargetArrivalTime":"2026-09-29T06:00:00","TargetDepartureTime":"2026-09-29T06:00:00","ExpectedArrivalTime":"2026-09-29T06:00:00","TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE"}},"ServerTime":"2026-09-29T00:03:07Z","Network":{"757202361":{"1":{"Longitude":4.8833957,"Latitude":52.36305,"TimingPointTown":"unknown","TimingPointName":"Leidseplein","TimingPointCode":"30006062","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE","IsTimingStop":true,"UserStopOrderNumber":1},"2":{"Longitude":4.8864403,"Latitude":52.361267,"TimingPointTown":"unknown","TimingPointName":"Rijksmuseum","TimingPointCode":"30006058","StopAreaCode":null,"TimingPointWheelChairAccessible":"ACCESSIBLE","TimingPointVisualAccessible":"ACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":2},"3":{"Longitude":4.892274,"Latitude":52.359467,"TimingPointTown":"unknown","TimingPointName":"Vijzelgracht","TimingPointCode":"30008073","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":3},"4":{"Longitude":4.9002423,"Latitude":52.359715,"TimingPointTown":"unknown","TimingPointName":"Frederiksplein","TimingPointCode":"30008057","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"ACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":4},"5":{"Longitude":4.9094133,"Latitude":52.361458,"TimingPointTown":"unknown","TimingPointName":"Weesperplein","TimingPointCode":"30008054","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":5},"6":{"Longitude":4.914174,"Latitude":52.362442,"TimingPointTown":"unknown","TimingPointName":"K. 's-Gravesandestr.","TimingPointCode":"30008176","StopAreaCode":null,"TimingPointWheelChairAccessible":"ACCESSIBLE","TimingPointVisualAccessible":"ACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":6},"8":{"Longitude":4.9248304,"Latitude":52.36688,"TimingPointTown":"unknown","TimingPointName":"Hoogte Kadijk","TimingPointCode":"30008255","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":8},"10":{"Longitude":4.9348106,"Latitude":52.37301,"TimingPointTown":"unknown","TimingPointName":"Rietlandpark","TimingPointCode":"30008261","StopAreaCode":null,"TimingPointWheelChairAccessible":"ACCESSIBLE","TimingPointVisualAccessible":"ACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":10},"11":{"Longitude":4.9381247,"Latitude":52.373455,"TimingPointTown":"unknown","TimingPointName":"C. van Eesterenlaan","TimingPointCode":"30008233","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"ACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":11},"12":{"Longitude":4.9373565,"Latitude":52.37683,"TimingPointTown":"unknown","TimingPointName":"Azartplein","TimingPointCode":"30008014","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":12}},"1912917788":{"1":{"Longitude":4.77478,"Latitude":52.35372,"TimingPointTown":"unknown","TimingPointName":"Matterhorn","TimingPointCode":"30004402","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE","IsTimingStop":true,"UserStopOrderNumber":1},"2":{"Longitude":4.776684,"Latitude":52.352966,"TimingPointTown":"unknown","TimingPointName":"Pilatus","TimingPointCode":"30004404","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":2},"3":{"Longitude":4.7831483,"Latitude":52.35037,"TimingPointTown":"unknown","TimingPointName":"Inaristraat","TimingPointCode":"30004406","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":3},"4":{"Longitude":4.788865,"Latitude":52.34981,"TimingPointTown":"unknown","TimingPointName":"Ecuplein","TimingPointCode":"30004408","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":4},"5":{"Longitude":4.795189,"Latitude":52.351055,"TimingPointTown":"unknown","TimingPointName":"Baden Powellweg","TimingPointCode":"30004410","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":5},"6":{"Longitude":4.8026104,"Latitude":52.35256,"TimingPointTown":"unknown","TimingPointName":"Hoekenes","TimingPointCode":"30004412","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":6},"7":{"Longitude":4.8091097,"Latitude":52.35393,"TimingPointTown":"unknown","TimingPointName":"Louis Davidsstraat","TimingPointCode":"30004414","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":7},"8":{"Longitude":4.8105884,"Latitude":52.356472,"TimingPointTown":"unknown","TimingPointName":"Meer en Vaart","TimingPointCode":"30004049","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"ACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":8},"9":{"Longitude":4.826264,"Latitude":52.357788,"TimingPointTown":"unknown","TimingPointName":"Johan Huizingalaan","TimingPointCode":"30004063","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":9},"10":{"Longitude":4.834601,"Latitude":52.35788,"TimingPointTown":"unknown","TimingPointName":"Station Lelylaan","TimingPointCode":"30004195","StopAreaCode":null,"TimingPointWheelChairAccessible":"ACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE","IsTimingStop":true,"UserStopOrderNumber":10},"11":{"Longitude":4.840149,"Latitude":52.35794,"TimingPointTown":"unknown","TimingPointName":"Derkinderenstraat","TimingPointCode":"30004061","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":11},"12":{"Longitude":4.8525224,"Latitude":52.35807,"TimingPointTown":"unknown","TimingPointName":"Surinameplein","TimingPointCode":"30006001","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":12},"13":{"Longitude":4.8532996,"Latitude":52.361805,"TimingPointTown":"unknown","TimingPointName":"Corantijnstraat","TimingPointCode":"30006013","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":13},"14":{"Longitude":4.8544445,"Latitude":52.364254,"TimingPointTown":"unknown","TimingPointName":"Hoofdweg","TimingPointCode":"30006114","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"ACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":14},"15":{"Longitude":4.859283,"Latitude":52.364807,"TimingPointTown":"unknown","TimingPointName":"Witte de Withstraat","TimingPointCode":"30003010","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":15},"16":{"Longitude":4.8653097,"Latitude":52.365417,"TimingPointTown":"unknown","TimingPointName":"Nicolaas Beetsstraat","TimingPointCode":"30006018","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"ACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":16},"17":{"Longitude":4.8717647,"Latitude":52.367126,"TimingPointTown":"unknown","TimingPointName":"Bilderdijkstraat","TimingPointCode":"30006021","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":17},"18":{"Longitude":4.8751016,"Latitude":52.362995,"TimingPointTown":"unknown","TimingPointName":"Overtoom","TimingPointCode":"30006043","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":18},"19":{"Longitude":4.8833957,"Latitude":52.36305,"TimingPointTown":"unknown","TimingPointName":"Leidseplein","TimingPointCode":"30006062","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":19},"20":{"Longitude":4.8864403,"Latitude":52.361267,"TimingPointTown":"unknown","TimingPointName":"Rijksmuseum","TimingPointCode":"30006058","StopAreaCode":null,"TimingPointWheelChairAccessible":"ACCESSIBLE","TimingPointVisualAccessible":"ACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":20},"21":{"Longitude":4.892274,"Latitude":52.359467,"TimingPointTown":"unknown","TimingPointName":"Vijzelgracht","TimingPointCode":"30008073","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":21},"22":{"Longitude":4.9002423,"Latitude":52.359715,"TimingPointTown":"unknown","TimingPointName":"Frederiksplein","TimingPointCode":"30008057","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"ACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":22},"23":{"Longitude":4.9094133,"Latitude":52.361458,"TimingPointTown":"unknown","TimingPointName":"Weesperplein","TimingPointCode":"30008054","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":23},"24":{"Longitude":4.914174,"Latitude":52.362442,"TimingPointTown":"unknown","TimingPointName":"K. 's-Gravesandestr.","TimingPointCode":"30008176","StopAreaCode":null,"TimingPointWheelChairAccessible":"ACCESSIBLE","TimingPointVisualAccessible":"ACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":24},"26":{"Longitude":4.9248304,"Latitude":52.36688,"TimingPointTown":"unknown","TimingPointName":"Hoogte Kadijk","TimingPointCode":"30008255","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":26},"28":{"Longitude":4.9348106,"Latitude":52.37301,"TimingPointTown":"unknown","TimingPointName":"Rietlandpark","TimingPointCode":"30008261","StopAreaCode":null,"TimingPointWheelChairAccessible":"ACCESSIBLE","TimingPointVisualAccessible":"ACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":28},"29":{"Longitude":4.9381247,"Latitude":52.373455,"TimingPointTown":"unknown","TimingPointName":"C. van Eesterenlaan","TimingPointCode":"30008233","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"ACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":29},"30":{"Longitude":4.9373565,"Latitude":52.37683,"TimingPointTown":"unknown","TimingPointName":"Azartplein","TimingPointCode":"30008014","StopAreaCode":null,"TimingPointWheelChairAccessible":"NOTACCESSIBLE","TimingPointVisualAccessible":"NOTACCESSIBLE","IsTimingStop":false,"UserStopOrderNumber":30}}}}}

The Actuals map is truncated to one of its 9 trips in the live call. The trip object is unchanged. The key of each trip is a journey ID.

Developer reference

Gotchas & limits

  • Use http://. A live probe of https://v0.ovapi.nl failed certificate checks (curl exit code 60). The catalogue entry also lists HTTPS as unsupported.
  • A line ID with no live trips returns 200 with an empty object, {}. It does not return an error or a 404. Lines such as NL_5302_1 returned {} in the probe.
  • GET /line/ with no ID lists all line IDs. The probe returned about 4,150 lines in a body of about 1.1 MB. Do not call it in a loop.
  • The IDs are <data owner>_<line planning number>_<direction>, for example GVB_1_1. LineDirection is 1 or 2.
  • Times such as ExpectedDepartureTime (2026-09-29T06:00:00) have no time zone offset, but LastUpdateTimeStamp has one (+0200). Do not mix the two without care.
  • Access-Control-Allow-Origin: * is set, so browser code can call the API. An HTTPS page cannot call it, because the browser blocks mixed content.