MTA API: Get service status
Gets 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.
Unofficial. Not affiliated with or endorsed by MTA.
Inputs
Values from the run on Oct 31, 2026, shown under Output.
- Line optional
line Line or route name, such as A, M15, or Hudson Line.
Not set
- Mode optional
mode Transit mode, such as subway or lirr.
subway (default)
One of
subway,bus,lirr,metro_north,all.
Input as JSON
{}Output
{ "lines": [ { "mode": "subway", "alerts": [ { "alert_id": "lmm:alert:269468:26", "headline": "[A] [S] trains are delayed in both directions while the South Channel Bridge opens for marine traffic to pass.", "active_to": null, "active_from": "2026-09-29T00:56:04-04:00", "description": null, "affected_stations": [] }, { "alert_id": "lmm:planned_work:34339", "headline": "[A] is rerouted in Manhattan and Downtown Brooklyn", "active_to": "2026-09-29T05:00:00-04:00", "active_from": "2026-09-28T21:30:00-04:00", "description": "No [A] service in both directions at 50 St, 42 St-Port Authority, 34 St-Penn Station, 23 St, 14 St, Spring St, Canal St, Chambers St, World Trade Center, Fulton St and High St [A] runs local between 168 St and 59 St-Columbus Circle and between Jay St-MetroTech and Euclid Av. [A] is rerouted in both …", "affected_stations": [ "59 St-Columbus Circle", "50 St", "42 St-Port Authority Bus Terminal" ] } ], "status": "Delays", "line_name": "A", "page_link": "https://www.mta.info/schedules/subway/a-train" }, { "mode": "subway", "alerts": [], "status": "Good service", "line_name": "C", "page_link": "https://www.mta.info/schedules/subway/c-train" }, { "mode": "subway", "alerts": [ { "alert_id": "lmm:alert:269467:26", "headline": "[E][F] trains are running with delays in both directions while we perform track maintenance in Queens.", "active_to": null, "active_from": "2026-09-29T00:34:43-04:00", "description": null, "affected_stations": [] }, { "alert_id": "lmm:planned_work:34338", "headline": "[E] is rerouted in Manhattan", "active_to": "2026-09-29T05:00:00-04:00", "active_from": "2026-09-28T21:30:00-04:00", "description": "No [E] service in both directions at 7 Av, 50 St, 42 St-Port Authority, 34 St-Penn Station, 23 St, 14 St, Spring St, Canal St and World Trade Center. [E] runs via the [F] in both directions between 47-50 Sts and 2 Av, the last stop. See a map of this service change. Travel Alternatives: For 7 Av, ta…", "affected_stations": [ "7 Av", "50 St", "42 St-Port Authority Bus Terminal" ] }, { "alert_id": "lmm:planned_work:33366", "headline": "Enter 5 Av/53 St [E][F] Station at 5 Av only Madison Av entrance will be exit only" , "active_to": "2027-03-28T01:00:20-04:00", "active_from": "2026-04-16T06:00:00-04:00", "description": "What's happening? We're replacing escalators", "affected_stations": [ "5 Av/53 St" ] } ], "status": "Delays", "line_name": "E", "page_link": "https://www.mta.info/schedules/subway/e-train" } ], "status_page_link": "https://www.mta.info/" }Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"mta.info/get_service_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": "mta.info/get_service_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": "mta.info/get_service_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 mta.info/get_service_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": { "line": { "type": "string", "description": "Line or route name, such as A, M15, or Hudson Line." }, "mode": { "enum": [ "subway", "bus", "lirr", "metro_north", "all" ], "type": "string", "default": "subway", "description": "Transit mode, such as subway or lirr." } }}Output schema
{ "type": "object", "required": [ "status_page_link", "lines" ], "properties": { "lines": { "type": "array", "items": { "type": "object", "required": [ "line_name", "mode", "status", "page_link", "alerts" ], "properties": { "mode": { "type": "string" }, "alerts": { "type": "array", "items": { "type": "object", "required": [ "headline", "description", "affected_stations", "active_from", "active_to", "alert_id" ], "properties": { "alert_id": { "type": [ "string", "null" ] }, "headline": { "type": "string" }, "active_to": { "type": [ "string", "null" ] }, "active_from": { "type": [ "string", "null" ] }, "description": { "type": [ "string", "null" ] }, "affected_stations": { "type": "array", "items": { "type": "string" } } } } }, "status": { "type": "string" }, "line_name": { "type": "string" }, "page_link": { "type": "string" } } } }, "status_page_link": { "type": "string" } }}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
mta.info/get_service_status- Returns
- line name, mode, status, page link, active alerts with stations and times
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 mta.info/get_service_status with the inputs above.
Ask your agent
- Is the L train running normally right now or are there delays?
- Check mta.info for any current alerts on the Hudson Line of Metro-North.
- What's the status of the M15 bus — any detours or service changes today?
- Are there any disruptions on the Long Island Rail Road Babylon Branch this evening?
- Pull up current service status for all NYC subway lines from mta.info and list the ones that aren't running good service.
See more
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.
tfl.gov.uk/get_line_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 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_statusLooks up today's crowd-sourced security wait estimate and hourly pattern for a US airport by name, city or code, with PreCheck status and checkpoints.
tsawaittimes.com/get_security_wait_timeGets the current status and prosecution history of one U.S. trademark by name, serial number or registration number. For a name, it picks the newest live matching mark (or the one matching the owner) and lists the other matches.
uspto.gov/get_trademark_statusLists current alerts for a named National Park Service park from its Current Conditions page, in the order shown on the page.
nps.gov/list_park_alertsLists current New York Times headlines with summaries, authors, images and publication times, in the order shown on the chosen section page (top stories or a section). Video-only items, ads and promotions are left out; times come from the section's feed and may be missing.
nytimes.com/list_headlinesChecks a flight's public status and times on Flightradar24 by flight number and the departure date at the origin airport.
flightradar24.com/check_flight_status