Sources and licences
Where every number on this site comes from, what licence it carries, what the source does not publish, and who took the photographs
The file that holds the whole subway is called “bus”
There is no separate open-data file for the Philadelphia subway. The schedule on this site is read out of one zip archive of about 26 MB, google_bus.zip, and the split between that archive and its sibling is the reverse of what the two names suggest: the file named for buses carries the three subway lines, the streetcars and the trolleybuses, while the file named for rail carries only Regional Rail, which is a different network and not the subject of this site. Reading the names instead of the contents is a mistake that costs a day, and it is the first thing worth writing down.
Inside, the archive describes 168 routes and 2,769,965 rows of stop times. 59,426 of those rows are the subway; everything else is another mode. Five of the routes are heavy rail, and those five are three lines, because the local, the express and the Broad-Ridge Spur are three service patterns of the same line rather than three lines. Publishing “five lines” would describe a network nobody in Philadelphia would recognize.
What survives that filter is this site: 3 lines, 70 stations and the 5 service patterns that run across them. Every figure you read here is computed from that archive or comes from one of the sources listed further down. None of them is typed into a sentence by hand, because a sentence goes stale and a calculation does not.
| What the build records about the source file | Value |
|---|---|
| Published version | v202611010 |
| Last modified, as the server reports it | Tue, 20 Oct 2026 20:14:34 GMT |
| Size on disk | 26 MB (25,959,927 bytes) |
| MD5 | 411a378a37e249d766475a3424ac0484 |
| SHA-256 | d83ba2188a38001df91d215da2321a790072e586ce4dd0ccbe64f2ef11ccb350 |
| Service period declared inside the file | 1 November 2026 to 20 February 2027 |
| Calendar dates actually covered | 112 days |
Three independent sources, and the one place they disagreed
The house rule is two official sources that agree before the station list is frozen. Here there are three: the open-data archive itself, the transit agency’s own GIS layer of metro stations, and the English Wikipedia article for each line, which is not official and is used only as a third opinion.
| Line | Open-data archive | The agency’s GIS layer | Wikipedia | Published here |
|---|---|---|---|---|
| Broad Street Line | 24 | 24 | 24 | 24 |
| Market–Frankford Line | 27 | 28 | 28 | 27 |
| Norristown High Speed Line | 22 | 22 | 22 | 22 |
Two of the three lines matched on the first pass. The Market–Frankford Line did not: the schedule serves 27 stations and both inventory sources count 28. A disagreement like that is normally a bug in the filter, and this one was not.
The missing station is a closed station
11th Street is still named in the file that lists the stops along each route — twice, once per direction — and it is no longer in the file that describes the stops themselves. Not one train in the entire schedule calls there. The two inventory sources keep listing it because the station still exists as a structure; the timetable does not, because nothing stops. So it is published as closed, in its place in the sequence, and it is never counted in the 70: that is the honest number of stations you can get on a train at.
Two details worth stating, because each of them is an easy way to publish something false. The two route rows are one station, grouped by the neighbors that surround them, and counting them separately would have added a station that does not exist. And the name is the one piece of information on this site that is not in the open-data archive at all — the archive no longer carries the row — so it comes from the other two sources, and it is flagged as such here rather than passed off as feed data. There is a page about the closed station that says the same thing in more detail.
The archive abbreviates the names, so two sources outvote one
The open-data archive writes 13th St, Ardmore Av, Race Vine, NRG. The agency’s GIS layer and Wikipedia write them out in full. The rule applied here is narrow on purpose: the archive’s name is published unless the other two sources agree with each other on a different form, and then that form wins. That happened 18 times, and all 70 published names are confirmed by at least two independent sources; the data check fails if any name ever drops to one.
The URL is then built from the adopted name, not from the raw one. Doing it the other way round is the natural way to write the code and it leaves 18 addresses carrying an abbreviation while the heading on the page carries the full name.
Where the other two sources do not agree with each other, the archive’s spelling stays and the disagreement is recorded. That is the case for the four stations on the Norristown High Speed Line whose names end in South — the GIS layer drops that word, and the word is precisely what distinguishes them from the Regional Rail stations of the same name a few hundred feet away — and for the station complex under City Hall, where one source writes the street in full and the other does not.
Three pairs of names that look alike and are not the same station
Spring Garden and Broad-Spring Garden are more than half a mile apart. Erie and Erie-Torresdale are at opposite ends of the city. So are Broad-Allegheny and Kensington-Allegheny, and Broad-Girard and Front-Girard. Merging stations by similar names, which is a tempting way to clean up a list, deletes a station from the network. The data check watches for it.
And three rows that are not stations at all
The archive contains two platforms labeled for employees only and one labeled as the end of a westbound trip sitting on an eastbound platform. The schedule calls at all three as if they were stops. Publishing them would mean three station pages for places you cannot board, and one of them would appear as the second stop out of 69th Street. They are excluded, by name, and the exclusion is tested.
The day types are worked out from the timetable, not read off a label
Most open-data archives state which service runs on which weekday. This one does state it, and the service identifiers are even legible. They are still not used as the source of truth here, and the reason is in the file itself.
Instead, each of the 112 dates in the service period is reduced to a signature: the sorted list of every trip that runs that day, with its route, its direction, its first departure and its last arrival to the second, and its number of stops. Dates with identical signatures are one group, and only then does the group get a name from the weekdays it covers. The result is 4 day types: Monday to Friday, Saturday, Sunday, and Holiday service.
Two Saturdays change their service number without changing their timetable
On two Saturdays in the period, the archive removes one service number from the Norristown High Speed Line and adds another — with identical trips. It is not a special timetable; it is the same Saturday with a different label. Those two dates therefore appear as exceptions inside the ordinary Saturday group and are not called a holiday timetable. It is also the reason none of those numbers is used as a key for anything.
And 33 extra trips with no calendar row would have made 15 day types out of 4
There are 33 trips in the archive whose service number has no row in the weekly calendar at all: they exist only because specific dates were added to them one at a time. Every one of them is a Broad Street Line express run to the stadium station in South Philadelphia. Let them into the signature of a day and every date carrying one becomes a day type of its own: the group count goes from 4 to 15.
Identifying them by “runs on a single date” does not work either — one of them runs on nine. The test that does work is the absence of a calendar row. They are kept out of the day types, out of the patterns and out of the running times, and published separately as what they are: extra trips on named dates. The archive does not say why they run, and neither does this site.
Christmas runs the Sunday timetable
That is the kind of thing people search for and get a vague answer to, so here it is plainly: 25 December has no timetable of its own — that date is simply added to the Sunday service. Thanksgiving and New Year’s Day do, and it is not the same timetable for all three lines: two of the lines get a holiday service built for the purpose, and the third, which has none, runs its Sunday service instead. Two different things on the same day, which is why the schedule page answers by line and not by date.
Door-open time does not exist in this source, and that changed how the numbers are checked
In every one of the 58,363 rows where it could be stated, this archive gives a train the same arrival time and departure time at a station. The time the doors stand open is not a fact of this source; it is absorbed into the running time between stations. So it is published as zero, measured, and this paragraph exists so that nobody later mistakes the zero for an oversight.
The convenient consequence is that the station-to-station times add up to the end-to-end time exactly, to the second, in all ten combinations of pattern and direction. The dangerous consequence is the one worth explaining, because it is a trap this network has fallen into before on another city: if the dwell had been inferred from the leftover — end-to-end minus the sum of the legs, divided by the number of stops — then checking that the legs plus the dwells equal the end-to-end would always pass. It would be a check of arithmetic against itself, and it would have passed with a minute per station invented by hand.
What actually does the checking is a separate table of 1,738 station pairs: for each pattern and each pair of stations the schedule serves, the median of “departure from A to arrival at B on the same trip”, read straight out of the timetable with nothing composed. The site’s own composed times land on all of them with a maximum deviation of zero. That table is deliberately never published and never used to calculate anything: a figure that both computes and verifies verifies nothing.
It carries the pattern, not just the pair, for a reason specific to this network. The express skips stations, so it links pairs the local also links, along the same corridor, without stopping in between. A median that mixed the two would invent discrepancies where there is no error at all.
The distance column is in kilometers, and reading it in miles would have published a longer railroad
The archive does not declare the unit of its distance column, and the agency is American, so the tempting reading is miles. They are kilometers, and two independent contrasts say so. The column ends at 21.56 on the Norristown High Speed Line, and that line is 13.4 mi (21.56 km) end to end. On the Market–Frankford Line it ends at 21.17 against a published 13.16 mi (21.17 km). Both times the number matches the kilometers and not the miles. Read the other way, the same column would have described a network about three fifths longer than the one that exists.
The line lengths on this site come from that column in the stop-times file and not from the drawn route shapes, which are a different table under a different licence; the data check fails if anyone changes where they are read from.
What on this site is live, and what is a published timetable
The agency publishes three open real-time streams, with no key and no registration, and all three answer. That is more than most operators manage, and it is also where the obvious assumption goes wrong, so this was measured rather than assumed: nine consecutive samples of all three streams, taken on 13 November 2026 between 4:52 and 5:02 pm Philadelphia time, counted route by route on the wire rather than by looking at the size of the file.
| Stream | Entities per sample | Broad Street Line (3 patterns) | Market–Frankford Line | Norristown High Speed Line |
|---|---|---|---|---|
| Trip updates — predicted arrivals | 2,044–2,073 | 0 | 0 | 8–10 |
| Vehicle positions — where the trains are | 1,121–1,129 | 0 | 0 | 10 |
| Service alerts — disruptions and notices | 497–500 | 4, 2 and 4 | 6–7 | 3 |
Read that middle block again, because it is the finding. The two lines that most people mean by “the Philadelphia subway” publish no arrival predictions and no train positions at all. Zero, in nine consecutive samples, at the busiest hour of the afternoon. The only one of the three with live running data is the Norristown High Speed Line.
The streams are genuinely live rather than a file reposted on a timer: the checksum changed in nine of nine samples, and so did a fingerprint built only from the subway predictions. That second test is the one that matters, because the checksum of the whole file moves with a hundred and fifty buses even if the subway part is frozen. In the alert stream the fingerprint repeats, which is normal: a notice about an elevator lasts hours.
The streams are also easy to get wrong in a way worth recording: each of the three hangs off its own folder on the server, and asking for one under another one’s path returns a not-found rather than an error you would notice.
The licence: the data may be redistributed, the trademarks may not
The schedule data on this site is used under the transit agency’s own open-data licence agreement, which was read in full in two independent places — the current agreement and a developer agreement last updated in March 2014 — and says the same thing in both. The grant is a “SEPTA hereby grants to Licensee a non-exclusive, non-assignable, non-transferable, limited and revocable right to use, reproduce and redistribute the datasets available on the Open Data Portal”.
The only restriction on use is about marks, not about data, and it reads in full: “Licensee may not use SEPTA’s trademarks and copyrighted materials for any commercial or profit-making use and may not alter them”. The separate copyright notice limiting material to informational and non-commercial purposes is explicitly scoped to the content of the agency’s own web server, not to the open-data portal.
What is deliberately not used
The data is in; the identity is out. This site does not use the agency’s logo, its official system map, its line bullets or roundels, or any copy of the text from its website. The diagrams and the map here are drawn from the data — from station coordinates, stop order and the line colors the archive itself declares — and they are not a redrawing of the official sheet. Where a line color matches, it matches because the color is in the data.
Attribution is offered as a courtesy rather than claimed as a requirement: Schedule data: SEPTA Open Data. Station names, line names and the names of fare products are used here only to describe the service this site is about.
One more thing that belongs in a sources page rather than in a footnote: before any of this was downloaded, the robots files of every host involved were read. The host that serves the open data and the three real-time streams allows everything. The agency’s main website disallows most file extensions, so nothing with an extension was ever requested from it. Those limits were respected, not discovered afterwards.
OpenStreetMap: here the credit is a condition, not a courtesy
The places listed under “nearby” on each of the 70 station pages — museums, parks, hospitals, stadiums, universities, historic buildings — come from OpenStreetMap and are used under the Open Database License 1.0. That licence requires the line “© OpenStreetMap contributors” on every page that shows them, which is why it is on all of them. It is not politeness; it is the condition under which the data may be shown at all. The licence text is at opendatacommons.org and the project’s own copyright page at openstreetmap.org/copyright.
How those lists are built, so that you know what you are reading: 3,844 map elements were read around the 70 stations, 3,424 of them had a proper name and a usable category, and 420 were dropped for having no claim to being worth walking to. What is published is 638 entries, at most 10 per station, chosen on notability first and distance second, every one of them with a link: 122 to Wikipedia, 121 to an official website and 395 to its own map record.
The radius is 600 m in a straight line from the station point, widened to 1200 m at the 33 stations where that circle came back nearly empty — which, predictably, is most of the outer end of the Norristown High Speed Line. Artworks, memorials, places of worship and sports grounds only qualify if they carry an identifier in a public knowledge base, because without that filter the list fills up with every parish church and ballfield in the neighborhood.
Fares and accessibility come from the same archive, which is unusual
Most open-data archives contain no prices at all. This one does, in the modern fare format, and that is why the fares page and the fare card page can state a figure instead of pointing you elsewhere: a single ride is $2.90 on every payment method in the file, and the file also carries the transfer rule — up to 2 transfers within 120 minutes on the payment methods that support it. The payment methods are described here by what they do rather than by their brand names, for the trademark reason above.
Accessibility is in the archive too, station by station, and the answer is not a round number: 42 of the 70 stations are recorded as step-free, 23 as not step-free, and 5 as step-free on some platforms only. That last category is a real state of affairs rather than a gap in the data — different platforms of the same station with different declarations — and it is published as such on the accessibility page. About a quarter of this network is not step-free, and rounding that off would be the dishonest way to present it.
For 6 large complexes the archive goes further and describes the inside: 682 rows of passageways, elevators, stairs, ramps and gates, with lengths and step counts, and 27 elevators among them. That is far more than almost any transit archive publishes. It is also not an inventory of street entrances, and the difference matters: for the other 64 stations the archive says nothing about the inside at all, and the number of ways in and out of a station is not something this site can state, so it does not.
What the source does not publish, and what is therefore missing here
A guide does not get better by filling holes. These are the 8 things the schedule archive does not contain, the 4 the accessibility data does not contain and the 3 the fare data does not contain — written out with the reason, so that you can decide whether you need to look somewhere else.
| What you will not find here | Why not |
|---|---|
| How long a transfer between two lines takes | There is no transfer file in the archive, and the interior data gives corridor lengths rather than times. In all three shared complexes the two lines use separate platforms, so there is a walk; how long it takes is not published anywhere we can read. It is left empty rather than estimated, and the pages say “a different platform” without a number. |
| How many street entrances a station has | Interior data covers 6 of the 70 stations. For the other 64, anything said about the street above would be invented. |
| A declared frequency for each line | There is no frequency file. Every interval on this site is measured by counting departures in the timetable, and it is measured per service pattern: the local, the express and the spur run on the same tracks, and adding them together produced “one point two minutes at peak”, which is not the interval of any train you can wait for. |
| How long the doors stay open | Not a fact of this source. Explained in full further up this page, because the way it was checked is more interesting than the gap. |
| Whether a station is underground, elevated or at street level | The agency’s GIS layer carries this and the schedule archive does not. It is not published per station here because it would rest on a single source, and this site’s rule is two. |
| When a station opened, and planned works or closures | Neither the opening date nor the engineering calendar is in any source used here. The one closure that is visible is visible because the timetable stops serving a station, not because anything announced it. |
| Weekly and monthly passes, and reduced fares | The fare data carries the single ride and nothing else. A student, senior or Medicare fare, and the price of a weekly pass, are set by the operator and published on its own pages. |
| Live arrivals on two of the three lines | Measured, nine times, route by route: they are not in the real-time streams. The section above has the counts. |
| Whether the elevator is working today | That is an alert, not an inventory. The accessibility pages describe what is built, and a notice about a specific elevator on a specific day is a different kind of statement with a different source. |
| Accessible restrooms, lowered counters and hearing loops | Not in the data at all. Their absence from this site is not evidence of their absence from a station. |
| The maximum balance a fare card can hold, and how to check it | Not in the fare data, and not documented anywhere we could read twice. The fare card page says which channels are verifiable and stops there. |
The photographs, and who took them
The photographs on this site come from Wikimedia Commons. There are 17 of them, and 11 are licensed CC BY or CC BY-SA, which requires naming the photographer and the licence. Using a photograph as a background without that line is as much an infringement as using a photograph with no licence at all, and it is the easiest licence condition in the world to break by accident. The other 6 are CC0 or public domain and require nothing; they are in the same table anyway, because a reader should be able to see where every image came from in one place.
The photographer is also named in the caption beside each photograph on the page where it appears. That these photographers published their work freely does not mean they have anything to do with this site or endorse it.

