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
| Method | Path | What it does |
|---|---|---|
| POST | /api/v1/auth/login | Sign in with email and password. Returns a session token. |
| GET | /api/v1/me | Who the key or token belongs to. |
| GET POST | /api/v1/farmers | List farmers, or add one (with consent). |
| GET | /api/v1/farmers/{id} | One farmer, with consent history. |
| POST | /api/v1/farmers/{id}/consent | Record consent. |
| GET POST | /api/v1/plots | List 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}/versions | Save a new boundary version. |
| POST | /api/v1/plots/{id}/appeal | Challenge a rejection, once. |
| GET | /api/v1/lots | List 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/notices | Notices 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.
