Open source

An open-source civic project. Not affiliated with the Government of Ontario or the MECP.

Open NshipyardOntario Facility Emissions Spine

Open Nshipyard · Project P5

Why does one Ontario factory show up under five different names?

Ontario's MECP and the federal GHGRP track the same plants under different names and publish no shared key. This project resolves 513 canonical facilities across both registries for 2010 to 2024: 458 anchored on exact normalized name plus same city, 55 honestly unmatched, 30,693 large-building rows quarantined. The payoff is identity: one query follows a plant across both programs and twenty years of history.

458

of 513 canonical facilities anchored across both registries, 89.3% of the spine

3,392 t

largest 2024 gap between the two programs after the biomass adjustment, at Greenstone Mine (+2.2%)

0

facilities resolved by fuzzy matching. The strict rules rejected every near-miss rather than guessing.

332,600 t

of methane CO2e at Essex-Windsor Regional Landfill in 2024, 99.2% of its reported total

Explorer

Search the 513 facilities.

Search above to browse the spine. Each facility carries its 2024 total from the Ontario program beside its 2024 total from the federal GHGRP, plus the match tier and the programs it appears in.

Methodology

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

  1. 1

    Sources, all retrieved 2026-10-10. Ontario MECP Greenhouse Gas Emissions Reporting By Facility, 2010 to 2024 (Reg 390/18): 4,231 rows, 480 unique facility IDs, 420 reporting in 2024, downloaded from files.ontario.ca under the Ontario Open Government Licence. Federal GHGRP Emissions by Gas, 2004 to 2024 (ECCC): 20,685 rows nationally, 4,606 for Ontario, 491 unique Ontario facility IDs, 418 reporting in 2024, fetched through the open.canada.ca catalogue API because the old static URL now returns the catalogue app shell. EWRB large buildings, 2018 to 2024, Ontario Ministry of Energy and Mines: 30,693 rows, 9,250 buildings, English files only.

  2. 2

    Anchor matching: names are uppercased, accents stripped, legal suffixes and punctuation removed, then matched exactly with the same normalized city on both sides. 458 of 513 canonical facilities matched this way (89.3%). All merges keep every historical name as a variant: 133 of 480 Ontario facility IDs changed names across years, and the spine preserves the full history.

  3. 3

    Three merge traps were found and defused during development. Canada Brick - Aldershot versus Hanson Brick - Aldershot are different companies whose shared token is the city name itself. BUNGE CANADA - HAMILTON versus Hamilton fails the same way. Two Ingredion plants in Cardinal and Port Colborne share a company name but are different facilities. The rules: a site suffix that equals the city can never anchor a merge, and conflicting site suffixes veto the merge.

  4. 4

    Tie-break by emissions: two federal facilities in Woodstock share the name Woodstock Plant. Anchored full-name matches are assigned before sub-form matches, so the Ontario record (Federal White Cement, 373,834 t in 2024) paired with G10114 (Federal White Cement, 373,477 t) instead of the Lafarge plant (220,315 t). Emissions agreed to 0.1 percent, confirming the choice.

  5. 5

    The fuzzy tier (difflib at 0.90 or above) produced zero merges after the strict rules, so resolved is 0. Near-misses like Hamilton Specialty Bar (2007) Inc. versus Hamilton Specialty Bar Corporation (ratio 0.75) were left unmatched rather than guessed.

  6. 6

    Unmatched facilities: 22 Ontario-only and 33 federal-only. Nearly all stopped reporting before 2024, which reads as closures or years below the 10-kilotonne threshold rather than matching failures. A facility whose municipality is recorded differently in the two programs cannot merge, because matching requires the same normalized city.

  7. 7

    Biomass adjustment: Ontario's published total includes biomass CO2 and the federal total excludes it. The 2024 join subtracts biomass from the Ontario side before comparing. Any reuse of the raw totals must apply the same adjustment. The Thunder Bay Operations example shows why: 1,384.3 kt published by Ontario against 202.5 kt in the federal file, agreeing within 1 tonne after adjustment.

  8. 8

    EWRB quarantine: the files publish no building names and no street addresses, only city and a 3-character postal code, so no record-level join is possible. All 30,693 rows are quarantined with reason codes: 3,002 report zero intensity (9.8%), 508 report absurd GHG intensity above 1,000 kgCO2e/m2 (max 2,861,043, median 25.9). The ministry's own warning that the data is not cleansed is borne out by the numbers.

  9. 9

    EWRB city context is a ceiling, not a gap in the pipeline: for 49 cities, the median weather-normalized site energy intensity and GHG intensity across anonymized manufacturing plants. 96 matched industrial facilities carry it, flagged ecological. It must never be presented as a building's own intensity.

  10. 10

    Anomalies: 128 year-over-year flags on bases above 1,000 tonnes, jumps above 200 percent or drops above 75 percent. The largest is Rainy River Mine, 4,660 to 146,180 tonnes from 2018 to 2019 (+3,037 percent), a mine ramping up, verified against the raw file.

  11. 11

    Landfills: 89 facilities identified by NAICS 56221 or name. A join spec for the provincial landfill registry is published, but no registry file was downloaded, so the registry-side join is a spec, not a computed join.

  12. 12

    Limits: 2024 is the latest vintage on all three sources. Both programs use a 10-kilotonne reporting threshold, so small emitters are absent. Kilograms are not harm and tonnes are not blame: these are reported totals, not health impact.

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

