Open source

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

Parcel Spine

Nshipyard Canada · Project 04

One stable ID for every Toronto property.

Property Boundaries, the City of Toronto's open parcel dataset, keys each polygon by an integer PARCELID. This spine joins those polygons to Address Points from the Toronto One Address Repository, the city's address-point dataset, and emits one row per parcel: TOP-<PARCELID>, with area, ward, neighbourhood, and addresses attached.

…

parcels in the spine, one row per city PARCELID

…

address points matched to a parcel

…

stacked parcels, each carrying 10 or more addresses

…

sample rows: 1,000 per ward, plus 684 unplaced

Explorer

Find a parcel by address or ID.

Type an address fragment, a TOP- ID, or a ward number above. The table draws from the 25,684-row sample: 1,000 parcels per ward, plus 684 parcels the build could not place in a ward.

Showcase

What the raw files cannot say.

…

Methodology

How the spine is built.

The TOP-<PARCELID> ID scheme

TOP stands for Toronto Open Parcel, and PARCELID is the city's own integer parcel key from Property Boundaries, the city's open parcel dataset. The ID stays stable as long as the city keeps PARCELID stable across data vintages; if the city renumbers a parcel, the TOP id changes with it.

Approximate areas

Areas are computed with an equirectangular projection centred on Toronto, which is fast but not survey-grade; treat area_m2 as approximate. Where the city published its own figure, it is kept in stated_area.

Build notes

    Built October 8, 2026 from the City of Toronto's open data portal.

    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/parcel/search?q=Queen+St+W&ward=10

    Search by address text or parcel ID, filtered to one ward

    Try it →
    {
      "query": "Queen St W",
      "ward": "10",
      "total": 65,
      "parcels": [
        { "parcel_id": "TOP-10572318", "ward": "10",
          "address_count": 3, "area_m2": 292.8, … }
      ]
    }
    GET/api/v1/parcel/lookup/TOP-10572318

    Full record: lineage, addresses, stacked flag

    Try it →
    {
      "parcel_id": "TOP-10572318",
      "feature_type": "CONDO",
      "area_m2": 292.8,
      "ward": "10",
      "hood158_name": "Kensington-Chinatown",
      "address_count": 3,
      "source_rows": 1,
      "flag_stacked": false,
      "lineage": "property-boundaries:526006"
    }
    GET/api/v1/parcel/summary

    Full-build totals, breakdowns, and methodology notes

    Try it →
    { "total_parcels": 498477,
      "addresses_matched": 525085,
      "stacked_parcels_ge10_addresses": 947,
      "size_buckets_m2": { … }, … }

    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 Parcel Spine MCP server so I can query it from here.
    1. Run: claude mcp add --transport http toronto-parcel https://this-site.example/mcp
    2. Run `claude mcp list` to confirm it connected.
    3. Look up the parcel at 136 Monarch Park Ave, and show me the result.

    Data

    Take the sample.

    25,684 rows: 1,000 per ward plus 684 unplaced, MIT licensed. The full spine is too large for the repo, so the sample below powers every page on this site.

    parcel_spine_sample.csv

    25,684 sampled parcels with addresses, wards, and lineage

    Download
    summary.json

    Totals, breakdowns, and build notes for the full spine

    Download