# Transport for London

> Read London's transport network through TfL's Unified API, the same interface behind TfL's own apps: live line status with the reason for every delay, the arrivals board at any stop, station closures and lift outages, published timetables, the stops and running order of every line, the journey planner with fares and step-free options, road delays, Santander Cycles availability and the London air quality forecast. Lines, stations, modes and roads are dropdowns loaded from TfL, so a step picks a station by name rather than by code. Needs a free TfL API key. Disclaimer: this is an independent integration built on TfL's open data. It is not affiliated with, endorsed by, or sponsored by Transport for London; TfL and its marks are the property of Transport for London.

App · Travel & Places · 15 actions. Web page: https://docs.lodol.com/docs/integrations/tfl

## Actions

### Check line status

Check whether named lines are running, and why they are not. Each line comes back with TfL's own wording (Good Service, Minor Delays, Part Suspended), the severity behind it, and the sentence explaining a delay. Branch on has_disruption rather than on the wording, and on all_good to alert only when something is actually wrong.

**Inputs**

- Lines (`lines`, text, required): Which lines to report on. The list holds every named rail line: the Tube, the DLR, the Elizabeth line, each London Overground line, the tram and the cable car. A bus route has a status too, so a route number such as 24 can be typed in instead of picked.

**Outputs**

- `all_good` (true/false)
- `count` (number)
- `disrupted_count` (number)
- `disrupted_lines` (list)
- `lines` (list)
- `requested_lines` (list)

**Example output**

```json
{
  "all_good": false,
  "count": 2,
  "disrupted_count": 1,
  "disrupted_lines": [
    "victoria"
  ],
  "lines": [
    {
      "disruptions": [],
      "has_disruption": false,
      "id": "central",
      "mode": "tube",
      "name": "Central",
      "reason": null,
      "severity": 10,
      "status": "Good Service",
      "statuses": [
        {
          "reason": null,
          "severity": 10,
          "status": "Good Service",
          "valid_from": null,
          "valid_to": null
        }
      ],
      "valid_from": null,
      "valid_to": null
    },
    {
      "disruptions": [
        {
          "additional_info": null,
          "affected_stop_count": 0,
          "category": "RealTime",
          "closure_type": "minorDelays",
          "description": "Victoria Line: Minor delays due to an earlier signal failure at Highbury & Islington.",
          "from": null,
          "to": null,
          "type": "lineInfo"
        }
      ],
      "has_disruption": true,
      "id": "victoria",
      "mode": "tube",
      "name": "Victoria",
      "reason": "Victoria Line: Minor delays due to an earlier signal failure at Highbury & Islington.",
      "severity": 9,
      "status": "Minor Delays",
      "statuses": [
        {
          "reason": "Victoria Line: Minor delays due to an earlier signal failure at Highbury & Islington.",
          "severity": 9,
          "status": "Minor Delays",
          "valid_from": "2026-09-02T21:39:05Z",
          "valid_to": "2026-09-03T00:29:00Z"
        }
      ],
      "valid_from": "2026-09-02T21:39:05Z",
      "valid_to": "2026-09-03T00:29:00Z"
    }
  ],
  "requested_lines": [
    "victoria",
    "central"
  ]
}
```

### Check road delays

Check the main roads TfL manages for exceptional delays: the A roads, the North and South Circulars, the river crossings. Leave the road list empty to sweep all of them in one request, and read roads_with_delays for the ones to avoid.

**Inputs**

- Roads (`roads`, text): Which roads to check. Leave this empty to check every road TfL reports on.

**Outputs**

- `all_clear` (true/false)
- `count` (number)
- `requested_roads` (list)
- `roads` (list)
- `roads_with_delays` (list)

**Example output**

```json
{
  "all_clear": false,
  "count": 2,
  "requested_roads": [
    "a2",
    "a406"
  ],
  "roads": [
    {
      "has_delays": false,
      "id": "a2",
      "measured_from": "2026-09-02T22:12:11Z",
      "measured_to": "2026-09-02T23:59:59Z",
      "name": "A2",
      "status": "Good",
      "status_description": "No Exceptional Delays"
    },
    {
      "has_delays": true,
      "id": "a406",
      "measured_from": "2026-09-02T22:12:11Z",
      "measured_to": "2026-09-02T23:59:59Z",
      "name": "North Circular (A406)",
      "status": "Serious",
      "status_description": "Serious Delays"
    }
  ],
  "roads_with_delays": [
    "North Circular (A406)"
  ]
}
```

