Transportation — entry 035 of 69

Transport for Berlin, Germany

Verified Jul 2026

vbb-rest is an open-source, community-built REST wrapper around VBB's official HAFAS backend for Berlin and Brandenburg public transit, covering stop search, departures, journeys, and live vehicle positions in the Friendly Public Transport Format (JSON). It's keyless and free, now on its 6th major version — the previously indexed v3 endpoint is deprecated in favor of v6.vbb.transport.rest.

This is a free, keyless REST API for public transport in Berlin and Brandenburg (VBB). It is the community project vbb-rest, not an official VBB service. You can search stops, read departures, and plan journeys. Version 6 of the API is at v6.vbb.transport.rest.

transitgermanyberlinopen-sourcecommunity
AuthenticationNone requiredCall it straight away — no key, no signup.
HTTPSSupportedTraffic is encrypted in transit.
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-berlin-germany/"><img src="https://greatapis.com/badge/transport-for-berlin-germany.svg" alt="Scored 88 on greatapis.com"></a>

Auth quickstart

  1. No API key is needed. Send the request with no credentials. Set a clear User-Agent so the maintainers can contact you if your app causes load.
Stored keyNo key stored

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

Find a stop by name

GEThttps://v6.vbb.transport.rest/locations?query=alexanderplatz&results=1

User-Agent: your-app/1.0 (yourdomain.example; you@yourdomain.example)

200 application/json; charset=utf-8

[
	{
		"type": "stop",
		"id": "900100003",
		"name": "S+U Alexanderplatz Bhf (Berlin)",
		"location": {
			"type": "location",
			"id": "900100003",
			"latitude": 52.521508,
			"longitude": 13.411267
		},
		"products": {
			"suburban": true,
			"subway": true,
			"tram": true,
			"bus": true,
			"ferry": false,
			"express": false,
			"regional": false
		},
		"ids": {
			"ifopt": "de:11000:900100003"
		},
		"stationDHID": "de:11000:900100003"
	}
]

The body is unchanged. results=1 limits the list to one match. Use the stop id (900100003) in other calls, for example /stops/900100003/departures.

Developer reference

Rate limit

100 requests/minute -- per the project's live getting-started.md.

Gotchas & limits

  • The query parameter is required. A call to /locations without it returns 400 with a JSON body: {"message":"Missing query.","statusCode":400}.
  • Responses carry Cache-Control: public, max-age: 300, so a proxy can serve a five-minute-old answer. The live probe showed x-cache: HIT on a repeat call.
  • The API sends Access-Control-Allow-Origin: *, so browser code can call it directly.
  • The products object lists which modes stop at the stop. Read the booleans (suburban, subway, tram, bus, ferry, express, regional) instead of guessing from the name.
  • The response header Link points to an OpenAPI 3.0.3 description at /.well-known/service-desc. Use it to generate a client.