European Environment Agency (EEA)
EU industrial-emissions portal - IED installations + release sites (was E-PRTR)
Source
Feed (what to expect)
Annual EU-27 bulk CSV/GeoJSON plus SPARQL endpoint (no auth); live-fetched each run.
Quirks
Reconciliation
Schema
Feeds (axes)
Record kinds
Identifier schemes
Phase 2 / Workstream B.2 landscape, written 2026-05-10. Reference for the EEA fetcher built against the v1 schema + ADR 008/009 facility-side synthesis + ADR 010/011 lineage substrate. Cross-references:
docs/adr/008-cross-source-facility-identity-resolution.md,docs/adr/010-lineage-records-share-canonical-pipeline.md,docs/LINEAGE.md,docs/DATASOURCES.md,docs/phases/02-multi-jurisdictional-and-lineage.md.
Live-data observations (verified 2026-05-10 against the EEA Datashare WebDAV share at
https://sdi.eea.europa.eu/datashare/public.php/webdav/). Pre-research assumptions indocs/DATASOURCES.mdabout a "~30,000+ pollutant-release sites" universe are corrected here: the IED installation register is a strict superset of the historical E-PRTR universe and is materially larger (70K installations / 64K parent facilities). Two pre-research assumptions also failed against the live data and are noted inline below: there is no usable cross-Member-State operator field in the user-friendly distribution, and the canonical distribution is now a versioned snapshot (v16, vintage 2026-02-20), not a daily-rolling product.
The portal supersedes the legacy E-PRTR series. Under the 2024 Industrial Emissions Directive update (IED 2.0) the legacy E-PRTR pollutant-release register and the new IED installation register are merged into a single dataset under EEA dataset code
eea_industrial-reporting-e-prtr_s(catalogue UUID9405f714-8015-4b5b-a63c-280b82861b3d). The current published version is v16, snapshot 20 February 2026, covering E-PRTR facility releases 2007-2024, IED installations 2017-2024, and Large Combustion Plants (LCPs) 2016-2024. v15 (Feb 2025) and earlier remain co-published in the same share for reproducibility.The bulk download is a Nextcloud datashare folder, not a direct file URL. Downloads route via:
https://sdi.eea.europa.eu/datashare/s/sptXqwkQr5g7Bp5Programmatic enumeration uses WebDAV PROPFIND against
https://sdi.eea.europa.eu/datashare/public.php/webdav/with HTTP basic auth<share-token>:<empty>(the token is the public share key, not a credential - Nextcloud expects the URL share token in the Authorization header for WebDAV requests against public shares). The full share is 1.4 TB across all historical versions + all reporting flows; FF only pulls the current-version v16 tabular bundle (147 MB compressed → 695 MB uncompressed).Concrete download URLs for v16 (current vintage):
Artifact URL Size Tabular CSV bundle …/webdav/eea_t_ied-eprtr_p_2007-2024_v16_r00/User%20friendly%20.csv%20files.zip147 MB Spatial GeoPackage …/webdav/eea_v_4326_10_m_ied-eprtr_p_2007-2024_v16_r00/ied_SiteMap.gpkg584 MB Schema metadata PDF …/webdav/eea_t_ied-eprtr_p_2007-2024_v16_r00/EEA_Industrial_Reporting_Metadata_v16.pdf1.4 MB Full Access DB …/webdav/eea_t_ied-eprtr_p_2007-2024_v16_r00/Industrial_dataset_v_16_2026_02_16.accdb2.03 GB The tabular CSV bundle is the primary FF artifact - it carries the 16 user-friendly tables that mirror what the Access DB exposes via its tabular surface. The Access DB has additional tables (operator details, permit administrative metadata) that didn't get exported into the CSV bundle but are accessible via
mdbtoolsif a future slice needs them. Spatial GeoPackage is optional and only needed if FF wants polygon footprints instead of the lon/lat carried in F6_1 directly.The CSV bundle is 16 tables grouped by reporting flow:
Code Filename Rows Description F1.4 F1_4_Air_Releases_Facilities.csv372,206 Air emissions per facility × pollutant × year F2.4 F2_4_Water_Releases_Facilities.csv- Water releases per facility F3.2 F3_2_Transfers_Facilities.csv- Pollutant transfers per facility F4.2 F4_2_WasteTransfers_Facilities.csv853,413 Waste transfers per facility F5.2 F5_2_LCP_Energy_Emissions.csv- Large Combustion Plant energy + emissions F6.1 F6_1_IED_Installations.csv477,644 IED installation register - facility-axis foundation F7.1 F7_1_IED_WI_coWI.csv- Waste / co-incineration plants Plus aggregate tables (national / sectoral / by-Annex-I-activity) that FF doesn't consume directly. F6.1 is the load-bearing file for the Facility universe; F1 - F5 are useful for emissions-side
FacilityAttributeenrichment but are not required to land Workstream B.2's exit criterion (multi-region facility coverage).F6.1 schema is INSPIRE-anchored, not Member-State-local. The 31-column schema (verified by reading the live header):
PublicationDate, CountryName, reportingYear, parent_facilityInspireId, EPRTRAnnexIMainActivity, InstallationInspireId, installationName, installationNameConfidentialityReason, City_of_Facility, Longitude, Latitude, addressConfidentialityReason, installationStatus, IEDAnnexIMainActivity, IEDMainActivityName, baselineReportIndicator, siteVisitNumber, siteVisitURL, dateOfStartOfOperation, publicEmissionMonitoring, publicEmissionMonitoringURL, permitGranted, dateOfGranting, permitReconsidered, permitUpdated, dateOfLastUpdate, permitURL, RelevantChapter, BATConclusion, BATAEL, BATAELStricterConditionBoth
parent_facilityInspireIdandInstallationInspireIdare full URI-form INSPIRE IDs, e.g.https://registry.gdi-de.org/id/de.rp.inspire.pf.bube-eureg/5000671_4731_0. The host varies by Member State (registry.gdi-de.orgfor Germany, etc.), but the URI is opaque and stable across years
that's the load-bearing identifier for ADR 008 cross-source matching against e.g. UK EA permit refs (B.3) and Wikidata
P9758(EPRTR Facility ID, when present).
Facility-axis cardinality, by-country, status:
- 477,644 rows in F6.1 (one row per installation × reporting year, 2017-2024 = 8 years).
- 70,847 unique InstallationInspireIds - the installation universe.
- 64,041 unique parent_facilityInspireIds - the facility-axis universe (FF's entity for ADR 008 matching). The 6.8K-installation surplus reflects multi-installation facilities (e.g., a chemical complex with separate permits per process unit).
- Top countries: Germany (105K rows), France (56K), Spain (54K), Italy (53K), Netherlands (33K), then a long tail Finland/Hungary/Sweden/Romania/Portugal at 6-11K each. Coverage spans EU-27 + EEA non-EU contributors (NO, IS, LI, CH, UK historical) - multi-region as advertised.
installationStatusdistribution: functional 95.1 % / disused 2.9 % / decommissioned 1.2 % / notRegulated 0.9 %. Filter to non-notRegulatedfor the active facility set; carrydisused/decommissionedasLifecycleEvent(kind="decommissioned").Operator-axis is unavailable in the user-friendly bundle. Pre-research assumed an
operator_namefield would be present per the legacy E-PRTR Article 7 reporting requirement; this failed against the live v16 CSVs. Neither F6.1 nor the facility-axis emission tables (F1.4 / F2.4 / F4.2) carry an operator string. The IED 2018 Implementing Decision moved operator-details reporting into a separate dataflow that the EEA chose not to expose in the user-friendly bundle. Two consequences:
- FF emits no Entity / OperatorReference / Relationship records from the EEA fetcher in B.2. EEA is a facility-only source - different from MSHA / MRDS / Wikidata which all carry operator names.
- Operator-axis enrichment for EU facilities goes via the A.6
same_entity_asmatcher operating onfacilityName×CountryNameagainst entities surfaced by Wikidata's operator chain (P137/P127/P749) on the same facility, after ADR 008 spatial-+-name match resolves Wikidata's facility QID to the EEA InspireId. Two-step: ADR 008 facility match → Wikidata operator chain → Workstream A lineage. EEA never contributes a hard anchor to the operator graph.Future B.2.x extension could parse the .accdb's operator tables via
mdbtools, but that's a follow-up - not in scope for closing Phase 2.Sector classification: dual-axis EPRTR + IED. Each row carries both
EPRTRAnnexIMainActivity(legacy E-PRTR Annex I sectors, e.g. "4(a)(ii)" = chemical industry / organic chemicals) andIEDAnnexIMainActivity+IEDMainActivityName(the more granular IED Annex I taxonomy, e.g. "4.1(b)" with the descriptive sub-activity name). FF emits twoClassificationrecords per installation:
taxonomy="eprtr_annex_i", code = the EPRTR designator (resolves to a sector-level commodity hint per the EPRTR sector code table)taxonomy="ied_annex_i", code = the IED activity codeThe commodity-axis mapping (EPRTR/IED → USGS commodity code, matching the Wikidata B.1.5 pattern) is a B.2.x slice; B.2.0 just records the schema location.
Lifecycle events are richly populated. Per F6.1 row:
dateOfStartOfOperation- first commissioning date (sentinel1000-01-01and1900-01-01appear when reporters didn't have the actual date - filter at parse time).permitGranted/dateOfGranting- original permit issuance.permitReconsidered/permitUpdated/dateOfLastUpdate- permit-amendment timeline; useful for tracking BAT-conclusion compliance updates.- Each maps cleanly to
LifecycleEvent(kind=...)records:commissionedfromdateOfStartOfOperation,permit_grantedfromdateOfGranting, etc. Reporting-year itself is not a lifecycle event - it's metadata about when the row was reported.License: free / EU open-data. Per the EEA's standard re-use terms (Commission Decision 2011/833/EU), bulk redistribution of derived data is permitted with attribution. No registration / API key / rate limit on the public Nextcloud share. FF's
Provenance.notesshould include the canonical citation: "EEA - Industrial Emissions Directive 2010/75/EU and E-PRTR Regulation (EC) No 166/2006, dataset version 16, 2026-02-20".
EEA satisfies the multi-region facility coverage half of the Phase 2 exit criteria. Numbers compared to existing fetchers:
| Source | Region | Facility universe | Operator-axis? |
|---|---|---|---|
| EPA FRS | US | 147,763 | No (program codes only) |
| MSHA | US | 47,330 (5,677 mining-commodity) | Yes (legal entity + controller) |
| USGS MRDS | US-anchored, 10+ countries | 237,087 (237,030 commodity) | Yes (owner names) |
| Wikidata | global | 97,764 (2,526 commodity-flagged) | Yes (P137/P127/P749 chain) |
| EEA | EU-27 + EEA + UK historical | ~64,041 facilities / 70,847 installations | No (gap noted above) |
Total post-EEA facility universe: ~600K source-tier facilities. EU coverage moves from "Wikidata-only and sparse" to dense at the facility-permit level; expect significant ADR 008 matches between Wikidata's EU mining/power facilities and EEA's IED installations.
Cross-source matching expectations:
P9758 (EPRTR Facility ID property) was populated on only ~9
entities in the B.1.0 universe survey, so direct-join is not
the path; ADR 008 spatial-+-name matching is. Expect HIGH
matches for the well-known EU facilities (BASF Ludwigshafen,
TotalEnergies refineries, ArcelorMittal steel plants) and
MEDIUM matches for the long tail.Cache strategy: BULK_FILE. One zip per vintage; vintage =
the metadata-published snapshot date (e.g. 2026-02-20 for v16).
Honor the same idempotent download_stream + _extract_* skip-
if-cached contract used by GLEIF / CorpWatch. Cache directory
layout: data/raw/eea/<vintage>/User-friendly-csvs.zip →
extracted to siblings.
Vintage anchor: the v16 metadata XML
(Industrial_Emissions_Directive_..._657ac3cb-affa-4295-a4a9-27b4f539adab.xml)
carries the canonical publication date. New versions land
roughly annually (v15 = Feb 2025; v16 = Feb 2026). FF pins to a
specific version-string (v16) and a snapshot date the same
way GLEIF pins to a content_date. Operator runs --force to
roll the pin forward.
Record kinds emitted:
Facility - one per parent_facilityInspireId (deduped
across reporting years); coordinate from the latest
reporting-year row's Longitude/Latitude.FacilityIdentifier(scheme="eea_inspire_id", value=URI) -
the load-bearing cross-source key. Add scheme constant to
models/_registry_ids.py (SCHEME_EEA_INSPIRE_ID).
Also a per-installation
FacilityIdentifier(scheme="eea_inspire_installation_id", …)
for the installation-axis (B.2.x; not blocking).Classification(taxonomy="eprtr_annex_i", code=...) and
Classification(taxonomy="ied_annex_i", code=...) per
installation; both rendered as MEDIUM-confidence sector hints.LifecycleEvent(kind="commissioned", date=dateOfStartOfOperation)
with sentinel-date filter (< 1950-01-01 → drop).
LifecycleEvent(kind="permit_granted", date=dateOfGranting)
conditional on permitGranted=Yes.FacilityAttribute(attribute_name="installation_status", …)
carrying the status enum (functional/disused/decommissioned).Memory footprint: F6.1 is 319 MB uncompressed CSV, ~480K
rows × 31 cols. Polars scan_csv + lazy collect handles this
in well under 1 GB RSS. Streaming row-by-row not required -
this is a normal-sized CSV.
Confidence tiering:
installationStatus=functional, INSPIRE ID present,
coordinates non-null, dateOfStartOfOperation non-sentinel.addressConfidentialityReason populated (operator
invoked confidentiality on the address; coords likely also
jittered - keep but de-rank).Following the A.7 / B.1 pattern:
Facility + FacilityIdentifier +
Classification + LifecycleEvent emit. Synthetic-CSV unit
tests.Optional follow-ups (Phase 3-eligible):
FacilityAttribute records (release amounts,
by year). Strong fit for downstream concentration analysis.mdbtools to recover the operator-axis. Restores
EEA→Wikidata lineage bridge directness."~30,000+ pollutant-release sites" is wrong. That was the legacy E-PRTR pollutant-reporter count from the pre-IED-2.0 merge. The unified IED+E-PRTR register is ~64K facilities / 71K installations.
"E-PRTR series and the IED installation register are
separate" is wrong post-merge. v15+ are unified; the legacy
E-PRTR-only series is no longer published as a standalone
product. Historical E-PRTR-formatted CSVs (v9 etc.) remain
accessible at the older data-and-maps/data/... URLs but
are frozen in time.
"REST API + SPARQL endpoint" is mostly wrong. The industry.eea.europa.eu portal exposes interactive query tooling backed by what looks like an internal SQL surface, but no public REST/SPARQL endpoint is documented or stable enough to anchor a fetcher on. Bulk-file via WebDAV is the only durable access path.
"Operator field present per Member State, varying in formality" turned out to be wrong for the user-friendly distribution. Operator info exists in the .accdb, not in the CSV bundle. The operator-axis gap is a real coverage limitation of the EEA path.