CBAM GN-Code Checker — EU Carbon Border Adjustment Mechanism
Pricing
from $3.00 / 1,000 classificatie-resultaats
CBAM GN-Code Checker — EU Carbon Border Adjustment Mechanism
Check whether a GN/CN customs code or product description falls under CBAM (EU carbon border tax): cement, iron & steel, aluminium, fertilisers, electricity or hydrogen.
Check in seconds whether a product falls under CBAM (Carbon Border Adjustment Mechanism, the EU's carbon border tax) by GN/CN customs code or free-text product description — and whether the 2025 50-tonne/year de-minimis threshold applies.
When should an AI agent use this?
- "Does GN code 7601 10 00 (aluminium bars) fall under CBAM?"
- "Check whether 'Portland cement' triggers a CBAM obligation."
- "We import 30 tonnes of steel tubes per year — does the CBAM de-minimis threshold apply?"
- "Which of these 20 imported product codes are subject to CBAM, and under which category (cement, steel, aluminium, fertiliser, electricity, hydrogen)?"
- "Is urea (GN 3102 10) covered by CBAM?"
- "Given a direct GN code, what CBAM category applies and is there a known exception?"
Why this matters
CBAM became financially tangible for the first time in 2026, with a further Omnibus simplification (Regulation (EU) 2025/2083) in effect since October 2025 that introduced a new cumulative 50-tonne/year de-minimis threshold — replacing the old per-shipment €150 rule. Checking whether a specific customs code is in scope, and whether your import volume clears the new threshold, is a recurring compliance task for every importer of steel, aluminium, cement or fertiliser.
What this Actor does
- Maps a GN/CN customs code (or a free-text product description as fallback) to 1 of 6 CBAM categories: cement, iron & steel, aluminium, fertilisers, electricity, hydrogen
- Matches hierarchically: a full 8-digit code matches if its 4-digit heading is listed, exactly like the real CBAM scope rules work
- Applies the 50-tonne/year cumulative de-minimis threshold (2025 Omnibus simplification) when a quantity is supplied — correctly excluded for electricity and hydrogen, which have no such exemption
- Flags a known explicit exclusion (GN 3105 60 00 — phosphorus/potassium-only fertiliser, no nitrogen)
- Flags match confidence (
hoog/middel/laag) per result — some codes have nuances (partial heading coverage, recent scope changes) that this Actor shows honestly instead of pretending certainty - Supports bulk classification of an entire import list in one run
- 100% static rule engine — no scraping, no external API calls at runtime
What this Actor does NOT do
It does not check whether a trading partner is a registered/authorised CBAM declarant. The official EU CBAM Registry (Authorisation Management Module) is a closed system, accessible only via EU Login to registered importers/customs representatives and national authorities — there is no public API or searchable list (verified 2026-07-12). If you need that check, it has to go through your own CBAM Registry access.
Input
| Field | Type | Description |
|---|---|---|
gnCode | string | Customs GN/CN code, e.g. "76011000" or "7601 10 00". Matches on the code or any longer code starting with it (heading-level match) |
productomschrijving | string | Free-text product description, used as fallback when gnCode is empty or doesn't match |
jaarlijkseHoeveelheidTon | number | Your cumulative annual CBAM import quantity in tonnes, for the 50-tonne de-minimis check. No effect on electricity/hydrogen (no exemption) |
producten | array | Bulk mode: a list of objects with the same fields above (plus an optional label per item) |
toonEmissieIndicatie | boolean | Optional, separately charged: adds an indicative CO2-intensity range (tCO2e/tonne) per CBAM category when the result is onder_cbam. See "Emission indication" below. Default false |
Output
{"input": { "gnCode": "76011000" },"genormaliseerdeCode": "76011000","matches": [{"code": "7601","codeTitel": "Aluminium product, heading 7601","categorie": "aluminium","matchZekerheid": "hoog","toelichting": "Hoofdstuk 76-post 7601 (aluminiumproduct) valt onder CBAM. ...","zoektermen": "aluminium"}],"status": "onder_cbam","toelichting": "Match gevonden met CBAM-categorie(ën): aluminium.","disclaimer": "Dit is een indicatieve classificatie ... GEEN juridisch bindend advies.","emissieIndicatie": null,"rapportage": {"volgendeDeadline": "Jaarlijkse CBAM-aangifte over het voorafgaande kalenderjaar, uiterlijk 31 mei ...","boeteHint": "Bij het niet, te laat of onjuist indienen van de CBAM-aangifte ... generiek indicatief in de orde van €10-50 per ton niet-aangegeven embedded emissions ..."}}
status:onder_cbam,onder_drempel(matched, but below the 50-tonne threshold),buiten_scope, oronbekend(no usablegnCode/productomschrijving, or an invalid GN-code format — see "GN-code format validation" below)matches: can contain more than one rule for a code (e.g. a heading-level rule plus a more specific sub-code rule), and can even span more than one CBAM category if a code or free-text description genuinely matches more than one (rare, but not excluded)rapportage: a static calendar field — the next CBAM reporting deadline and a generic penalty hint. Only filled when there's an actual CBAM import (onder_cbamoronder_drempel),nullotherwise. This is informational, not a per-case legal calculation — see the shareddisclaimerfield.
GN-code format validation
gnCode is normalised by stripping everything except digits. Only a result of 2, 4, 6 or 8 digits
(chapter/heading/sub-heading/full breakdown) is treated as a plausible GN/CN code. Anything else — a
typo, or digits embedded in unrelated text (e.g. an 11-digit paste error) — returns status onbekend
with an explicit "ongeldig GN-code-formaat" explanation instead of being silently prefix-matched
against the rule set. This does not fall back to productomschrijving, so a malformed code can't
mask itself behind a coincidental free-text match.
Emission indication (optional, separately charged)
Set toonEmissieIndicatie: true to add a rough tCO2e/tonne intensity range per matched CBAM category, only
when status is onder_cbam. emissieIndicatie is an array — one entry per matched category. In the
overwhelming majority of cases a product matches exactly one category, so the array has 1 entry; if a code or
free-text description genuinely matches more than one category (rare, but not excluded), every matched category
gets its own entry instead of only the first one being shown:
{"emissieIndicatie": [{"categorie": "cement","indicatieveTonCo2ePerTonMin": 0.6,"indicatieveTonCo2ePerTonMax": 0.9,"toelichting": "Cement/clinkerproductie: circa 0,6-0,9 ton CO2e per ton product, ...","disclaimer": "Dit is een GROVE, illustratieve orde-van-grootte ... GEEN officiële EU CBAM-default-waarde ..."}]}
This is a broad, illustrative order-of-magnitude compiled from generally published industry averages — not
the official EU CBAM default value (which requires a product/installation-specific calculation under the CBAM
implementing regulation). It's meant to give importers a first-order feel for how much certificate costs might
weigh, not a number to file with. Always read the disclaimer field on each entry. The separately charged
emissie-indicatie-resultaat event is billed once per result regardless of how many entries the array has — the
price is unchanged from before this array shape.
Bulk runs (more than 1 product) also get one free summary record at the end, on top of the per-product results — not charged, no extra event:
{"type": "cumulatieve_samenvatting","aantalProducten": 3,"totaalTonPerCategorie": { "cement": 55, "elektriciteit": 0, "waterstof": 0, "kunstmest": 0, "ijzer_staal": 0, "aluminium": 10 },"categorieenBovenDrempel": ["cement"],"drempelTon": 50}
This makes the 50-tonne de-minimis threshold's cumulative nature (per importer per year, not per
shipment — see the FAQ) directly actionable: two products that are each individually onder_drempel can
still push a category's cumulative total over the threshold, which this summary flags. elektriciteit and
waterstof are never included in categorieenBovenDrempel — the threshold doesn't apply to them at all.
Use cases
- Importers of steel, aluminium, cement or fertiliser: check new product codes against CBAM before the first shipment
- Customs/compliance consultants: bulk-classify a client's full import list in one run
- Procurement teams: flag which new supplier product lines will trigger CBAM reporting
- AI agents: structured JSON output, ideal as an MCP tool for import-compliance workflows
Pricing
This Actor uses Apify's Pay-Per-Event (PPE) pricing model.
- Actor Start: $0.00005 (Apify default)
- classificatie-resultaat: $0.003 per classified product
- emissie-indicatie-resultaat: $0.006 extra, only with
toonEmissieIndicatieenabled and only when the result isonder_cbam
Legal
- The GN/CN-code-to-category mapping is compiled from Regulation (EU) 2023/956 Annex I as amended by Regulation (EU) 2025/2083, cross-checked against 2 independent secondary compliance sources (2026-07-12) because the literal EUR-Lex annex text could not be extracted as parseable text during development. Verify against the official EUR-Lex text before relying on this for a filing decision.
- This is an indicative classification, not legal advice, and it is not a CBAM declarant-registry check (see "What this Actor does NOT do" above).
- The optional
emissieIndicatieis a rough illustrative range, not the official EU CBAM default value and not usable for an actual CBAM filing — see its owndisclaimerfield. - No personal data is processed — only product/customs-code classification data.
FAQ
Q: My GN code didn't match anything — does that mean I'm not covered? A: Probably, but the rule set isn't exhaustive and is based on secondary sources rather than the literal official annex. Verify against the official EUR-Lex text of Regulation (EU) 2023/956 if in doubt.
Q: Does this check if my trading partner is an authorised CBAM declarant? A: No — the official CBAM Registry has no public API or searchable list. This Actor only classifies goods, not counterparties.
Q: What's the 50-tonne threshold? A: Since the October 2025 CBAM Omnibus simplification, importers with less than 50 cumulative tonnes of CBAM goods per year are exempt — replacing the old per-shipment €150 de-minimis rule. It does not apply to electricity or hydrogen.
Q: Why do some results show matchZekerheid: "middel" instead of "hoog"?
A: A handful of CBAM headings (e.g. ferro-alloys under 7202, or certain fertiliser sub-codes under 3102/
3105) are only partially covered at the 8-digit level, or the available secondary sources disagreed on
the exact sub-code boundary. This Actor shows that honestly rather than guessing.
Related Actors
- ../upv-classificatiechecker and ../nis2-sbi-sector-mapper — the same shared rule-engine approach, for Dutch/EU compliance classification in other domains (extended producer responsibility, cybersecurity law sector scoping).
Combined EU compliance scan (manual orchestration suggestion)
These 3 Actors target the same buyer (importers, customs/compliance consultants) and share the same static rule-engine approach, but each classifies against a different legal scope. There is no combined workflow Actor — running them together today means calling each one separately and merging the results yourself (e.g. in an n8n/Make flow, a script, or an AI agent that calls all 3 as tools):
- CBAM GN-Code Checker (this Actor) — is this product/GN-code subject to the carbon border tax?
- ../upv-classificatiechecker — does this same product trigger extended producer responsibility (UPV) obligations?
- ../nis2-sbi-sector-mapper — does the importing company's SBI sector fall under NIS2 cybersecurity-law scope?
Feeding the same product/company identifiers into all 3 gives a broader "which EU compliance regimes apply to us" picture than any single Actor covers. This is a documentation pointer only, not a built integration — a genuine combined-workflow Actor (shared input schema, single run, merged output) would be a separate product with its own pricing.
Keywords
cbam, carbon border adjustment mechanism, eu carbon tax, gn code, cn code, customs classification, steel, aluminium, cement, fertiliser, compliance, import
Changelog
0.3.2
- Added a static
rapportagefield (next CBAM reporting deadline + a generic penalty hint) to each result, filled only when there's an actual CBAM import (onder_cbam/onder_drempel). No pricing change — enrichment of the same result object. emissieIndicatieis now an array (one entry per matched CBAM category) instead of only ever showing the first matched category when a code matched more than one. No pricing change — same already-chargedemissie-indicatie-resultaatevent, billed once per result regardless of array length.- Added GN-code format validation: only 2/4/6/8-digit normalised codes are treated as plausible
GN/CN codes; anything else now returns
onbekendwith an explicit explanation instead of being silently prefix-matched. No pricing change — bugfix on an existing, already-priced event. - Expanded the "Related Actors" section with a manual combined-workflow suggestion for UPV Classificatiechecker and NIS2 SBI Sector Mapper. Documentation only, no built integration.
0.3.1 - Bugfix
classificatie-resultaatis no longer charged when the result status isonbekend(empty/meaningless request) — the customer received nothing to classify, so they aren't billed for it.
0.3.0
- Added optional
toonEmissieIndicatieinput: when the result isonder_cbam, adds an indicative tCO2e/tonne intensity range per CBAM category (illustrative industry-average order of magnitude, not the official EU default value). New charged eventemissie-indicatie-resultaat($0.006), confirmed by the user (2026-07-14).
0.2.0
- Added a free
cumulatieve_samenvattingrecord at the end of bulk runs (2+ products), totallingjaarlijkseHoeveelheidTonper CBAM category so a cumulative de-minimis breach can be spotted even when every individual product is below the 50-tonne threshold. No pricing change.
0.1.0 - Initial release
- GN/CN-code and free-text classification against 6 CBAM categories (cement, iron & steel, aluminium, fertilisers, electricity, hydrogen).
- Hierarchical code matching (heading-level rules match any longer code starting with them).
- 50-tonne/year cumulative de-minimis threshold (2025 Omnibus simplification), correctly excluded for electricity/hydrogen.
- Explicit known-exclusion handling (GN 3105 60 00).
- Bulk classification via the
producteninput field. - Built on the shared
shared-rule-enginepackage (also used by NIS2 SBI Sector Mapper and UPV Classificatiechecker), extended with a newvindMatchesOpCodePrefixfunction for hierarchical customs-code matching.