### Check status across a whole mode

Check every line of a whole way of travelling at once: the entire Tube, the Overground, the DLR, the trams, the buses. One call answers 'is anything wrong on the network this morning?', and names the lines to worry about in disrupted_lines. This is also how to list the lines a mode runs, since each one comes back named.

**Inputs**

- Modes (`modes`, text, required): Which ways of travelling. Pick more than one to cover them in a single call.

**Outputs**

- `all_good` (true/false)
- `count` (number)
- `disrupted_count` (number)
- `disrupted_lines` (list)
- `lines` (list)
- `requested_modes` (list)

**Example output**

```json
{
  "all_good": false,
  "count": 2,
  "disrupted_count": 1,
  "disrupted_lines": [
    "victoria"
  ],
  "lines": [
    {
      "disruptions": [],
      "has_disruption": false,
      "id": "central",
      "mode": "tube",
      "name": "Central",
      "reason": null,
      "severity": 10,
      "status": "Good Service",
      "statuses": [
        {
          "reason": null,
          "severity": 10,
          "status": "Good Service",
          "valid_from": null,
          "valid_to": null
        }
      ],
      "valid_from": null,
      "valid_to": null
    },
    {
      "disruptions": [
        {
          "additional_info": null,
          "affected_stop_count": 0,
          "category": "RealTime",
          "closure_type": "minorDelays",
          "description": "Victoria Line: Minor delays due to an earlier signal failure at Highbury & Islington.",
          "from": null,
          "to": null,
          "type": "lineInfo"
        }
      ],
      "has_disruption": true,
      "id": "victoria",
      "mode": "tube",
      "name": "Victoria",
      "reason": "Victoria Line: Minor delays due to an earlier signal failure at Highbury & Islington.",
      "severity": 9,
      "status": "Minor Delays",
      "statuses": [
        {
          "reason": "Victoria Line: Minor delays due to an earlier signal failure at Highbury & Islington.",
          "severity": 9,
          "status": "Minor Delays",
          "valid_from": "2026-09-02T21:39:05Z",
          "valid_to": "2026-09-03T00:29:00Z"
        }
      ],
      "valid_from": "2026-09-02T21:39:05Z",
      "valid_to": "2026-09-03T00:29:00Z"
    }
  ],
  "requested_modes": [
    "tube"
  ]
}
```

### Find Santander Cycles nearby

Find the cycle hire docking stations near a point and how many bikes and empty spaces each one has right now, split between standard bikes and e-bikes. Read has_bikes to answer 'can I get a bike here?' and has_space for 'can I leave one?'.

**Inputs**

- Latitude (`latitude`, number, required): The latitude to search around. Chain this from a stop found in an earlier step, or read it off a map. From 51.2 to 51.8.
- Longitude (`longitude`, number, required): The longitude to search around. Negative west of Greenwich, positive east of it. From -0.6 to 0.4.
- Search radius (metres) (`radius_metres`, number): How far around that point to look, in metres. 500 is a few minutes' walk. TfL cannot serve a wider search than 2,000 metres. From 50 to 2000. Default: `500`.

**Outputs**

- `bike_points` (list)
- `bikes_available` (number)
- `count` (number)
- `empty_docks` (number)
- `latitude` (number)
- `longitude` (number)
- `radius_metres` (number)

**Example output**

```json
{
  "bike_points": [
    {
      "bikes_available": 6,
      "distance_metres": 63,
      "e_bikes": 2,
      "empty_docks": 15,
      "has_bikes": true,
      "has_space": true,
      "id": "BikePoints_116",
      "installed_on": "2010-07-14",
      "is_locked": false,
      "is_temporary": false,
      "lat": 51.514499,
      "lon": -0.141423,
      "name": "Little Argyll Street, West End",
      "standard_bikes": 4,
      "total_docks": 21
    }
  ],
  "bikes_available": 6,
  "count": 1,
  "empty_docks": 15,
  "latitude": 51.515224,
  "longitude": -0.141903,
  "radius_metres": 400
}
```

