BYTETOOLS

SEPTA Arrivals API

Free Philadelphia SEPTA API with no key: live Regional Rail departures by station with track, status and delay, plus train positions and alerts. Tested example included.

No API key requiredHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-21

What is the SEPTA Arrivals API?

SEPTA publishes a free, key-free API for Philadelphia public transport. The arrivals endpoint returns live Regional Rail departures for any station, split northbound and southbound, with scheduled and actual times, track assignment, service type and on-time status.

SEPTA's data has been open since its hackathon programme in the early 2010s and has stayed open ever since, which makes it one of the longest-running key-free transit APIs in the United States. Beyond arrivals there are live train positions, elevator outage notices, bus detours and service alerts, all on the same terms.

The response shape is unusual enough to plan for. The top-level object has exactly one key, and that key is a human-readable sentence containing the station name and the current date and time — so it changes on every request and cannot be hard-coded. Take the first value rather than looking up a name. Inside it, `Northbound` and `Southbound` arrays group departures by direction, and station names must match SEPTA's own spelling exactly, hyphens and all: "Airport Terminal E-F", not "Airport Terminal EF".

Quick facts

Base URL
https://www3.septa.org/api
Authentication
No API key or account. SEPTA has published these endpoints openly since its developer programme launched.
Rate limit
No published quota. Arrival predictions refresh about once a minute, so there is nothing to gain from faster polling.
Pricing
Free.
CORS
Not enabled — call it from your server
Official docs
Read the docs

How to use the SEPTA Arrivals API

Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.

1. Fetch live Regional Rail departures for a station

GET https://www3.septa.org/api/Arrivals/index.php?station=Airport%20Terminal%20E%20F&results=2

curl
curl 'https://www3.septa.org/api/Arrivals/index.php?station=Airport%20Terminal%20E%20F&results=2'
JavaScript (fetch)
const res = await fetch("https://www3.septa.org/api/Arrivals/index.php?station=Airport%20Terminal%20E%20F&results=2");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://www3.septa.org/api/Arrivals/index.php?station=Airport%20Terminal%20E%20F&results=2", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
{
  "Airport Terminal E-F Departures: August 21, 2026, 4:01 am": [
    {
      "Northbound": [
        {
          "direction": "N",
          "path": "R4N",
          "train_id": "402",
          "origin": "Airport Terminal E-F",
          "destination": "Temple U",
          "line": "Airport",
          "status": "On Time",
          "service_type": "LOCAL",
          "next_station": null,
          "sched_time": "2026-08-21 05:07:00.000",
          "depart_time": "2026-08-21 05:07:00.000",
          "track": "2",
          "track_change": null,
          "platform": "",
          "platform_change": null
        },
        {
          "direction": "N",
          "path": "R4N",
          "train_id": "404",
          "origin": "Airport Terminal E-F",
          "destination": "Warminster",
          "line": "Airport",
          "status": "On Time",
          "service_type": "LOCAL",
          "next_station": null,
          "sched_time": "2026-08-21 05:37:00.000",
          "depart_time": "2026-08-21 05:37:00.000",
          "track": "2",
          "track_change": null,
          "platform": "",
          "platform_change": null
        }
      ]
    },
    {
      "Southbound": [
        {
          "direction": "S",
          "path": "R4S",
          "train_id": "401",
          "origin": "Fern Rock TC",
          "destination": "Airport",
          "line": "Warminster",
          "status": "On Time",
          "service_type": "LOCAL",
          "next_station": null,
          "sched_time": "2026-08-21 04:52:00.000",
          "depart_time": "2026-08-21 04:52:00.000",

Parameters

ParameterTypeRequiredDescription
stationqueryRequiredStation name, matching SEPTA's own spelling exactly including hyphens. Airport Terminal E F
resultsqueryOptionalHow many departures to return per direction. 2
directionqueryOptionalRestrict to `N` or `S` instead of returning both. N
(train view)pathOptional`/TrainView/index.php` returns live positions for every Regional Rail train.
(alerts)pathOptional`/Alerts/index.php` returns service alerts and advisories for all modes.
(elevator outages)pathOptional`/elevator/index.php` reports lifts currently out of service — an accessibility feed few agencies publish.

Response fields

(top-level key)string
A sentence containing the station name and current timestamp. It changes every request — read the first value, do not look up the key.
Northbound / Southboundarray
Departures grouped by direction.
train_idstring
Train number, unique for the service day.
origin / destinationstring
Where the service started and where it terminates.
linestring
Regional Rail line name, for example "Airport".
statusstring
"On Time" or a delay expressed in minutes as text, such as "12 min late".
service_typestring
`LOCAL` or `EXPRESS`, which determines whether it calls at intermediate stations.
sched_time / depart_timestring
Scheduled and expected departure, in `YYYY-MM-DD HH:MM:SS.mmm` local Philadelphia time with no timezone marker.
track / track_changestring
Assigned track and whether it has changed from the plan.
pathstring
Internal route code such as "R4N", a survival from SEPTA's old regional rail numbering.
next_stationstring
The train's next stop, or null when it has not yet departed its origin.

What you can build with the SEPTA Arrivals API

  • Build a Regional Rail departure board for a station
  • Alert commuters when their train is delayed or changes track
  • Track live train positions across the Philadelphia network
  • Surface lift outages for step-free journey planning
  • Log on-time performance for a route over time

Common errors and how to fix them

Cannot find the data in the response

The single top-level key is a timestamped sentence.

Fix: Take the first value of the object rather than indexing by name. The key differs on every request.

Empty result for a station you know exists

The station name does not match SEPTA's spelling.

Fix: Names must match exactly, hyphens included — "Airport Terminal E-F", "30th Street Station". Fetch the station list first if you are unsure.

Times parse into the wrong hour

Timestamps are local Philadelphia time with no timezone marker.

Fix: Interpret them as America/New_York, and take care around the daylight saving transitions when an hour repeats.

CORS error in the browser

The endpoints send no Access-Control-Allow-Origin header.

Fix: Proxy server-side. Predictions update about once a minute, so a short cache is appropriate anyway.

SEPTA Arrivals API — frequently asked questions

Is the SEPTA API free?

Yes, free with no key or account, and it has been open since SEPTA's developer programme launched in the early 2010s — one of the longest-running open transit APIs in the United States.

Why is the top-level key a sentence?

It is an artefact of the original design: the key contains the station name and the current timestamp, so it changes on every call. Read the first value of the object rather than trying to address the key.

Does it cover buses and the subway too?

The arrivals endpoint is Regional Rail. Other endpoints cover bus and subway — including live vehicle positions, detours, alerts and lift outages — under the same key-free terms.

What does service_type tell me?

Whether the train is LOCAL or EXPRESS, which decides whether it calls at intermediate stations. A passenger at a smaller station needs a LOCAL, and showing an express as the next train would be actively misleading.

Tools that pair with this API

SEPTA Arrivals is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.