General
Trackser Live is the custom data backend that powers the Trackser app. It fetches live train data from TfL's TrackerNet XML feeds every minute, enriches it with direction inference, stall detection, reformation tracking, and Metropolitan line timetable data, then publishes compact gzip-compressed JSON snapshots to Cloudflare R2. The app reads those snapshots rather than calling TfL directly.
TfL's TrackerNet feed is detailed but raw — it contains inconsistencies, duplicates, ambiguous direction codes, depot movement noise, and edge cases that accumulate quickly in production. Trackser Live handles all of that server-side, so the app receives clean, enriched data without having to do any of the heavy lifting on-device.
Specifically, Trackser Live adds: reliable direction inference, EWMA-based stall detection, reformation detection, destination cleansing, Metropolitan line stopping pattern resolution from working timetable data, and per-train journey tracking across the railway day.
Snapshots are built every minute. TfL's TrackerNet updates approximately every 30 seconds
per station. Under normal conditions, the data you receive will be 0–90 seconds old.
Every response includes an as_of timestamp so you know exactly when the
snapshot was built.
All 11 Underground lines are fully supported, plus Chiltern Railways trains that share Metropolitan line track:
metropolitan · chiltern · bakerloo · central · circle · district · hammersmith-city · jubilee · northern · piccadilly · victoria · waterloo-city
Data & accuracy
TrackerNet reports train positions using track circuit codes. When a train is between stations, we resolve the code to the nearest inter-station description (e.g. "Approaching Knightsbridge" or "Left Acton Town"). Occasionally the data doesn't contain enough information to be more precise than "between [Station A] and [Station B]" — we report the best available information rather than guess.
A stalled train (isMaybeStalled: true) is one that has been at the same
location longer than the EWMA threshold — approximately five minutes beyond normal dwell
time for that location. Not all stalls indicate a problem: a train sitting at a terminus
waiting for its next departure time will typically trigger this flag.
Stall state persists overnight to avoid false positives for trains stabled at depots.
Reformation (isReformed: true) is detected when a train's vehicle ID or set
number changes while the train is stationary. This can happen when train sets are split,
joined, or reconfigured during service — or when a train number is reassigned to a
different physical unit. Reformation events are logged for analysis.
The vehicleId field is the leading car number — the identifier of the
physical train unit (stock set) working that service, as opposed to the operational
train number. On lines where this data is available from TrackerNet, it lets you
identify which fleet vehicle is operating a given service. This is what the Trackser
app displays as "Leading Car Number."
If TrackerNet becomes unavailable, the worker enters exponential backoff and continues
serving the most recent cached snapshot. The as_of timestamp will
indicate stale data. Status updates appear on the system status page.
Where available, the Unified API is used as a fallback data source.
API access
Currently, Trackser Live serves the Trackser app exclusively and API keys aren't issued publicly. If you have a project that would genuinely benefit from this data, get in touch — if there's enough interest, external access is something we'd consider.
Rate limits are set per API key depending on use case. In general, the data is updated once per minute — there's rarely a good reason to poll more frequently than that. A 429 response means you've exceeded your limit; implement exponential backoff and contact us if you need higher limits.
Live data endpoints serve pre-built snapshots from Cloudflare R2, edge-cached globally. Responses are typically under 100ms. The API itself does almost no computation per request — it's essentially a very fast file read.
Support
Include the timestamp (from as_of), the line ID, and the train number
in your report. Email support@curiosity175.co.uk.
Position mapping issues on specific track circuits are the most common cause —
these are usually fixable with a location data update.
Email support@curiosity175.co.uk and we'll get back to you. Technical questions about the data or infrastructure are always welcome.