### Find stops near a place

Find the stops within walking distance of a point, nearest first, each with how many metres away it is. Chain the coordinates from a stop, a customer address or anything else a workflow already knows the position of.

**Inputs**

- Latitude (`latitude`, number, required): The latitude to search around. Chain this from a stop found in an earlier step, or read it off a map. From 51.2 to 51.8.
- Longitude (`longitude`, number, required): The longitude to search around. Negative west of Greenwich, positive east of it. From -0.6 to 0.4.
- Kind of stop (`stop_kind`, text): Which kinds of stop to look for. One of: `stations` (Stations (Tube, DLR, Overground, Elizabeth line, tram, rail)), `bus_stops` (Bus and coach stops), `all` (Everything). Default: `stations`.
- Search radius (metres) (`radius_metres`, number): How far around that point to look, in metres. 500 is a few minutes' walk. TfL cannot serve a wider search than 2,000 metres. From 50 to 2000. Default: `500`.

**Outputs**

- `count` (number)
- `latitude` (number)
- `longitude` (number)
- `radius_metres` (number)
- `stop_kind` (text)
- `stops` (list)

**Example output**

```json
{
  "count": 1,
  "latitude": 51.515224,
  "longitude": -0.141903,
  "radius_metres": 500,
  "stop_kind": "stations",
  "stops": [
    {
      "distance_metres": 67,
      "id": "940GZZLUOXC",
      "in_service": true,
      "lat": 51.515224,
      "line_ids": [
        "bakerloo",
        "central",
        "victoria"
      ],
      "lines": [
        "Bakerloo",
        "Central",
        "Victoria"
      ],
      "lon": -0.141903,
      "modes": [
        "tube"
      ],
      "name": "Oxford Circus Underground Station",
      "stop_type": "NaptanMetroStation",
      "zone": "1"
    }
  ]
}
```

### Get a line's stops in order

The stops of a line in the order it calls at them, one way round, with each branch listed separately. Where 'List the stops on a line' answers which stops, this answers in what order, which is what tells you whether a station comes before or after another one.

**Inputs**

- Line (`line`, text, required): Which line. The list holds every named rail line; a bus route number such as 24 can be typed in instead.
- Direction (`direction`, text, required): Which way round the line runs. TfL keeps a separate timetable and stop order for each direction, so there is no combined answer. One of: `inbound` (Inbound (towards central London)), `outbound` (Outbound (away from central London)).

**Outputs**

- `branches` (list)
- `direction` (text)
- `is_outbound_only` (true/false)
- `line` (text)
- `line_id` (text)
- `mode` (text)
- `routes` (list)
- `station_count` (number)
- `stations` (list)

**Example output**

```json
{
  "branches": [
    {
      "branch_id": 1,
      "service_type": "Regular",
      "stop_count": 2,
      "stops": [
        {
          "distance_metres": null,
          "id": "940GZZLUVIC",
          "in_service": true,
          "lat": 51.496359,
          "line_ids": [
            "circle",
            "district",
            "victoria"
          ],
          "lines": [
            "Circle",
            "District",
            "Victoria"
          ],
          "lon": -0.143865,
          "modes": [
            "tube"
          ],
          "name": "Victoria Underground Station",
          "stop_type": "NaptanMetroStation",
          "zone": "1"
        },
        {
          "distance_metres": null,
          "id": "940GZZLUOXC",
          "in_service": true,
          "lat": 51.515224,
          "line_ids": [
            "bakerloo",
            "central",
            "victoria"
          ],
          "lines": [
            "Bakerloo",
            "Central",
            "Victoria"
          ],
          "lon": -0.141903,
          "modes": [
            "tube"
          ],
          "name": "Oxford Circus Underground Station",
          "stop_type": "NaptanMetroStation",
          "zone": "1"
        }
      ]
    }
  ],
  "direction": "outbound",
  "is_outbound_only": false,
  "line": "Victoria",
  "line_id": "victoria",
  "mode": "tube",
  "routes": [
    {
      "name": "Brixton \u2194 Walthamstow Central",
      "stop_ids": [
        "940GZZLUVIC",
        "940GZZLUOXC"
      ]
    }
  ],
  "station_count": 2,
  "stations": [
    {
      "distance_metres": null,
      "id": "940GZZLUOXC",
      "in_service": true,
      "lat": 51.515224,
      "line_ids": [
        "bakerloo",
        "central",
        "victoria"
      ],
      "lines": [
        "Bakerloo",
        "Central",
        "Victoria"
      ],
      "lon": -0.141903,
      "modes": [
        "tube"
      ],
      "name": "Oxford Circus Underground Station",
      "stop_type": "NaptanMetroStation",
      "zone": "1"
    },
    {
      "distance_metres": null,
      "id": "940GZZLUVIC",
      "in_service": true,
      "lat": 51.496359,
      "line_ids": [
        "circle",
        "district",
        "victoria"
      ],
      "lines": [
        "Circle",
        "District",
        "Victoria"
      ],
      "lon": -0.143865,
      "modes": [
        "tube"
      ],
      "name": "Victoria Underground Station",
      "stop_type": "NaptanMetroStation",
      "zone": "1"
    }
  ]
}
```

