openapi: 3.2.0
info:
title: Umo IQ Public Feed API
version: '1.24'
summary: Cubic Transportation Systems' anonymous real-time transit feed (formerly the NextBus Public XML Feed).
description: The Umo IQ Public Feed provides transit agency configuration (agencies, routes, stops, directions, paths), arrival/departure predictions, schedules, active service messages and live vehicle locations for the agencies Cubic's Umo IQ serves.
termsOfService: https://retro.umoiq.com/xmlFeedDocs/NextBusXMLFeed.pdf
contact:
name: Umo IQ Support (Cubic Transportation Systems)
email: umoiq.support@cubic.com
url: https://retro.umoiq.com/
x-license-note: The PDF's LICENSE AGREEMENT grants Umo IQ customers a non-exclusive licence to use the feed free of charge, provides no support outside written contracts, and reserves the right to terminate or limit the feed to any user at any time.
servers:
- url: https://retro.umoiq.com/service
description: Umo IQ public feed (production). Formerly http://webservices.nextbus.com/service.
security: []
tags:
- name: Public Feed
description: The command-driven public feed, in XML and JSON forms.
paths:
/publicXMLFeed:
get:
tags:
- Public Feed
operationId: getPublicXmlFeed
summary: Run a public feed command and receive XML
description: 'Executes one of the nine documented feed commands and returns XML. The `command` parameter selects the operation; the remaining query parameters are read only by the commands that use them (see each parameter''s description). Polling commands (`vehicleLocations`, `predictions`) should be called at most once every 10 seconds. Send `Accept-Encoding: gzip, deflate` to receive compressed responses (50-85% smaller).'
parameters:
- $ref: '#/components/parameters/command'
- $ref: '#/components/parameters/agency'
- $ref: '#/components/parameters/route'
- $ref: '#/components/parameters/stopTag'
- $ref: '#/components/parameters/stopId'
- $ref: '#/components/parameters/routeTag'
- $ref: '#/components/parameters/stops'
- $ref: '#/components/parameters/vehicle'
- $ref: '#/components/parameters/time'
- $ref: '#/components/parameters/useShortTitles'
- $ref: '#/components/parameters/terse'
- $ref: '#/components/parameters/verbose'
responses:
'200':
description: Always HTTP 200. The `
` root carries a `copyright` attribute and one of the per-command payloads below, or an `` element.
headers:
Access-Control-Allow-Origin:
description: Observed as `*` on every response (2026-09-19).
schema:
type: string
content:
text/xml:
schema:
$ref: '#/components/schemas/XmlBody'
examples:
agencyList:
summary: command=agencyList
value: "\n \n\n"
error:
summary: Unknown command
value: "\n \"bogus\" is an unknown command.\n\n"
/publicJSONFeed:
get:
tags:
- Public Feed
operationId: getPublicJsonFeed
summary: Run a public feed command and receive JSON
description: The JSON rendering of the same feed. Accepts exactly the commands and parameters of `/publicXMLFeed`. Every value is serialised as a string (numbers and booleans included), and an element that occurs once is rendered as an object where a repeated element is rendered as an array, so clients must accept both shapes. Documented in the PDF only by reference; the `/publicJSONFeed` path itself was confirmed live on 2026-09-19.
parameters:
- $ref: '#/components/parameters/command'
- $ref: '#/components/parameters/agency'
- $ref: '#/components/parameters/route'
- $ref: '#/components/parameters/stopTag'
- $ref: '#/components/parameters/stopId'
- $ref: '#/components/parameters/routeTag'
- $ref: '#/components/parameters/stops'
- $ref: '#/components/parameters/vehicle'
- $ref: '#/components/parameters/time'
- $ref: '#/components/parameters/useShortTitles'
- $ref: '#/components/parameters/terse'
- $ref: '#/components/parameters/verbose'
responses:
'200':
description: Always HTTP 200. An object with `copyright` plus one of the per-command payload keys (`agency`, `route`, `predictions`, `vehicle`, `lastTime`) or an `Error` member.
headers:
Access-Control-Allow-Origin:
description: Observed as `*` on every response (2026-09-19).
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/JsonBody'
examples:
agencyList:
summary: command=agencyList
value:
copyright: All data copyright agencies listed below and Umo IQ 2026.
agency:
- tag: ttc
title: Toronto Transit Commission
shortTitle: Toronto TTC
regionTitle: Ontario
vehicleLocation:
summary: command=vehicleLocation&a=ttc&v=4592
value:
copyright: All data copyright Toronto Transit Commission 2026.
vehicle:
routeTag: '501'
predictable: 'true'
heading: '253'
speedKmHr: '9'
lon: '-79.3907082'
id: '4592'
dirTag: 501_1_501A
lat: '43.6499993'
secsSinceReport: '3'
error:
summary: Unknown command
value:
copyright: All data copyright Toronto Transit Commission 2026.
Error:
shouldRetry: 'false'
content: '"bogus" is an unknown command.'
components:
parameters:
command:
name: command
in: query
required: true
description: 'The feed command to run. `agencyList` needs no other parameter; every other command requires `a`. routeConfig: optional `r` (all routes, max 100, when omitted), `terse`, `verbose`. predictions: `stopId` (optionally with `routeTag`) OR `r` + `s`. predictionsForMultiStops: `stops` repeated. schedule: `r`. messages: optional `r` repeated. vehicleLocations: `r` + `t`. vehicleLocation: `v`.'
schema:
type: string
enum:
- agencyList
- routeList
- routeConfig
- predictions
- predictionsForMultiStops
- schedule
- messages
- vehicleLocations
- vehicleLocation
stops:
name: stops
in: query
required: false
description: For `predictionsForMultiStops`. Repeat once per stop as `|` (e.g. `stops=501|472&stops=501|7813`). Maximum 150 stops per route.
style: form
explode: true
schema:
type: array
items:
type: string
stopId:
name: stopId
in: query
required: false
description: Numeric stop ID from `routeConfig`, used by `predictions` to get predictions for every route serving the stop. Not every agency assigns stop IDs.
schema:
type: string
routeTag:
name: routeTag
in: query
required: false
description: Optional route filter for `predictions` when using `stopId`.
schema:
type: string
vehicle:
name: v
in: query
required: false
description: Vehicle id for `vehicleLocation`.
schema:
type: string
stopTag:
name: s
in: query
required: false
description: Stop tag from `routeConfig`, used with `r` by `predictions`. Alphanumeric; may carry `_IB`, `_OB` or `_ar` suffixes for larger agencies.
schema:
type: string
useShortTitles:
name: useShortTitles
in: query
required: false
description: When `true`, prediction commands return short agency/route/direction/stop titles where the agency defines them.
schema:
type: boolean
route:
name: r
in: query
required: false
description: Route tag from `routeList`. Required by `schedule` and `vehicleLocations`; optional for `routeConfig` (omit for all routes, limited to 100 per request) and `messages` (repeat `r` for several routes); used with `s` by `predictions`.
schema:
type: string
example: '501'
agency:
name: a
in: query
required: false
description: Agency tag from `agencyList` (e.g. `ttc`). Required by every command except `agencyList`.
schema:
type: string
example: ttc
verbose:
name: verbose
in: query
required: false
allowEmptyValue: true
description: Flag for `routeConfig` — include directions with `useForUI="false"`.
schema:
type: boolean
terse:
name: terse
in: query
required: false
allowEmptyValue: true
description: Flag for `routeConfig` — omit path (map polyline) data, roughly halving the payload.
schema:
type: boolean
time:
name: t
in: query
required: false
description: For `vehicleLocations`. Epoch time in milliseconds of the previous call's `lastTime`; `0` returns the last 15 minutes. Maximum timespan 5 minutes.
schema:
type: string
schemas:
JsonBody:
type: object
description: The JSON rendering. All scalar values are strings. A member that would hold a single element is an object; a repeated element is an array.
properties:
copyright:
type: string
Error:
oneOf:
- $ref: '#/components/schemas/Error'
- type: array
items:
$ref: '#/components/schemas/Error'
agency:
type: array
items:
$ref: '#/components/schemas/Agency'
route:
oneOf:
- $ref: '#/components/schemas/Route'
- type: array
items:
$ref: '#/components/schemas/Route'
predictions:
oneOf:
- $ref: '#/components/schemas/Predictions'
- type: array
items:
$ref: '#/components/schemas/Predictions'
vehicle:
oneOf:
- $ref: '#/components/schemas/Vehicle'
- type: array
items:
$ref: '#/components/schemas/Vehicle'
lastTime:
$ref: '#/components/schemas/LastTime'
ScheduleStop:
type: object
properties:
tag:
type: string
xml:
attribute: true
content:
type: string
description: Stop title (element text in XML).
Agency:
type: object
properties:
tag:
type: string
description: Agency tag, the `a` parameter for every other command.
xml:
attribute: true
title:
type: string
xml:
attribute: true
shortTitle:
type: string
description: Only present when it differs from `title`.
xml:
attribute: true
regionTitle:
type: string
xml:
attribute: true
LastTime:
type: object
description: Returned by `vehicleLocations`; feed `time` back as `t` on the next poll.
properties:
time:
type: string
description: Epoch milliseconds of the newest location returned.
xml:
attribute: true
Direction:
type: object
properties:
tag:
type: string
xml:
attribute: true
title:
type: string
xml:
attribute: true
name:
type: string
description: Simplified grouping name such as Inbound/Outbound; not provided by every agency.
xml:
attribute: true
branch:
type: string
description: Observed on Toronto TTC route configurations (2026-09-19).
xml:
attribute: true
useForUI:
type: string
enum:
- 'true'
- 'false'
xml:
attribute: true
stop:
type: array
description: Ordered stop references (`tag` only).
items:
type: object
properties:
tag:
type: string
xml:
attribute: true
Route:
type: object
description: Route summary (`routeList`), full configuration (`routeConfig`), schedule table (`schedule`) or message group (`messages`, where `tag="all"` holds system-wide messages).
properties:
tag:
type: string
xml:
attribute: true
title:
type: string
xml:
attribute: true
shortTitle:
type: string
xml:
attribute: true
color:
type: string
description: Route colour, hex without `#` (routeConfig).
xml:
attribute: true
oppositeColor:
type: string
description: Contrasting colour, black or white (routeConfig).
xml:
attribute: true
latMin:
type: string
xml:
attribute: true
latMax:
type: string
xml:
attribute: true
lonMin:
type: string
xml:
attribute: true
lonMax:
type: string
xml:
attribute: true
scheduleClass:
type: string
description: Current schedule class, e.g. a seasonal schedule name (schedule).
xml:
attribute: true
serviceClass:
type: string
description: Service day class the schedule applies to (schedule).
xml:
attribute: true
direction:
description: Direction list (routeConfig) or the direction name string (schedule).
oneOf:
- type: string
- type: array
items:
$ref: '#/components/schemas/Direction'
stop:
type: array
items:
$ref: '#/components/schemas/Stop'
path:
type: array
description: Map polylines (routeConfig, unless `terse`).
items:
$ref: '#/components/schemas/Path'
header:
type: object
description: Schedule column header — the ordered stops (schedule).
properties:
stop:
type: array
items:
$ref: '#/components/schemas/ScheduleStop'
tr:
type: array
description: Schedule rows, one per block (schedule).
items:
$ref: '#/components/schemas/ScheduleRow'
message:
type: array
items:
$ref: '#/components/schemas/Message'
ScheduleRow:
type: object
xml:
name: tr
properties:
blockID:
type: string
xml:
attribute: true
stop:
type: array
items:
type: object
properties:
tag:
type: string
xml:
attribute: true
epochTime:
type: string
description: Scheduled arrival in epoch milliseconds; `-1` when the trip does not serve the stop.
xml:
attribute: true
content:
type: string
description: Time as HH:mm:ss, or `--` when not served.
Error:
type: object
description: Returned in place of a payload when the request is bad or the agency server is initialising.
properties:
shouldRetry:
type: string
description: '`true` when the server was only initialising — retry after 10 seconds. `false` means the URL itself is wrong and retrying will not help.'
enum:
- 'true'
- 'false'
xml:
attribute: true
content:
type: string
description: Human-readable message (element text in XML; `content` member in JSON).
Prediction:
type: object
properties:
seconds:
type: string
xml:
attribute: true
minutes:
type: string
description: Display value; round seconds down.
xml:
attribute: true
epochTime:
type: string
description: Predicted time in epoch milliseconds.
xml:
attribute: true
isDeparture:
type: string
enum:
- 'true'
- 'false'
xml:
attribute: true
block:
type: string
xml:
attribute: true
dirTag:
type: string
xml:
attribute: true
tripTag:
type: string
xml:
attribute: true
branch:
type: string
description: Toronto TTC only.
xml:
attribute: true
vehicle:
type: string
description: Observed on TTC predictions (2026-09-19); not in the PDF.
xml:
attribute: true
affectedByLayover:
type: string
description: Only present when true.
xml:
attribute: true
isScheduleBased:
type: string
description: Only present when true.
xml:
attribute: true
delayed:
type: string
description: Only present when true; a `slowness` attribute may accompany it (experimental).
xml:
attribute: true
Stop:
type: object
properties:
tag:
type: string
description: Unique alphanumeric stop identifier.
xml:
attribute: true
title:
type: string
xml:
attribute: true
shortTitle:
type: string
xml:
attribute: true
lat:
type: string
xml:
attribute: true
lon:
type: string
xml:
attribute: true
stopId:
type: string
description: Optional numeric ID; may refer to several physical stops (bus bays).
xml:
attribute: true
Vehicle:
type: object
properties:
id:
type: string
xml:
attribute: true
routeTag:
type: string
xml:
attribute: true
dirTag:
type: string
xml:
attribute: true
lat:
type: string
xml:
attribute: true
lon:
type: string
xml:
attribute: true
secsSinceReport:
type: string
xml:
attribute: true
predictable:
type: string
enum:
- 'true'
- 'false'
xml:
attribute: true
heading:
type: string
description: Degrees 0-360; negative when unavailable.
xml:
attribute: true
speedKmHr:
type: string
xml:
attribute: true
Predictions:
type: object
properties:
agencyTitle:
type: string
xml:
attribute: true
routeTag:
type: string
xml:
attribute: true
routeCode:
type: string
xml:
attribute: true
routeTitle:
type: string
xml:
attribute: true
stopTag:
type: string
xml:
attribute: true
stopTitle:
type: string
xml:
attribute: true
dirTitleBecauseNoPredictions:
type: string
description: Present only when there are no predictions, so a UI can still show the direction.
xml:
attribute: true
direction:
type: array
items:
type: object
properties:
title:
type: string
xml:
attribute: true
prediction:
type: array
description: At most 5 predictions per direction.
items:
$ref: '#/components/schemas/Prediction'
message:
type: array
items:
type: object
properties:
text:
type: string
xml:
attribute: true
Path:
type: object
properties:
point:
type: array
items:
type: object
properties:
lat:
type: string
xml:
attribute: true
lon:
type: string
xml:
attribute: true
Message:
type: object
properties:
id:
type: string
xml:
attribute: true
creator:
type: string
xml:
attribute: true
sendToBuses:
type: string
xml:
attribute: true
startBoundary:
type: string
xml:
attribute: true
startBoundaryStr:
type: string
xml:
attribute: true
endBoundary:
type: string
xml:
attribute: true
endBoundaryStr:
type: string
xml:
attribute: true
text:
type: string
textSecondaryLanguage:
type: string
phonemeText:
type: string
smsText:
type: string
priority:
type: string
description: 1 (highest) to 5; Agence metropolitaine de transport only.
routeConfiguredForMessage:
type: array
items:
type: object
properties:
tag:
type: string
xml:
attribute: true
stop:
type: array
items:
$ref: '#/components/schemas/Stop'
interval:
type: array
items:
type: object
properties:
startDay:
type: string
description: 1 = Monday.
xml:
attribute: true
startTime:
type: string
description: Seconds past midnight.
xml:
attribute: true
endDay:
type: string
xml:
attribute: true
endTime:
type: string
xml:
attribute: true
XmlBody:
type: object
description: The `` root element of every XML response.
xml:
name: body
properties:
copyright:
type: string
xml:
attribute: true
Error:
$ref: '#/components/schemas/Error'
agency:
type: array
description: Returned by `agencyList`.
items:
$ref: '#/components/schemas/Agency'
route:
type: array
description: Returned by `routeList` (tag/title only), `routeConfig`, `schedule` and `messages`.
items:
$ref: '#/components/schemas/Route'
predictions:
type: array
description: Returned by `predictions` and `predictionsForMultiStops`.
items:
$ref: '#/components/schemas/Predictions'
vehicle:
type: array
description: Returned by `vehicleLocations` and `vehicleLocation`.
items:
$ref: '#/components/schemas/Vehicle'
lastTime:
$ref: '#/components/schemas/LastTime'
externalDocs:
description: Public XML Feed documentation (PDF, revision 1.24)
url: https://retro.umoiq.com/xmlFeedDocs/NextBusXMLFeed.pdf
x-generated-from: documentation
x-authored-by: API Evangelist
x-apievangelist:
method: generated
generated: '2026-09-19'
first_party: false
source: https://retro.umoiq.com/xmlFeedDocs/NextBusXMLFeed.pdf
source_revision: Public XML Feed revision 1.24, 18 May 2021
note: Cubic Transportation Systems publishes this feed as a PDF, not as a machine-readable contract. This document was written by API Evangelist from that PDF and then checked command-by-command against the live host on 2026-09-19 (see x-evidence). Nothing here is asserted that the PDF does not document or the host did not answer.
ownership: retro.umoiq.com's footer reads "Cubic Transportation Systems, Inc. Proprietary Information" and the PDF routes support to umoiq.support@cubic.com.
x-evidence:
verified: '2026-09-19'
method: probed
host: retro.umoiq.com
agency_used: ttc
commands:
agencyList: 200
routeList: 200
routeConfig: 200
predictions: 200
predictionsForMultiStops: 200
schedule: 200
messages: 200
vehicleLocations: 200
vehicleLocation: 200
forms:
- /publicXMLFeed
- /publicJSONFeed
observed_headers:
Access-Control-Allow-Origin: '*'
Server: Apache
Vary: Accept-Encoding
no_rate_limit_headers: true