BYTETOOLS

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.

No API key requiredCORS enabledHTTPSFree tier

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
curl 'https://retro.umoiq.com/service/publicJSONFeed?command=routeList&a=ttc'
JavaScript (fetch)
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);
Python (requests)
import requests

res = requests.get("https://retro.umoiq.com/service/publicJSONFeed?command=routeList&a=ttc", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
{
  "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

ParameterTypeRequiredDescription
commandqueryRequired`agencyList`, `routeList`, `routeConfig`, `predictions`, `vehicleLocations` or `schedule`. routeList
aqueryOptionalAgency tag, from `agencyList`. Required by every command except that one. ttc
rqueryOptionalRoute tag, for `routeConfig` and `predictions`. 7
squeryOptionalStop tag, for predictions at a specific stop. 3372
stopIdqueryOptionalNumeric stop id, an alternative to the route-and-stop pair. 3372
tqueryOptionalEpoch 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

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.