Stib

View API Documentation

STIB is the main public transport operator in Brussels. It has its own open data platform which provides different data sets. The GTFS feed is used to provide the schedule of the vehicles. STIB does not publish a GTFS-RT feed: its real-time API gives anonymous positions (a line, a destination, the last stop passed and the metres since), with no vehicle or trip identifier. The MobilityTwin.Brussels platform reconstructs both, live: vehicle-trip gives every vehicle with its GTFS trip and delay, and gtfs-rt-vehicle-position and gtfs-rt-trip-update publish the same as standard GTFS-RT feeds, see STIB GTFS Realtime.

Source

Endpoints

Gtfs

/stib/gtfs
GTFS APPLICATION/ZIP

The GTFS zip file of STIB/MIVB

Refresh: Daily
From
2024-04-05 06:20:01
To
2026-10-06 06:20:01
Records
707

GTFS (Parquet)

/stib/gtfs-parquet
GTFS-PARQUET APPLICATION/ZIP

The GTFS feed of STIB/MIVB converted to Apache Parquet format (zip archive of .parquet files). Parquet uses columnar storage with zstd compression and strong typing, resulting in 40-75% smaller files compared to the original GTFS zip. This format enables extremely efficient data transfer and near-zero RAM overhead when reading specific columns via Polars or DuckDB, making it ideal for analytical workloads and large-scale processing. Produced using gtfs-parquet v0.4.0.

Refresh: Daily (regenerated from the GTFS feed)
From
2024-04-05 06:20:01
To
2026-10-06 06:20:01
Records
689

Segments

/stib/segments
GEOJSON APPLICATION/JSON

The segments of the STIB/MIVB network

Refresh: Daily (derived from the STIB shapefile and stops)
From
2024-08-21 14:48:24
To
2026-10-06 05:20:01
Records
660

Stops

/stib/stops
GEOJSON APPLICATION/JSON

The stops of STIB/MIVB. The data was enriched and cleaned for easier use.

Refresh: Daily (derived from stops-by-line and stop-details)
From
2024-08-21 14:48:23
To
2026-10-06 02:20:00
Records
290

Vehicle distance

/stib/vehicle-distance
JSON APPLICATION/JSON

This endpoint provides the raw data of the STIB/MIVB proprietary API which returns the distance of each vehicle since the last stop. For long time ranges, download the history as Parquet files through /parquetized (see Bulk history).

Refresh: Every 20 seconds
From
2023-02-24 17:55:46
To
2026-10-07 02:00:20
Records
5,093,864

Vehicle position

/stib/vehicle-position
GEOJSON APPLICATION/JSON

The estimated positions of the vehicles based on the GTFS feed and the proprietary APIs. Because the STIB/MIVB proprietary API does not provide the identity of the vehicles, the MobilityTwin.Brussels platform also performs computations to attribute a unique identity to each vehicle along a given trip. These ids do not correspond to the ids of the GTFS feed but are rather generated randomly. The ids are unique for a given trip. To track a vehicle across consecutive queries, use the uuid field which remains stable for the duration of a trip.

Refresh: Every 20 seconds (computed from vehicle-distance)
From
2024-08-21 14:54:58
To
2026-10-07 01:59:57
Records
2,971,267

Vehicle position with trip

/stib/vehicle-trip
GEOJSON APPLICATION/JSON

Every STIB/MIVB vehicle on the road, every 20 seconds, with the GTFS trip it is running and its delay. STIB's real-time API names neither vehicles nor trips. This endpoint tracks each vehicle from poll to poll under the constraint that vehicles on a line do not overtake each other, reads its stop calls as they happen, and pairs the vehicles on the road with the timetabled trips that could be running by the smallest total deviation between observed and scheduled times. It is the live form of the method behind the punctuality table. Each feature carries uuid (stable for as long as the vehicle is tracked on one run), lineId, directionId (the destination stop), direction (GTFS direction_id), pointId and distanceFromPoint, routeId, and where a trip was established tripId, startDate, startTime, delay (seconds late at the last stop called at, negative when early), stopId and stopSequence (the stop the vehicle is at or heading to) and status (STOPPED_AT or IN_TRANSIT_TO). A vehicle gets its trip after its second stop call, about a minute after leaving its first stop; a vehicle still waiting at its first stop has none, since which waiting vehicle makes the next departure is not knowable from the feed. Measured over a full replayed day, 91% of the vehicles that had left their first stop carried a trip, and 93% of those trips were the ones the daily method assigns with the whole day in hand (88% at the morning peak, 97% off-peak). For long time ranges, download the history as Parquet files through /parquetized (see Bulk history).

Refresh: Every 20 seconds (computed from vehicle-distance)
From
2025-10-07 06:21:17
To
2026-10-07 01:59:57
Records
1,329,699

GTFS-RT Vehicle positions

/stib/gtfs-rt-vehicle-position
GTFS-RT APPLICATION/OCTET-STREAM

STIB/MIVB vehicle positions as a standard GTFS Realtime feed, built from vehicle-trip — STIB itself publishes no GTFS-RT. One VehiclePosition per vehicle, with trip_id, start_date and start_time where the trip was established, and otherwise only route_id and direction_id. vehicle.id is the tracking uuid, stable for one run. IDs match the gtfs endpoint of the same day.

