# EUDR/CSRD Supply-Chain Reference Data Feed (`conceivable_extension/eudr-csrd-data-feed`) Actor

Reference-data layer for EU Deforestation Regulation and CSRD compliance: is a product/HS code in EUDR scope, what's the origin country's official EU deforestation-risk classification, does a company hit current CSRD thresholds, and what changed since your last check.

- **URL**: https://apify.com/conceivable\_extension/eudr-csrd-data-feed.md
- **Developed by:** [joseph fadero](https://apify.com/conceivable_extension) (community)
- **Categories:** Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 commodity scope check completes

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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/CSRD Supply-Chain Reference Data Feed

**EUDR enforcement begins 30 December 2026 for large operators. Penalties can reach 4% of total annual EU turnover. There is essentially zero dedicated coverage of this on the Apify Store today** — the closest adjacent actor found during this build's research has 2 users.

### What this is NOT — read this first

**This actor does not do satellite plot-boundary verification or TRACES due-diligence-statement submission.** Those are real EUDR compliance requirements, but they are not scraping/data-lookup tasks — they need geolocation data your company holds, satellite imagery analysis, and direct integration with the EU's TRACES system. That's a different, much larger product. This actor is deliberately scoped to the **reference-data layer**: the four lookups a compliance team needs answered repeatedly, not the full due-diligence workflow.

### What it does

| Mode | Answers |
|---|---|
| `commodity_scope_check` | Is this HS code an EUDR-regulated commodity/product? |
| `country_risk_check` | What's this origin country's official EU deforestation-risk classification? |
| `csrd_scope_check` | Does this company hit current CSRD reporting thresholds? |
| `regulatory_update_feed` | Has the country-risk list or EU guidance changed since your last check? |

### Everything below was researched live for this build, not assumed — this is the highest-stakes actor in the portfolio so far

**CSRD thresholds** have genuinely changed multiple times through 2025-2026 (the PRD itself flagged this) — verified against current sources rather than carried over from older knowledge:

- EU undertakings: **> 1,000 employees AND > €450,000,000 net EU turnover** (both criteria, consolidated basis for groups) — no balance-sheet threshold post-Omnibus.
- Third-country (non-EU parent) undertakings: > €450M EU-generated turnover (parent, 2 consecutive years) AND a subsidiary/branch exceeding €200M EU turnover.
- Applicable for financial years beginning on or after **1 January 2027**.
- Legal basis: **Directive (EU) 2026/470** — Council approval 24 Feb 2026, Official Journal publication 26 Feb 2026, entered into force 18 March 2026. Cross-referenced across two independent sources before hardcoding.

**Not modeled:** the "wave one" transitional exemption for companies already reporting from FY2024 that would otherwise fall out of scope for FY2025-2026 — that needs prior reporting history, which isn't in this actor's input schema.

**Country risk classification is live-fetched from the European Commission's own official page**, not a hardcoded snapshot — confirmed live while building this actor: 194 countries, split exactly **140 low / 50 standard / 4 high** risk, matching the Commission's published 22 May 2025 figures precisely (the 4 high-risk countries: Belarus, Myanmar, North Korea, Russia). A revision is expected sometime in 2026 pending updated FAO deforestation data — because this fetches live rather than from a snapshot, that revision is picked up automatically, no rebuild needed.

**Commodity/HS code mapping is a static table, and this is the one part of the build genuinely worth double-checking yourself.** EUR-Lex (the EU's official legislation portal) returned empty/blocked responses to automated requests throughout this build — likely bot-protection on primary-legislation pages, not a data-availability problem. The table here was compiled from a third-party legal-compliance summary and cross-referenced against general knowledge of the regulation's structure, including a **genuine July 2026 amendment** (soluble coffee HS 2101 11 00 and frozen cattle tongues HS ex 0206 21 00 were added to Annex I, compliance required from 30 Dec 2027) that this table reflects. For a compliance-critical determination, verify the exact HS code against the authoritative text yourself: https://eur-lex.europa.eu/eli/reg/2023/1115 — many Annex I entries are "ex" (partial-heading) qualified, meaning only certain goods within an HS heading are actually in scope; this table matches by prefix, which can occasionally over-include.

**The regulatory update feed monitors two real things, not a fabricated "here's what changed in the law" feature.** No clean, fetchable, dated legislative-change feed was found (same EUR-Lex blocking issue). Instead it diffs: (1) the country-risk list itself — precise, per-country additions/reclassifications/removals — and (2) a content hash of the Commission's EUDR resource hub page as a coarse "something changed here, go look" signal. Both are real, both are checked live every run, neither pretends to be more specific than it is.

### Input schema

```json
{
  "mode": "country_risk_check",
  "hsCode": "440710",
  "originCountry": "BR",
  "companyEmployeeCount": 5000,
  "companyEUTurnover": 800000000,
  "companyNonEURevenue": 100000000
}
```

`originCountry` accepts a 2-letter ISO code or a full country name — resolved against the EU's own official naming (which uses UN-standard long-form names like "United States of America," "Russian Federation") via the same UN reference data already used in Actor 28, plus a small alias table for common short forms (USA, UK, South/North Korea, Vietnam, etc.).

### Output schema

```json
{
  "queryType": "commodity_scope_check | country_risk_check | csrd_scope_check | regulatory_update_feed",
  "isEUDRInScope": "boolean | null",
  "commodityCategory": "cattle | cocoa | coffee | palm_oil | rubber | soy | wood | derived_product | not_applicable | null",
  "countryRiskClassification": "low | standard | high | not_classified | null",
  "isCSRDInScope": "boolean | null",
  "csrdApplicableFrom": "string | null",
  "regulatoryChangesSinceLastRun": ["array of change descriptions"],
  "sourceUrl": "string",
  "checkedAt": "ISO timestamp"
}
```

Fields not relevant to the requested `mode` are `null` rather than omitted, so downstream consumers get a stable shape regardless of mode.

### Delta detection

Reuses `src/shared/deltaStore.ts` from Actor 26 verbatim, same as Actor 27 — unmodified, including the named-store fix that makes cross-run persistence actually work.

### Pricing

| Event | Price |
|---|---|
| Run started | £0.05 |
| Commodity/country/CSRD check | £0.05 |
| Regulatory change detected | £0.20 |
| Regulatory check, no change | £0.08 |
| Lookup failed | free |

Regulatory-update mode is priced as the primary recurring-revenue driver per the PRD's own framing — a one-time scope check is useful once, tracking amendments is genuinely ongoing value, especially for a regulation that's already been delayed once.

### Setup note

No browser needed — plain HTTP calls to the EU Commission's own pages and UN Comtrade's reference data, runs on `apify/actor-node:20`.

### n8n integration

- **Workflow A (trigger):** scheduled weekly check for regulatory amendments/delays.
- **Workflow B (processing):** alert on any detected change (this regulation has already slipped once — buyers need to know immediately if it happens again), quarterly digest of CSRD threshold changes if applicable.

# Actor input Schema

## `mode` (type: `string`):

commodity\_scope\_check: is this HS code in EUDR scope. country\_risk\_check: EU deforestation-risk classification for this origin country. csrd\_scope\_check: does this company hit current CSRD reporting thresholds. regulatory\_update\_feed: has the EU's country-risk list or key EUDR guidance changed since your last check.

## `hsCode` (type: `string`):

Harmonized System / CN code, e.g. '440710'. Required when mode is commodity\_scope\_check.

## `originCountry` (type: `string`):

2-letter ISO code (e.g. 'BR') or full country name matching the EU's own list (e.g. 'Brazil'). Required when mode is country\_risk\_check.

## `companyEmployeeCount` (type: `integer`):

Required when mode is csrd\_scope\_check.

## `companyEUTurnover` (type: `number`):

Net annual turnover generated in the EU, in euros. Required when mode is csrd\_scope\_check.

## `companyNonEURevenue` (type: `number`):

Optional, for csrd\_scope\_check. If substantial relative to EU turnover, the actor flags that the third-country parent+subsidiary test may need manual review — see README, this can't be fully resolved from these three inputs alone.

## Actor input object example

```json
{
  "mode": "regulatory_update_feed"
}
```

# Actor output Schema

## `resultsDatasetUrl` (type: `string`):

Dataset of EUDR/CSRD reference-data records produced by this run.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("conceivable_extension/eudr-csrd-data-feed").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("conceivable_extension/eudr-csrd-data-feed").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{}' |
apify call conceivable_extension/eudr-csrd-data-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,conceivable_extension/eudr-csrd-data-feed"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/dFcczOeZFAdOW5zyT/builds/BinupW1rF72t70QWg/openapi.json