### Get disruptions on a line

Read the disruptions TfL has posted against named lines, in full. Where 'Check line status' gives one headline per line, this gives every notice behind it, including planned engineering work with the dates it runs between. An empty list means normal service.

**Inputs**

- Lines (`lines`, text, required): Which lines to report on. The list holds every named rail line: the Tube, the DLR, the Elizabeth line, each London Overground line, the tram and the cable car. A bus route has a status too, so a route number such as 24 can be typed in instead of picked.

**Outputs**

- `count` (number)
- `disruptions` (list)
- `has_disruptions` (true/false)
- `requested_lines` (list)

**Example output**

```json
{
  "count": 1,
  "disruptions": [
    {
      "additional_info": null,
      "affected_stop_count": 0,
      "category": "RealTime",
      "closure_type": "minorDelays",
      "description": "Victoria Line: Minor delays due to an earlier signal failure at Highbury & Islington.",
      "from": null,
      "to": null,
      "type": "lineInfo"
    }
  ],
  "has_disruptions": true,
  "requested_lines": [
    "victoria"
  ]
}
```

### Get live arrivals at a stop

Read the live board at a stop: every train, tram or bus due, how many minutes away it is, where it is heading and which platform it comes into. Sorted soonest first, so the first row is the next one out and next_arrival_minutes answers 'how long have I got?'. Filter by line at a busy interchange to see only the one you take.

**Inputs**

- Stop (`stop`, text, required): Which stop. The list holds every station on TfL's rail network. Any other stop (a bus stop, a pier, a platform) can be given by its NaPTAN code instead, which is what 'Search for a stop' returns.
- Only this line (`line`, text): Show only this line's arrivals. Leave empty for every line calling at the stop.

**Outputs**

- `arrivals` (list)
- `count` (number)
- `line_filter` (text)
- `next_arrival_minutes` (number)
- `station` (text)
- `stop_id` (text)

**Example output**

```json
{
  "arrivals": [
    {
      "current_location": "At Oxford Circus",
      "destination": "Brixton Underground Station",
      "direction": "inbound",
      "expected_arrival": "2026-09-02T22:12:13Z",
      "line": "Victoria",
      "line_id": "victoria",
      "minutes_away": 0,
      "mode": "tube",
      "platform": "Southbound - Platform 5",
      "seconds_away": 38,
      "towards": "Brixton",
      "vehicle_id": "011"
    },
    {
      "current_location": "Between Green Park and Oxford Circus",
      "destination": "Walthamstow Central Underground Station",
      "direction": "outbound",
      "expected_arrival": "2026-09-02T22:19:43Z",
      "line": "Victoria",
      "line_id": "victoria",
      "minutes_away": 8,
      "mode": "tube",
      "platform": "Northbound - Platform 6",
      "seconds_away": 488,
      "towards": "Walthamstow Central",
      "vehicle_id": "204"
    }
  ],
  "count": 2,
  "line_filter": "victoria",
  "next_arrival_minutes": 0,
  "station": "Oxford Circus Underground Station",
  "stop_id": "940GZZLUOXC"
}
```

