Open source

An open-source civic project. Not affiliated with the Government of Canada or Environment and Climate Change Canada.

Open NshipyardThe Facility Crosswalk

Open Nshipyard · Project P2

Which carbon emitters are also the worst toxic polluters.

Environment and Climate Change Canada runs two facility registries that share no published key. The Greenhouse Gas Reporting Program names 1,879 emitters for 2024. The National Pollutant Release Inventory tracks 24,553 polluters since 1993. This project links them: 1,422 anchor matches on self-reported NPRI IDs, entity resolution for the rest, quarantine for the ambiguous. The combined ranking is the first public answer to the headline question.

1,879

GHG-reporting facilities in 2024, each linked to the pollutant registry

75.7%

anchor-matched on self-reported NPRI IDs. No guessing.

249.8M t

of CO2 equivalent reported for 2024 by the linked facilities

124

more facilities recovered by name and address resolution

Explorer

Search the linked facilities.

Search above to browse the crosswalk. Each facility carries its 2024 GHG total beside its 2024 toxic releases and disposals, plus the match method and confidence tier.

Methodology

How the crosswalk was built, and where it is weak.

  1. 1

    Sources, both retrieved 2026-10-10 under the Open Government Licence - Canada: the NPRI bulk files for all years (ECCC dataset 40e01423-7728-429c-ac9d-2954385ccdfb, updated 2026-05-01): geolocations master with 24,553 facility records, plus 1993-2024 releases, disposals, and transfers quantity files. And the GHGRP emissions-by-gas file PDGES-GHGRP-GHGEmissionsGES-2004-Present (ECCC dataset a8ba14b7-7f23-462a-bdbb-83b0ef629823, updated 2026-05-27), 20,685 facility-year rows, of which 1,879 are 2024.

  2. 2

    Anchor matching: a GHGRP facility whose Facility NPRI ID is non-zero, non-blank, and present in the NPRI geolocations master is an anchored match, confidence high. 1,422 of 1,879 GHGRP facilities matched this way (75.7%).

  3. 3

    Entity resolution for the 457 unanchored facilities: names are uppercased, accents stripped, legal suffixes dropped, punctuation removed, then scored against NPRI facilities in the same province. A score of 0.90 or higher with coordinates within 25 km (when both sides publish them) becomes a resolved match, confidence high at 0.99+ and medium below. 124 facilities matched this way.

  4. 4

    Temp ID resolution: NPRI quantity files contain 3 facility IDs absent from the geolocations master. None resolved unambiguously to a single master record, so all 3 are quarantined and their quantities are excluded rather than guessed. The temp-ID problem is smaller than the registry documentation implies, at least in the current files.

  5. 5

    Quarantine: low-similarity near-matches, name matches whose coordinates disagree by more than 25 km, and temp IDs with multiple candidate masters are logged in quarantine.json and excluded from every ranking. A guess is worse than an unmatched row.

  6. 6

    Toxic totals: 2024 releases and disposals summed per facility in kilograms. Source units were tonnes (the large majority), kilograms, and grams. Grams of toxic equivalent (dioxins and furans) are excluded from the kilogram sums and counted separately because they are not a mass. NPRI disposals include tailings and waste rock, which dominate mine totals: the ranking treats contained disposal and environmental release identically by mass, which flatters mines and understates air toxics. Transfers for recycling are excluded pending a complete retrieval of the transfers bulk file.

  7. 7

    Limits: 2024 reporting year on both sides. GHGRP covers facilities emitting 10 kilotonnes of CO2e or more per year. NPRI has its own substance and employee thresholds, so small polluters are absent from both. Kilograms are not harm: a kilogram of mercury and a kilogram of nitrate differ completely in damage. 426 GHGRP facilities report NPRI ID as bare 0, a placeholder.

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

Search matched facilities by name, company, or city, with province and match-method filters

{
  "q": "suncor",
  "total": 9,
  "hits": [
    {
      "npri_id": "2230",
      "ghgrp_id": "G10280",
      "facility_name": "Suncor Energy Inc. Oil Sands",
      "ghg_tco2e": 8036871.1,
      "toxic_total_kg": 126088920.8,
      "match_method": "anchored",
      "confidence": "high"
    }
  ]
}
Try it →

GET

/api/v1/facility/lookup?npri_id=2230

Full combined record: GHG emissions alongside toxic releases, disposals, and transfers

{
  "npri_id": "2230",
  "ghgrp_id": "G10280",
  "ghg_tco2e": 8036871.1,
  "toxic_releases_kg": 93907802.0,
  "toxic_disposals_kg": 32181118.8,
  "toxic_transfers_kg": 0,
  "match_method": "anchored",
  "confidence": "high"
}
Try it →

GET

/api/v1/crosswalk/summary

Match statistics, combined emitter/polluter rankings, and per-province aggregates

{ "stats": { "anchored": 1422, "resolved": 38,
    "unmatched": 419, "match_rate": 77.7, … },
  "ranking_combined": [ … ],
  "provinces": { "AB": { "facilities": 780, … } } }
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 The Facility Crosswalk MCP server so I can query it from here.
1. Run: claude mcp add --transport http facility-crosswalk https://this-site.example/mcp
2. Run `claude mcp list` to confirm it connected.
3. Look up the facility with the highest combined carbon and toxic ranking and show me its numbers, and show me the result.

Data

Take the files.

The crosswalk, the combined facility records, and the match statistics. MIT licensed.

crosswalk.csv

1,879 rows: NPRI ID, GHGRP ID, match method, confidence tier, temp-ID aliases

Download
facilities.json

Full combined records for every matched facility, GHG beside toxics

Download
stats.json

Match statistics: anchored, resolved, unmatched, totals

Download