BYTETOOLS

myTTC API

Free Toronto TTC departures API with no key: upcoming streetcar, bus and subway times for any station or stop, grouped by route with branch names. Tested example included.

No API key requiredHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-21

What is the myTTC API?

myTTC is a free, key-free API returning upcoming departures for Toronto Transit Commission stops and stations. Appending `.json` to any station page URL returns its stops, the routes serving each one, and the next departures with both a display time and a Unix timestamp.

The design is charmingly direct: every page on the site has a JSON twin, so `myttc.ca/finch_station` becomes `myttc.ca/finch_station.json` and you have an API. Stop identifiers are readable slugs rather than opaque numbers, which makes URLs guessable and debugging much easier than with a conventional transit feed.

Where it earns its keep is branch handling. Toronto routes split constantly — the 36 Finch West runs as 36A, 36B and 36D to different destinations — and this API exposes that in the `shape` field of every departure, so a passenger sees which branch is actually coming rather than three identical rows labelled "36". Departure times are given twice, once as a compact display string like "8:03a" and once as `departure_timestamp` in Unix seconds; use the latter for anything computed.

Quick facts

Base URL
https://myttc.ca
Authentication
No API key or account. Community-run service, not affiliated with the Toronto Transit Commission.
Rate limit
No published quota. It is a volunteer-run site, so poll gently — once a minute per stop is plenty.
Pricing
Free.
CORS
Not enabled — call it from your server
Official docs
Read the docs

How to use the myTTC 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. Fetch upcoming departures for a Toronto station

GET https://myttc.ca/finch_station.json

curl
curl 'https://myttc.ca/finch_station.json'
JavaScript (fetch)
const res = await fetch("https://myttc.ca/finch_station.json");
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://myttc.ca/finch_station.json", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
{
  "name": "Finch Station",
  "uri": "finch_station",
  "stops": [
    {
      "agency": "Toronto Transit Commission",
      "uri": "finch_station_bishop_entrance",
      "name": "Finch Station Bishop Entrance",
      "routes": []
    },
    {
      "agency": "Toronto Transit Commission",
      "uri": "finch_station_bus_bay",
      "name": "Finch Station Bus Bay",
      "routes": [
        {
          "route_group_id": "32",
          "uri": "36_finch_west",
          "name": "36 Finch West",
          "stop_times": [
            {
              "service_id": 1,
              "departure_time": "8:03a",
              "departure_timestamp": 1787299389,
              "shape": "36A Finch West To Kipling"
            },
            {
              "service_id": 1,
              "departure_time": "8:03a",
              "departure_timestamp": 1787299389,
              "shape": "36B Finch West To Humberwood"
            },
            {
              "service_id": 1,
              "departure_time": "8:09a",
              "departure_timestamp": 1787299749,
              "shape": "36D Finch West To Weston Road And Milvan"
            },
            {
              "service_id": 1,
              "departure_time": "8:11a",
              "departure_timestamp": 1787299869,
              "shape": "36A Finch West To Kipling"
            },
            {
              "service_id": 1,
              "departure_time": "8:11a",
              "departure_timestamp": 1787299869,
              "shape": "36B Finch West To Humberwood"
            },
            {
              "service_id": 1,

Parameters

ParameterTypeRequiredDescription
(station slug)pathRequired`/{station_slug}.json` returns the station with its stops and departures. finch_station
(stop slug)pathOptionalA specific stop within a station, also with `.json` appended. finch_station_bus_bay
(route)pathOptionalRoute pages such as `/36_finch_west.json` return the route's stops. 36_finch_west

Response fields

name / uristring
Station name and its slug, which is the identifier used in URLs.
stopsarray
Individual stops within the station — bus bays, entrances, platforms.
stops[].agencystring
Operating agency, normally "Toronto Transit Commission".
stops[].routesarray
Routes serving this stop. Empty for entrances with no service of their own.
routes[].namestring
Route name including its number, for example "36 Finch West".
routes[].route_group_idstring
Groups branches of the same route together.
stop_times[].departure_timestring
Display form such as "8:03a". For presentation only.
stop_times[].departure_timestampinteger
Unix seconds for the same departure. Use this for any calculation.
stop_times[].shapestring
The specific branch and destination, such as "36A Finch West To Kipling" — the field that distinguishes branches.
stop_times[].service_idinteger
Service calendar identifier, distinguishing weekday from weekend patterns.

What you can build with the myTTC API

  • Show the next departures at a Toronto station
  • Distinguish route branches so passengers board the right vehicle
  • Drive a personal or office departure display
  • Alert when the next vehicle to a specific destination is due
  • Explore TTC stop and route structure with human-readable slugs

Common errors and how to fix them

404 on a station slug

The slug is wrong.

Fix: Slugs are lowercase with underscores — `finch_station`, not `Finch Station`. Browse the site to confirm one before hard-coding it.

Departures for a branch you cannot use

Toronto routes split into lettered branches serving different destinations.

Fix: Read the `shape` field and filter on it. Showing "36" three times without the branch is actively misleading.

Times parse into the wrong day

`departure_time` is a compact display string with no date.

Fix: Use `departure_timestamp`, which is unambiguous Unix seconds. Reserve the display string for rendering.

Empty routes array on a stop

Some stops are entrances or exits with no service of their own.

Fix: Skip stops whose `routes` array is empty rather than rendering a blank row.

myTTC API — frequently asked questions

Is the myTTC API free?

Yes, free with no key or account. It is a community-run service rather than an official TTC product, so keep polling light.

How do I find a station identifier?

Slugs are the URL segments on myttc.ca itself, lowercase with underscores. Any page becomes JSON by appending `.json`, which makes identifiers easy to discover by browsing.

What does the shape field tell me?

Which branch of a route a departure belongs to, with its destination — "36A Finch West To Kipling". Toronto routes branch heavily, so this is what stops a passenger boarding a vehicle going somewhere else.

Is this an official TTC API?

No. It is an independent community project. The TTC's own real-time data flows through NextBus and GTFS feeds, which are also open but structured very differently.

Tools that pair with this API

myTTC 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.