Refresh: On request, from the latest vehicle-trip snapshot (every 20 seconds)
Availability depends on source data

GTFS-RT Trip updates

/stib/gtfs-rt-trip-update
GTFS-RT APPLICATION/OCTET-STREAM

Predicted arrivals for STIB/MIVB as a standard GTFS Realtime feed, built from vehicle-trip — STIB itself publishes no GTFS-RT. One TripUpdate per trip that has a vehicle on it: the delay measured at the last stop the vehicle called at is applied to every stop still ahead of it (arrival and departure carry both delay and absolute time). Trips with no vehicle on them are left out rather than declared on time, and there are no cancellations: the source has no signal for them.

Refresh: On request, from the latest vehicle-trip snapshot (every 20 seconds)
Availability depends on source data

Punctuality

/stib/punctuality
PARQUET APPLICATION/OCTET-STREAM

Daily punctuality table for STIB/MIVB, reconstructed from the anonymous vehicle-distance feed. STIB publishes no GTFS-RT trip updates and no vehicle identity: the source is a set of positions every 20 seconds, each carrying only a line, a direction, the stop point last passed and the metres since. This table is therefore *derived*, not reported. Vehicles are recovered by aligning consecutive polls under the constraint that vehicles on a line do not overtake each other; stop calls are read where a vehicle's distance along the line crosses a stop; and GTFS trip ids are assigned by a second order-preserving alignment of the day's journeys against the day's timetable. Columns match the other operators' punctuality tables, with seven appended: `route_gtfs_id`, `journey_id`, `match_deviation_minutes`, `observed`, `inferred`, `missing_reason` and `dwell_share`. Two limits are structural and must be read before use. **`cancelled` is always false** — the feed carries no cancellation signal at all, and an unmatched trip is equally evidence that the tracker lost the vehicle, so no cancellation is claimed rather than guessed. Do not compute a STIB cancellation rate from this table. **`observed` marks a measured time and `inferred` a derived one**; they are mutually exclusive, and a consumer wanting measurement only should filter on `observed`. Rows with neither carry a `missing_reason`. `trip_schedule_relationship` is 0 for a timetabled trip and 1 (ADDED) for a run matched to none, whose `trip_id` starts with `added-`. Typical quality, measured across 146 days spanning April 2024 to August 2026: about 92% of timetabled trips matched on days without a feed outage, 88% of scheduled stop calls carrying a measured time and 94% once inference is included, with a median match deviation of 1.3 minutes. Quality does not degrade with age. The denominator is the timetable, and since no cancellation signal exists, a trip that was short-turned or never ran keeps all of its scheduled calls.

Refresh: Daily (one file per Brussels service day)
From
2024-04-06 00:00:00
To
2026-10-07 00:00:00
Records
909

Speed

/stib/speed
JSON APPLICATION/JSON

The speed of the vehicles of STIB/MIVB over their last move, per line, stop and direction: STIB refreshes a vehicle's distance about every 40 seconds, and a move is timed from when the previous distance first appeared to when the new one did.

Refresh: Every 20 seconds (computed from vehicle-distance)
From
2024-08-21 02:00:04
To
2026-10-07 02:00:20
Records
3,145,467

Aggregated speed

/stib/aggregated-speed
JSON APPLICATION/JSON

The average speed of the vehicles of STIB/MIVB on a 10 minutes interval, per line, stop and direction.

Refresh: Every 20 seconds (10-minute rolling average)
From
2024-08-21 04:23:11
To
2026-10-07 02:00:20
Records
2,727,674

Trips

/stib/trips
MF-JSON APPLICATION/JSON

All the trips of STIB/MIVB for the specified period of time. This is an aggregate of the GeoJSON files returned by the vehicle-position endpoint of MobilityTwin.Brussels.

Refresh: On request — aggregated from vehicle-position over the queried interval
Availability depends on source data

Shapefile

/stib/shapefile
GEOJSON APPLICATION/JSON

The shapefile of STIB/MIVB

Refresh: Daily (derived from the STIB shapefile)
From
2024-08-21 14:48:24
To
2026-10-06 05:20:01
Records
714

Stop details

/stib/stop-details
JSON APPLICATION/JSON

Detailed information about each STIB/MIVB stop including GPS coordinates and names in French and Dutch.

Refresh: Daily
From
2026-04-29 11:31:03
To
2026-10-06 02:20:00
Records
107

Stops by line

/stib/stops-by-line
JSON APPLICATION/JSON

The ordered list of stops for each STIB/MIVB line, per direction.

Refresh: Daily
From
2026-04-29 11:31:02
To
2026-10-06 02:20:00
Records
107

Waiting times

/stib/waiting-times
JSON APPLICATION/JSON

Real-time waiting times at STIB/MIVB stops with expected arrival times per line and destination.

Refresh: Every 60 seconds
From
2026-03-30 11:00:43
To
2026-10-07 02:00:28
Records
343,184

Travellers information

/stib/travellers-information
JSON APPLICATION/JSON

Real-time traveller information messages and service alerts for STIB/MIVB lines and stops.

Refresh: Every 15 minutes
From
2026-03-30 11:15:23
To
2026-10-07 01:55:55
Records
13,405