### Get London air quality

Today's and tomorrow's air pollution forecast for London, as a band from Low to Very High, with the reading broken down by pollutant. The one thing here that is about the air rather than the trains, and the one worth checking before telling somebody to cycle.

**Inputs**: None.

**Outputs**

- `band` (text)
- `count` (number)
- `disclaimer` (text)
- `forecasts` (list)
- `published_at` (text)
- `source_url` (text)
- `summary` (text)

**Example output**

```json
{
  "band": "Low",
  "count": 1,
  "disclaimer": "This forecast is intended to provide information on expected pollution levels in areas of significant public exposure.",
  "forecasts": [
    {
      "band": "Low",
      "from": "2026-09-02T00:00:00Z",
      "nitrogen_dioxide_band": "Low",
      "ozone_band": "Low",
      "pm10_band": "Low",
      "pm25_band": "Low",
      "published_at": "2026-09-02T08:19:39Z",
      "sulphur_dioxide_band": "Low",
      "summary": "Low air pollution forecast valid from Wednesday 2 September to end of Wednesday 2 September GMT",
      "text": "Low air pollution is forecast across London today. Fresher westerly winds will keep pollution levels down.",
      "to": "2026-09-02T23:59:00Z",
      "type": "Current"
    }
  ],
  "published_at": "2026-09-02T08:19:39Z",
  "source_url": "http://londonair.org.uk/forecast",
  "summary": "Low air pollution forecast valid from Wednesday 2 September to end of Wednesday 2 September GMT"
}
```

### Get station closures and lift outages

Find out what is wrong with the stations themselves rather than the trains: closed stations, entrances shut, lifts and escalators out of service, step-free access interrupted. This is what decides whether a journey is possible today for anyone who cannot use stairs.

**Inputs**

- Modes (`modes`, text, required): Which ways of travelling. Pick more than one to cover them in a single call.

**Outputs**

- `affected_stations` (list)
- `count` (number)
- `disruptions` (list)
- `has_disruptions` (true/false)
- `requested_modes` (list)

**Example output**

```json
{
  "affected_stations": [
    "Barons Court Underground Station"
  ],
  "count": 1,
  "disruptions": [
    {
      "affected_lines": [
        "District",
        "Piccadilly"
      ],
      "appearance": "PlannedWork",
      "closure_type": "partClosure",
      "description": "BARONS COURT STATION: From Monday 6 July until November, westbound trains will not call at Barons Court. Please use eastbound District or Piccadilly line trains and change at West Kensington or Earls Court.",
      "from": "2026-07-06T03:30:00Z",
      "mode": "tube",
      "station": "Barons Court Underground Station",
      "station_id": "940GZZLUBSC",
      "stop_id": "940GZZLUBSC",
      "to": "2026-11-30T01:29:00Z",
      "type": "Part Closure"
    }
  ],
  "has_disruptions": true,
  "requested_modes": [
    "tube"
  ]
}
```

### Get stop details

Everything TfL holds about one stop: which lines call there, the fare zone, the address and phone number, how many lifts, escalators and gates it has, whether there is Wi-Fi or a toilet, and the full accessibility notes including whether step-free access is by lift.

**Inputs**

- Stop (`stop`, text, required): Which stop. The list holds every station on TfL's rail network. Any other stop (a bus stop, a pier, a platform) can be given by its NaPTAN code instead, which is what 'Search for a stop' returns.

**Outputs**

- `stop` (object)

**Example output**

```json
{
  "stop": {
    "accessibility": {
      "AccessViaLift": "No",
      "BlueBadgeCarParkSpaces": "0",
      "LimitedCapacityLift": "No",
      "TaxiRankOutsideStation": "No",
      "Toilet": "No"
    },
    "address": "Oxford Circus Station, Oxford St, London, W1B 3AG",
    "distance_metres": null,
    "facilities": {
      "Escalators": "14",
      "Gates": "30",
      "Lifts": "0",
      "Ticket Halls": "2",
      "Toilets": "no",
      "WiFi": "yes"
    },
    "has_toilets": false,
    "has_wifi": true,
    "hub_id": "940GZZLUOXC",
    "id": "940GZZLUOXC",
    "in_service": true,
    "lat": 51.515224,
    "line_ids": [
      "bakerloo",
      "central",
      "victoria"
    ],
    "lines": [
      "Bakerloo",
      "Central",
      "Victoria"
    ],
    "lon": -0.141903,
    "modes": [
      "tube"
    ],
    "name": "Oxford Circus Underground Station",
    "phone": "0845 330 9880",
    "platform_count": 16,
    "stop_type": "NaptanMetroStation",
    "zone": "1"
  }
}
```

