Validate, fix, convert and report on EUDR geolocation files over HTTPS, save projects and file due diligence statements. OpenAPI 3.1, API keys, per-plan limits.
The API does what the checker does, for programs: an ERP that checks supplier files as
they arrive, a pipeline that fixes and saves them, a script that files the statement.
It runs the same rules, fixes and converter as the web checker, so a file comes out the
same either way. The whole API is described in OpenAPI 3.1 at
/api/v1/openapi.json; point a client generator at it.
Keys
Create a key in Settings → API and MCP (Team or Consultant plan). Send it on every request:
Authorization: Bearer eudr_…
A key works in one workspace, with the role of the member who created it: a viewer's key
can read projects but not save them. If that member leaves the workspace, the key stops
working. Only a hash of the key is stored; it is shown once, when you create it.
Limits
Each plan with the API has a number of requests a minute, counted per billing workspace,
and the plan's monthly allowance of distinct plots, shared with saved projects and
supplier uploads. A plot counts once a month however often you send it. Every response
carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset; a 429 also
carries Retry-After. GET /me shows both allowances.
Sending files
The examples use $EUDR_API for the base URL at the top of the reference
and $EUDR_KEY for your key. Send the file as the body, or as multipart/form-data when it has several parts (a
shapefile's .shp, .dbf and .prj). Options go in the query string.
Largest file: 50 MB. A GeoJSON file compresses about tenfold, so send large ones
gzip-compressed with Content-Encoding: gzip.
Files sent to /validate, /fix, /convert, /report and /forest are processed in
memory and not stored. Nothing from them is logged. Only the project endpoints store a
file, as a saved version. For files that must not leave your computer at all, use
the command-line tool.
Errors
Every error has the same shape, with a stable code to branch on and a message to show
a person:
Base URL: https://eudrplot.com/api/v1 · OpenAPI 3.1: openapi.json
Files
Stateless: the file is processed and not stored.
POST/validate
Check a file. Every problem the Information System would reject the file for, and the weaker points of its evidence, with how to fix each. Non-GeoJSON files are converted first.
Parameter
In
Description
filename optional
query
The file's name, when sending raw bytes; its extension tells the format. Default plots.geojson.
commodity optional
query
The commodity. Only cattle changes the result. One of: cattle, cocoa, coffee, oil-palm, rubber, soya, wood.
crs optional
query
The coordinate system when the file does not declare it, e.g. EPSG:32630.
country optional
query
ISO alpha-2 country of the plots, so unlabelled UTM can be recognised.
features optional
query
Include the per-plot table. Default true.
Body: The file: its raw bytes as the body (GeoJSON, KML, KMZ, GPX, CSV or a zipped shapefile), or multipart/form-data with one or more files (a shapefile's .shp, .dbf and .prj). Content-Encoding: gzip is accepted. Largest file: 50 MB decompressed.
Fix a file. Applies the automatic fixes, re-checks, and returns the fixed GeoJSON with a change log of every change (hectares before and after for geometry). Fixes that change a plot's area need acceptGeometryChanges and never pass the area guard.
Parameter
In
Description
filename optional
query
The file's name, when sending raw bytes; its extension tells the format. Default plots.geojson.
fixes optional
query
Comma-separated fix ids. Default: every bulk-safe fix.
acceptGeometryChanges optional
query
Allow fixes that change a plot's measured area (within the 2% guard).
commodity optional
query
The commodity. Only cattle changes the result. One of: cattle, cocoa, coffee, oil-palm, rubber, soya, wood.
crs optional
query
The coordinate system when the file does not declare it, e.g. EPSG:32630.
country optional
query
ISO alpha-2 country of the plots, so unlabelled UTM can be recognised.
output optional
query
file: answer with the GeoJSON itself instead of JSON. One of: json, file.
Body: The file: its raw bytes as the body (GeoJSON, KML, KMZ, GPX, CSV or a zipped shapefile), or multipart/form-data with one or more files (a shapefile's .shp, .dbf and .prj). Content-Encoding: gzip is accepted. Largest file: 50 MB decompressed.
Responses:
200 The fixed file and what was done, or with output=file the GeoJSON itself (X-Changes-Applied, X-Fixes-Skipped and X-Errors-Remaining headers). FixResult
400 Bad request: a wrong option or an unreadable body.
401 The key is missing, wrong or revoked.
402 The plan does not include this, or the month's plot allowance would be exceeded.
413 The file is too large.
415 Not a file format the checker reads.
422 The file could not be converted (e.g. crs_required, with likely EPSG codes), or the Information System refused it.
423 The workspace is read-only: payment is overdue.
Convert to GeoJSON. KML, KMZ, GPX, CSV or a shapefile to GeoJSON in WGS 84 degrees, with every decision listed. A file whose coordinate system cannot be determined gets 422 crs_required with the likely EPSG codes in details.crsCandidates.
Parameter
In
Description
filename optional
query
The file's name, when sending raw bytes; its extension tells the format. Default plots.geojson.
crs optional
query
The coordinate system when the file does not declare it, e.g. EPSG:32630.
country optional
query
ISO alpha-2 country of the plots, so unlabelled UTM can be recognised.
output optional
query
file: answer with the GeoJSON itself instead of JSON. One of: json, file.
Body: The file: its raw bytes as the body (GeoJSON, KML, KMZ, GPX, CSV or a zipped shapefile), or multipart/form-data with one or more files (a shapefile's .shp, .dbf and .prj). Content-Encoding: gzip is accepted. Largest file: 50 MB decompressed.
Responses:
200 The GeoJSON and the conversion notes, or with output=file the GeoJSON itself. ConvertResult
400 Bad request: a wrong option or an unreadable body.
401 The key is missing, wrong or revoked.
402 The plan does not include this, or the month's plot allowance would be exceeded.
413 The file is too large.
415 Not a file format the checker reads.
422 The file could not be converted (e.g. crs_required, with likely EPSG codes), or the Information System refused it.
423 The workspace is read-only: payment is overdue.
PDF report. The PDF validation report the checker produces, stamped with the file's SHA-256 and the rule-set version. Optionally after the safe fixes and with the forest section.
Parameter
In
Description
filename optional
query
The file's name, when sending raw bytes; its extension tells the format. Default plots.geojson.
fix optional
query
Apply the bulk-safe fixes first; the report includes the change log.
forest optional
query
Include forest cover in 2020 and tree cover loss since.
commodity optional
query
The commodity. Only cattle changes the result. One of: cattle, cocoa, coffee, oil-palm, rubber, soya, wood.
crs optional
query
The coordinate system when the file does not declare it, e.g. EPSG:32630.
country optional
query
ISO alpha-2 country of the plots, so unlabelled UTM can be recognised.
Body: The file: its raw bytes as the body (GeoJSON, KML, KMZ, GPX, CSV or a zipped shapefile), or multipart/form-data with one or more files (a shapefile's .shp, .dbf and .prj). Content-Encoding: gzip is accepted. Largest file: 50 MB decompressed.
Responses:
200 The PDF. X-File-Sha256, X-Errors and X-Warnings headers.
400 Bad request: a wrong option or an unreadable body.
401 The key is missing, wrong or revoked.
402 The plan does not include this, or the month's plot allowance would be exceeded.
413 The file is too large.
415 Not a file format the checker reads.
422 The file could not be converted (e.g. crs_required, with likely EPSG codes), or the Information System refused it.
423 The workspace is read-only: payment is overdue.
429 Rate limit reached; see Retry-After.
502 A service we depend on (a forest map, the Information System) did not answer.
Forest cover 2020 and loss since. Per plot: the share that was forest on 31 December 2020 on the JRC's GFC2020 V4 map, and tree cover lost since 2021 on land that was forest in 2020 (Hansen GFC v1.13). Risk indicators for the operator's own assessment, not a verdict. Only fixed map squares are requested from the map servers.
Parameter
In
Description
filename optional
query
The file's name, when sending raw bytes; its extension tells the format. Default plots.geojson.
crs optional
query
The coordinate system when the file does not declare it, e.g. EPSG:32630.
country optional
query
ISO alpha-2 country of the plots, so unlabelled UTM can be recognised.
Body: The file: its raw bytes as the body (GeoJSON, KML, KMZ, GPX, CSV or a zipped shapefile), or multipart/form-data with one or more files (a shapefile's .shp, .dbf and .prj). Content-Encoding: gzip is accepted. Largest file: 50 MB decompressed.
Create a project from a file. Saves the file as version 1 (converted to GeoJSON first if needed). Counts its plots toward the month's allowance.
Parameter
In
Description
name optional
query
Project name. Default: the file name.
filename optional
query
The file's name, when sending raw bytes; its extension tells the format. Default plots.geojson.
crs optional
query
The coordinate system when the file does not declare it, e.g. EPSG:32630.
country optional
query
ISO alpha-2 country of the plots, so unlabelled UTM can be recognised.
Body: The file: its raw bytes as the body (GeoJSON, KML, KMZ, GPX, CSV or a zipped shapefile), or multipart/form-data with one or more files (a shapefile's .shp, .dbf and .prj). Content-Encoding: gzip is accepted. Largest file: 50 MB decompressed.
Responses:
201 Created object
400 Bad request: a wrong option or an unreadable body.
401 The key is missing, wrong or revoked.
402 The plan does not include this, or the month's plot allowance would be exceeded.
413 The file is too large.
415 Not a file format the checker reads.
422 The file could not be converted (e.g. crs_required, with likely EPSG codes), or the Information System refused it.
423 The workspace is read-only: payment is overdue.
The file's name, when sending raw bytes; its extension tells the format. Default plots.geojson.
crs optional
query
The coordinate system when the file does not declare it, e.g. EPSG:32630.
country optional
query
ISO alpha-2 country of the plots, so unlabelled UTM can be recognised.
Body: The file: its raw bytes as the body (GeoJSON, KML, KMZ, GPX, CSV or a zipped shapefile), or multipart/form-data with one or more files (a shapefile's .shp, .dbf and .prj). Content-Encoding: gzip is accepted. Largest file: 50 MB decompressed.
Responses:
201 Created object
400 Bad request: a wrong option or an unreadable body.
401 The key is missing, wrong or revoked.
402 The plan does not include this, or the month's plot allowance would be exceeded.
404 Not found in this workspace.
409 Nothing changed since the last version.
413 The file is too large.
415 Not a file format the checker reads.
422 The file could not be converted (e.g. crs_required, with likely EPSG codes), or the Information System refused it.
423 The workspace is read-only: payment is overdue.
File a due diligence statement. Files a statement with the EU Information System (TRACES) from the project's current version, through the workspace's connection (Settings → EU Information System). Plots are grouped into producers. Checked against the Commission's rules before anything is sent. Reference and verification numbers arrive later: poll GET /dds/{id}.
A statement and its status. Fetches the status from the Information System when allowed (30 minutes after filing, then every 5 minutes) and the statement still waits for its numbers, or with refresh=true.
Parameter
In
Description
id
path
refresh optional
query
Fetch the status even when the numbers are known.
Responses:
200 OK object
400 Bad request: a wrong option or an unreadable body.
401 The key is missing, wrong or revoked.
402 The plan does not include this, or the month's plot allowance would be exceeded.
404 Not found in this workspace.
429 Rate limit reached; see Retry-After.
502 A service we depend on (a forest map, the Information System) did not answer.
Switch weekly monitoring on or off. On: the project's current version is checked within ten minutes, then every Monday from 04:00 UTC, and again whenever a new version is saved. Counts the version's plots against the plan's monitored plots.
Parameter
In
Description
id
path
Body: object
Responses:
200 OK object
400 Bad request: a wrong option or an unreadable body.
401 The key is missing, wrong or revoked.
402 The plan does not include this, or the month's plot allowance would be exceeded.
404 Not found in this workspace.
423 The workspace is read-only: payment is overdue.
Confirms that you file this statement as the operator or trader, or for them, and that due diligence was exercised (Regulation (EU) 2023/1115, Art. 4(2) and 4(3)).
activityType
string
One of: IMPORT, EXPORT, DOMESTIC.
operatorRole optional
string
One of: OPERATOR, REPRESENTATIVE_OPERATOR.
representedOperator optional
object
With REPRESENTATIVE_OPERATOR: the operator you file for.
Field
Type
Description
name
string
identifierType
string
identifierValue
string
eori optional
string
country
string
street optional
string
postalCode optional
string
city optional
string
email optional
string
phone optional
string
countryOfActivity optional
string
EU Member State, ISO alpha-2.
borderCrossCountry optional
string
EU Member State of entry or exit (import and export).
internalReference optional
string
comment optional
string
geoLocationConfidential optional
boolean
commodities
object[]
At most 100.
Me
Field
Type
Description
workspace
object
Field
Type
Description
id
string
name
string
key
object
Field
Type
Description
id
string
name
string
prefix
string
role
string
One of: owner, admin, member, viewer.
plan
object
Field
Type
Description
id
string
name
string
readOnly
boolean
usage
object
Field
Type
Description
month
string
YYYY-MM
plots
integer
Distinct plots metered this month.
plotLimit
integer or null
rateLimit
object
Field
Type
Description
perMinute
integer
remaining
integer
resetSeconds
integer
AlertStatus
new: not looked at. reviewing: someone is on it. dismissed: not deforestation after 2020, with the reason. confirmed: deforestation after 2020 on the plot.
string: new, reviewing, dismissed, confirmed
AlertConfidence
How sure the evidence makes us, apart from a person's review. confirmed: two or more independent sources agree, or Sentinel-2 or Sentinel-1 imagery shows the clearing. likely: one source with high confidence that has held, no clear image yet. unconfirmed: one low-confidence source, or the imagery shows no change. not_relevant: set aside (before the cut-off, not forest in 2020, minor, or along the plot's edge). Only confirmed and likely are emailed and sent to webhooks.
drop: the clearing shows inside while the land around is stable. no_change: it does not, or everything changed alike. unclear: no clear image yet. One of: drop, no_change, unclear.
before
object or null
after
object[]
AlertSystem
radd: RADD (WUR), Sentinel-1 radar, 10 m. glads2: GLAD-S2 (UMD), Sentinel-2, 10 m. dist: DIST-ALERT (UMD, NASA), Landsat and Sentinel-2, 30 m.
The plot's alerts grouped into events, each with its evidence. NDVI for optical, VH backscatter in dB for radar; inside the event and in a ring of land around it.
images
object or null
AlertEvent
Field
Type
Description
kind
string
detected, grew (newer alerts), reopened, status (a person's review), or confidence (the evidence changed the confidence). One of: detected, grew, reopened, status, confidence.