Search facilities by name, city, program presence, and match tier

{
  "q": "algoma",
  "total": 2,
  "hits": [
    {
      "spine_id": "ONF-000042",
      "canonical_name": "Algoma Steel Inc",
      "city": "Sault Ste. Marie",
      "tier": "anchored",
      "programs": ["ontario_ghg", "federal_ghgrp"],
      "ontario_2024_t": 4226732,
      "ghgrp_2024_t": 4226731.318
    }
  ]
}
Try it →

GET

/api/v1/facility/ONF-000042

Full record: both programs' name histories, annual series, 2024 totals, delta, EWRB context, methane and anomaly flags

{
  "spine_id": "ONF-000042",
  "canonical_name": "Algoma Steel Inc",
  "tier": "anchored",
  "ontario_2024_t": 4226732,
  "ghgrp_2024_t": 4226731.318,
  "delta_2024_t": 0.68,
  "ewrb_context": null,
  "methane": [],
  "anomalies": []
}
Try it →

GET

/api/v1/stats

Match statistics, funnel, unmatched split, top-30 emitters, EWRB quarantine, landfill methane, 2024 agreement deltas

{ "stats": { "spine_rows": 513,
    "tiers": { "anchored": 458, "resolved": 0, "unmatched": 55 }, … },
  "top_emitters": [ … ],
  "agreement_2024": { "n_matched_with_2024_both": 416, … } }
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 Ontario Facility Emissions Spine MCP server so I can query it from here.
1. Run: claude mcp add --transport http ontario-emissions-spine https://this-site.example/mcp
2. Run `claude mcp list` to confirm it connected.
3. Look up the facility with the highest 2024 emissions and show me its program-vs-program delta, and show me the result.

Data

Take the files.

The spine, the identity-resolution funnel, the agreement deltas, and the curated examples. MIT licensed.

spine.csv

513 rows: spine ID, canonical name, city, tier, program IDs, 2024 totals, EWRB city

Download
spine.json

Full records: per-program name histories, annual series 2010-2024, EWRB context, methane flags

Download
stats.json

Match statistics: tiers, programs, EWRB quarantine reasons, anomaly count

Download
match_funnel.json

The identity-resolution funnel stages and counts

Download
examples.json

9 curated entity-resolution cases: 5 clean merges, 4 correctly rejected near-misses

Download