Network Pulse

What the feeds send

The raw data, as files. A whole payload from each of the four feeds this platform reads, a short excerpt of each, and one spreadsheet listing every field against how often it is actually filled in.

Sample taken

2026-09-18 08:12:16Z

Live feeds bounded to

-1.80,53.30,-0.90,53.70

Timetable from

20260905_023127.zip

These are a sample of one moment, and they are not refreshed on a timer. That is deliberate: they exist to be quoted, and a figure that changes under a document after it has gone out is worse than one that is a month old and says so. Rebuild with venv/bin/python build_feed_samples.py.

Every field, and how often it is filled

A specification says what a feed may carry. This says what it did. One row per field, with the share of records that had a value.

Download the inventory (CSV, 10.8 KB)

The files

Start with the excerpt of each — it is the same structure, cut to a handful of records so it can be read. The full payload is there when the whole thing is wanted.

SIRI-VM · XML

Live vehicle positions

data.bus-data.dft.gov.uk/api/v1/datafeed/

Every bus reporting inside the box, once. One VehicleActivity per vehicle: where it is, which line and journey it is running, and when the position was recorded.

Watch out: There is no delay field, no next stop and no onward calls — not low, absent. Punctuality has to be derived by matching positions to the timetable, which is what the platform does.

908 records in this sample

SIRI-SX · XML

Disruptions and situations

data.bus-data.dft.gov.uk/api/v1/siri-sx/

The national situation feed: roadworks, incidents and service changes, each with a period, a reason and the operators or lines it affects.

Watch out: National, not boxed — this one file is the whole country. Only a handful of authorities publish to it, so no situations for an operator means nothing either way.

393 records in this sample

GTFS-RT · Protobuf

The same positions, in the other format

data.bus-data.dft.gov.uk/api/v1/gtfsrtdatafeed/

BODS republishes vehicle positions as GTFS-Realtime. Same buses, different wire format, and one thing SIRI does not give: a trip_id that joins straight to the timetable.

Watch out: Bearing is set on 100 pct of records and 28.5 pct of them are −1, which means unknown. A sentinel is not a value: read the fill rate here as 71.5 pct, which is what SIRI reports too.

908 records in this sample

GTFS · CSV in a zip

The timetable

the weekly BODS timetable export

What was supposed to run: agencies, routes, trips, stop times, calendars and road geometry. Everything the live feeds are measured against.

Watch out: The sample keeps the first 50 rows of each file so it stays readable. Fill rates in the inventory are over the whole export — 5.6 million stop times, not 50.

Reading these

A missing field is the finding

What is not in the list matters more than what is. There is no delay, no next stop and no passenger count in any of it — so every one of those numbers on this site is derived, and the derivation is the work.

100% does not mean complete

GTFS-RT sets bearing on every record, so it reads 100% — but 28.5% of those are −1, meaning unknown. Counting the sentinel out leaves 71.5%, which is roughly what SIRI reports for the same buses at the same moment. A filled field is not the same as a known value, and this table counts fields, not knowledge.

The live feeds are boxed, the situations are not

SIRI-VM and GTFS-RT were pulled for one rectangle over South and West Yorkshire. SIRI-SX has no such filter, so that file is the whole country.

One moment, not an average

Fill rates come from a single pull of each live feed. They are stable enough to quote — the same shapes turn up every time — but a field at 0.4% here could be 0.6% tomorrow. Data ingestion covers the cadences.