The 70 station cards — the wide image at the top of each station page, with the station name set across it — are derived works of 16 of these same photographs, which is why the same names appear in the table above and nowhere else. Each card carries its photographer’s credit and its licence printed inside the image, so the condition travels with the file if the file ever travels on its own — a credit that lives only in the HTML around a picture is lost the moment somebody saves the picture.
The logo of this site is its own work. It is not from Commons and it is not a version of the transit agency’s mark, which belongs to the agency: it shows a train coming out of a tunnel mouth under the silhouette of City Hall and the figure of William Penn on top of it. That is a city skyline, not a transit brand.
Found something wrong?
Something is. With this many derived figures the question is not whether but which. The build runs 162 checks in fifteen blocks over the data layer, and a second script breaks that layer on purpose 25 times — deletes a station, swaps a line color, injects a dwell, moves a terminal — and requires the checks to notice; all 25 are caught. That is the reason to trust the numbers, and it is also exactly why the next mistake will be one no check was written for.
A running time that does not match, a station in the wrong place on the map, a nearby place that closed years ago, a credit that is missing: write to [email protected] or use the contact page. A message that names the page and the figure gets fixed; a message that says the site is wrong somewhere cannot be acted on.
Corrections are made in the generator that writes these pages, never in the published page. That takes a little longer, and in exchange the fix lands on every page that shares the figure and does not come back at the next rebuild.
