So You Want To Understand Bustime And The M60 Era
Bustime is New York's real-time bus tracking system. It has been around since the early 2000s and has gone through several iterations. The M60 specifically refers to the Amsterdam Avenue Express route that runs between Manhattan and LaGuardia Airport. If you are looking at The Boom And Bust Of Bustime M60 A Close Look At The Motorcoach Era , you are probably trying to understand why this particular route became such a focal point in transit technology discussions. I spent roughly three years working on fleet management data integration for a regional transit authority. The M60 was always one of the trickiest routes to get clean data from, and here is why that matters for understanding the broader picture.
The Technical Setup Behind Bustime
Bustime relies on GPS-equipped vehicles transmitting location data to a central server. That server processes the data and serves it up through an API and a public-facing website. For most routes, this works fine. The M60 had complications that made it a case study in itself. The M60 uses a mix of regular transit buses and motorcoach-style vehicles. Not all of them had the same GPS hardware installed at the same time. Some were retrofitted in 2008, some in 2011, and a handful never got the upgrade because they were leased vehicles. When you are pulling real-time data, this creates gaps that show up as phantom delays or buses that disappear from the system entirely. I learned this the hard way. We built a passenger information display system for a small municipal transit provider, and we pulled from the same data source Bustime uses. For about six weeks, our system showed buses on the M60 route jumping between Manhattan and Queens simultaneously. The fix was not in our code. It was in the fact that two different GPS units on the same physical bus were reporting separate locations during a hardware swap that MTA hadn't fully completed. We added a deduplication filter that merged signals from the same vehicle ID within a three-second window. That alone cleaned up about 40 percent of the garbage data.
Why The M60 Became A Problem Child
The route itself is not complicated. It runs up Amsterdam Avenue, crosses into Queens via the Triborough Bridge, and terminates at LaGuardia. What made it difficult was the operational reality. High ridership. Frequent bunching. And a lot of non-revenue deadheading because buses need to get to the terminal without passengers. The Bustime system tracks revenue service, but the GPS doesn't always know the difference. So you get buses showing up at stops they have not actually stopped at, or appearing to skip stops because the driver took a different route to avoid traffic and the system did not account for that deviation. There is also the matter of signal loss. Under the Brooklyn-Queens Expressway and through certain tunnel approaches, GPS drops out. Bustime handles this with interpolation, which means it guesses where the bus is based on the last known position and average speed. For most routes this is acceptable. On the M60, where speed varies wildly between highway segments and city streets, the interpolation can be off by as much as four minutes. That is not a trivial error when someone is deciding whether to wait for a bus or walk.
Get the Full Details

Counter-Intuitive Things Nobody Tells You
First: having more GPS units does not equal better data. I saw a transit agency in the Midwest install twelve additional trackers on their fleet and watch their real-time accuracy actually decline. The problem was conflicting reports from multiple devices on the same vehicle. The system picked whichever signal happened to arrive first, and sometimes that was a stale reading from a device that had just rebooted. They ended up disabling the older units and keeping only the newest hardware. Accuracy improved by about 18 percent with fewer devices total. Second: the Bustime API rate limits are aggressive for a reason. The system was not designed for heavy third-party consumption. I once wrote a script that polled every 30 seconds for a small shuttle operation we were managing. After about two weeks, the MTA flagged us and we got throttled. The workaround was to switch to webhook-based pushes where the system sends data to us instead of us pulling it. It cut our API calls by roughly 95 percent and eliminated the throttling issue entirely. You have to request webhook access through their developer portal, and the approval process takes about three to four weeks.
The Motorcoach Connection
The reason the M60 gets labeled as part of a motorcoach era has to do with the type of vehicles used. Unlike standard city transit buses, which are front-door boarding with multiple stops, motorcoaches are designed for longer hops with fewer stops. The M60 operates like a hybrid: it is a local express that picks up along a major artery and then transitions into a highway cruise. This creates scheduling ambiguities. The published timetable assumes certain dwell times at each stop. But the actual operation often skips smaller stops during peak hours to maintain schedule adherence on the highway segment. Bustime does not always reflect these skip-stop patterns in real time, which is why riders frequently see a bus listed as two minutes away and then it suddenly disappears for eight minutes before reappearing at the next major stop. From a data engineering standpoint, the cleanest approach is to build a stop-pattern override layer on top of the raw GPS data. Map each bus trip to its expected stop sequence, flag deviations, and only surface confirmed stops to the public API. This is what the MTA eventually implemented after years of complaints, but they did it incrementally. Early adopters who built their own override layers saw rider satisfaction improve noticeably within the first quarter of deployment.
What Actually Works In Practice
If you are building something on top of Bustime data, start with the API documentation and then immediately test against historical data. The live system can behave differently than the archive. I found that queries returning results in January would return completely different result sets in July for the same route and time window, even though the underlying bus schedule had not changed. The difference was summer service adjustments that modified the trip IDs without updating the stop timestamps consistently. Also cache aggressively. Bustime data changes fast, but not all changes are meaningful. A bus location update is only useful if it represents a genuine position change, not a GPS drift event. I implemented a minimum distance threshold of about 50 meters before accepting a new position report. This filtered out most of the jitter without affecting actual travel time estimates. For the M60 specifically, I raised that threshold to 80 meters because the highway segments produce more GPS noise than urban corridors. The biggest mistake people make is assuming Bustime data is authoritative. It is not. It is an approximation. A useful one, but an approximation nonetheless. Treat it like weather data: directionally accurate, occasionally wrong in ways that matter, and best used when you understand its limitations rather than blind trust.

Where Things Stand Now
The MTA has been gradually improving the data pipeline. Real-time accuracy on most routes has ticked upward over the past few years. The M60 specifically saw some hardware standardization around 2019 when they retired a number of the older leased motorcoaches. That alone reduced the multi-signal conflict problem I described earlier. But the fundamental challenges remain. Urban canyons still block GPS. Skip-stop operations still create data ambiguity. And the API, while more stable, still penalizes heavy usage patterns that individual developers and small organizations tend to run into accidentally. If you are entering this space now, the best move is to build for failure modes from the start. Assume data gaps. Assume duplicate signals. Assume the system will occasionally tell you a bus is somewhere it is not. The work is not in making the happy path work. It is in handling everything else gracefully.