Transportation — entry 053 of 69

Transport for Philadelphia, US

Verified Jul 2026

SEPTA's real-time data is spread across a family of small JSON endpoints under www3.septa.org/api (TrainView, TransitView, NextToArrive, Alerts, BusDetours) plus separate GTFS-RT protobuf feeds, and is now indexed through a Swagger UI at api.septa.org rather than the old Code-for-America hackathon reference page. None of the endpoints tested require a key, but SEPTA doesn't publish rate limits or uptime guarantees.

SEPTA runs trains, buses, subway, and trolleys around Philadelphia. Its public API returns live data as JSON. The TrainView endpoint lists every Regional Rail train that is now running, with position, next stop, and delay.

transitreal-timebusesregional-railphiladelphia
AuthenticationNone requiredCall it straight away — no key, no signup.
HTTPSSupportedTraffic is encrypted in transit.
CORSDisabledBrowser calls need a server-side proxy.
PricingFreeNo paid tier — free for the documented use case.
FormatsJSON, GTFS-RTResponses can be requested as JSON or GTFS-RT.

GreatAPIs Score

Score80out of 100
Authentication25/25No authentication required
Pricing20/20Free to use
Docs0/20No docs or spec available
Formats15/15Supports 2 response formats
Freshness20/20Verified within 6 months

Embed this badge

Scored 80 on greatapis.com
<a href="https://greatapis.com/api/transport-for-philadelphia-us/"><img src="https://greatapis.com/badge/transport-for-philadelphia-us.svg" alt="Scored 80 on greatapis.com"></a>

Auth quickstart

  1. No API key is needed. The endpoints are open and keyless.
Stored keyNo key stored

Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.

List live Regional Rail trains

GEThttps://www3.septa.org/api/TrainView/index.php

200 application/json

[{"lat":"39.95282972","lon":"-75.15885418","trainno":"2397","service":"LOCAL","dest":"Penn Medicine","currentstop":"Jefferson Station","nextstop":"Jefferson Station","line":"Media/Wawa","consist":"126,125,168,167","heading":"260.40754794104","late":0,"SOURCE":"Norristown","TRACK":"4","TRACK_CHANGE":""}]

The array is truncated to its first train. The live call returned 26 trains. The train object is unchanged.

Developer reference

Gotchas & limits

  • Most numbers are JSON strings. In the response, lat, lon, trainno, and heading are quoted. Only late (minutes late) is a real number. Convert the strings before you do any math.
  • The response has no wrapper object. The top level is a bare array, and it changes with each call because it shows trains now in service.
  • Field names are not consistent in case: lat, trainno, and dest are lower case, but SOURCE, TRACK, and TRACK_CHANGE are upper case.
  • TRACK and TRACK_CHANGE can be empty strings when SEPTA has no track data for the train.
  • The response sets Cache-Control: no-store and the Expires date is 1997, so each call is fresh. Cache on your side if you poll.