Open source

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

Parking Tickets

Nshipyard Canada · Project 06

What 50 million parking tickets look like on a map.

Toronto issues about 2.8 million parking tickets a year. The City publishes every ticket: date, time, infraction code, fine, and street address. This project geocodes three years of tickets (2023-2025) to wards and neighbourhoods, so enforcement patterns become visible instead of anecdotal.

Explorer

Search streets, neighbourhoods, wards, infractions.

Type a street name, a neighbourhood, a ward, or an infraction description. Counts come from the geocoded 2023-2025 slice.

The infraction codebook

Every infraction code in the slice, with its official description, ticket count, and average set fine. Toronto's parking rules arrive as unexplained numbers; this is the translation.

CodeDescriptionTicketsAvg fine

Showcase

The enforcement map.

Every geocoded ticket placed in its neighbourhood. Downtown wards absorb a share of enforcement far beyond their share of streets, and a handful of blocks do most of the work.

Fewer
More tickets (log scale)

The most-ticketed streets

Ticket counts by normalized street name, 2023-2025. One address can dominate a whole street.

    Tickets by hour of day

    Enforcement follows the workday: it climbs from 7h, peaks mid-morning, and falls off after 18h.

    Tickets by month

    Summer months run hotter than winter, year after year.

    Tickets by day of week

    Weekdays carry enforcement; Sundays are quiet.

    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/tickets/by_ward?ward=10

    Ticket stats for one ward

    {
      "ward": "10",
      "name": "Spadina-Fort York",
      "tickets": 811816,
      "fines": 62531325,
      "y2023": 286351, "y2024": 267802, "y2025": 257663
    }
    GET/api/v1/tickets/infractions?code=5

    One infraction code, documented

    {
      "code": "5",
      "desc": "PARK-SIGNED HWY-PROHIBIT DY/TM",
      "tickets": 769476,
      "avg_fine": 56.62
    }
    GET/api/v1/tickets/streets?q=king

    Most-ticketed streets matching a name

    { "count": 3, "streets": [
      { "street": "KING ST W", "tickets": 53753 }, … ] }

    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 Parking Tickets MCP server so I can query it from here.
    1. Run: claude mcp add --transport http toronto-parking https://this-site.example/mcp
    2. Run `claude mcp list` to confirm it connected.
    3. Get the ticket stats for ward 10 and tell me its yearly trend, and show me the result.

    Methodology

    How the tickets were placed on the map.

    • 1

      Slice: City of Toronto open data “Parking Tickets”, calendar years 2023-2025, retrieved 2026-10-08. About 2.8 million tickets a year.

    • 2

      Geocoding: each ticket's street address was matched to the City's Address Points (Municipal) file on house number plus normalized street name. The address point supplies the ward; the 158-model neighbourhood comes from a point-in-polygon join on official boundary geometries.

    • 3

      Match rate is reported on this page from the computed data. Tickets with no house number (street-only locations, intersections) cannot be address-matched and are counted as unmatched.

    • 4

      What this cannot answer: who was ticketed (tag numbers are masked), whether a ticket was paid or disputed, or why enforcement concentrates where it does. Density reflects where officers write tickets, not only where violations happen.

    Data

    Take the files.

    Versioned releases, MIT licensed. Aggregated CSVs; the per-ticket source files stay with the City's open data portal.

    tickets_by_ward.csvDownload
    tickets_by_neighbourhood158.csvDownload
    infraction_codebook.csvDownload
    top_streets.csvDownload