EU GMP Non-Compliance & Certificate Monitor (EudraGMDP) avatar

EU GMP Non-Compliance & Certificate Monitor (EudraGMDP)

Pricing

from $4.00 / 1,000 record scrapeds

Go to Apify Store
EU GMP Non-Compliance & Certificate Monitor (EudraGMDP)

EU GMP Non-Compliance & Certificate Monitor (EudraGMDP)

Monitor the public EudraGMDP database for GMP non-compliance statements and GMP certificates, with filters, delta mode (only new records) and optional webhook alerts. Built for pharma QA teams and consultants.

Pricing

from $4.00 / 1,000 record scrapeds

Rating

0.0

(0)

Developer

goober

goober

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Categories

Share

EU GMP non-compliance and certificate alerts (EudraGMDP API)

Find out which medicine manufacturing sites in the EU and abroad were just declared non-compliant with Good Manufacturing Practice (GMP). This Actor reads the public EudraGMDP database of the European Medicines Agency (EMA) and returns clean JSON: statements of GMP non-compliance and GMP certificates, with site, country, dates and the inspectorate's findings.

It is for regulatory affairs, procurement, supply-chain and pharmacovigilance teams, analysts and journalists. A non-compliance statement is often one of the earliest public signals that supply of a medicine may be interrupted.

Why use this Actor

  • Official source: the EMA's public EudraGMDP database, not a scraped third-party copy.
  • No stateful web form: EudraGMDP needs a session and a multi-step search. You send one JSON input and get rows.
  • Delta mode: onlyNew returns only records you have not seen before. Good for scheduled alerts.
  • Webhook summary: optional Discord, Slack or generic JSON message after each run.
  • Light and polite: plain HTTP, no browser, no proxies, about 1 request per second.

Quick start

Click Start with the prefilled input. It takes about 10 seconds and returns the 5 newest statements of GMP non-compliance of the last 90 days, with details:

{ "mode": "gmpNonCompliance", "maxItems": 5, "includeDetails": true }

You get a dataset with one row per statement. Open the Overview view for a table, or the JSON for every field.

What you get

One dataset item per record. Fields that the source does not provide are null.

FieldMeaning
recordType, documentNumber, eudragmdpReference, documentType, miaNumberIdentity of the document (miaNumber is the site authorisation number, when listed). eudragmdpReference is the stable EudraGMDP ID
siteName, siteAlternativeName, siteAddress, additionalDetails, city, postcode, countryThe manufacturing or importing site
omsOrganisationId, omsLocationId, dunsNumberRegistry identifiers (DUNS from details only)
inspectionEndDate, issueDateYYYY-MM-DD. issueDate of a certificate comes from the detail page
issuingAuthority, legalBasis, scope, outcome, operations[]Detail page: who issued it, under which article, scope, compliant or non-compliant, the listed GMP operations
natureOfNonCompliance, actionTaken, additionalCommentsNon-compliance statements: the inspectorate's findings and measures
detailsIncluded, isNew, source, scrapedAtRun metadata. isNew is true in delta mode

Input options

FieldMeaning
modegmpNonCompliance (default) or gmpCertificates
since, untilYYYY-MM-DD. Issue date for non-compliance statements; inspection end date for certificates (EudraGMDP cannot filter certificates by issue date). Default: last 90 days
companyNameText that must appear in the site name or alternative name
countriesISO-2 codes or English names, e.g. ["IN","China"]. Non-compliance: filter. Certificates: one search per country, default all EEA countries. third (all third countries) and all also work for certificates but EudraGMDP needs 1-3 minutes to answer
activeSubstanceKeyword that must occur in the site name or the statement text. EudraGMDP has no structured substance field, so this only finds records whose text names the substance
includeDetailsRead each record's detail page (default true, one extra request per record)
onlyNew, stateStoreNameDelta mode and the name of the persistent store
webhookUrlOptional https webhook (secret)
maxItemsCap on billed records per run (default 50, prefill 5)
maxDetailRequestsCap on detail pages per run (default 300)
requestDelaySecsDelay between requests, minimum 1

Sample item (real run, 2026-10-19; long texts shortened with ...)

{
"recordType": "gmpNonCompliance",
"documentNumber": "MT/004NCR/2026",
"eudragmdpReference": "188112",
"siteName": "Glukem Biocare Private Limited",
"siteAddress": "Plot No 3a Biotech Park, Phase III Karkapatla, Markook",
"city": "Siddipet",
"postcode": "502281",
"country": "India",
"omsOrganisationId": "ORG-100057915",
"omsLocationId": "LOC-100104543",
"inspectionEndDate": "2026-09-15",
"issueDate": "2026-10-16",
"issuingAuthority": "Malta",
"dunsNumber": "87-368-0583",
"legalBasis": "Issued following an inspection in accordance with Art. 111(7) of Directive 2001/83/EC as amended",
"scope": "Human Medicinal Products",
"outcome": "non-compliant",
"operations": [
"1 NON-COMPLIANT MANUFACTURING OPERATIONS",
"1.2 Non-sterile products",
"1.2.1.17 Other: Manufacture of intermediates (pellets)(en)",
"1.6.3 Chemical/Physical"
],
"natureOfNonCompliance": "The inspection resulted in a critical deficiency related to contamination risk in the Fluid Bed Coating (FBC) equipment ...",
"actionTaken": "Revocation of the marketing authorisation(s)\nMember states should consider not initiating ... Prohibition of supply ...",
"detailsIncluded": true,
"isNew": true,
"scrapedAt": "2026-10-18T22:24:54Z"
}

