Developer portal · Reference
The Trackser Live HTTP API — the endpoints that power the Trackser app, the parameters they take, and the shapes they return.
latest-plain.json variant for an uncompressed body.YYYY-MM-DD refers to that boundary, not midnight.no-store. Historical and timetable responses are cacheable.The primary feed. Each line's Durable Object publishes a pre-built snapshot; these endpoints read the latest one.
Latest map-area snapshot for a line — a superset that includes adjacent services shown on the app's map. gzip-compressed. Use /map/latest-plain.json for an uncompressed body.
Latest single-line snapshot including terminals. /line/latest-plain.json for uncompressed.
Metadata and stats only — train count, build time, source health. Omits the trains[] array. Ideal for lightweight status polling.
Single-train lookup. ?flavor=map|line selects which snapshot to search (default line).
All lines merged into one response. Only the line flavour exists for all.
{
"as_of": "2026-07-07T18:48:49Z",
"status": { "ok": true, "buildMs": 142 },
"stats": { "trainCount": 34 },
"trains": [ /* Train objects — see the data model below */ ]
}
If no snapshot exists yet, the endpoint returns 202 with a warming body and triggers a build; retry shortly.
Per-train and per-unit history for a railway day. Requests older than a key's historical window are gated.
| Endpoint | Returns |
|---|---|
GET /live/{lineId}/journeys | All journeys for today's railway day. |
GET /live/{lineId}/journeys/{trainNumber} | One train's journey. ?timetable=true folds in the booked working-timetable trip. |
GET /live/{lineId}/journeys/{YYYY-MM-DD} | All journeys for a historical railway day. |
GET /live/{lineId}/journeys/{YYYY-MM-DD}/{trainNumber} | A single historical journey. |
GET /live/{lineId}/journeys/{trainNumber}/compare | Timetable-vs-live comparison. ?date=YYYY-MM-DD. |
GET /live/{lineId}/units | All physical units seen on a railway day. ?date=. |
GET /live/{lineId}/units/{unitNo} | One unit: its journeys[] and gapSightings[]. |
{
"trainNumber": "460",
"railwayDay": "2026-07-07",
"stops": [
{ "time": "18:41:00", "location": "Baker Street", "platform": "5", "direction": "northbound" }
]
}
{code} is a station registry code (e.g. WPK for Wembley Park).
| Endpoint | Returns |
|---|---|
GET /station/{code} | Station info: {code, name, lines[], timetableAvailable}. |
GET /station/{code}/board | Live departure board across all lines serving the station. ?limit (default 10, max 50). |
GET /station/{code}/timetable | Scheduled departures. ?direction, ?from/?to (HH:MM). |
GET /station/{code}/departures | Merged live + scheduled board, with a booked-platform signal. |
GET /station/{code}/history | Past sightings. ?date=YYYY-MM-DD (required), ?from/?to. |
{
"station": "Wembley Park",
"code": "WPK",
"asOf": "2026-07-07T18:48:49Z",
"departures": [{
"lineId": "metropolitan",
"trainNumber": "460",
"towards": "Aldgate",
"direction": "southbound",
"currentLocation": "Approaching Wembley Park",
"secondsAway": 90,
"stopsAway": 1,
"platform": "3",
"platformInfo": { "number": "3", "source": "confirmed-location", "confidence": "high" },
"stoppingPattern": "All Stations"
}]
}
secondsAway is an estimate — a live ETA rebased onto the train's true position; null when timing data is missing.stopsAway is a topological stop count; null when the branch is ambiguous.platformInfo.source is one of five ranked signals, strongest first: confirmed-location, polled, … , scheduled.Working-timetable data. Currently published for the Metropolitan and Chiltern lines.
| Endpoint | Returns |
|---|---|
GET /timetables/{lineId}/{dayType}/{direction} | Timetable for a line, day type and direction. ?date= override. |
GET /timetables/{lineId}/{timetableId}/{dayType}/{direction} | A specific timetable version. |
GET /timetables/{lineId}/list | Available timetable IDs for a line. |
GET /timetables/{lineId}/{YYYY-MM-DD} | The schedule entry effective for a date. |
dayType is one of m-f, sat, sun, current; direction is northbound or southbound.
Archived historical snapshots. Only the map flavour is archived.
| Endpoint | Returns |
|---|---|
GET /replay/{lineId}/list | Archived snapshot keys for a day. ?day=YYYY-MM-DD, ?flavor=map. |
GET /replay/get?objectKey=… | Fetch one archived snapshot by object key. |
Object keys follow archive/{lineId}/trains/map/{YYYY-MM-DD}/{HH}-{MM}-{SS}.json and are validated to prevent traversal. Snapshots older than a key's window require a pro/admin key.
Public component release history — returned as a page, or JSON with ?format=json.
| Endpoint | Returns |
|---|---|
GET /admin/status | { now, overall: "ok"|"degraded", monitorStatus, lines[] } — per-line up/down, tuned for uptime monitors. |
GET /admin/health | Adds deploy version and per-line meta (last build, train count, consecutive failures). |
GET /live/{lineId}/{map|line}/latest-stats.json | Per-line freshness and stats without the train list. |
These endpoints power this site's status page, which reports per-line pipeline health.
The record emitted in every live snapshot's trains[] array. Selected fields:
| Field | Type | Meaning |
|---|---|---|
id | string | Unique id, lineId:trainNumber. |
lineId | string | Line slug. |
trainNumber | string | LU train number or NR headcode. trainNumberInferred flags inference. |
source | trackernet | unified | Which upstream feed produced the record. |
currentLocation | string | Live positional text, e.g. "At Baker Street Platform 5" or "Between X and Y". |
direction | string | Cardinal direction, e.g. northbound. |
towards / nextTowards | string | Destination(s). |
stoppingPattern | string | e.g. All Stations, Semi Fast, Fast, Booked: …. |
leadingCarNo / rearCarNo | string | Physical unit identifiers. |
isMaybeStalled | boolean | Stall inference; paired with stallDurationSeconds, stallSince. |
isReformed / oldTrainNumber | — | Reformation tracking. |
polledStationName | string | Station whose countdown produced this sighting — not reliably the next stop (see data sources). |
| Code | Body | Meaning |
|---|---|---|
200 | JSON body | Success. |
202 | warming | No snapshot built yet; a build was triggered. Retry shortly. |
404 | HTML error page | Unknown path (paths are gated by an allow-list). |
Endpoints evolve with the app. If something here doesn't match what you're seeing, or you need access, email [email protected].