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.
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 'https://www3.septa.org/api/Arrivals/index.php?station=Airport%20Terminal%20E%20F&results=2'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);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()){
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
station | query | Required | Station name, matching SEPTA's own spelling exactly including hyphens. Airport Terminal E F |
results | query | Optional | How many departures to return per direction. 2 |
direction | query | Optional | Restrict to `N` or `S` instead of returning both. N |
(train view) | path | Optional | `/TrainView/index.php` returns live positions for every Regional Rail train. |
(alerts) | path | Optional | `/Alerts/index.php` returns service alerts and advisories for all modes. |
(elevator outages) | path | Optional | `/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
Time Zone Converter
Convert any date and time between world time zones. See UTC offsets, daylight saving handled automatically, and compare multiple zones at once.
Timestamp Converter
Convert timestamps to human-readable dates and dates back to timestamps. Auto-detects seconds vs milliseconds, shows local, UTC and ISO 8601 formats.
JSON Formatter
Format, beautify and minify JSON online with 2-space, 4-space or tab indentation. Sort keys alphabetically and catch syntax errors instantly — free and private.
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.