A complete real output with one non-compliance statement and one GMP certificate is in sample_output.json in the project folder.

Pricing

Pay per event: one record-scraped event per dataset item, $4.00 per 1,000 records ($0.004 each).

  • Records skipped by a filter, by delta mode or because of an error are never pushed and never charged.
  • maxItems caps the cost of a run, and the run also stops when your maximum charge per run is reached.
  • Example: 50 records cost 50 x $0.004 = $0.20. Reading details adds run time (about 1 second per record), not extra events.

Use with AI agents (MCP, Claude, Cursor, n8n, Make)

AI agents can call this Actor through the Apify MCP server. Add this to your MCP client config (you sign in with OAuth in the browser on first use):

{ "mcpServers": { "apify": { "url": "https://mcp.apify.com?tools=goobertje/eu-gmp-compliance-monitor" } } }

Example prompts and the input each one maps to:

  1. "Which sites in India or China got a GMP non-compliance statement since 1 September 2026?"
    { "mode": "gmpNonCompliance", "since": "2026-09-01", "countries": ["IN", "CN"], "maxItems": 50 }
  2. "Does any GMP non-compliance statement from the last 90 days mention paracetamol?"
    { "mode": "gmpNonCompliance", "activeSubstance": "paracetamol", "includeDetails": true, "maxItems": 20 }
  3. "List the Belgian GMP certificates of Universiteit Gent since January 2026."
    { "mode": "gmpCertificates", "countries": ["BE"], "companyName": "Gent", "since": "2026-01-01", "maxItems": 20 }

In n8n, Make or Zapier, use the Apify node or module, pick this Actor and paste the same JSON.

Use cases

  • Supply-risk alerts: a daily run with onlyNew and a webhook tells you when a site in your supply chain is declared non-compliant.
  • Supplier due diligence: look up a manufacturer by name across non-compliance statements and GMP certificates.
  • Regulatory affairs and procurement dashboards: feed the JSON into a sheet or BI tool.
  • Journalism and research: track enforcement activity per country or inspectorate.

FAQ

Where does the data come from, and is it allowed? From the public EudraGMDP database of the EMA. Its robots.txt returns 404 (no restrictions) and the Actor still fetches and honours it. The EMA legal notice allows reuse, also commercial, with the EMA acknowledged as source. See the legal section below.

How fresh is it? Each run reads the live database. The national authorities fill it, so entries can appear weeks after the inspection.

How much does a typical run cost? The prefilled run of 5 records costs $0.02. A daily alert run that returns a handful of new records costs a few cents.

What happens if EudraGMDP blocks me or changes? The Actor stops after repeated 403 or 429 answers and never tries to get around a block. Heavy searches are never re-sent. If the page layout changes, parsing may return fewer or empty fields (never invented values); please report it.

Can I schedule it and get only new records? Yes. Set onlyNew to true and keep the same stateStoreName. Example schedule input: {"mode":"gmpNonCompliance","onlyNew":true,"stateStoreName":"my-gmp-watch","webhookUrl":"https://hooks.slack.com/services/...","countries":["IN","CN"]}. The first run is capped by maxItems (default 50): with more than 50 records in the window, catching up takes several runs, newest first (raise maxItems to go faster). A record pushed without details because maxDetailRequests ran out is not remembered and is reported again later. Without onlyNew nothing is remembered and the webhook says "records", not "new records".

What is not included? Belgian shortage notices and manufacturing-authorisation records.

Limits and honest caveats

  • Data freshness: entries appear when the authorities publish them.
  • Certificates are heavy to search: one country at a time (a single country answers in a few seconds). Without countries the EEA-wide search runs, which EudraGMDP answers in about 10 seconds. Use since, countries and companyName to keep runs short.
  • Date meaning differs by mode (see input options).
  • Active substance: text match only. Absence of a match does not prove a substance is not affected.
  • Speed: about 1 record per second with details, because requests are throttled to 1 per second.
  • Source: the public EudraGMDP database, https://eudragmdp.ema.europa.eu/. The site publishes no robots.txt restrictions (the file returns 404) and the Actor still fetches and honours it on every run. It uses only the public search pages, no login and no workaround of any protection.
  • The EMA legal notice states that information on EMA web pages may be reproduced and distributed, also for commercial purposes, provided that EMA is acknowledged as the source. Every item carries source: "EudraGMDP (EMA), public database"; please keep that attribution when you republish.
  • EudraGMDP content is provided by the national competent authorities; the EMA accepts no liability for it. This Actor reproduces it as published and gives no assurance of completeness or accuracy. Check the original database before taking regulatory, legal or commercial decisions.
  • Records can name companies and sites. The data is public regulatory information; using it is your responsibility under the laws that apply to you.
  • Not affiliated with, endorsed by or sponsored by the European Medicines Agency, the European Commission or any national authority.

Found a problem or want a field added? Open an issue on the Actor page.