### Get the published timetable

Read the published departure times from one stop on one line, grouped the way TfL publishes them: weekdays, Friday, Saturday and Sunday each get their own list, with the first and last departure of each. This is the scheduled service, not live running, so it answers 'when does the last train go?' rather than 'where is my train now?'.

**Inputs**

- Line (`line`, text, required): Which line. The list holds every named rail line; a bus route number such as 24 can be typed in instead.
- Departing from (`stop`, text, required): Which stop to read departures from. The list holds the stops on the line chosen above.
- Direction (`direction`, text, required): Which way round the line runs. TfL keeps a separate timetable and stop order for each direction, so there is no combined answer. One of: `inbound` (Inbound (towards central London)), `outbound` (Outbound (away from central London)).

**Outputs**

- `calls_at` (list)
- `direction` (text)
- `from_stop_id` (text)
- `line` (text)
- `line_id` (text)
- `schedule_count` (number)
- `schedules` (list)

**Example output**

```json
{
  "calls_at": [
    "Green Park Underground Station",
    "Oxford Circus Underground Station"
  ],
  "direction": "outbound",
  "from_stop_id": "940GZZLUVIC",
  "line": "Victoria",
  "line_id": "victoria",
  "schedule_count": 1,
  "schedules": [
    {
      "departure_count": 3,
      "departures": [
        {
          "next_day": false,
          "raw_hour": 5,
          "time": "05:34"
        },
        {
          "next_day": false,
          "raw_hour": 5,
          "time": "05:41"
        },
        {
          "next_day": true,
          "raw_hour": 24,
          "time": "00:35"
        }
      ],
      "first_departure": "05:34",
      "last_departure": "00:35",
      "last_departure_next_day": true,
      "name": "Monday - Thursday"
    }
  ]
}
```

### List the stops on a line

Every stop a line calls at, with its fare zone, position and the other lines that meet it. This is where a workflow finds the interchanges between two lines, or checks whether a line reaches a station at all.

**Inputs**

- Line (`line`, text, required): Which line. The list holds every named rail line; a bus route number such as 24 can be typed in instead.

**Outputs**

- `count` (number)
- `line_id` (text)
- `stops` (list)

**Example output**

```json
{
  "count": 2,
  "line_id": "victoria",
  "stops": [
    {
      "distance_metres": null,
      "id": "940GZZLUOXC",
      "in_service": true,
      "lat": 51.515224,
      "line_ids": [
        "bakerloo",
        "central",
        "victoria"
      ],
      "lines": [
        "Bakerloo",
        "Central",
        "Victoria"
      ],
      "lon": -0.141903,
      "modes": [
        "tube"
      ],
      "name": "Oxford Circus Underground Station",
      "stop_type": "NaptanMetroStation",
      "zone": "1"
    },
    {
      "distance_metres": null,
      "id": "940GZZLUVIC",
      "in_service": true,
      "lat": 51.496359,
      "line_ids": [
        "circle",
        "district",
        "victoria"
      ],
      "lines": [
        "Circle",
        "District",
        "Victoria"
      ],
      "lon": -0.143865,
      "modes": [
        "tube"
      ],
      "name": "Victoria Underground Station",
      "stop_type": "NaptanMetroStation",
      "zone": "1"
    }
  ]
}
```

### Plan a journey

Plan a journey across London the way TfL's own planner does: several options, each with its legs, how long it takes, how many changes it needs and what it costs. Leave the time empty to plan from now, or give one and say whether it is when to leave or when to arrive. Ask for step-free routes, the fewest changes, or particular modes only.

**Inputs**

