Open source

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

Procurement Spending

Nshipyard Canada · Project 09

Who gets the city's money.

Toronto publishes every awarded contract, but the same vendor hides behind 4,240 different spellings, and three award values are phone numbers typed into the amount field. This project resolves the names into 4,082 canonical vendors and quarantines the defects: $21.5B in awards from 2012 to 2026, searchable by vendor, split between competitive and non-competitive.

$21.5B

in awarded contracts and consulting spend, 2012-2026, across 13,084 records

4,082

canonical vendors resolved from 4,240 raw name spellings, with 174 fuzzy merges logged for audit

20.8%

of all spend captured by the top 10 vendors

90.1%

of spend awarded competitively; non-competitive contracts are 8.5%

Explorer

Search 4,082 vendors.

Search by vendor name above to browse the canonical vendor file. Each vendor merges every spelling the source data used for it.

Methodology

How the vendor file was built, and where it is weak.

  1. 01

    Sources: three City of Toronto open-data packages retrieved 2026-10-08 from the CKAN datastore: awarded contracts (7,755 records), non-competitive contracts (2,937), and consulting expenditures 2012-2024 (3,187 rows across four workbooks). 13,084 records in total.

  2. 02

    Vendor entity resolution is deterministic and documented: names are uppercased, punctuation stripped, legal suffixes (Ltd, Inc, Corp and 12 more) dropped, then exact-matched; a fuzzy pass merges keys with difflib ratio 0.93 or higher sharing a first token. 4,240 raw spellings became 4,082 canonical vendors; all 174 merges are logged in vendor_merges.json.

  3. 03

    Three award records carried bare 10-digit integers in the amount field (9054510208, 4163927134, 1898820680): the pattern of phone numbers, not credible awards. They are quarantined and excluded from every total; without this the headline spend would be overstated by $15.1B.

  4. 04

    Amounts are award or expenditure values as published, not audited final payments. Multi-year awards appear in full in the award year, so year totals are commitment timing, not cash flow.

  5. 05

    Toronto publishes no commodity codes on award records. High Level Category is the source's own coarse coding. GSIN hints are keyword heuristics against the federal table with 1.8% coverage; they are suggestions, never classifications.

  6. 06

    The legacy wx.toronto.ca award postings were unreachable at build time, so the CKAN datastore dumps are the complete source used. Capital and procurement pipeline files describe planned work, not spending, and are excluded from all totals.

  7. 07

    Vendor identity has no business-number key in the source data, so merges are name-based and conservative. The variant table is the stable join key; vendor IDs regenerate on each rebuild.

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/vendor/search?q=furfari&limit=3

Search canonical vendors by name, ranked by total spend

{
  "q": "furfari",
  "limit": 3,
  "total": 1,
  "hits": [
    {
      "id": "V00001",
      "n": "Furfari Paving Co. Ltd.",
      "vc": 4, "a": 58, "s": 781673999.74,
      "fy": "2012", "ly": "2018"
    }
  ]
}
Try it →

GET

/api/v1/vendor/lookup?vendor_id=V00001

Full vendor record: spend, awards, merged name variants, top awards

{
  "id": "V00001",
  "n": "Furfari Paving Co. Ltd.",
  "s": 781673999.74, "a": 58,
  "variants": ["Furfari Paving Co. Ltd.", "FURFARI PAVING CO LTD"],
  "awards": [ { "a": 600600000, "y": "2016",
    "k": "competitive", "c": "Construction Services" } ]
}
Try it →

GET

/api/v1/spend/summary

Spend aggregates: top-10 share, competitive split, by year, category, division, reasons

{ "meta": { "total_spend": 21520000000, … },
  "top10_share_pct": 20.8,
  "by_kind": { "competitive": { "share_pct": 90.1 }, … },
  "top_vendors": [ … ] }
Try it →

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 Procurement Spending MCP server so I can query it from here.
1. Run: claude mcp add --transport http toronto-procurement https://this-site.example/mcp
2. Run `claude mcp list` to confirm it connected.
3. Search vendors for "paving" and show me the top result, and show me the result.

Data

Take the files.

The entity-resolution table and the full aggregate summary, MIT licensed, as CSV and JSON.

vendor_variants.csv

4,240 raw vendor spellings mapped to 4,082 canonical vendor IDs

Download
summary.json

Spend aggregates by year, kind, category, division, and reason

Download