EU ETS emissions monitor avatar

EU ETS emissions monitor

Pricing

$2.00 / 1,000 results

Go to Apify Store
EU ETS emissions monitor

EU ETS emissions monitor

Monitor verified emissions, free allocation and surrendered allowances for EU ETS installations.

Pricing

$2.00 / 1,000 results

Rating

0.0

(0)

Developer

Chee Chiaw Lim

Chee Chiaw Lim

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

This Apify Actor joins the European Commission Union Registry installation metadata and yearly activity downloads. It returns one record per installation and reporting year with verified emissions, free allocation, reserve allocation, transitional allocation, and surrendered allowances.

Input

An empty input selects all registries and the previous UTC calendar year, with a limit of 100 results. In 2026 the default reporting year is 2025. It does not search backwards if that year has no verified emissions.

FieldDefaultMeaning
countries[]Registry codes such as ["DE", "PL"]. Empty selects all.
yearsPrevious yearReporting years, such as ["2025"]. Numeric years also work through the API.
activityTypeCodes[]Optional activity codes.
minVerifiedEmissionsUnsetMinimum verified emissions in tonnes CO2 equivalent. Missing emissions fail this filter.
installationIds[]Installation identifiers. Use countries to disambiguate identifiers shared across registries.
onlyNewfalseEmit new and numerically changed records, skip unchanged records.
maxItems100Maximum results per run, between 1 and 10000.
stateStoreNameeu-ets-emissions-monitor-stateNamed key-value store for snapshot history.

Output

Each result contains the installation and registry identifiers, installation name, reporting year, emissions, allocations, surrender total, exclusion flag, activity, permit and EPRTR identifiers, city, postal code, emission years, permitted company details, and source snapshot date. Blank and n/a values become null. Installation identifiers and codes remain strings.

The following excerpt shows the numeric fields from the supplied real sample.

{
"registryCode": "AT",
"country": "Austria",
"installationId": "1",
"installationName": "Calmit Bad Ischl",
"year": 2005,
"verifiedEmissionsTco2e": 41399,
"allocationFree": 44894,
"allocationReserve": 0,
"allocationTransitional": 0,
"surrenderedTotal": 41399,
"excluded": false,
"complianceGap": 0,
"snapshotDate": "2026-10-21",
"generatedId": "AT:1:2005",
"changeType": "new",
"changedFields": []
}

Every complete result also contains source, licence, and retrievedAt. The source field names both datasets, links both downloads, and states the transformations. complianceGap is surrendered allowances minus verified emissions when both values exist. It is an arithmetic comparison, not a legal compliance assessment. The dataset has overview and allocation views. RUN_SUMMARY in the default key-value store records timestamps, fetched, eligible and pushed counts, charge-limit status, and any error. Fetched counts describe joined records that pass source filters, not every CSV row.

Change detection

generatedId is registryCode:installationId:year. The Actor hashes verified emissions, free allocation, reserve allocation, transitional allocation, and surrendered total with SHA-256. A missing previous snapshot gives new. A different numeric hash gives changed. The same hash gives unchanged. changedFields lists the numeric fields that differ from the saved snapshot.

Metadata and snapshot-date changes do not trigger a numeric change. onlyNew includes both new and changed records. State advances only after a successful dataset push. Records beyond maxItems or the charge limit retain their previous state. Use a separate state store for each independent monitor. Avoid concurrent runs sharing one state store. There is no deletion detection.

Pricing

Pay per result, with no run fee. The charge event is result, one event per saved dataset item. Unchanged records skipped with onlyNew do not incur a result event. This repository does not configure a Store price or deploy the Actor.

Source credit and licence

Source: European Commission, Union Registry public data downloads. The download page lists these files.

Licence text exactly as recorded in TERMS.md, from the European Commission legal notice:

"content owned by the EU on this website is licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) licence ... reuse is allowed, provided appropriate credit is given and changes are indicated. You may be required to clear additional rights if a specific content depicts identifiable private individuals".

Changes made by this Actor include joining the downloads on registry code and installation identifier, filtering records, removing personal-data fields, normalizing missing and numeric values, calculating the surrender gap, and classifying numeric changes. No endorsement by the European Commission is implied.

Personal-data handling

The Actor drops aircraft operators when activity code is 10 or activity type is Aircraft operator. It never outputs ACCOUNT_IDENTIFIER_IN_REG, installation street addresses, or account holder address fields. It returns accountHolderName only when the metadata row has a company registration number or LEI. Otherwise that field is null. It returns account holder country, company registration number, and LEI where present. Tests cover these rules. Rows without matching metadata are omitted because the Actor cannot check their activity type.

Downloads and limitations

Downloads use a one-second minimum interval per host and retry transient HTTP failures. Each gzip is streamed to a temporary CSV and checked through its final gzip trailer before parsing. Failed full downloads get up to three attempts, including truncated gzip files. Failure after the third attempt stops the run with a source URL and error. Each body download has a two-minute timeout. Temporary files are removed when collection finishes or fails.

The built-in CSV parser handles quoted commas, escaped quotes, multiline fields, UTF-8, and CRLF. It streams rows. Memory holds selected installation metadata and persisted result hashes, not the yearly activity file. The Actor needs temporary disk space for both decompressed CSVs. The memory target is below 1 GB, but this has not been measured on a live run in this environment.

The two daily files can have different snapshot dates. Metadata is current rather than historical. Results follow source order. Repeated runs with onlyNew: false can return the same first 100 rows. Narrow filters or enable onlyNew to progress through matching records. Source revisions and missing values can change results. Swiss-specific columns are not added to the EU columns. surrenderedTotal uses SURR_ALL.

Local checks

Run npm install, then npm test. Tests use node:test, stub fetch, and local storage. Small fixtures in test/fixtures are trimmed from the CSV samples. Run npx apify-cli run --purge with empty input for a live check. Inspect storage/datasets/default and storage/key_value_stores/default/RUN_SUMMARY.json before relying on the results. Run node scripts/verify-output.js to validate the saved fields and compare the item count with the summary.