- From (`origin`, text, required): Where the journey starts. Pick a station, or type a full postcode such as SW1A 1AA. A partly written place name is refused with the places it could have meant, so a postcode or a station is the reliable way in.
- To (`destination`, text, required): Where the journey ends. Pick a station, or type a full postcode.
- When (`when`, date and time): The time to plan around. Leave empty to plan from now. Given in your own time zone and converted to London's clock for you, summer time included.
- That time is (`time_is`, text): Whether the time above is when to set off or when to be there. Ignored when no time is given. One of: `Departing` (Leave at that time), `Arriving` (Arrive by that time). Default: `Departing`.
- Via (`via`, text): A place the journey must pass through. Same form as the two above.
- Only these modes (`modes`, text): Restrict the journey to these ways of travelling. Leave empty to let TfL use whatever is fastest.
- What matters most (`priority`, text): What to optimise the journey for. One of: `LeastTime` (Get there fastest), `LeastInterchange` (Fewest changes), `LeastWalking` (Least walking).
- Accessibility (`accessibility`, text): What the journey has to avoid. Step-free options route around stations with stairs only. One of: `NoRequirements` (No requirements), `StepFreeToVehicle` (Step-free all the way onto the train), `StepFreeToPlatform` (Step-free to the platform), `NoSolidStairs` (Avoid stairs), `NoEscalators` (Avoid escalators), `NoElevators` (Avoid lifts).
- Walking speed (`walking_speed`, text): How fast to assume the walking parts are done, which changes which connections are reachable. One of: `Slow`, `Average`, `Fast`.

**Outputs**

- `count` (number)
- `destination` (text)
- `fastest_duration_minutes` (number)
- `journeys` (list)
- `lines_used` (list)
- `origin` (text)

**Example output**

```json
{
  "count": 1,
  "destination": "940GZZLUVIC",
  "fastest_duration_minutes": 4,
  "journeys": [
    {
      "arrives_at": "2026-09-04T07:57:00Z",
      "changes": 0,
      "departs_at": "2026-09-04T07:53:00Z",
      "duration_minutes": 4,
      "fare_pence": 310,
      "fare_pounds": 3.1,
      "is_disrupted": false,
      "legs": [
        {
          "arrives_at": "2026-09-04T07:57:00Z",
          "departs_at": "2026-09-04T07:53:00Z",
          "detail": "Victoria line towards Brixton",
          "distance_metres": 15,
          "duration_minutes": 4,
          "from": "Oxford Circus Underground Station",
          "from_id": "940GZZLUOXC",
          "is_disrupted": false,
          "line": "Victoria",
          "mode": "tube",
          "summary": "Victoria line to Victoria",
          "to": "Victoria Underground Station",
          "to_id": "940GZZLUVIC",
          "towards": [
            "Brixton Underground Station"
          ]
        }
      ],
      "summary": "Victoria line to Victoria"
    }
  ],
  "lines_used": [
    "Victoria"
  ],
  "origin": "940GZZLUOXC"
}
```

### Search for a stop

Find a stop by name and get the code every other action takes. This is how a workflow turns 'Oxford Circus' typed by a person, or read out of an email, into something TfL can answer about. Where a name covers a whole interchange, the stations inside it are listed instead, so every code that comes back works in the arrivals board and the journey planner. Narrow by mode when a name belongs to more than one place, as King's Cross does. TfL returns at most 50 matches.

**Inputs**

- Stop name (`query`, text, required): The name to search for. Part of a name is enough.
- Only these modes (`modes`, text): Narrow the search to stops served by these modes. Leave empty to search everything.

**Outputs**

- `count` (number)
- `query` (text)
- `stops` (list)

**Example output**

```json
{
  "count": 1,
  "query": "Oxford Circus",
  "stops": [
    {
      "distance_metres": null,
      "id": "940GZZLUOXC",
      "in_service": true,
      "lat": 51.515224,
      "line_ids": [
        "bakerloo",
        "central",
        "victoria"
      ],
      "lines": [
        "Bakerloo",
        "Central",
        "Victoria"
      ],
      "lon": -0.141903,
      "modes": [
        "tube"
      ],
      "name": "Oxford Circus Underground Station",
      "stop_type": "NaptanMetroStation",
      "zone": "1"
    }
  ]
}
```
