BYTETOOLS

Wiener Linien Realtime API

Free Vienna public transport API with no key: live countdown times for U-Bahn, tram and bus, with step-free access flags and traffic-jam warnings. Tested example included.

No API key requiredHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-21

What is the Wiener Linien Realtime API?

The Wiener Linien real-time API is Vienna's free, key-free departure monitor. Given a stop's RBL number it returns every line serving that platform with live countdown times in minutes, the direction, platform, step-free access flag and a warning when a surface service is caught in traffic.

The RBL number is the thing to understand first. Vienna identifies not stops but individual platform positions — one RBL per line per direction — so Stephansplatz has several, and the one in the example returns only the U1 towards Leopoldau. That granularity is exactly right for a departure display facing one platform, and exactly wrong if you expected everything at the station; pass several `stopId` parameters to cover a whole interchange.

The `countdown` field is the operator's own answer in whole minutes, which sidesteps clock-skew problems entirely — a display driven by countdowns stays correct even if the device's time is wrong. Two other flags are worth surfacing: `barrierFree` marks step-free access for that specific service, and `trafficjam` goes true when a tram or bus is delayed by road congestion, which is a distinction most APIs never make.

Quick facts

Base URL
https://www.wienerlinien.at/ogd_realtime
Authentication
No API key or account since the open-data relaunch. Published as Vienna open government data.
Rate limit
No published quota. Countdowns refresh roughly every 30 seconds, so there is nothing to gain from faster polling.
Pricing
Free.
CORS
Not enabled — call it from your server
Official docs
Read the docs

How to use the Wiener Linien Realtime API

Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.

1. Fetch live departures for a Vienna platform

GET https://www.wienerlinien.at/ogd_realtime/monitor?stopId=4111

curl
curl 'https://www.wienerlinien.at/ogd_realtime/monitor?stopId=4111'
JavaScript (fetch)
const res = await fetch("https://www.wienerlinien.at/ogd_realtime/monitor?stopId=4111");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://www.wienerlinien.at/ogd_realtime/monitor?stopId=4111", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
{
  "data": {
    "monitors": [
      {
        "locationStop": {
          "type": "Feature",
          "geometry": {
            "type": "Point",
            "coordinates": [
              16.3716613,
              48.208062
            ]
          },
          "properties": {
            "name": "60201320",
            "title": "Stephansplatz",
            "municipality": "Wien",
            "municipalityId": 49000001,
            "type": "stop",
            "coordName": "WGS84",
            "gate": "1",
            "attributes": {
              "rbl": 4111
            }
          }
        },
        "lines": [
          {
            "name": "U1",
            "towards": "Leopoldau",
            "direction": "H",
            "platform": "1",
            "richtungsId": "1",
            "barrierFree": true,
            "realtimeSupported": true,
            "trafficjam": false,
            "departures": {
              "departure": [
                {
                  "departureTime": {
                    "timePlanned": null,
                    "timeReal": "2026-08-21T10:02:46.000+0200",
                    "countdown": 1
                  },
                  "vehicle": {
                    "name": "U1",
                    "towards": "Leopoldau",
                    "direction": "H",
                    "platform": "1",
                    "richtungsId": "1",
                    "barrierFree": true,
                    "foldingRamp": false,
                    "cooling": false,
                    "realtimeSupported": true,
                    "trafficjam": false,

Parameters

ParameterTypeRequiredDescription
stopIdqueryRequiredRBL number identifying a platform position. Repeat the parameter to monitor several at once. 4111
divaqueryOptionalDIVA number, which selects a whole stop rather than one platform. 60201320
activateTrafficInfoqueryOptionalInclude disruption notices, for example `stoerunglang`. stoerunglang
(static data)pathOptionalStop, line and platform reference CSVs are published separately on the Vienna open data portal.

Response fields

data.monitorsarray
One monitor per platform queried.
monitors[].locationStopobject
GeoJSON Feature for the platform, with `[longitude, latitude]` coordinates.
locationStop.properties.titlestring
Stop name, for example "Stephansplatz".
locationStop.properties.attributes.rblinteger
The RBL number, echoed back so multi-stop responses stay attributable.
monitors[].linesarray
Lines serving this platform.
lines[].name / towardsstring
Line label and the direction headsign.
lines[].platform / directionstring
Platform designation and direction code (`H` outbound, `R` return).
lines[].barrierFreeboolean
Whether this service offers step-free access.
lines[].trafficjamboolean
True when a surface service is delayed by road congestion — a distinction most APIs do not make.
lines[].departures.departure[].departureTime.countdowninteger
Minutes until departure. Immune to client clock skew.
departureTime.timePlanned / timeRealstring
ISO 8601 planned and actual times. `timePlanned` can be null when only a live estimate exists.

What you can build with the Wiener Linien Realtime API

  • Drive a platform departure display in Vienna
  • Show the next tram home in a personal dashboard
  • Flag step-free services for accessibility-aware journey planning
  • Detect surface delays caused by road traffic rather than the network
  • Monitor several platforms of an interchange in one request

Common errors and how to fix them

Only one line comes back for a big station

An RBL identifies a single platform position, not the whole station.

Fix: Pass several `stopId` parameters, or use `diva` to select the stop as a whole.

timePlanned is null

Some departures only have a real-time estimate.

Fix: Fall back to `countdown`, which is always present and is the field the operator's own displays use.

CORS error in the browser

The endpoint sends no Access-Control-Allow-Origin header.

Fix: Proxy it server-side. Because countdowns refresh every 30 seconds, a short server-side cache also cuts load.

Cannot find the RBL number for a stop

RBL numbers are published in separate reference files, not through this API.

Fix: Download the stop, line and platform CSVs from the Vienna open data portal and join them once.

Wiener Linien Realtime API — frequently asked questions

Is the Wiener Linien API free?

Yes, free with no key or registration since the open-data relaunch. It is published as Vienna open government data.

What is an RBL number?

It identifies one platform position — a specific line in a specific direction at a specific stop — rather than the stop as a whole. That is why a busy interchange has many RBLs and why a single query returns only part of the station.

Why use countdown instead of the timestamps?

Because it is the operator's own answer in whole minutes and does not depend on the client's clock being right. A departure board driven by countdowns stays accurate on a device with skewed time.

What does the trafficjam flag mean?

It marks a tram or bus delayed by road congestion rather than by a network problem. It lets you tell a passenger the vehicle is stuck in traffic instead of showing an unexplained delay.

Tools that pair with this API

Wiener Linien Realtime is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.