# EUDR Screener: HS code & country risk for Reg. 2023/1115 (`ravch/eudr-screener`) Actor

Screen HS codes and commodity names against EU Deforestation Regulation (EUDR) Annex I. Returns scope, commodity (cattle, cocoa, coffee, oil palm, rubber, soya, wood), country risk per Reg. 2025/917, DDS deadline (30 Dec 2026 large / 30 Jun 2027 SME), and obligations with article citations.

- **URL**: https://apify.com/ravch/eudr-screener.md
- **Developed by:** [Rafał Chudzik](https://apify.com/ravch) (community)
- **Categories:** Automation, AI, Integrations
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 results

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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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

## EUDR Preliminary Scope and Obligation Screener

Rule-based **preliminary scope and obligation screener** for the **EU Deforestation Regulation (EUDR), Regulation (EU) 2023/1115** (as currently consolidated). Send an HS code or commodity name plus the country of production, your operator/trader role and enterprise size; get back a structured pre-screen of likely scope, country risk per Commission Implementing Reg. (EU) 2025/1093, due diligence statement requirement (or downstream / SME / low-risk simplification), geolocation precision, deadline (with EUTR carve-out flag), match-confidence flag, and article-level legal references.

> **Use this Actor when**: you import or trade cattle, cocoa, coffee, oil palm, rubber, soya or wood (or relevant derived products listed in Annex I) on the EU market, and you need a quick rule-based pre-screen of which SKUs likely trigger DDS / enhanced due diligence / simplified due diligence / downstream reliance before deeper compliance work.

This Actor is **not affiliated with or endorsed by the European Commission** or any market surveillance authority. Output is preliminary screening, not legal, customs, environmental or due-diligence advice. See the disclaimer at the bottom.

### Quick start

```json
{
  "queries": [
    { "query": "0901.21", "country": "BR" },
    { "query": "wooden furniture", "country": "RU" }
  ],
  "operatorRole": "operator_first_placer",
  "enterpriseSize": "large",
  "wasRegulatedByEUTR": false
}
````

That run costs `$0.001 + 2 × $0.005 = $0.011`. The Brazilian coffee returns standard-risk full DDS pre-screening. The Russian wooden furniture flags `country_risk: "high"` and adds enhanced due diligence to the obligations list. Both return the cut-off date `31 December 2020` and (for large/medium) the deadline `30 December 2026`.

### What it returns

For each input row:

- **scope and category**: yes / no, plus one of `cattle`, `cocoa`, `coffee`, `oil_palm`, `rubber`, `soya`, `wood`
- **screening\_result**: `in_scope_full_dds`, `in_scope_full_dds_enhanced`, `in_scope_simplified_dds`, `in_scope_can_rely_on_upstream_dds`, `no_match`, `requires_manual_review`
- **requires\_manual\_review** flag for ambiguous cases
- **HS prefix**: the longest matching prefix from Annex I (4, 6, or 8 digit)
- **country risk**: `low` / `standard` / `high` per Commission Implementing Reg. (EU) 2025/1093
- **DDS deadline + basis**: 30 Dec 2026 (large/medium, or micro/small with EUTR carve-out) or 30 Jun 2027 (micro/small without carve-out) per Reg. (EU) 2025/2650
- **deforestation cut-off**: 31 December 2020
- **role-aware obligation flags**: `requires_dds`, `can_rely_on_upstream_dds`, `requires_geolocation`, `requires_risk_assessment`, `requires_enhanced_due_diligence`, `simplified_obligations_available`
- **structured obligations**: text-by-text article-cited list
- **legal\_basis**: list of regulation + article citations
- **amending\_acts**: the active amending acts considered (Reg. 2024/3234, Reg. 2025/1093, Reg. 2025/2650)

### Why this Actor exists

EUDR puts the legal burden on the **first operator** placing an in-scope product on the EU market, with simplified rules for downstream operators, SME traders, and low-risk-country sourcing introduced by Reg. (EU) 2025/2650 and Commission Implementing Reg. (EU) 2025/1093. To pre-screen whether you carry the full DDS, get simplified DD, or can rely on upstream documentation, you have to:

1. parse the HS / CN / TARIC code at the precision the currently-consolidated Annex I lists (including the December 2025 removal of certain CN Chapter 49 printed products by Reg. (EU) 2025/2650),
2. classify the country of production under the three-tier benchmarking from Reg. (EU) 2025/1093 (4 high-risk, ~50 standard-risk, ~140 low-risk countries),
3. derive role-specific obligations (operator first-placer, downstream operator, non-SME trader, SME trader),
4. determine the applicable deadline including the EUTR carve-out for previously-regulated micro/small operators,
5. resolve the simplification reason (low-risk country / downstream actor / micro-small primary operator / none),
6. cite the article-level basis.

This Actor turns that into a rule-based pre-screen.

### Input

```json
{
  "queries": [
    { "query": "0901.21", "country": "BR" },
    { "query": "1801.00", "country": "Cote d'Ivoire" },
    { "query": "wooden furniture", "country": "RU" },
    { "query": "1511.10.00", "country": "Indonesia" },
    { "query": "soya beans", "country": "AR" }
  ],
  "operatorRole": "operator_first_placer",
  "enterpriseSize": "large",
  "wasRegulatedByEUTR": false
}
```

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `queries` | array of objects | yes | n/a | Up to 5,000 items per run. Each item has a `query` plus optional `country`. |
| `queries[].query` | string | yes | n/a | HS / CN / TARIC code at any precision OR a plain-English commodity name. |
| `queries[].country` | string | no | n/a | ISO-2 / ISO-3 / full name. Diacritics accepted. If omitted, country risk defaults to `standard`. |
| `operatorRole` | enum | no | `operator_first_placer` | `operator_first_placer` / `operator_downstream` / `non_sme_trader` / `sme_trader`. Drives DDS submission obligation vs reliance on upstream DDS. |
| `enterpriseSize` | enum | no | `large` | `large` / `medium` / `small` / `micro` per Recommendation 2003/361/EC. Drives the deadline together with the EUTR carve-out. |
| `wasRegulatedByEUTR` | boolean | no | `false` | If micro/small AND previously regulated by Reg. (EU) 995/2010 (EUTR), the earlier 30 Dec 2026 deadline applies per Reg. (EU) 2025/2650 carve-out. |
| `operatorSize` (deprecated) | enum | no | `large` | Backwards-compatible. `large` → `enterpriseSize=large`; `sme` → `enterpriseSize=small`. Prefer the new fields. |

### Output

One dataset row per query. **In-scope example** (Brazilian coffee, large operator, first placer):

```json
{
  "query": "0901.21",
  "query_type": "hs_code",
  "country_input": "BR",
  "in_scope": true,
  "commodity_category": "coffee",
  "hs_code": "0901",
  "hs_label": "Coffee, whether or not roasted or decaffeinated",
  "country_iso2": "BR",
  "country_risk": "standard",
  "operator_role": "operator_first_placer",
  "enterprise_size": "large",
  "was_regulated_by_eutr": false,
  "deadline": "30 December 2026",
  "deadline_basis": "Large or medium enterprise: 30 December 2026 (Reg. 2025/2650)",
  "deforestation_cut_off": "31 December 2020",
  "requires_dds": true,
  "can_rely_on_upstream_dds": false,
  "requires_geolocation": true,
  "geolocation_precision": "Polygon coordinates for plots greater than 4 hectares (Art. 9(1)(d)). Single point coordinates accepted for plots up to 4 hectares and for cattle establishments.",
  "requires_information_collection": true,
  "requires_risk_assessment": true,
  "requires_risk_mitigation": true,
  "requires_enhanced_due_diligence": false,
  "simplified_due_diligence_available": false,
  "simplification_reason": "none",
  "screening_result": "in_scope_full_dds",
  "match_confidence": "prefix_code",
  "requires_manual_review": false,
  "requires_manual_cn_verification": false,
  "indicative_estimate_warning": "Indicative pre-screening only. ...",
  "not_affiliated_with_eu_commission": true,
  "verify_at": "https://green-business.ec.europa.eu/deforestation-regulation-implementation_en",
  "country_risk_source": "Commission Implementing Regulation (EU) 2025/1093",
  "annex_version": "Reg. (EU) 2023/1115 Annex I as currently consolidated, including the removal of certain CN Chapter 49 printed products by Reg. (EU) 2025/2650",
  "data_version": "2026-04-25",
  "obligations": [
    "Submit a Due Diligence Statement (DDS) to the EUDR Information System (Art. 4).",
    "Verify the product is deforestation-free since 31 December 2020 (Art. 9, Art. 10).",
    "Provide geolocation coordinates of all plots (Art. 9(1)(d)).",
    "Verify legality of production ..."
  ],
  "legal_basis": [
    "Reg. (EU) 2023/1115, Art. 4 to 13 (Due diligence)",
    "Reg. (EU) 2023/1115, Annex I (In-scope commodities and products, post-2025/2650 consolidation)",
    "Reg. (EU) 2025/2650 (Targeted revision)",
    "Commission Implementing Reg. (EU) 2025/1093 (Country benchmarking)"
  ],
  "amending_acts": [
    { "act": "Reg. (EU) 2024/3234", "subject": "Postponement of EUDR application by 12 months" },
    { "act": "Reg. (EU) 2025/2650", "subject": "Targeted revision: ..." },
    { "act": "Commission Implementing Reg. (EU) 2025/1093", "subject": "Country benchmarking ..." }
  ],
  "source_url": "https://eur-lex.europa.eu/eli/reg/2023/1115/oj"
}
```

**Downstream operator** (relying on upstream DDS reference): `requires_dds: false`, `can_rely_on_upstream_dds: true`, `screening_result: in_scope_can_rely_on_upstream_dds`, plus an obligation to record and pass through the upstream DDS reference (Art. 4(8) as amended by Reg. (EU) 2025/2650).

**SME trader**: `requires_dds: false`, `can_rely_on_upstream_dds: true`, simplified obligations under Art. 5(2) as amended by Reg. (EU) 2025/2650. Records of the upstream operator and the upstream DDS reference must be kept and made available on request.

**High-risk country** (Belarus, DPRK, Myanmar, Russia for first-placer or non-SME trader): `country_risk: "high"`, `requires_enhanced_due_diligence: true`, `requires_risk_mitigation: true`, additional Art. 13 obligation. Member-state authorities target ≥9% of operators and ≥9% of volume per year.

**Low-risk country** (e.g. China, India, US, EU member states for first-placer): `country_risk: "low"`, `simplified_due_diligence_available: true`, `simplification_reason: "low_risk_country"`. DDS still required, but `requires_risk_assessment: false` and `requires_risk_mitigation: false` per Art. 13(1).

**Out-of-scope**:

```json
{
  "query": "8517",
  "in_scope": false,
  "screening_result": "no_match",
  "requires_manual_review": true,
  "obligations": ["No matching EUDR Annex I HS code or commodity keyword. Manual review recommended ..."],
  "notes": ["Out-of-scope products may still fall under other EU due diligence frameworks (e.g. CSDDD, Conflict Minerals Regulation, FLEGT). EUDR screening alone is not a full sustainability check."]
}
```

### Code examples

#### Apify Client (Python)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("ravch/eudr-screener").call(run_input={
    "queries": [
        {"query": "0901.21", "country": "BR"},
        {"query": "wooden furniture", "country": "RU"},
    ],
    "operatorRole": "operator_first_placer",
    "enterpriseSize": "large",
})
needs_dds = []
needs_review = []
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    if item["requires_dds"]:
        needs_dds.append(item["query"])
    if item["requires_manual_review"]:
        needs_review.append(item["query"])
print(f"{len(needs_dds)} item(s) flagged for DDS submission")
print(f"{len(needs_review)} item(s) flagged for manual review")
```

#### curl (synchronous run)

```bash
curl -X POST 'https://api.apify.com/v2/acts/ravch~eudr-screener/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"queries":[{"query":"0901.21","country":"BR"},{"query":"4407","country":"RU"}],"operatorRole":"operator_first_placer","enterpriseSize":"large"}'
```

> **Security note**: prefer `Authorization: Bearer YOUR_APIFY_TOKEN` over a token in the URL where the platform supports it. Tokens in URLs may be logged by intermediaries.

### How matching works

#### HS code precision

EUDR Annex I lists commodities at 4-, 6- and (occasionally) 8-digit precision. Real-world inputs come at 4, 6, 8 (CN), or 10 (TARIC) digits with various separators. The matcher walks longest-prefix-first and returns the most specific Annex I entry that matches.

| Input | Normalised | Matched prefix | Category |
|---|---|---|---|
| `0901` | `0901` | `0901` | coffee |
| `0901.21` | `090121` | `0901` | coffee |
| `09012100` | `09012100` | `0901` | coffee |
| `0901210090` | `0901210090` | `0901` | coffee |
| `HS 1511.10` | `151110` | `151110` | oil\_palm |
| `8517` | `8517` | (no match) | (no match, manual review) |

#### Commodity name matching

A whole-word matcher with 1-2 letter suffix tolerance handles plurals and inflections: `tyre` matches `tyres`, `wood` matches `wooden`, `book` matches `books`. False positives like `iron` matching `ironing` are rejected.

#### Country risk benchmarking (Commission Implementing Reg. (EU) 2025/1093)

Under Commission Implementing Reg. (EU) 2025/1093 (adopted 22 May 2025) the Commission has classified ~195 countries into three tiers:

- **HIGH risk** (4 countries): Belarus, North Korea, Myanmar, Russia. Enhanced due diligence under Art. 13 if you are first-placer / non-SME trader. Authorities check at least 9% of operators and 9% of volume per year.
- **STANDARD risk** (~50 countries): Brazil, Indonesia, Malaysia, Argentina, Colombia, Mexico, Côte d'Ivoire, Nigeria, Cameroon and others. Full due diligence under Art. 4-13 if you are first-placer / non-SME trader. Authorities check at least 3% of operators per year.
- **LOW risk** (~140 countries): all 27 EU Member States, US, Canada, UK, China, India, Norway, Switzerland, Japan, Vietnam, Australia, etc. Simplified due diligence under Art. 13(1): collect Art. 9 information and submit DDS, but the risk assessment (Art. 10) and risk mitigation (Art. 11) steps are NOT required unless there is information indicating risk of mixing with non-low-risk supply.

Unknown country names default to standard risk (a safe default; the regulation's residual rule is LOW, but the Actor flags unknown country inputs for manual verification).

The Commission may amend the classification list. Always verify against the official [Green Forum country classification list](https://green-forum.ec.europa.eu/nature-and-biodiversity/deforestation-regulation-implementation/eudr-cooperation-and-partnerships/country-classification-list_en) before relying.

### Use cases

- **Procurement scope check**: pre-screen a supplier list / BoM to flag which SKUs likely trigger DDS submission vs reliance on upstream DDS
- **Pre-import customs validation**: customs broker pre-screens whether a shipment falls under EUDR before lodging a customs declaration
- **Annex I update sweep**: when the Commission amends Annex I, screen the SKU catalogue against the new list to flag newly in-scope items for review
- **Country tier change response**: when a producing country moves between tiers, screen sourcing data to flag suppliers now likely triggering enhanced DD
- **Role triage**: confirm whether your role under EUDR is operator first-placer, downstream operator, non-SME trader, or SME trader, and the resulting obligation profile
- **AI agent integration**: through the [EU Compliance MCP](../eu-compliance-mcp), ask an AI client "is HS 1511.10 from Indonesia likely in EUDR scope for an SME trader?" and get a structured pre-screen with article references (subject to MCP-server cautions)

### FAQ

**What's the difference between operator first-placer, operator downstream, non-SME trader, and SME trader?**

- **Operator first-placer**: the first economic operator placing an in-scope product on the EU market. Submits the DDS.
- **Operator downstream**: places on the market a product already placed by an upstream operator. Per Reg. (EU) 2025/2650 (Art. 4(8)), may rely on the upstream DDS reference number rather than submit a separate DDS.
- **Non-SME trader**: a trader that is not a micro/small enterprise. Treated as an operator under Art. 5(1) and carries the same Art. 4 to 12 obligations.
- **SME trader**: a micro/small trader. Significantly simplified obligations under Art. 5(2) as amended by Reg. (EU) 2025/2650. Keeps records of the upstream DDS reference; does not submit a separate DDS.

**What's the deadline for my operator type?**

- Large or medium enterprise: 30 December 2026.
- Micro or small enterprise: 30 June 2027 by default.
- Micro or small enterprise that was previously regulated by Reg. (EU) 995/2010 (EU Timber Regulation): 30 December 2026 (EUTR carve-out per Reg. (EU) 2025/2650). Verify case-by-case.

**Are there any low-risk countries?**
Yes. Commission Implementing Reg. (EU) 2025/1093 (adopted 22 May 2025) classifies ~140 countries as low risk, including all 27 EU Member States, the US, Canada, UK, China, India, Norway, Switzerland, Japan and Vietnam. Sourcing exclusively from low-risk countries enables simplified due diligence under Art. 13(1): operators must still collect Art. 9 information and submit a DDS, but the risk assessment (Art. 10) and risk mitigation (Art. 11) steps are not required unless there is information indicating risk of mixing with non-low-risk supply. Verify the current classification at the [official Green Forum country list](https://green-forum.ec.europa.eu/nature-and-biodiversity/deforestation-regulation-implementation/eudr-cooperation-and-partnerships/country-classification-list_en).

**How do I know which HS code to use?**
Use the CN (Combined Nomenclature) code that customs assigned to the import. CN matches HS at the 6-digit level and adds 2 more digits for EU specifics. The Actor accepts 4 / 6 / 8 / 10 digit precision and resolves to the longest matching Annex I prefix.

**My product is a derivative not in Annex I, am I really out of scope?**
EUDR covers **relevant commodities and relevant derived products listed in Annex I** (not arbitrary derivatives). If your HS code does not resolve to one of the seven commodity categories AND no relevant commodity keyword matches, the Actor flags `no_match` with `requires_manual_review` and `requires_manual_cn_verification: true`. Confirm manually that no EUDR-relevant commodity is present in your supply chain (cocoa as ingredient, palm derivatives like fatty acids or biodiesel, leather, paper packaging, etc.). Out-of-EUDR-scope products may still fall under other regimes (CSDDD, FLEGT).

**What about printed books and newspapers (CN Chapter 49)?**
Reg. (EU) 2025/2650 **removed CN Chapter 49 printed products from Annex I**. Printed books (4901), newspapers (4902), brochures and leaflets are NOT in EUDR scope post-2025/2650. The Actor flags any query starting with 4901/4902 with `requires_manual_cn_verification: true` so users can confirm they are using the post-2025/2650 consolidated Annex I.

**Are products produced in EU forests in scope?**
Yes. EUDR applies regardless of where the commodity was produced, including EU-grown wood, EU-raised cattle, EU-cultivated soya. The country-risk classification simply determines the procedural intensity. EU member states default to standard risk.

**What about traders who buy from a first placer?**
Per Reg. (EU) 2025/2650 (first-placer rule), only the first operator placing the product on the EU market submits the DDS. Downstream operators and SME traders may rely on the upstream DDS reference number under Art. 4(8) and Art. 5(2). Set `operatorRole` to `operator_downstream` or `sme_trader` to get the corresponding pre-screen.

**How fresh is the country risk list?**
Reflects Commission Implementing Reg. (EU) 2025/1093 as published. After each Commission amendment, the Actor data is updated and a new version is released. Re-run affected screenings after every amendment.

### Pricing

Pay per event. No subscription, no setup fee.

| Event | Price |
|---|---|
| Actor Start (once per run) | $0.001 |
| Product Screened (per query) | $0.005 |

Screening 1,000 SKUs in a single run costs **$5.001**.

### Limitations

- Pre-screens scope and likely obligations. Does **not** verify your specific shipment is deforestation-free, does **not** validate geolocation polygons against satellite forest-cover data, does **not** submit DDS to the EUDR Information System.
- Does not validate your declared `operatorRole`, `enterpriseSize`, or `wasRegulatedByEUTR` flag against your actual position in the supply chain.
- Country risk reflects Commission Implementing Reg. (EU) 2025/1093 as published. List can change.
- Annex I uses the Combined Nomenclature; some 6-digit subheadings split into 8-digit CN codes of which only some are in scope. The Actor preserves the precision Annex I publishes.
- Many secondary obligations (record-keeping under Art. 12, public communication under Art. 11, supplier risk-mitigation specifics) require human judgement and are not pre-screened by this Actor.

### Sources

- [Regulation (EU) 2023/1115 (EUDR) consolidated text on EUR-Lex](https://eur-lex.europa.eu/eli/reg/2023/1115/oj)
- [Regulation (EU) 2024/3234: postponement of application](https://eur-lex.europa.eu/eli/reg/2024/3234/oj)
- [Commission Implementing Reg. (EU) 2025/1093: country benchmarking (three-tier classification)](https://eur-lex.europa.eu/eli/reg_impl/2025/1093/oj)
- [Regulation (EU) 2025/2650: targeted revision (downstream / SME / first-placer / EUTR carve-out / CN Ch. 49 removal)](https://eur-lex.europa.eu/eli/reg/2025/2650/oj)
- [European Commission, Deforestation Regulation implementation portal](https://green-business.ec.europa.eu/deforestation-regulation-implementation_en)
- [European Commission Green Forum, Country Classification List](https://green-forum.ec.europa.eu/nature-and-biodiversity/deforestation-regulation-implementation/eudr-cooperation-and-partnerships/country-classification-list_en)

### Related compliance Actors

- [**EU Compliance MCP Server**](../eu-compliance-mcp): call this Actor (and 3 others) from Claude Desktop, Cursor, or any MCP-compatible AI client (subject to MCP-server cautions in that Actor's README)
- [**REACH SVHC Checker**](../reach-svhc-checker): chemical substances of very high concern
- [**CBAM Report Helper**](../cbam-report-helper): Carbon Border Adjustment Mechanism for cement, steel, aluminium, fertilisers, electricity, hydrogen
- [**Battery Regulation Passport**](../battery-regulation-passport): Reg. (EU) 2023/1542 scope check, Battery Passport pre-screening

### Disclaimer

This Actor provides an **unofficial preliminary EUDR scope and obligation screening** based on the supplied CN/HS code or product description, country of production, operator role, and company-size inputs. It is **not affiliated with or endorsed by the European Commission, any market surveillance authority, or any competent authority of an EU Member State**.

Output is **preliminary screening only** and is **not legal, customs, environmental, or due-diligence advice**. Results do not verify deforestation-free status, legality of production, geolocation accuracy, supply-chain mixing, customs classification, or the user's actual operator/trader role. The Actor's classification, dates and obligation flags may be incomplete, outdated, or wrong, particularly where the regulation depends on Commission delegated/implementing acts (notably the country classification list under Reg. (EU) 2025/1093) that may have been amended after the Actor's last update.

Annex I classification, country-risk status, DDS obligations, applicable deadlines, EUTR carve-out applicability, location of production plots and deforestation-free / legally-produced status **must be verified** against the official [EUDR Information System](https://green-business.ec.europa.eu/deforestation-regulation-implementation_en), [EUR-Lex](https://eur-lex.europa.eu/) and qualified counsel before placing, making available, or exporting relevant products on the EU market.

Final compliance responsibility under Art. 4 EUDR rests on the operator. The author and ravch.dev disclaim all liability for any direct, indirect, or consequential loss arising from use of, or reliance on, this Actor's output. Use at your own risk.

# Actor input Schema

## `queries` (type: `array`):

List of products to pre-screen against EUDR Annex I. Each item is an object with two fields: `query` is an HS / CN / TARIC code (4 / 6 / 8 / 10 digit, dots and spaces allowed) OR a plain-English commodity name ("coffee", "palm oil", "wooden furniture"). Optional `country` accepts ISO-2 (BR), ISO-3 (BRA), or full name ("Brazil", "Côte d'Ivoire"). Up to 5,000 items per run.

## `operatorRole` (type: `string`):

Role of the entity placing or making the product available on the EU market (Reg. 2023/1115 as amended by Reg. 2025/2650). 'operator\_first\_placer' submits the DDS. 'operator\_downstream' may rely on the upstream DDS reference under Art. 4(8). 'non\_sme\_trader' is treated as an operator under Art. 5(1). 'sme\_trader' (micro/small) has significantly simplified obligations under Art. 5(2).

## `enterpriseSize` (type: `string`):

Per Recommendation 2003/361/EC. Large/medium: 30 December 2026. Micro/small: 30 June 2027 by default, or 30 December 2026 if previously regulated by EUTR (set `wasRegulatedByEUTR`).

## `wasRegulatedByEUTR` (type: `boolean`):

Reg. (EU) 2025/2650 EUTR carve-out: micro/small operators who were already in scope of Reg. (EU) 995/2010 (EUTR) face the earlier 30 December 2026 EUDR deadline rather than 30 June 2027. Verify carve-out applicability case-by-case.

## Actor input object example

```json
{
  "queries": [
    {
      "query": "0901.21",
      "country": "BR"
    },
    {
      "query": "coffee",
      "country": "VN"
    },
    {
      "query": "1801.00",
      "country": "GH"
    },
    {
      "query": "soya beans",
      "country": "AR"
    },
    {
      "query": "wooden furniture",
      "country": "ID"
    }
  ],
  "operatorRole": "operator_first_placer",
  "enterpriseSize": "large",
  "wasRegulatedByEUTR": 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 = {
    "queries": [
        {
            "query": "0901.21",
            "country": "BR"
        },
        {
            "query": "coffee",
            "country": "VN"
        },
        {
            "query": "1801.00",
            "country": "GH"
        },
        {
            "query": "soya beans",
            "country": "AR"
        },
        {
            "query": "wooden furniture",
            "country": "ID"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ravch/eudr-screener").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 = { "queries": [
        {
            "query": "0901.21",
            "country": "BR",
        },
        {
            "query": "coffee",
            "country": "VN",
        },
        {
            "query": "1801.00",
            "country": "GH",
        },
        {
            "query": "soya beans",
            "country": "AR",
        },
        {
            "query": "wooden furniture",
            "country": "ID",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("ravch/eudr-screener").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 '{
  "queries": [
    {
      "query": "0901.21",
      "country": "BR"
    },
    {
      "query": "coffee",
      "country": "VN"
    },
    {
      "query": "1801.00",
      "country": "GH"
    },
    {
      "query": "soya beans",
      "country": "AR"
    },
    {
      "query": "wooden furniture",
      "country": "ID"
    }
  ]
}' |
apify call ravch/eudr-screener --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=ravch/eudr-screener",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "EUDR Screener: HS code & country risk for Reg. 2023/1115",
        "description": "Screen HS codes and commodity names against EU Deforestation Regulation (EUDR) Annex I. Returns scope, commodity (cattle, cocoa, coffee, oil palm, rubber, soya, wood), country risk per Reg. 2025/917, DDS deadline (30 Dec 2026 large / 30 Jun 2027 SME), and obligations with article citations.",
        "version": "0.3",
        "x-build-id": "6ymGfNgZyotaLRcTT"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/ravch~eudr-screener/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-ravch-eudr-screener",
                "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/ravch~eudr-screener/runs": {
            "post": {
                "operationId": "runs-sync-ravch-eudr-screener",
                "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/ravch~eudr-screener/run-sync": {
            "post": {
                "operationId": "run-sync-ravch-eudr-screener",
                "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",
                "required": [
                    "queries"
                ],
                "properties": {
                    "queries": {
                        "title": "Products to screen",
                        "minItems": 1,
                        "maxItems": 5000,
                        "type": "array",
                        "description": "List of products to pre-screen against EUDR Annex I. Each item is an object with two fields: `query` is an HS / CN / TARIC code (4 / 6 / 8 / 10 digit, dots and spaces allowed) OR a plain-English commodity name (\"coffee\", \"palm oil\", \"wooden furniture\"). Optional `country` accepts ISO-2 (BR), ISO-3 (BRA), or full name (\"Brazil\", \"Côte d'Ivoire\"). Up to 5,000 items per run."
                    },
                    "operatorRole": {
                        "title": "Your role under EUDR",
                        "enum": [
                            "operator_first_placer",
                            "operator_downstream",
                            "non_sme_trader",
                            "sme_trader"
                        ],
                        "type": "string",
                        "description": "Role of the entity placing or making the product available on the EU market (Reg. 2023/1115 as amended by Reg. 2025/2650). 'operator_first_placer' submits the DDS. 'operator_downstream' may rely on the upstream DDS reference under Art. 4(8). 'non_sme_trader' is treated as an operator under Art. 5(1). 'sme_trader' (micro/small) has significantly simplified obligations under Art. 5(2).",
                        "default": "operator_first_placer"
                    },
                    "enterpriseSize": {
                        "title": "Enterprise size (drives the DDS deadline)",
                        "enum": [
                            "large",
                            "medium",
                            "small",
                            "micro"
                        ],
                        "type": "string",
                        "description": "Per Recommendation 2003/361/EC. Large/medium: 30 December 2026. Micro/small: 30 June 2027 by default, or 30 December 2026 if previously regulated by EUTR (set `wasRegulatedByEUTR`).",
                        "default": "large"
                    },
                    "wasRegulatedByEUTR": {
                        "title": "Was the operator previously regulated by the EU Timber Regulation?",
                        "type": "boolean",
                        "description": "Reg. (EU) 2025/2650 EUTR carve-out: micro/small operators who were already in scope of Reg. (EU) 995/2010 (EUTR) face the earlier 30 December 2026 EUDR deadline rather than 30 June 2027. Verify carve-out applicability case-by-case.",
                        "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
