Source: MTA BusTime SIRI API (real-time vehicle positions)
Route shapes: MTA GTFS Static Data
These are observational estimates derived in real time from the MTA BusTime SIRI API, not official MTA metrics. The numbers shown here are approximations that use a different data pipeline and calculation method than the MTA's published performance data. They should be treated as directional indicators, not authoritative measurements.
What we measure: Every 30 seconds, we record each bus's GPS position. For any bus seen in consecutive snapshots, we calculate the distance traveled and divide by elapsed time. When route shape data is available, distance is measured along the route polyline (snapping each GPS point to the nearest point on the route and summing the along-route path). When route shapes are unavailable, we fall back to great-circle (haversine) distance, which underestimates actual road distance. Speeds above 60 mph are discarded as GPS noise. A rolling average over the last 3 poll cycles smooths jitter.
System-wide averaging: Each route's average speed is computed first (mean of all individual bus speeds on that route), then the system-wide average is the mean of all route-level averages. This gives equal weight to each route regardless of how many buses it runs, consistent with MTA route-level reporting. Without this, high-frequency routes (M15, B46, etc.) would dominate the system average.
How the MTA measures it: The MTA's Bus Route Segment Speeds dataset calculates speed between "timepoints" (major scheduled stops) using the known route-geometry distance and GPS-derived travel time. Their speed includes dwell time at stops, traffic delays, signal waits, operator reliefs, and all other in-service time—representing the actual travel speed a rider experiences.
Key similarities: Our route-distance calculation mirrors the MTA approach of measuring along actual route geometry rather than straight-line distance. Like the MTA, our speeds inherently include dwell time, traffic, and signal delays because we measure wall-clock time between snapshots.
Key differences: (1) The MTA measures between scheduled timepoints with known inter-stop distances, while we snap GPS points to route shapes, introducing some positional error. (2) The MTA aggregates by hour across many trips for statistical reliability; we show real-time snapshots of individual buses. (3) Our 30-second polling interval means short segments may produce noisy speed readings. (4) When route shapes aren't loaded yet, we fall back to haversine distance, which underestimates by 10–40% on winding routes. (5) Buses at layover points or waiting at terminals may register near-zero speeds, pulling our averages down.
What we measure: Two buses on the same route traveling in the same direction are flagged as "bunched" if they are within 250 meters of each other. This is a simple proximity-based measure.
How the MTA/Comptroller measures it: The NYC Comptroller's "Behind Schedule" report defines bunching as when the actual headway between two buses is less than 25% of the scheduled headway. For example, on a route scheduled every 8 minutes, buses arriving 2 minutes apart would be bunched. This headway-based definition is more precise because it accounts for how frequently buses are supposed to run.
Key difference: Our 250m threshold is a rough spatial proxy. On a route with 5 mph average speed, 250m is about 1.8 minutes of travel time. On a fast limited-stop route, 250m might be just 30 seconds of headway. A headway-based definition would require access to GTFS schedule data (planned headways), which this tracker does not currently incorporate.
What we measure: We sort buses along a route by position (using route-distance when available, otherwise by latitude for north-south routes or longitude for east-west routes), compute the distance between consecutive buses, and divide by observed route speed to estimate the time gap a rider at the midpoint would experience. Routes with fewer than 3 active buses per direction are excluded (too few data points). Gaps are capped at 60 minutes (longer likely reflects a route terminus, not a real service gap).
Key limitation: This is a spatial interpolation, not a measurement of actual bus arrival times at stops. The MTA measures gaps using actual arrival data at stops. Our method can overestimate gaps on routes where buses cluster near the ends (terminals, turnarounds) and underestimate gaps if buses are evenly spaced but moving at different speeds.
What we measure: Uses the standard queuing-theory formula: E[wait] = E[gap²] / (2 × E[gap]). If buses were perfectly evenly spaced, your expected wait would be half the headway. Irregular spacing increases wait time because some gaps are disproportionately long. This formula captures that effect.
How the MTA measures it: The MTA publishes "Additional Bus Stop Time," defined as the average time customers spend waiting beyond their scheduled wait time. This requires schedule data to compute the excess. Our figure is a theoretical expected wait based on observed spacing, not a comparison to any schedule.