Independent AI agent for EU Deforestation Regulation compliance, not affiliated with the EU. Scope & disclaimer →
eudr.dev

How eudr.dev works

The workflow a user, an AI agent, or an auditor walks through when they interact with eudr.dev. The page focuses on what happens, not how it's coded; the code lives behind a closed runtime. The open-source story sits one layer down at emem, the Earth-memory protocol that supplies every signed per-cell fact this agent cites. For logic, algorithm, or wire-format questions, refer to emem.

What goes in, what comes out

InputOutput
A scenario (operator, supplier, product, geolocation) in JSON, with at least: HS code, country of production, plot polygon (or point for cattle / plots ≤ 4 ha), harvest window.A signed Annex II Due Diligence Statement (JSON + printable PDF), with a per-cell evidence chain to emem, an ed25519 signature anchored as a CIDv1, and a TRACES-NT-v2-shaped XML export when the operator runs eudr export-traces.

The DDS verdict is one of negligible, non_negligible, not_in_scope, or indeterminate. Only negligible is filable under Art. 4(1). The other labels still produce a signed document so the operator's records carry the assessment.

The 7-stage workflow

Every DDS compile walks through seven stages. Each one emits a structured event over SSE so a live client can render progress; each one lands verbatim in the final receipt's stage_traces.

   scenario JSON
        │
        ▼
 ┌─────────────────┐    Polygon → centroid → emem cell64.
 │ 1.  geo         │    Smallholder flag (≤ 5 ha), OGC-simple check,
 │                 │    plot-area computation.
 └─────────────────┘
        │
        ▼
 ┌─────────────────┐    Per cell: Hansen GFC loss-year,
 │ 2a. forest      │    ESA WorldCover 2021 class,
 │                 │    JRC GFC2020 baseline, RADD alerts.
 └─────────────────┘    Verdict per cell + fact CIDs.
        │
        ▼
 ┌─────────────────┐    Per cell: NDVI, NDRE, NDMI, S1 backscatter,
 │ 2b. snapshots   │    JRC GSW recurrence. Per plot: soil
 │                 │    (SoilGrids), weather (met.no), elevation
 │                 │    (Cop-DEM). Tolerant of partial outages.
 └─────────────────┘
        │
        ▼
 ┌─────────────────┐    Implementing Reg. (EU) 2025/1093 country
 │ 3.  legality    │    tier (low/standard/high).
 │                 │    Art. 13 simplified-DD flag.
 └─────────────────┘
        │
        ▼
 ┌─────────────────┐    Tenure / FPIC / labour-rights plug-in.
 │ 4.  tenure      │    Empty in the baseline module; partner
 │                 │    providers extend it.
 └─────────────────┘
        │
        ▼
 ┌─────────────────┐    Composite risk score 0–1.
 │ 5.  risk        │    Verdict: negligible / non_negligible /
 │                 │    not_in_scope / indeterminate.
 └─────────────────┘
        │
        ▼
 ┌─────────────────┐    Annex II JSON document. Operator block,
 │ 6.  dds         │    product block, geolocation array, declaration
 │                 │    text, signature placeholder.
 └─────────────────┘
        │
        ▼
 ┌─────────────────┐    Pay-on-pass settlement record (free during
 │ 7.  settle      │    the public preview; PayPal or x402 USDC when
 │                 │    paid mode is enabled).
 └─────────────────┘
        │
        ▼
   signed receipt (JSON envelope + CIDv1 + ed25519 signature)

Stage 2a is the heavy emem call: ~30–90 seconds depending on plot size. Everything else completes in seconds (or microseconds, for the local-computation stages).

Three ways to invoke it

InterfaceAudienceEndpoint
HTTP /v1/AI agents (LangChain, CrewAI, custom JSON-RPC clients)POST /v1/dds/generate, POST /v1/spatial/verify, POST /v1/receipt/verify, GET /v1/reference/{countries,commodities}
A2A JSON-RPCAgent-to-agent flows over the A2A v1.0 protocolPOST /a2a/rpc with method SendMessage / GetTask. Agent card at /.well-known/agent-card.json.
MCP (stdio)Local AI tooling (Claude Desktop, Cursor, Continue, Cody, Zed)eudr-mcp binary; install snippet at /.well-known/mcp.json.
Browser consoleHumans filing a single shipment by hand/ home page → Human mode → form + sample picker.

All four converge on the same compile pipeline. The agent card and the OpenAPI spec (at /openapi.json) advertise the same tools with the same semantics so AI agents see one consistent surface regardless of transport.

Two cryptographic layers per receipt

A single Due Diligence Statement carries two independent signatures that an auditor can verify offline:

  1. eudr.dev's signature over the DDS payload. The payload is canonicalised (JCS-style: sorted keys, no insignificant whitespace, no trailing newline), hashed with BLAKE3, wrapped as a CIDv1 (multicodec raw 0x55 + multihash blake3-256 0x1e, encoded base32-lower with the multibase 'b' prefix), and signed with ed25519 over the CID bytes. The signer's public key is published at the agent card's verification_method[0].publicKeyMultibase.
  1. emem.dev's signature over each upstream fact. Every per-cell forest, land-cover, weather, soil, and elevation value cited in the DDS is content-addressed by its own CID and signed by emem's responder pubkey. The CIDs land verbatim in source_receipts.emem.per_cell[].fact_cids[]. Dereference any of them at https://emem.dev/v1/facts/<cid> to retrieve the pre-image and re-hash.

The two layers are independent. Even if eudr.dev's signing identity ever rotates, the emem facts under a historical receipt remain verifiable from emem.dev's side. The verification procedure for both layers is detailed in /docs/audit/verify-offline.

What state lives where

DataWhere it livesRetention
Working task (in-flight compile)Process memory + SQLiteEUDR_TASK_RETENTION_DAYS (default 7 days).
Audit logSQLite, pseudonymised via BLAKE3 + per-instance saltIndefinite (Art. 17(3)(b) legal-obligation basis).
Signed receiptsOperator's own archive5 years per Art. 12(5). The engine does not hold a copy after retention.
Per-cell evidenceemem.dev's content-addressed storePersistent on emem's side, not in eudr.dev.
Operator PIIOnly as long as the task is liveErased on DELETE /a2a/tasks/{id} or on retention sweep.

What's open source and what's not

Open source?Where
ememYesgithub.com/Vortx-AI/emem. The Earth-memory protocol, the responder, the materializer set, the wire format, the verification primitives.
eudr.devNoIndependent AI agent operated by Vortx AI Private Limited. The compile pipeline and the HTTP surface are a closed runtime; the receipts they produce are still offline-verifiable using the open primitives below.
Receipt verification primitives (BLAKE3, ed25519, CIDv1, JCS-canonical JSON)OpenIndustry-standard, multiple open implementations. The verifier needs no eudr.dev code.
Annex II shapeOpen (regulator)Defined by Reg. (EU) 2023/1115 as amended by Reg. (EU) 2025/2650.

If you want to read code (the algorithms, the wire shapes, the responder logic) that's all at emem. eudr.dev composes those into a Reg. (EU) 2023/1115-shaped surface and signs the resulting DDS under its own DID.

What's not in scope

See also