NextBus (Umo IQ) API
Free NextBus JSON feed with no key: routes, stops, live vehicle positions and arrival predictions for dozens of North American transit agencies through one endpoint. Tested example included.
Endpoint tested and returned HTTP 200 on 2026-08-21
What is the NextBus (Umo IQ) API?
The NextBus public feed, now operated by Umo IQ, is a free, key-free API serving real-time transit data for dozens of North American agencies. A single endpoint pattern returns agency lists, route and stop configurations, live vehicle positions and arrival predictions.
The reason this feed still matters is breadth: one URL pattern covers everything from the Toronto Transit Commission to small university shuttles, so a single integration works across dozens of agencies without a separate key, contract or response format for each. The `a=` parameter selects the agency and the rest of the request stays identical.
Its age shows in the design. The service was built as an XML feed and JSON was added later by swapping `publicXMLFeed` for `publicJSONFeed` in the path, which is why the field names are terse (`tag`, `title`) and why single-element arrays sometimes collapse into bare objects — a quirk worth normalising on ingest before it produces an intermittent bug. Note also that the historical `nextbus.com` hostname now redirects to `retro.umoiq.com`, so use the current host directly.
Quick facts
- Base URL
https://retro.umoiq.com/service/publicJSONFeed- Authentication
- No API key or account. A legacy public feed maintained by Umo IQ; the older nextbus.com host now redirects here.
- Rate limit
- No published numeric quota, but the operator throttles abusive clients. Predictions refresh roughly every 20 seconds.
- Pricing
- Free.
- CORS
- Enabled — callable directly from browser JavaScript
- Official docs
- Read the docs
How to use the NextBus (Umo IQ) API
Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.
1. List every route operated by a transit agency
GET https://retro.umoiq.com/service/publicJSONFeed?command=routeList&a=ttc
curl 'https://retro.umoiq.com/service/publicJSONFeed?command=routeList&a=ttc'const res = await fetch("https://retro.umoiq.com/service/publicJSONFeed?command=routeList&a=ttc");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);import requests
res = requests.get("https://retro.umoiq.com/service/publicJSONFeed?command=routeList&a=ttc", timeout=20)
res.raise_for_status()
print(res.json()){
"copyright": "All data copyright Toronto Transit Commission 2026.",
"route": [
{
"tag": "7",
"title": "7-Bathurst"
},
{
"tag": "8",
"title": "8-Broadview"
},
{
"tag": "9",
"title": "9-Bellamy"
},
{
"tag": "10",
"title": "10-Van Horne"
},
{
"tag": "11",
"title": "11-Bayview"
},
{
"tag": "12",
"title": "12-Kingston Rd"
},
{
"tag": "13",
"title": "13-Avenue Rd"
},
{
"tag": "14",
"title": "14-Glencairn"
},
{
"tag": "15",
"title": "15-Evans"
},
{
"tag": "16",
"title": "16-McCowan"
},
{
"tag": "17",
"title": "17-Birchmount"
},
{
"tag": "18",
"title": "18-Caledonia"
},
{
"tag": "19",
"title": "19-Bay"
},
{
"tag": "20",
"title": "20-Cliffside"
},
{
"tag": "21",
"title": "21-Brimley"
},
{
"tag": "22",
"title": "22-Coxwell"
},
{
"tag": "23",
"title": "23-Dawes"
},
{
"tag": "24",
"title": "24-Victoria Park"
},
{
"tag": "25",
"title": "25-Don Mills"
},
{
"tag": "26",
"title": "26-Dupont"
},
{
"tag": "27",
"title": "27-Jane South"
},
{
"tag": "28",
"title": "28-Bayview South"
},
{
"tag": "29",
"title": "29-Dufferin"
},
{
"tag": "30",
"title": "30-High Park North"
},
{
"tag": "31",
"title": "31-Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
command | query | Required | `agencyList`, `routeList`, `routeConfig`, `predictions`, `vehicleLocations` or `schedule`. routeList |
a | query | Optional | Agency tag, from `agencyList`. Required by every command except that one. ttc |
r | query | Optional | Route tag, for `routeConfig` and `predictions`. 7 |
s | query | Optional | Stop tag, for predictions at a specific stop. 3372 |
stopId | query | Optional | Numeric stop id, an alternative to the route-and-stop pair. 3372 |
t | query | Optional | Epoch milliseconds for `vehicleLocations` — returns vehicles that moved since then. Send 0 for all. 0 |
Response fields
copyrightstring- Attribution string naming the agency. Display it — it is a condition of the feed.
routearray- Routes for the agency, each with `tag` and `title`.
route[].tagstring- Route identifier used in subsequent calls. Usually the public route number.
route[].titlestring- Display name, typically "number-name" such as "7-Bathurst".
(routeConfig) stop, direction, patharray- Stops with coordinates, direction groupings and the route's drawn shape.
(predictions) prediction[].minutes / seconds / epochTimestring- Arrival estimate in three units. All are strings, even the numeric ones.
(predictions) isDeparture / affectedByLayoverstring- Whether the prediction is a departure and whether a layover makes it unreliable.
(vehicleLocations) vehicle[].lat, lon, heading, secsSinceReportstring- Live vehicle position, heading and how stale the fix is.
What you can build with the NextBus (Umo IQ) API
- Build one arrival-prediction integration covering many agencies
- Show live bus positions on a campus or city map
- Drive a stop-level countdown display
- Compare service patterns across several agencies with one codebase
- Prototype a transit app before negotiating agency-specific access
Common errors and how to fix them
Arithmetic on prediction times fails
Every numeric value in the feed is a string.
Fix: Cast `minutes`, `seconds` and `epochTime` before use. The feed's XML heritage means nothing is typed.
An array is sometimes an object
Single-element collections collapse into a bare object rather than a one-element array.
Fix: Normalise on ingest — wrap anything that is not already an array. This produces bugs that only appear on quiet routes.
Unknown agency tag
The agency is not on this feed, or its tag differs from its public name.
Fix: Call `command=agencyList` first. Tags are short and lowercase, and rarely match the agency's branding.
Predictions marked affectedByLayover
The vehicle is scheduled to wait at a terminus, so the prediction is a timetable value.
Fix: Show these differently, or suppress them. They are far less reliable than a genuine in-motion prediction.
NextBus (Umo IQ) API — frequently asked questions
Is the NextBus API free?
Yes, free with no key or account. It is a legacy public feed maintained by Umo IQ, and the historical nextbus.com host now redirects to retro.umoiq.com.
Which agencies are covered?
Dozens across North America, from large systems like the Toronto Transit Commission down to university shuttles. Call `command=agencyList` for the current list — agencies are added and removed over time.
How do I get JSON instead of XML?
Use the `publicJSONFeed` path rather than `publicXMLFeed`. The parameters are identical; only the serialisation differs, and the JSON still carries the XML structure's fingerprints.
How accurate are the predictions?
They are generated from live vehicle positions and are generally good within a few minutes. Predictions flagged `affectedByLayover` are timetable-derived rather than measured, and should be treated with more caution.
Tools that pair with this API
JSON Formatter
Format, beautify and minify JSON online with 2-space, 4-space or tab indentation. Sort keys alphabetically and catch syntax errors instantly — free and private.
XML to JSON Converter
Convert XML to JSON online. Elements become objects, attributes are prefixed with @, text is preserved, and parse errors are reported clearly — in-browser.
Timestamp Converter
Convert timestamps to human-readable dates and dates back to timestamps. Auto-detects seconds vs milliseconds, shows local, UTC and ISO 8601 formats.
NextBus (Umo IQ) is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.