Q.01

How do I read an installation’s EUTL compliance data?

Each row in the EUTL compliance export is one installation (or aircraft or maritime operator account) in one annual compliance workbook. The COMPLIANCE_CODE is the registry's own verdict on whether the operator surrendered enough allowances. The two TOTAL_ columns are running totals, not that year's figures, so take the year's numbers from the year-by-year activity file.

Approach: I used the Union Registry/EUTL annual compliance workbooks and year-by-year activity data, and the ETS Directive 2003/87/EC (consolidation of 1 March 2024). The official list of what each compliance code means is in the Registry Regulation (EU) 2019/1122, which the datasets don't hold, and I couldn't get its text from EUR-Lex.

1. What the 14 columns mean

I'm using Raffinerie Heide GmbH (DE, installation 10) as the example, 2024 workbook [1]:

ColumnExample valueHow to read it
REGISTRY_CODE / INSTALLATION_IDENTIFIERDE / 10Together these identify the installation. The ID is only unique within one country's registry.
PERMIT_IDENTIFIER14210-0010Permit number. Use it to match the installation to the operator's account in the Operators file, which gives the address, account holder and activity name [2].
MAIN_ACTIVITY_TYPE_CODE21Code 21 appears as "Refining of mineral oil" in the Operators file (same source as above). Code 10 appears on an aircraft-operator monitoring-plan row [3]. Code 50 appears on a ship-management company [4].
COMPLIANCE_CODEAThe compliance status for the year in COMPLIANCE_STATUS_LATEST_YEAR (see section 3).
TOTAL_VERIFIED_EMISSIONS / TOTAL_SURRENDERED_ALLOWANCES3,905,098 / 3,885,098Running totals (see section 2).
CH_ columnsNOT APPLICABLEA separate set of code and emissions values. In these examples they are filled in only for aircraft-operator rows.
YEAR_OF_FIRST / LAST_EMISSIONS, ACCOUNT_CLOSURE2005 / NOT SET / OPENWhen the installation is in the system, and whether its account is open.

2. The totals add up across years

Heide's TOTAL_VERIFIED_EMISSIONS climbs each year:

  • 2021: 943,963 [5]
  • 2022: 1,947,560 [6]
  • 2023: 2,969,925 [7]
  • 2024: 3,905,098
  • 2025: 4,862,745 [8]

The year-on-year step from 2023 to 2024 is 935,173. That matches the 2024 line of the year-by-year activity file exactly (verified emissions 935,173, surrendered 935,173) [9].

So for one year's figures:

  • Subtract the previous workbook's total, or
  • Use the activity file. It also breaks surrenders down by unit type (for example SURR_EUA) and shows free allocation.

3. Read the code; don't recalculate it from the totals

In every Heide workbook from 2021 to 2025, cumulative surrenders sit 20,000 below cumulative verified emissions, yet the code is still A. Treat the code as the registry's determination. Don't re-derive it from the two totals.

What the published rows show:

  • A: surrenders equal to verified emissions, e.g. Calmit Bad Ischl, 161,475 and 161,475 [10].
  • B: surrenders below verified emissions, e.g. Ferbatil, 19,165 surrendered against 28,393 verified [11].
  • C: verified emissions shown as "NOT CALCULATED" [12].
  • "EXCLUDED SINCE 2021": zero totals and a blank status year [13].

The binding definitions of the codes are in the Registry Regulation, and I couldn't confirm their wording from the official text. A search snippet suggested the definitions changed in later amendments, but I haven't seen the text, so I'm not relying on it.

4. The legal yardstick (Directive 2003/87/EC)

  • Article 12(3): Member States "shall ensure that, by 30 September each year", each operator surrenders allowances "equal to the total emissions from that installation during the preceding calendar year, as verified in accordance with Article 15" [14].
  • Article 12(3a): no surrender is due for emissions verified as captured and transported for permanent storage at a facility permitted under Directive 2009/31/EC (same source).
  • Article 16(3): if an operator falls short, it is liable for an excess emissions penalty of EUR 100 per tonne CO2e not covered. Paying the penalty does not remove the duty to surrender the missing allowances the following year. Article 16(4): the penalty rises with the European consumer price index. Article 16(2): names of operators in breach are published [15].
  • Article 3gb: shipping companies have a phase-in, so a maritime row can legitimately show fewer surrenders than verified emissions. The share due is 40% of 2024 and 70% of 2025 verified emissions, then 100% from 2026 [16].

If you give me a registry code and installation ID, I can pull its full compliance and allocation history.

Sources: Union Registry public data portal

Q.02

What do the compliance codes mean?

I couldn't get the official definitions of the compliance codes. They're set in the Registry Regulation (Delegated Regulation (EU) 2019/1122), and EUR-Lex wouldn't return its text in any format I tried. The registry files and the Commission's Union Registry page also don't explain them. What I can tell you is how each code shows up in the published rows, which suggests what it means but isn't the legal definition.

Approach: I searched the EUTL annual compliance workbooks and the other Union Registry bulk files, then the Commission's Union Registry page and its 2025 compliance workbook. Neither has a key to the codes, and I couldn't open Regulation (EU) 2019/1122 on EUR-Lex.

Codes found in the compliance workbooks

CodeWhat the rows showExample
ASurrenders equal verified emissions, cumulativelyVetropack Pöchlarn: 286,885 verified, 286,885 surrendered, status year 2025 [17]
BSurrenders below verified emissionsFerbatil (API): 28,393 verified, 19,165 surrendered, status year 2025 [18]. A shipping company with 556 verified and 0 surrendered [19]
CVerified emissions shown as "NOT CALCULATED" and 0 surrenderedAn Austrian aircraft-operator row, status year 2025 [20]. A shipping company, Safiran Payam Darya [21]
EXCLUDED SINCE 2021Zero totals and a blank status year; seen on Austrian aircraft-operator accounts that are still open[22]

I found no rows with code D, E, X, W or Z. That doesn't mean those codes don't exist, only that I found none.

Points that affect how you read the codes

  • Check the year. A code applies to the year in COMPLIANCE_STATUS_LATEST_YEAR, not to the workbook year. In the 2025 workbook, a closed Austrian aircraft-operator account still shows A, but with status year 2023 and account closure on 18-APR-2024 (2025 workbook, row 3).
  • CH_COMPLIANCE_CODE is a separate code. In one row the two disagree: an Air Belgium aircraft-operator row has COMPLIANCE_CODE B (7,129 verified, 6,752 surrendered) but CH_COMPLIANCE_CODE A with CH emissions of 0 [23]. The CH column can also show "-" (2025 workbook, row 3).
  • The code doesn't always follow from the totals. Raffinerie Heide is coded A even though its cumulative surrenders are 20,000 below cumulative verified emissions (from my earlier answer). Take the code as the registry's own verdict.
  • A shipping B may be expected. Shipping companies only had to surrender part of their verified emissions for 2024 and 2025 under Article 3gb of the ETS Directive. So a B on a shipping row may reflect that rather than a shortfall in what the law required.

Sources: European Commission, Union Registry page; Compliance data for 2025 workbook; Regulation (EU) 2019/1122, consolidated text on EUR-Lex (couldn't open)

Q.03