TfL London Transit
Real-time London TfL transit data — Tube arrivals, bus predictions, line status, disruptions, journey planning, and route information. Uses TfL's single unified REST API for all modes. API key optional (free, recommended for higher rate limits).
When to Use
- User asks about the Tube, London Underground, TfL, or London public transport
- User mentions specific Tube lines (Bakerloo, Central, Circle, District, Hammersmith & City, Jubilee, Metropolitan, Northern, Piccadilly, Victoria, Waterloo & City)
- User asks "is the Northern line running" or "when's the next Tube"
- User mentions London stations (King's Cross, Oxford Circus, Waterloo, Victoria, Paddington, etc.)
- User asks about London buses, DLR, Overground, Elizabeth line, or trams
- User asks about TfL service status, delays, disruptions, or planned closures
- User asks about Oyster, contactless, or TfL fares
- User asks about journey planning in London
Data Sources
TfL has a single unified REST API (api.tfl.gov.uk) that returns JSON for ALL modes — Tube, bus, DLR, Overground, Elizabeth line, trams, river bus, cable car. No protobuf, no SIRI, no multiple feed formats. Just one clean REST API with consistent JSON responses.
API key: Register for a free app_key at https://api-portal.tfl.gov.uk/ — append ?app_key={KEY} to requests. The API works without a key for basic usage but is rate-limited; with a key you get 500 requests per minute.
Key Endpoints
| Endpoint |
Description |
/Line/Mode/tube/Status |
All Tube line statuses |
/Line/{lineId}/Status |
Specific line status |
/StopPoint/{naptanId}/Arrivals |
Arrivals at a stop |
/Line/{lineId}/Arrivals/{stopPointId} |
Arrivals filtered by line |
/StopPoint/Search/{query} |
Search stops by name |
/StopPoint?lat=&lon=&radius= |
Stops near location |
/Line/{lineId}/StopPoints |
Stops on a line |
/Line/{lineId}/Route/Sequence/{dir} |
Route stop sequence |
/Line/{lineId}/Disruption |
Disruptions on a line |
/Journey/JourneyResults/{from}/to/{to} |
Journey planning |
/Line/Mode/bus |
All bus routes |
All endpoints return JSON. Append ?app_key={KEY} for authenticated requests.
Implementation
Quick Start: Use the helper scripts
The scripts in this skill's scripts/ directory handle fetching, parsing, and presenting TfL data.
Script: scripts/tfl.mjs
Main entry point. Supports these commands:
# Tube line status
node scripts/tfl.mjs status
node scripts/tfl.mjs status --all
node scripts/tfl.mjs status --line victoria
# Arrivals at a station
node scripts/tfl.mjs arrivals --station "Oxford Circus"
node scripts/tfl.mjs arrivals --stop 940GZZLUOXC
node scripts/tfl.mjs arrivals --stop-search "kings cross"
node scripts/tfl.mjs arrivals --stop-search "kings cross" --line piccadilly
# Bus arrivals
node scripts/tfl.mjs bus-arrivals --stop 490005183E
node scripts/tfl.mjs bus-arrivals --stop-search "oxford circus"
node scripts/tfl.mjs bus-arrivals --stop-search "oxford circus" --route 24
# Disruptions
node scripts/tfl.mjs disruptions
node scripts/tfl.mjs disruptions --line northern
# Routes and stops
node scripts/tfl.mjs routes
node scripts/tfl.mjs routes --all
node scripts/tfl.mjs bus-routes
node scripts/tfl.mjs stops --search "waterloo"
node scripts/tfl.mjs stops --near 51.5074,-0.1278 --radius 500
node scripts/tfl.mjs stops --line victoria
node scripts/tfl.mjs route-info --line bakerloo
node scripts/tfl.mjs route-info --route 24
# Journey planning
node scripts/tfl.mjs journey --from "waterloo" --to "kings cross"
node scripts/tfl.mjs journey --from "51.5031,-0.1132" --to "51.5308,-0.1238"
Setup: API Key (Optional, Recommended)
Basic functionality works without a key (rate-limited). For 500 requests/minute:
- Register at https://api-portal.tfl.gov.uk/
- Set environment variable:
TFL_API_KEY
Tube Lines Reference
| Line ID |
Line Name |
Emoji |
Terminals |
| bakerloo |
Bakerloo |
brown |
Harrow & Wealdstone <-> Elephant & Castle |
| central |
Central |
red |
Epping / Ealing Broadway <-> West Ruislip |
| circle |
Circle |
yellow |
Hammersmith (loop via Liverpool Street) |
| district |
District |
green |
Richmond / Ealing Broadway <-> Upminster |
| hammersmith-city |
Hammersmith & City |
pink |
Hammersmith <-> Barking |
| jubilee |
Jubilee |
silver |
Stanmore <-> Stratford |
| metropolitan |
Metropolitan |
magenta |
Chesham / Amersham / Uxbridge <-> Aldgate |
| northern |
Northern |
black |
Edgware / High Barnet <-> Morden / Battersea |
| piccadilly |
Piccadilly |
dark blue |
Heathrow T5 / Uxbridge <-> Cockfosters |
| victoria |
Victoria |
light blue |
Walthamstow Central <-> Brixton |
| waterloo-city |
Waterloo & City |
teal |
Waterloo <-> Bank |
Other TfL Rail Modes
| Line ID |
Name |
Type |
| dlr |
DLR |
Docklands Light Railway |
| liberty |
Liberty |
Overground (Romford — Upminster) |
| lioness |
Lioness |
Overground (Watford — Euston) |
| mildmay |
Mildmay |
Overground (Stratford — Richmond/Clapham) |
| suffragette |
Suffragette |
Overground (Gospel Oak — Barking) |
| weaver |
Weaver |
Overground (Liverpool St — Enfield/Cheshunt/Chingford) |
| windrush |
Windrush |
Overground (Highbury — Crystal Palace/Clapham/W Croydon) |
| elizabeth |
Elizabeth line |
Crossrail |
| tram |
London Trams |
Croydon Tramlink |
TfL Fares Reference (from March 2025)
| Fare Type |
Price |
| Tube Zone 1 (Oyster/contactless, peak) |
£2.80 |
| Tube Zone 1 (Oyster/contactless, off-peak) |
£2.70 |
| Tube Zones 1-2 (peak) |
£2.80 |
| Tube Zones 1-2 (off-peak) |
£2.70 |
| Tube Zones 1-3 (peak) |
£3.50 |
| Tube Zones 1-3 (off-peak) |
£2.80 |
| Bus & Tram (any journey) |
£1.75 |
| Hopper fare (unlimited bus/tram within 1 hour) |
£1.75 total |
| Daily cap Zones 1-2 |
£8.90 |
| Weekly cap Zones 1-2 |
£44.70 |
| Cash single (ticket machine) |
£6.70 (Zone 1) |
Peak: Mon-Fri 6:30-9:30am and 4:00-7:00pm (except public holidays).
Tips for Users
- NaPTAN IDs are the station identifiers — Tube stations use
940GZZLU{code} format
- Use
--station or --stop-search for name-based lookups; use --stop for exact NaPTAN IDs
- Times are shown in 24-hour format (London convention)
- The
arrivals command uses timeToStation (seconds) from the TfL API for ETA
- Bus stops have their own NaPTAN IDs in
490{code} format
- Journey planning returns fare estimates when available
Error Handling
- If
TFL_API_KEY is not set, requests still work but are rate-limited — a note is printed
- 429 rate limit responses print a helpful message with the key signup URL
- Invalid station/stop searches show "No matching station found" with suggestions
- Network errors and API error responses produce friendly messages
- Station closed or no service shows an appropriate message
Response Formatting
When presenting transit info to the user:
- Lead with the most actionable info (next arrival time, line status)
- Show line name with color emoji (e.g., "🔴 Central: Good Service")
- Show times in 24-hour format (London convention)
- For arrivals: show line + destination + minutes (from
timeToStation / 60)
- Show platform name when available
- For journey planning: show step-by-step with mode, line, duration, and fare
- Always mention disruptions for queried lines
External Endpoints
| Endpoint |
Data Sent |
Data Received |
api.tfl.gov.uk/Line/*/Status |
API key (query param, optional) |
Line status (JSON) |
api.tfl.gov.uk/StopPoint/*/Arrivals |
API key (query param, optional) |
Arrivals (JSON) |
api.tfl.gov.uk/StopPoint/Search/* |
API key (query param, optional) |
Stop search results (JSON) |
api.tfl.gov.uk/StopPoint?lat=&lon= |
API key (query param, optional) |
Nearby stops (JSON) |
api.tfl.gov.uk/Line/*/StopPoints |
API key (query param, optional) |
Stops on line (JSON) |
api.tfl.gov.uk/Line/*/Route/Sequence/* |
API key (query param, optional) |
Route sequence (JSON) |
api.tfl.gov.uk/Line/*/Disruption |
API key (query param, optional) |
Disruptions (JSON) |
api.tfl.gov.uk/Journey/JourneyResults/* |
API key (query param, optional) |
Journey results (JSON) |
api.tfl.gov.uk/Line/Mode/bus |
API key (query param, optional) |
Bus routes (JSON) |
API key is passed as a query parameter to TfL's official API. No other user data is transmitted.
Security & Privacy
- API key optional — TfL Unified API works without a key (rate-limited); with a free key you get 500 req/min
- No user data transmitted — requests contain only the optional API key and route/stop identifiers, no personal information
- No local storage — this skill does not write any files to disk (no GTFS cache needed — TfL is all live API)
- No telemetry — this skill does not phone home or collect usage data
- Input handling — stop names and route IDs from user input are URL-encoded in API queries, never interpolated into shell commands
Trust Statement
This skill reads publicly available transit data from TfL's official Unified API. The optional API key is used only for TfL API rate-limit authentication. The skill does not access, store, or transmit any personal information beyond the API key configured by the user.
1---2name: tfl3description: London TfL transit — real-time Tube arrivals, bus predictions, line status, service disruptions, journey planning, and route info for the London Underground, DLR, Overground, Elizabeth line, and buses. Use when the user asks about London public transport, Tube times, bus arrivals, or TfL service status.4license: MIT5---6
7# TfL London Transit
8
9Real-time London TfL transit data — Tube arrivals, bus predictions, line status, disruptions, journey planning, and route information. Uses TfL's single unified REST API for all modes. API key optional (free, recommended for higher rate limits).
10
11## When to Use
12
13- User asks about the Tube, London Underground, TfL, or London public transport
14- User mentions specific Tube lines (Bakerloo, Central, Circle, District, Hammersmith & City, Jubilee, Metropolitan, Northern, Piccadilly, Victoria, Waterloo & City)
15- User asks "is the Northern line running" or "when's the next Tube"
16- User mentions London stations (King's Cross, Oxford Circus, Waterloo, Victoria, Paddington, etc.)
17- User asks about London buses, DLR, Overground, Elizabeth line, or trams
18- User asks about TfL service status, delays, disruptions, or planned closures
19- User asks about Oyster, contactless, or TfL fares
20- User asks about journey planning in London
21
22## Data Sources
23
24TfL has a **single unified REST API** (`api.tfl.gov.uk`) that returns JSON for ALL modes — Tube, bus, DLR, Overground, Elizabeth line, trams, river bus, cable car. No protobuf, no SIRI, no multiple feed formats. Just one clean REST API with consistent JSON responses.
25
26**API key:** Register for a free `app_key` at https://api-portal.tfl.gov.uk/ — append `?app_key={KEY}` to requests. The API works without a key for basic usage but is rate-limited; with a key you get 500 requests per minute.
27
28### Key Endpoints
29
30| Endpoint | Description |
31|----------|-------------|
32| `/Line/Mode/tube/Status` | All Tube line statuses |
33| `/Line/{lineId}/Status` | Specific line status |
34| `/StopPoint/{naptanId}/Arrivals` | Arrivals at a stop |
35| `/Line/{lineId}/Arrivals/{stopPointId}` | Arrivals filtered by line |
36| `/StopPoint/Search/{query}` | Search stops by name |
37| `/StopPoint?lat=&lon=&radius=` | Stops near location |
38| `/Line/{lineId}/StopPoints` | Stops on a line |
39| `/Line/{lineId}/Route/Sequence/{dir}` | Route stop sequence |
40| `/Line/{lineId}/Disruption` | Disruptions on a line |
41| `/Journey/JourneyResults/{from}/to/{to}` | Journey planning |
42| `/Line/Mode/bus` | All bus routes |
43
44All endpoints return JSON. Append `?app_key={KEY}` for authenticated requests.
45
46## Implementation
47
48### Quick Start: Use the helper scripts
49
50The scripts in this skill's `scripts/` directory handle fetching, parsing, and presenting TfL data.
51
52### Script: `scripts/tfl.mjs`
53
54Main entry point. Supports these commands:
55
56```bash
57# Tube line status
58node scripts/tfl.mjs status
59node scripts/tfl.mjs status --all
60node scripts/tfl.mjs status --line victoria
61
62# Arrivals at a station
63node scripts/tfl.mjs arrivals --station "Oxford Circus"
64node scripts/tfl.mjs arrivals --stop 940GZZLUOXC
65node scripts/tfl.mjs arrivals --stop-search "kings cross"
66node scripts/tfl.mjs arrivals --stop-search "kings cross" --line piccadilly
67
68# Bus arrivals
69node scripts/tfl.mjs bus-arrivals --stop 490005183E
70node scripts/tfl.mjs bus-arrivals --stop-search "oxford circus"
71node scripts/tfl.mjs bus-arrivals --stop-search "oxford circus" --route 24
72
73# Disruptions
74node scripts/tfl.mjs disruptions
75node scripts/tfl.mjs disruptions --line northern
76
77# Routes and stops
78node scripts/tfl.mjs routes
79node scripts/tfl.mjs routes --all
80node scripts/tfl.mjs bus-routes
81node scripts/tfl.mjs stops --search "waterloo"
82node scripts/tfl.mjs stops --near 51.5074,-0.1278 --radius 500
83node scripts/tfl.mjs stops --line victoria
84node scripts/tfl.mjs route-info --line bakerloo
85node scripts/tfl.mjs route-info --route 24
86
87# Journey planning
88node scripts/tfl.mjs journey --from "waterloo" --to "kings cross"
89node scripts/tfl.mjs journey --from "51.5031,-0.1132" --to "51.5308,-0.1238"
90```
91
92### Setup: API Key (Optional, Recommended)
93
94Basic functionality works without a key (rate-limited). For 500 requests/minute:
95
961. Register at https://api-portal.tfl.gov.uk/
972. Set environment variable: `TFL_API_KEY`
98
99### Tube Lines Reference
100
101| Line ID | Line Name | Emoji | Terminals |
102|---------|-----------|-------|-----------|
103| bakerloo | Bakerloo | brown | Harrow & Wealdstone <-> Elephant & Castle |
104| central | Central | red | Epping / Ealing Broadway <-> West Ruislip |
105| circle | Circle | yellow | Hammersmith (loop via Liverpool Street) |
106| district | District | green | Richmond / Ealing Broadway <-> Upminster |
107| hammersmith-city | Hammersmith & City | pink | Hammersmith <-> Barking |
108| jubilee | Jubilee | silver | Stanmore <-> Stratford |
109| metropolitan | Metropolitan | magenta | Chesham / Amersham / Uxbridge <-> Aldgate |
110| northern | Northern | black | Edgware / High Barnet <-> Morden / Battersea |
111| piccadilly | Piccadilly | dark blue | Heathrow T5 / Uxbridge <-> Cockfosters |
112| victoria | Victoria | light blue | Walthamstow Central <-> Brixton |
113| waterloo-city | Waterloo & City | teal | Waterloo <-> Bank |
114
115### Other TfL Rail Modes
116
117| Line ID | Name | Type |
118|---------|------|------|
119| dlr | DLR | Docklands Light Railway |
120| liberty | Liberty | Overground (Romford — Upminster) |
121| lioness | Lioness | Overground (Watford — Euston) |
122| mildmay | Mildmay | Overground (Stratford — Richmond/Clapham) |
123| suffragette | Suffragette | Overground (Gospel Oak — Barking) |
124| weaver | Weaver | Overground (Liverpool St — Enfield/Cheshunt/Chingford) |
125| windrush | Windrush | Overground (Highbury — Crystal Palace/Clapham/W Croydon) |
126| elizabeth | Elizabeth line | Crossrail |
127| tram | London Trams | Croydon Tramlink |
128
129### TfL Fares Reference (from March 2025)
130
131| Fare Type | Price |
132|-----------|-------|
133| Tube Zone 1 (Oyster/contactless, peak) | £2.80 |
134| Tube Zone 1 (Oyster/contactless, off-peak) | £2.70 |
135| Tube Zones 1-2 (peak) | £2.80 |
136| Tube Zones 1-2 (off-peak) | £2.70 |
137| Tube Zones 1-3 (peak) | £3.50 |
138| Tube Zones 1-3 (off-peak) | £2.80 |
139| Bus & Tram (any journey) | £1.75 |
140| Hopper fare (unlimited bus/tram within 1 hour) | £1.75 total |
141| Daily cap Zones 1-2 | £8.90 |
142| Weekly cap Zones 1-2 | £44.70 |
143| Cash single (ticket machine) | £6.70 (Zone 1) |
144
145Peak: Mon-Fri 6:30-9:30am and 4:00-7:00pm (except public holidays).
146
147### Tips for Users
148
149- **NaPTAN IDs** are the station identifiers — Tube stations use `940GZZLU{code}` format
150- Use `--station` or `--stop-search` for name-based lookups; use `--stop` for exact NaPTAN IDs
151- Times are shown in 24-hour format (London convention)
152- The `arrivals` command uses `timeToStation` (seconds) from the TfL API for ETA
153- Bus stops have their own NaPTAN IDs in `490{code}` format
154- Journey planning returns fare estimates when available
155
156### Error Handling
157
158- If `TFL_API_KEY` is not set, requests still work but are rate-limited — a note is printed
159- 429 rate limit responses print a helpful message with the key signup URL
160- Invalid station/stop searches show "No matching station found" with suggestions
161- Network errors and API error responses produce friendly messages
162- Station closed or no service shows an appropriate message
163
164### Response Formatting
165
166When presenting transit info to the user:
167- Lead with the most actionable info (next arrival time, line status)
168- Show line name with color emoji (e.g., "🔴 Central: Good Service")
169- Show times in 24-hour format (London convention)
170- For arrivals: show line + destination + minutes (from `timeToStation / 60`)
171- Show platform name when available
172- For journey planning: show step-by-step with mode, line, duration, and fare
173- Always mention disruptions for queried lines
174
175## External Endpoints
176
177| Endpoint | Data Sent | Data Received |
178|----------|-----------|---------------|
179| `api.tfl.gov.uk/Line/*/Status` | API key (query param, optional) | Line status (JSON) |
180| `api.tfl.gov.uk/StopPoint/*/Arrivals` | API key (query param, optional) | Arrivals (JSON) |
181| `api.tfl.gov.uk/StopPoint/Search/*` | API key (query param, optional) | Stop search results (JSON) |
182| `api.tfl.gov.uk/StopPoint?lat=&lon=` | API key (query param, optional) | Nearby stops (JSON) |
183| `api.tfl.gov.uk/Line/*/StopPoints` | API key (query param, optional) | Stops on line (JSON) |
184| `api.tfl.gov.uk/Line/*/Route/Sequence/*` | API key (query param, optional) | Route sequence (JSON) |
185| `api.tfl.gov.uk/Line/*/Disruption` | API key (query param, optional) | Disruptions (JSON) |
186| `api.tfl.gov.uk/Journey/JourneyResults/*` | API key (query param, optional) | Journey results (JSON) |
187| `api.tfl.gov.uk/Line/Mode/bus` | API key (query param, optional) | Bus routes (JSON) |
188
189API key is passed as a query parameter to TfL's official API. No other user data is transmitted.
190
191## Security & Privacy
192
193- **API key optional** — TfL Unified API works without a key (rate-limited); with a free key you get 500 req/min
194- **No user data transmitted** — requests contain only the optional API key and route/stop identifiers, no personal information
195- **No local storage** — this skill does not write any files to disk (no GTFS cache needed — TfL is all live API)
196- **No telemetry** — this skill does not phone home or collect usage data
197- **Input handling** — stop names and route IDs from user input are URL-encoded in API queries, never interpolated into shell commands
198
199## Trust Statement
200
201This skill reads publicly available transit data from TfL's official Unified API. The optional API key is used only for TfL API rate-limit authentication. The skill does not access, store, or transmit any personal information beyond the API key configured by the user.