Public Transit Stats

Live public-transit positions & on-time performance, tracked over time.

City

Pick cities to compare

All cities
    Comparing

      Transit type

      Time window

      Comparison

      Pick one or more cities above.

      Data-quality grades

      Each city's grade is its on-time performance: 90%+ = A, 80% = B, 70% = C, 60% = D, below = F. The "Issues" column separately flags feed problems (e.g. feed down). A city with no gradeable data is left ungraded — never given a letter. Methodology

      Loading…

      Feed health

      Loading…

      Methodology

      How GlobalTransitStats turns public GTFS-Realtime feeds into the numbers on this site — and the limits of those numbers.

      Where the data comes from

      We read each city's public GTFS-Realtime feed (the open standard agencies publish for live vehicle positions and, sometimes, trip delays) plus their static GTFS schedule. We do not use any private or paid feed. A city is only as good as its agency's public data.

      On-time performance

      Each tracked vehicle is graded every poll as on time, late, or early from its delay in seconds (on-time band configurable; default ±2 min). When a feed carries no explicit delay, we derive one by comparing the observed position/time against the static schedule ("schedule-diff"). Feeds whose realtime trip IDs don't match their static schedule show "schedule data pending" rather than a fabricated number.

      Statistics windows

      Numbers are always computed for a window (5 min / 1 h / 1 day / 7 / 30 days / 1 / 5 years / all time). Short windows read raw observations; long windows read daily rollups. History accumulates forward from our first poll — it cannot be backfilled, so long windows are empty until enough time passes.

      City vs network scope

      National feeds (e.g. the Netherlands, Norway) report vehicles far beyond one city. "City" scope bounds results to the city's geographic box; "network" scope includes the whole feed.

      Feed health & data-quality grade

      Every ~2 minutes we record whether each city's feed is responding and how fresh it is. The daily data-quality grade (A–F) combines feed uptime, freshness, and whether on-time data is gradeable, using weights and bands defined in configuration. Each grade carries a confidence (how much data we had) and a list of issues. A grade measures the public data, not the agency; missing data can make good service invisible. A city with no data gets no grade — we never invent one.

      Service delivered vs scheduled (approximate)

      Where a city's schedule includes a service calendar and its realtime trip IDs match it, we estimate the share of scheduled trips that were actually observed. This is inference, not ground truth: a feed outage can look like cancellations, so each figure carries a confidence tied to that day's feed uptime, and feeds whose IDs don't match their schedule are marked unsupported rather than given a misleading number.

      Why some cities are missing or hidden

      A city only appears once its data is complete enough (routes loaded, labels resolved, in-area vehicles, gradeable delays). Incomplete cities are hidden automatically and reappear when their data improves.

      How to cite

      These are transparent, reproducible measures from open feeds — not official agency metrics. Please cite "GlobalTransitStats, from public GTFS-Realtime feeds" and link the specific city/route page.