Open source

An open-source civic project. Not affiliated with the Government of Canada or the City of Toronto.

311 Taxonomy

Nshipyard Canada · Project 05

Every 311 request, classified.

Toronto's 311 line takes millions of service requests a year, logged as 952 free-text request types across 9 city divisions. This is the versioned taxonomy: division, section, request type, with counts, plus a ward-by-ward backlog analysis built from 2,225,151 requests filed between 2022 and 2026.

…

service requests analyzed, filed 2022 through 2026

…

distinct request types normalized into one hierarchy

…

city divisions, from Solid Waste to Toronto Water

…

requests from 2022-2024 still open: the measurable backlog

Explorer

Search 952 request types.

Search above, or pick a division, to browse the taxonomy. Pick a ward below for its backlog profile.

Ward backlog

Pick a ward to see its backlog rate, income, and request mix.

Showcase

Does 311 fix rich neighbourhoods faster?

The open data has no completion dates, so nobody can compute true time-to-close from it. What can be measured is the backlog: requests filed in 2022-2024 that were still open in the October 2026 extract. Correlated against 2021 Census median household income by ward, the relationship is essentially flat: r = 0.18. What predicts backlog is the kind of work, not the neighbourhood's income. Parks tree work sits open for years; solid waste closes almost everything.

Backlog rate by ward

Share of 2022-2024 requests still open (New or In Progress), with 2020 median household income. 25 wards.

Backlog rate by division

The division matters more than the ward. Parks requests are mostly tree work.

Income vs backlog, by ward

Each dot is a ward. The cloud is flat: income does not predict backlog.

What this cannot say

Backlog is a proxy, not a measurement of speed. A request can sit open for legitimate reasons: seasonal tree work, multi-year capital projects, or duplicate reports. The correlation of 0.18 is descriptive, not causal, and it is weak enough to treat as no relationship. Ward income is a 2021 Census median; it says nothing about who filed each request.

Methodology

How the taxonomy was built.

The slice

The City of Toronto open data file '311 Service Requests - Customer Initiated', yearly extracts for 2022, 2023, 2024, 2025, and 2026, retrieved 2026-10-08. 2,225,151 rows. Request types were normalized for case and whitespace only; the wording is the City's own. Each type got a stable code: T311-D for divisions, T311-S for sections, T311-R for request types.

The backlog definition

A request counts as backlog if it was created between 2022 and 2024 and was still in 'New' or 'In Progress' status in the October 2026 extract. 2025 and 2026 are excluded as too recent to judge. 'Completed' and 'Closed' both count as resolved; 'Cancelled' is excluded as not actionable.

Notes and limits

    Built October 2026 from City of Toronto open data.

    For developers

    Query it from code, or from an agent.

    Three consumption paths, same canonical data. REST for applications, OpenAPI for integration, MCP tools over streamable HTTP for AI agents.

    Endpoints

    GET/api/v1/requests/taxonomy?q=pothole

    Search the 952-type taxonomy by text, filtered by division

    Try it →
    {
      "total": 2,
      "types": [
        { "code": "T311-R0007",
          "division": "Transportation Services",
          "type": "Road Pothole / Road Damage",
          "count": 35691, … }
      ]
    }
    GET/api/v1/requests/wards?code=10

    One ward: backlog rate, income, division mix

    Try it →
    {
      "ward_code": "10",
      "ward_name": "Spadina-Fort York",
      "backlog_rate": 0.1185,
      "median_household_income_2020": 89000,
      "top_division": "Municipal Licensing & Standards", … }
    GET/api/v1/requests/lookup?code=T311-R0007

    One taxonomy code: division, section, count, share

    Try it →
    {
      "code": "T311-R0007",
      "division": "Transportation Services",
      "section": "Road Operations",
      "count": 35691, "share": 0.016 }

    Connect your agent

    Put this data to work inside your AI tools.

    Pick your harness, copy the prompt, send it to your agent. Your agent runs the setup itself.

    Copy and send this to Claude Code

    Set up the Toronto 311 Taxonomy MCP server so I can query it from here.
    1. Run: claude mcp add --transport http toronto-311 https://this-site.example/mcp
    2. Run `claude mcp list` to confirm it connected.
    3. Look up taxonomy code T311-R0007 and tell me its division and count, and show me the result.

    Data

    Take the files.

    Versioned releases, MIT licensed. CSV for spreadsheets, JSON for applications.

    taxonomy.csv

    952 request types: division, section, code, count, share

    Download
    resolution_by_ward.csv

    25 wards: backlog rate, median income, division mix

    Download
    summary.json

    Totals, findings, and methodology notes

    Download