Transport for London API: Get line status
Gets the current or future-day service status for London Tube, Elizabeth line, DLR, Overground, tram or a named bus route. Multiple notices on one line are combined into the most disruptive status.
Unofficial. Not affiliated with or endorsed by Transport for London.
Inputs
Values from the run on Oct 23, 2026, shown under Output.
- Date optional
date Future service date in YYYY-MM-DD, such as 2026-10-03. Omit for the current live status. Must be today or later.
Not set
Exactly 10 characters.
- Line optional
line Line name or bus route number, such as Northern, Elizabeth line, Mildmay, Overground or 73. Omit for all rail and tram lines.
(default)
Input as JSON
{}Output
{ "lines": [ { "type": "Tube", "reason": null, "status": "Good service", "line_id": "bakerloo", "valid_to": null, "line_name": "Bakerloo", "page_link": "https://tfl.gov.uk/tube-bus-river/status/" , "valid_from": null, "severity_number": 10 }, { "type": "Tube", "reason": "Central Line: Minor delays due to an earlier faulty train at Perivale and following a late finish of engineering work.", "status": "Minor delays", "line_id": "central", "valid_to": "2026-10-24T01:29:00+01:00", "line_name": "Central", "page_link": "https://tfl.gov.uk/tube-bus-river/status/" , "valid_from": "2026-10-23T07:42:07+01:00", "severity_number": 9 }, { "type": "Tube", "reason": "Circle Line: Minor delays due to an earlier faulty train at Euston Square.", "status": "Minor delays", "line_id": "circle", "valid_to": "2026-10-24T01:29:00+01:00", "line_name": "Circle", "page_link": "https://tfl.gov.uk/tube-bus-river/status/" , "valid_from": "2026-10-23T09:08:25+01:00", "severity_number": 9 } ]}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"tfl.gov.uk/get_line_status","input":{}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "tfl.gov.uk/get_line_status" , "input": {}})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "tfl.gov.uk/get_line_status" , "input": {} }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run tfl.gov.uk/get_line_status# with {}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "type": "object", "properties": { "date": { "type": "string", "maxLength": 10, "minLength": 10, "description": "Future service date in YYYY-MM-DD, such as 2026-10-03. Omit for the current live status. Must be today or later." }, "line": { "type": "string", "default": "", "description": "Line name or bus route number, such as Northern, Elizabeth line, Mildmay, Overground or 73. Omit for all rail and tram lines." } }}Output schema
{ "type": "object", "required": [ "lines" ], "properties": { "lines": { "type": "array", "items": { "type": "object", "required": [ "line_name", "type", "status", "reason", "valid_from", "valid_to", "page_link", "line_id", "severity_number" ], "properties": { "type": { "type": "string", "description": "Transport type." }, "reason": { "type": [ "string", "null" ], "description": "Explanation when service is not good, or null." }, "status": { "type": "string", "description": "Service status in words." }, "line_id": { "type": "string", "description": "TfL line identifier.", "x-fous-developer": true }, "valid_to": { "type": [ "string", "null" ], "format": "date-time", "description": "End of the reported status in London local time, or null." }, "line_name": { "type": "string", "description": "Line or bus route name." }, "page_link": { "type": "string", "description": "TfL service status page for this line." }, "valid_from": { "type": [ "string", "null" ], "format": "date-time", "description": "Beginning of the reported status in London local time, or null." }, "severity_number": { "type": "integer", "description": "TfL status severity number.", "x-fous-developer": true } }, "additionalProperties": false }, "description": "Service status in TfL line order." } }, "additionalProperties": false}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
tfl.gov.uk/get_line_status- Returns
- line name, type, status, reason, valid from/to, line id, severity number
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method tfl.gov.uk/get_line_status with the inputs above.
Ask your agent
- Is the Northern line running normally right now?
- What's the service status for the Elizabeth line on 2026-10-03?
- Any delays on bus route 73 today?
- Check whether the DLR has part-suspended service this evening.
- Are there planned closures on the Overground for 2026-11-14 on tfl.gov.uk?
See more
All Transport for London methodsPlans a London public transport journey between two places, stations, addresses or postcodes with the TfL Journey Planner, leaving or arriving at a given time. Returns journey options in TfL order with leg directions and an adult pay-as-you-go fare when available.
tfl.gov.uk/plan_journeyGets current MTA line statuses and active alerts for subway, bus, Long Island Rail Road, or Metro-North lines, optionally for one line. Bus and rail status reflects published alerts; no alert means Good service.
mta.info/get_service_statusChecks a flight's public status and times on Flightradar24 by flight number and the departure date at the origin airport.
flightradar24.com/check_flight_statusChecks the public FlightAware status of an airline flight (airline name or code plus number) on a departure date, by default today at the departure airport: airports, scheduled, estimated and actual gate times in local time, delays, gates, terminals, aircraft and distance. A date older than FlightAware's public two-week list is looked up on the flight's history page when FlightAware still shows it.
flightaware.com/check_flight_statusGets the official overall status, components, active incidents and scheduled maintenance for a service from its Atlassian Statuspage summary feed.
atlassian.com/get_service_statusChecks whether an app or website has current problems in a country on Downdetector: its status, reports in the latest 15-minute interval, the usual report count, the most reported problem types and the most affected locations when shown. The service must have a public Downdetector page in that country.
downdetector.com/check_service_statusFinds dated FlixBus trip options between two cities, with stops, local times, availability and displayed per-person prices, including partner operators on some routes.
flixbus.com/search_bus_tripsGets the TV broadcasts scheduled in a country for a date from TVmaze. It can also add local and worldwide streaming releases. Airtimes are shown in the service's timezone, or in UTC when the service has none.
tvmaze.com/get_tv_schedule