Developers

Connect your own systems to EUDR Farm.

Getting access

An organisation administrator creates an access key under Integrations in the app. A key can be read-only, is shown once, and can be revoked at any time. It acts as the person who made it. To try the interface safely, ask us for a test organisation: it is marked as a test, shows a banner, and its data is not evidence.

Calling the interface

curl -H "Authorization: Bearer efk_…" https://<your-site>/api/v1/farmers

Responses are JSON: {"data": …}, or {"error": {"code", "message", "requestId"}}. Version 1 is stable: new fields may appear, existing ones will not change meaning. A POST may carry an Idempotency-Key header, and a repeat with the same key returns the first answer.

Limits

Each key can make 60 calls a minute. Beyond that you receive 429 with the time to wait. A read-only key receives 403 on anything but GET. An administrator can switch the interface off for an organisation.

Endpoints

MethodPathWhat it does
POST/api/v1/auth/loginSign in with email and password. Returns a session token.
GET/api/v1/meWho the key or token belongs to.
GET POST/api/v1/farmersList farmers, or add one (with consent).
GET/api/v1/farmers/{id}One farmer, with consent history.
POST/api/v1/farmers/{id}/consentRecord consent.
GET POST/api/v1/plotsList plots, or add one with a boundary.
GET/api/v1/plots/{id}One plot: boundary versions, check results, screening and review decisions.
POST/api/v1/plots/{id}/versionsSave a new boundary version.
POST/api/v1/plots/{id}/appealChallenge a rejection, once.
GET/api/v1/lotsList lots.
GET/api/v1/lots/{id}One lot: purchases, packs, share links and what blocks it.
GET/api/v1/packs/{id}The files in a pack.
GET/api/v1/packs/{id}/files/{name}Download one pack file.
GET/api/v1/connectors/ice-cot/lots/{id}The ICE CoT farm plot file from the lot's newest pack.
GET/api/v1/noticesNotices for the signed-in user.

Webhooks

Add an address under Integrations to be told when a plot is verified (plot.verified) or blocked (plot.blocked), or a pack is generated (pack.generated). The body holds ids and codes only.

POST https://your.address/hook
X-EUDRFarm-Event: plot.verified
X-EUDRFarm-Timestamp: 1767225600
X-EUDRFarm-Signature: sha256=<hex>

{"id":"…","event":"plot.verified","createdAt":"…","data":{"plotId":"…","plotCode":"P-…","status":"verified"}}

Check the signature by computing HMAC-SHA256(secret, timestamp + "." + body) as hex and comparing it with the header. Reject messages with an old timestamp. Answer with any 2xx status; anything else is tried again, up to six times over about nine hours. The address must be public and use https.

Connectors

The ICE CoT connector returns the farm plot file with the field names the ICE CoT platform asks for. It can be switched on or off per organisation.