# CBAM GN-Code Checker — EU Carbon Border Adjustment Mechanism (`codeclouds/cbam-gn-code-checker`) Actor

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.

- **URL**: https://apify.com/codeclouds/cbam-gn-code-checker.md
- **Developed by:** [Dennis](https://apify.com/codeclouds) (community)
- **Categories:** Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 classificatie-resultaats

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## CBAM GN-Code Checker — EU Carbon Border Adjustment Mechanism

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

```json
{
  "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`, or `onbekend` (no usable `gnCode`/`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_cbam` or `onder_drempel`), `null`
  otherwise. This is informational, not a per-case legal calculation — see the shared `disclaimer`
  field.

#### 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:

```json
{
  "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:

```json
{
  "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 `toonEmissieIndicatie` enabled and only when the
  result is `onder_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 `emissieIndicatie` is a rough illustrative range, **not the official EU CBAM default value**
  and not usable for an actual CBAM filing — see its own `disclaimer` field.
- 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](../upv-classificatiechecker)** and **[NIS2 SBI Sector Mapper](../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):

1. **CBAM GN-Code Checker** (this Actor) — is this product/GN-code subject to the carbon border tax?
2. **[UPV Classificatiechecker](../upv-classificatiechecker)** — does this same product trigger
   extended producer responsibility (UPV) obligations?
3. **[NIS2 SBI Sector Mapper](../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 `rapportage` field (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.
- `emissieIndicatie` is 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-charged `emissie-indicatie-resultaat` event, 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 `onbekend` with 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-resultaat` is no longer charged when the result status is `onbekend` (empty/meaningless
  request) — the customer received nothing to classify, so they aren't billed for it.

#### 0.3.0

- Added optional `toonEmissieIndicatie` input: when the result is `onder_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 event `emissie-indicatie-resultaat` ($0.006), confirmed by the user (2026-07-14).

#### 0.2.0

- Added a free `cumulatieve_samenvatting` record at the end of bulk runs (2+ products), totalling
  `jaarlijkseHoeveelheidTon` per 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 `producten` input field.
- Built on the shared `shared-rule-engine` package (also used by NIS2 SBI Sector Mapper and UPV
  Classificatiechecker), extended with a new `vindMatchesOpCodePrefix` function for hierarchical
  customs-code matching.

# Actor input Schema

## `gnCode` (type: `string`):

Customs GN/CN goods code, e.g. "76011000" or "7601 10 00". Matches on the code or any longer code starting with it (heading-level match). Leave empty to use a product description instead.

## `productomschrijving` (type: `string`):

Free text, e.g. "Portland cement" or "aluminium profiles". Used as a fallback when gnCode is empty or doesn't match.

## `jaarlijkseHoeveelheidTon` (type: `number`):

Your cumulative annual import quantity across all CBAM goods, in tonnes — used for the 50-tonne/year de-minimis threshold introduced by the 2025 CBAM Omnibus simplification. Does not apply to electricity or hydrogen (no threshold exemption for those).

## `producten` (type: `array`):

Optional: check multiple products in one run. Each item has the same fields as above (gnCode, productomschrijving, jaarlijkseHoeveelheidTon, and an optional own "label"). If filled, the single fields above are ignored. E.g. \[{"label": "Product A", "gnCode": "76011000"}].

## `toonEmissieIndicatie` (type: `boolean`):

Optional, separately charged: adds an indicative CO2-intensity range (tCO2e/tonne) per CBAM category when the result is onder\_cbam. Illustrative industry-average order of magnitude, not the official EU CBAM default value.

## Actor input object example

```json
{
  "producten": [
    {
      "label": "Product A",
      "gnCode": "76011000"
    }
  ],
  "toonEmissieIndicatie": false
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "producten": [
        {
            "label": "Product A",
            "gnCode": "76011000"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("codeclouds/cbam-gn-code-checker").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "producten": [{
            "label": "Product A",
            "gnCode": "76011000",
        }] }

# Run the Actor and wait for it to finish
run = client.actor("codeclouds/cbam-gn-code-checker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "producten": [
    {
      "label": "Product A",
      "gnCode": "76011000"
    }
  ]
}' |
apify call codeclouds/cbam-gn-code-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=codeclouds/cbam-gn-code-checker",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "CBAM GN-Code Checker — EU Carbon Border Adjustment Mechanism",
        "description": "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.",
        "version": "0.1",
        "x-build-id": "zO682iC9uSHgbh6mw"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/codeclouds~cbam-gn-code-checker/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-codeclouds-cbam-gn-code-checker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/codeclouds~cbam-gn-code-checker/runs": {
            "post": {
                "operationId": "runs-sync-codeclouds-cbam-gn-code-checker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/codeclouds~cbam-gn-code-checker/run-sync": {
            "post": {
                "operationId": "run-sync-codeclouds-cbam-gn-code-checker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "gnCode": {
                        "title": "GN/CN Code",
                        "type": "string",
                        "description": "Customs GN/CN goods code, e.g. \"76011000\" or \"7601 10 00\". Matches on the code or any longer code starting with it (heading-level match). Leave empty to use a product description instead."
                    },
                    "productomschrijving": {
                        "title": "Product Description",
                        "type": "string",
                        "description": "Free text, e.g. \"Portland cement\" or \"aluminium profiles\". Used as a fallback when gnCode is empty or doesn't match."
                    },
                    "jaarlijkseHoeveelheidTon": {
                        "title": "Annual Cumulative Import Quantity (tonnes)",
                        "type": "number",
                        "description": "Your cumulative annual import quantity across all CBAM goods, in tonnes — used for the 50-tonne/year de-minimis threshold introduced by the 2025 CBAM Omnibus simplification. Does not apply to electricity or hydrogen (no threshold exemption for those)."
                    },
                    "producten": {
                        "title": "Bulk: List of Products",
                        "type": "array",
                        "description": "Optional: check multiple products in one run. Each item has the same fields as above (gnCode, productomschrijving, jaarlijkseHoeveelheidTon, and an optional own \"label\"). If filled, the single fields above are ignored. E.g. [{\"label\": \"Product A\", \"gnCode\": \"76011000\"}]."
                    },
                    "toonEmissieIndicatie": {
                        "title": "Show emission indication",
                        "type": "boolean",
                        "description": "Optional, separately charged: adds an indicative CO2-intensity range (tCO2e/tonne) per CBAM category when the result is onder_cbam. Illustrative industry-average order of magnitude, not the official EU CBAM default value.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
