EU Pesticide MRL Watchlist Monitor avatar

EU Pesticide MRL Watchlist Monitor

Pricing

from $10.00 / 1,000 watchlist item checkeds

Go to Apify Store
EU Pesticide MRL Watchlist Monitor

EU Pesticide MRL Watchlist Monitor

Checks a watchlist of commodity/pesticide-residue pairs against the EU Pesticides Database for MRLs. Reports limit, unit, definition, with change states (FIRST_SEEN, UNCHANGED, LIMIT_CHANGED, DEFINITION_CHANGED, NOT_FOUND). Informational only; Official Journal is authoritative. No personal data.

Pricing

from $10.00 / 1,000 watchlist item checkeds

Rating

0.0

(0)

Developer

Pavel Staurouski

Pavel Staurouski

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

11 days ago

Last modified

Share

Checks a watchlist of commodity/pesticide-residue pairs against the European Commission's EU Pesticides Database (food.ec.europa.eu/plants/pesticides/eu-pesticides-database_en) for maximum residue levels (MRLs) under Regulation (EC) No 396/2005.

What you get

One record per watchlist item per run: the current MRL and its unit (mg/kg), whether it is marked "at or below the limit of quantification" (the published "*" suffix), the verbatim residue definition (never a bare CAS number or trade name - some residues are defined as "sum of X, Y and Z, expressed as X", covering metabolites or a whole substance group, and this Actor passes that full definition through exactly as published), the regulation that set the current value and the date it became applicable, and the EU's own previously-published value for that row (which may equal the current one, if a later amendment only reconfirmed it without changing the figure).

Every record also carries an explicit state: FIRST_SEEN, UNCHANGED, LIMIT_CHANGED, DEFINITION_CHANGED, NOT_FOUND, INVALID_INPUT, or FETCH_ERROR. A failed fetch always produces an explicit FETCH_ERROR record per watchlist item, never a silent "no change" - and never touches your previously-saved comparison state, so the next successful run still compares against the last known-good snapshot.

What it does not do

No legal advice, no compliance certification. The Commission states this database "is made available solely for the purpose of information. It has no legal value." The official information is published in the Official Journal of the European Union; this Actor surfaces that disclaimer rather than overriding it. NOT_FOUND means the database has no commodity-specific entry for that pair - the EU's generic default MRL of 0.01 mg/kg (Regulation (EC) No 396/2005, Art. 18(1)(b)) still applies in that case, this Actor just does not fabricate a row the Commission itself never published. No personal data: every field traces to a commodity, a residue definition, a regulation number or a date, never a contact name or signatory.

Why you might need this

A food-testing lab, an importer's supplier-quality team, or a compliance consultant tracking a fixed set of commodity/pesticide pairs needs to know immediately when an MRL tightens, loosens, or the residue definition itself is redefined. Testing a batch against a limit that was lowered last month, because nobody re-ran the Commission's search tool against the growing watchlist, produces a result that reads "pass" against stale data and "fail" (or a border rejection) against the regulation actually in force - not a hypothetical, since amending regulations for a single residue are published several times a year. This Actor turns that manual re-check into a scheduled run instead of a recurring blind spot.

Input

{
"watchlist": [
{ "commodityName": "Oranges", "residueName": "Glyphosate" },
{ "commodityId": 2, "residueId": 8 },
{ "commodityName": "Table grapes", "residueName": "Glyphosate" }
]
}

Each item needs a commodity, given as either commodityId (the database's own numeric product_id, most reliable) or commodityName (exact, case-insensitive match). Commodity names are not unique in the source: generic category names like "Others (2)", "Muscle", "Kidney" or "Lentils" repeat across different hierarchy branches (confirmed: "Others (2)" alone appears 47 times). An ambiguous name resolves to INVALID_INPUT with every candidate's numeric id and full breadcrumb listed in errorMessage, so you can pin the right one. It also needs a residue, given as either residueId (numeric pest_res_id) or residueName (exact, case-insensitive match; residue names are confirmed unique, so this is always safe).

Tip: run once with a best-guess name to discover the real id from the error detail, then switch to commodityId/residueId for faster, unambiguous future runs.

Sample output

{
"commodityId": 4,
"commodityName": "Oranges",
"commodityCode": 110020,
"commodityPath": "FRUITS, FRESH or FROZEN; TREE NUTS > Citrus fruits > Oranges",
"residueId": 120,
"residueDefinition": "Glyphosate",
"mrlUnit": "mg/kg",
"currentMrlRaw": "0.5",
"currentMrlValue": 0.5,
"currentAtOrBelowLoq": false,
"currentLegalReference": "Reg. (EU) No 293/2013",
"currentApplicableDate": "2013-04-06",
"currentFootnote": null,
"previousPublishedMrlRaw": "0.5",
"previousPublishedMrlValue": 0.5,
"previousPublishedLegalReference": "Reg. (EU) No 441/2012",
"previousPublishedApplicableDate": "2012-06-14",
"sourceUrl": "https://ec.europa.eu/food/plant/pesticides/eu-pesticides-database/backend/api/pr/get_details_single_pr?pest_res_id=120&lang=en",
"watchlistItem": { "commodityName": "Oranges", "residueName": "Glyphosate" },
"matchState": "UNCHANGED",
"changedFields": [],
"checkedAt": "2026-10-08T12:02:06.828Z",
"errorMessage": null
}

This is a real record from a live run: the current glyphosate MRL on oranges (0.5 mg/kg, set by Reg. (EU) No 293/2013), alongside the previously-published value the Commission itself recorded before that amendment, so you can see at a glance that the figure was reconfirmed rather than changed.

Change tracking across runs

Run this Actor on a schedule. Each watchlist pair's last-seen snapshot (MRL, LOQ marker, legal reference, applicable date, residue definition) is stored per Actor, so every subsequent run reports exactly what changed since the last one, not just the current state.

Pricing

Pay per run started, plus per watchlist item successfully checked against the live database (resolves to FIRST_SEEN, UNCHANGED, LIMIT_CHANGED, DEFINITION_CHANGED, or NOT_FOUND). Items that fail to resolve (INVALID_INPUT) or hit a transient fetch failure (FETCH_ERROR) are never charged. See the Pricing tab for exact rates.