JavaScript client for the BVG HAFAS API.

Usage no npm install needed!

<script type="module">
  import bvgHafas from '';



A client for the HAFAS endpoint of Berliner Verkehrsbetriebe (BVG), the largest public transport provider in Berlin. It acts as a consistent and straightforward interface on top of their verbose API.

This project is actually a thin wrapper around hafas-client@5. Its docs document the API in general.

Note: The BVG HAFAS endpoint covers Brandenburg as well.

npm version ISC-licensed chat on gitter support Jannis via GitHub Sponsors


npm install bvg-hafas


Check the docs for hafas-client@5 as well as its BVG-specific customisations.


const createClient = require('bvg-hafas')

const client = createClient('my-awesome-program')

As an example, we will search for a route from Berlin Jungfernheide to Tempelhof. To get the station IDs, use locations(query, [opt]).

client.journeys('900000020201', '900000068201', {results: 1})
.then((journeys) => console.log(journeys[0]))

The output will be an array of journey objects in the Friendly Public Transport Format 1.2.1 format:

    type: 'journey',
    legs: [ {
        id: '1|62072|0|86|14082018',
        origin: {
            type: 'stop',
            id: '900000020201',
            name: 'S+U Jungfernheide',
            location: {
                type: 'location',
                latitude: 52.530273,
                longitude: 13.299064
            products: {
                suburban: true,
                subway: true,
                tram: false,
                bus: true,
                ferry: false,
                express: false,
                regional: true
        departure: '2018-08-14T15:05:00.000+02:00',
        departurePlatform: '6',
        departureDelay: 0,
        destination: {
            type: 'stop',
            id: '900000068201',
            name: 'S+U Tempelhof',
            location: {
                type: 'location',
                latitude: 52.470692,
                longitude: 13.385756
            products: { /* … */ }
        arrival: '2018-08-14T15:27:00.000+02:00',
        arrivalPlatform: '2',
        arrivalDelay: 0,
        direction: 'Ringbahn S 42',
        line: {
            type: 'line',
            id: 's42',
            name: 'S42',
            public: true,
            mode: 'train',
            product: 'suburban',
            operator: { /* … */ },
            // …
        cycle: { min: 300, max: 300 }
    } ],
    refreshToken: '…'


Check hafas-client's related libs.


If you have a question, found a bug or want to propose a feature, have a look at the issues page.