# EudraGMDP Pharma Registry (EMA) - WDA, MIA, GMP, GDP, API (`rastriq/eudragmdp-pharma-registry`) Actor

Official EU pharma compliance data from EMA EudraGMDP: wholesale distribution (WDA), manufacturing (MIA), GMP/GDP certificates, non-compliance statements and active substance registrations.

- **URL**: https://apify.com/rastriq/eudragmdp-pharma-registry.md
- **Developed by:** [Rastriq — Structured data from the world](https://apify.com/rastriq) (community)
- **Categories:** Lead generation, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 document returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## EudraGMDP Pharma Registry — EU pharma licences & inspection certificates as clean data

Download the **official European register of pharmaceutical licences and inspections** (EMA **EudraGMDP**) as a clean table: who is allowed to **make**, **import**, **store** and **distribute** medicines in Europe, and which sites **passed or failed** their inspections.

No pharma background needed — this page explains everything in plain words.

***

### New to pharma regulation? The 60-second version

In Europe, nobody can make or move medicines without permission from a national regulator (e.g. Spain's AEMPS, Germany's regional authorities). Regulators also **inspect** factories and warehouses and publish the result. All of this goes into one EU database run by the European Medicines Agency: **EudraGMDP**.

Think of it as the **official business register of the medicines supply chain**:

```
Active ingredient  ──►  Factory  ──►  Warehouse / wholesaler  ──►  Pharmacy / hospital
  supplier              (makes the     (stores and distributes)
                         medicine)
  API registration      MIA licence     WDA licence
                        + GMP cert.     + GDP cert.
```

| You'll see... | It means... | Everyday analogy |
|---|---|---|
| **WDA** | Licence to be a **wholesale distributor** of medicines | A licence to run a logistics warehouse |
| **MIA** | Licence to **manufacture or import** medicines | A factory's operating licence |
| **GMP certificate** | A **factory passed** its Good Manufacturing Practice inspection | A passed MOT/ITV, for a factory |
| **GDP certificate** | A **warehouse/distributor passed** its Good Distribution Practice inspection (storage, temperature, traceability) | A passed MOT/ITV, for a warehouse |
| **Non-compliance** | The inspection **failed** seriously — often means suspension or product recalls | A failed MOT, made public |
| **API registration** | Registration to make, import or distribute **active ingredients** (the raw chemical) | A raw-material supplier register |
| **Site** | One physical location (a plant, a warehouse). A company can have many | A branch / building |
| **ORG-… / LOC-…** | The EMA's official ID for a **company** (ORG) and for a **site** (LOC) | Company tax ID / building reference |
| **NCA** | The national authority that issued the document | The issuing office |

***

### Which dataset do I need?

Pick one or more in **"What do you want to download?"**.

| If you want... | Choose | Records (whole EEA) | Typical run time |
|---|---|---|---|
| A list of **medicine distributors and logistics warehouses** (sales prospects, logistics partners) | **Wholesale distributors (WDA)** | ~11,000 | ~1.5 min |
| A list of **factories and importers** | **Manufacturers & importers (MIA)** | ~7,400 | ~1 min |
| To check whether **factories passed inspection**, or find **failed** ones | **Factory inspection certificates (GMP)** | ~14,000 (EEA) + non-EEA sites (India, China, US...) | ~2.5–8 min |
| To check whether **distributors/warehouses passed inspection** | **Warehouse inspection certificates (GDP)** | ~500 per mid-size country | ~3.5 min per country |
| **Active-ingredient** makers, importers and traders | **Active ingredient suppliers (beta)** | ~4,800 rows (EEA) | ~2.5 min per country |

**Tip:** for *"which distributors handle cold-chain products, vaccines or blood products?"*, choose **Wholesale distributors** and switch on **Include full licence details**.

Prefer one row per **building/site** with all its licences grouped together? Use our sister actor **EU Pharma Sites Graph**.

***

### How to run it (3 steps)

1. **What do you want to download?** → e.g. *Wholesale distributors*.
2. **Countries** → e.g. *Spain*, or *All EEA countries*.
3. Click **Start**. Download the results as Excel, CSV or JSON from the *Output* tab.

Optional:

- **Include full licence details** — adds authority, inspection dates, authorised activities and special product types. Slower (2–3 s per document).
- **Filters** — company name, failed inspections on/off, certificate dates.
- **Recurring runs → Return only changes** — schedule it weekly and get only new or updated documents (great for alerts).

***

### What you get: field-by-field guide

Every dataset uses **the same columns**, so you can mix them in one spreadsheet. Columns that don't apply to a dataset are empty.

#### Always filled

| Column | Plain meaning | Example |
|---|---|---|
| `module` | Which dataset the row comes from | `WDA` |
| `docId` | Unique ID of the document in EudraGMDP — use it to deduplicate | `29276` |
| `documentType` | Exact document type (see table below) | `WDA`, `GMPC`, `GMPNC`, `GDPWDA`... |
| `documentNumber` | Licence / certificate number given by the authority | `ED-023-CL` |
| `holder.name` | Company that holds the licence | `Leon Research S.L.` |
| `holder.omsOrganisationId` | Official company ID (`ORG-…`) — best key to group a company's sites | `ORG-100027271` |
| `site.name`, `site.street`, `site.city`, `site.postcode`, `site.country`, `site.countryCode` | Where the site is | `Leon`, `24009`, `ES` |
| `site.omsLocationId` | Official site ID (`LOC-…`) — best key to join with other data | `LOC-100054103` |
| `dates.authorisation` / `dates.issue` | When the licence was granted / certificate issued | `2026-10-07` |
| `dates.inspectionEnd` | Date of the last inspection (certificates) | `2023-05-25` |
| `dates.lastUpdated` | Last time the authority changed the record | `2026-10-09T14:01:03` |
| `permalink` | Link to the official page on the EMA website | |
| `_flags` | Data-quality warnings (see below) | `["non_compliance"]` |

#### `documentType` decoded

| Value | Meaning |
|---|---|
| `WDA` | Wholesale distribution licence |
| `MIA` | Manufacturing / import licence |
| `GMPC` | Factory **passed** inspection |
| `GMPNC` | Factory **failed** inspection (non-compliance) |
| `GDPWDA` | Wholesaler warehouse **passed** inspection |
| `GDPAPI` | Active-ingredient distributor **passed** inspection |
| `GDPNCWDA` / `GDPNCAPI` | Distributor **failed** inspection |
| `API-REG` | Active ingredient registration |

#### Filled only with "Include full licence details"

| Column | Plain meaning |
|---|---|
| `issuingAuthority` | Authority that signed the document (e.g. *Junta de Castilla y León*) |
| `legalBasis` | Laws the licence is granted under |
| `scope.productTypes` | Human and/or veterinary medicines |
| `scope.distributionOperations` | What a distributor may do: **procurement** (buy), **holding** (store), **supply** (sell), **export**, other |
| `scope.specialRequirementProducts` | **Products needing special handling**: cold chain, immunologicals/vaccines, blood products, narcotics, radiopharmaceuticals |
| `scope.manufacturingOperations` | What a factory may make/test (sterile, tablets, packaging, quality control...) |
| `scope.activeSubstances` | Active ingredients a registered supplier handles |
| `linkedAuthorisationNumber` | For GDP certificates: the WDA licence they certify |
| `remarks` | Free-text remarks from the authority (e.g. validity date) |
| `nonComplianceDetails` | For failed inspections: what went wrong and what action was taken |

#### `_flags` — warnings, never filters

We **never delete** rows; we label them so you decide:

| Flag | Meaning |
|---|---|
| `non_compliance` | Failed inspection |
| `gmp_older_than_3y` / `gdp_older_than_5y` | Inspection older than the certificate's own validity guidance — check before relying on it |
| `uk_legacy_pre2021` | UK document frozen since Brexit (only Northern Ireland is still updated) |
| `encoding_suspect` | Garbled characters in the source (some Czech addresses); kept as published |
| `address_unparsed` | City or postcode couldn't be separated from the address |
| `confidential_fields` | The source hides names/signatures as "Confidential" (we never collect them) |
| `detail_fetch_failed` | Details couldn't be loaded; the basic row is still there |

***

### Example (real record, with details)

```json
{
  "module": "WDA",
  "docId": 29276,
  "documentType": "WDA",
  "documentNumber": "ED-023-CL",
  "holder": { "name": "Leon Research S.L.", "omsOrganisationId": "ORG-100027271" },
  "site": { "omsLocationId": "LOC-100054103", "city": "Leon", "postcode": "24009", "countryCode": "ES" },
  "issuingAuthority": "Junta De Castilla Y Leon",
  "dates": { "authorisation": "2026-10-07", "lastUpdated": "2026-10-09T14:01:03" },
  "scope": {
    "distributionOperations": [{ "code": "2.2", "label": "Holding" },
                               { "code": "2.5", "label": "Other", "text": "Contract warehouse" }],
    "specialRequirementProducts": [{ "code": "3.3", "label": "Other", "text": "Immunological medicines" }]
  },
  "permalink": "https://eudragmdp.ema.europa.eu/inspections/exc/sites/doc/WDA/29276"
}
```

Reading it: *a licensed warehouse in León that stores medicines under contract, including vaccines/immunologicals (which need refrigeration).*

***

### EudraGMDP Pharma Registry input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `modules` | array of strings (required) | `["WDA"]` | Datasets to download: `WDA`, `MIA`, `GMP`, `GDP`, `API_REG` (beta). |
| `countries` | array of strings | `["EEA"]` (pre-filled: `["ES"]`) | `EEA`, `ALL` (GMP/GDP include non-EEA sites), `THIRD` (non-EEA only), or any 2-letter country code. |
| `fetchDetails` | boolean | `false` | Include full licence details (authority, inspection dates, activities, special products). About 2-3 seconds per document. |
| `maxItems` | integer (min 1) | `1000` (pre-filled: `50`) | Stop after this many records. |
| `holderNameContains` | string | empty | Company or site name contains (case-insensitive, partial match). |
| `includeNonCompliance` | boolean | `true` | Inspection certificates only: also return statements of non-compliance (flag `non_compliance`). |
| `gdpOperation` | string | `ALL` | Warehouse certificates (GDP) only: `ALL`, `GDPWDA` or `GDPAPI`. |
| `dateFrom` | date string | empty | Inspection certificates only: issued on or after this date (for example `2025-01-01`). |
| `dateTo` | date string | empty | Inspection certificates only: issued on or before this date. |
| `mode` | string | `full` | `full` or `delta`. With `delta` each run remembers what it returned (key-value store `eudragmdp-registry-state`) and outputs only new or updated documents. |
| `updatedSince` | date string | empty | Return only documents updated on or after this date (for example `2026-09-01`). |
| `maxConcurrency` | integer (1-2) | `2` | Parallel requests, capped at 2 out of respect for the public EMA website. |
| `proxyConfiguration` | object | Apify Proxy off | Not needed: the source is public. |

Pre-filled input (Spanish wholesale distributors, 50 records):

```json
{"modules": ["WDA"], "countries": ["ES"], "maxItems": 50}
```

#### Example record without full details (real output)

With `fetchDetails` off, fields that come only from the detail page stay empty. In this real WDA record, `status`, `holder.omsOrganisationId` and `site.omsLocationId` are `null` and `detailFetched` is `false`:

```json
{
  "module": "WDA",
  "docId": 7503,
  "documentType": "WDA",
  "documentNumber": "ED-017-CL",
  "status": null,
  "holder": {
    "name": "Cofares Noroeste Y Del Cantabrico S.A.",
    "omsOrganisationId": null
  },
  "site": {
    "name": "Cofares Noroeste Y Del Cantabrico S.A.",
    "omsLocationId": null,
    "ncaReferenceKey": null,
    "duns": null,
    "addressRaw": "Parcela 69b Calle Muela Quebrada, Po Ind La Hiniesta, Zamora, 49024, Spain",
    "street": "Parcela 69b Calle Muela Quebrada, Po Ind La Hiniesta",
    "city": "Zamora",
    "postcode": "49024",
    "county": null,
    "country": "Spain",
    "countryCode": "ES"
  },
  "issuingAuthority": null,
  "legalBasis": [],
  "dates": {
    "authorisation": "2026-07-21",
    "issue": null,
    "inspectionEnd": null,
    "lastUpdated": null
  },
  "linkedAuthorisationNumber": null,
  "miaNumber": null,
  "scope": null,
  "remarks": null,
  "nonComplianceDetails": null,
  "permalink": "https://eudragmdp.ema.europa.eu/inspections/exc/sites/doc/WDA/7503",
  "source": "EudraGMDP (EMA) — content provided by EEA National Competent Authorities",
  "scrapedAt": "2026-10-12T08:59:40Z",
  "detailFetched": false,
  "_flags": []
}
```

### Ready-to-use examples

Copy any of these into the **JSON** input tab, or open the matching saved example from the *Examples* tab.

**1. All licensed medicine wholesalers in Spain**

```json
{ "modules": ["WDA"], "countries": ["ES"], "maxItems": 1000 }
```

**2. Cold-chain / vaccine distributors in Germany** (details on, then filter `scope.specialRequirementProducts`)

```json
{ "modules": ["WDA"], "countries": ["DE"], "fetchDetails": true, "maxItems": 500 }
```

**3. Failed factory inspections worldwide (India, China, US...)**

```json
{ "modules": ["GMP"], "countries": ["THIRD"], "includeNonCompliance": true, "maxItems": 2000 }
```

**4. Everything one company holds across Europe**

```json
{ "modules": ["WDA", "MIA", "GMP", "GDP"], "countries": ["EEA"], "holderNameContains": "Alliance Healthcare" }
```

**5. Weekly alert: new or changed GMP certificates in France**

```json
{ "modules": ["GMP"], "countries": ["FR"], "mode": "delta" }
```

**6. Active-ingredient (API) suppliers in Italy**

```json
{ "modules": ["API_REG"], "countries": ["IT"], "maxItems": 1000 }
```

#### Example values for the empty fields

| Field | Try one of these |
|---|---|
| **Company name contains** | `Alliance Healthcare`, `Phoenix`, `Sanacorp`, `Novo Nordisk`, `Sanofi`, `Sandoz`, `Teva`, `Zentiva`, `Takeda`, `Fresenius Kabi`, `Octapharma`, `Linde`, `Air Liquide`, `Laboratorios Normon` — or generic words like `Logistics`, `Pharma`, `Apotheke` |
| **Countries** | `ES`, `DE`, `FR`, `IT`, `NL`, `PL`; `EEA` (all of Europe); `THIRD` (non-EEA sites inspected by EU authorities, GMP/GDP only) |
| **Issued from / until** | `2025-01-01` → `2025-12-31` (one year of certificates) |
| **Only updated since** | e.g. `2026-09-01` for last month's changes |

***

### Use cases for EU pharma licence and GMP/GDP certificate data

- **Sales prospecting** — every licensed distributor or manufacturer in a country, with official IDs.
- **Pharma logistics** — find warehouses handling **cold-chain**, vaccine or blood products.
- **Supplier checks** — does a supplier hold a valid certificate? When was it last inspected?
- **Risk alerts** — weekly run with *Return only changes* to catch new failed inspections.
- **Market mapping** — count factories and warehouses by country or region.

***

### How much does it cost to scrape EudraGMDP pharma licences?

Pay per result, no subscription. Prices per 1,000 events (Apify plan discounts applied automatically):

| Event | Free | Bronze | Silver | Gold+ |
|---|---|---|---|---|
| **Document returned** (one row) | $4.00 | $3.50 | $3.00 | $2.50 |
| **Full details loaded** (only with *Include full licence details*) | $3.00 | $2.50 | $2.00 | $1.50 |

Failed detail loads are never charged. Typical costs (Free plan):

| Run | Rows | Cost |
|---|---|---|
| Wholesale distributors, Spain | ~590 | ~$2.40 |
| Factory certificates (GMP), Spain | ~670 | ~$2.70 |
| Wholesale distributors, whole EEA | ~11,000 | ~$44 |
| Weekly "only changes" alert, one country | usually < 50 | < $0.20 |

**Worked example (BRONZE tier):** 100 wholesale-distributor rows with *Include full licence details* on: 100 x $0.0035 = $0.35 for the rows, plus 100 x $0.0025 = $0.25 for the details, plus the $0.00005 Actor start event (512 MB = one event). Total: about **$0.60**. Without details: about $0.35.

Set **Max records** to cap your spend on any run.

***

### EudraGMDP data source and limitations

- **Source**: EudraGMDP is run by the EMA; content is provided by national authorities, and the EMA accepts no liability for it. Questions about a document should go to the issuing authority.
- **No personal data**: names and signatures are hidden by the source and never collected.
- **Suspended or withdrawn licences** are not shown by the public website, so they are not included.
- **Wholesale distributors without details** don't include the official IDs (ORG/LOC) — the source doesn't list them; switch on details or use *EU Pharma Sites Graph*.
- **Warehouse certificates (GDP)** are served 10 per page by the source, so all of Europe takes a few hours.
- We query the EMA website politely (max 2 parallel requests).

### FAQ

**Is this data official?** Yes — it comes from the EU database fed by national regulators; every row links to the official page.

**How fresh is it?** Live: each run reads the EMA website directly.

**Can I get only what changed?** Yes: *Recurring runs → Return only changes*.

**What's the difference with EU Pharma Sites Graph?** This actor gives **one row per document**; Sites Graph gives **one row per building/site** with all its documents grouped.

**How much does a test run cost?** The pre-filled input (Spanish WDA, 50 records) on the Free plan is 50 x $0.004 = $0.20, plus the $0.00005 Actor start event. **Max records** caps any run.

**Why are `status` or the ORG/LOC IDs `null`?** In the real wholesale-distributor record above (details off) `status` is `null`, and the source list does not include the official ORG/LOC IDs for wholesale distributors. Switch on `fetchDetails`, or use *EU Pharma Sites Graph*.

**Do I need proxies?** No. The source is public and the Actor queries it politely (max 2 parallel requests).

### Related Rastriq actors

- [EU Pharma Sites Graph](https://apify.com/rastriq/eu-pharma-sites-graph) - one row per pharma site with all its licences grouped.
- [FDA Drug Establishments (DECRS)](https://apify.com/rastriq/fda-drug-establishments-delta) - drug establishments registered with the US FDA, with daily changes and removals.
- [Europages Scraper](https://apify.com/rastriq/europages-scraper) - European B2B company directory.

# Actor input Schema

## `modules` (type: `array`):

Pick one or more datasets:<br>• <b>Wholesale distributors</b>: companies licensed to store and distribute medicines (WDA).<br>• <b>Manufacturers & importers</b>: licensed factories and importers (MIA).<br>• <b>Factory inspection certificates</b>: GMP certificates and failed inspections.<br>• <b>Warehouse inspection certificates</b>: GDP certificates and failed inspections.<br>• <b>Active ingredient suppliers</b>: companies registered to make, import or distribute active substances (beta).

## `countries` (type: `array`):

Choose where the sites are located. Pick <b>All EEA countries</b> for the whole EU/EEA in one go, or specific countries. You can also type any other 2-letter country code (e.g. <code>BR</code>).

## `fetchDetails` (type: `boolean`):

Opens every document to add: issuing authority, inspection dates, authorised activities and <b>special product types</b> (cold chain, vaccines/immunologicals, blood products, narcotics...).<br>About 2-3 seconds per document: great for one country, slow for all of Europe.

## `maxItems` (type: `integer`):

Stop after this many records. Use a small number for your first test.

## `holderNameContains` (type: `string`):

Search by company or site name (e.g. <code>Pfizer</code>). Pick a suggestion or type any text (case-insensitive, partial match).

## `includeNonCompliance` (type: `boolean`):

Inspection certificates only: also return statements of non-compliance (flag <code>non_compliance</code>).

## `gdpOperation` (type: `string`):

Warehouse inspection certificates (GDP) only.

## `dateFrom` (type: `string`):

Inspection certificates only: issued on or after this date. Example: <code>2025-01-01</code> to see this year's certificates.

## `dateTo` (type: `string`):

Inspection certificates only: issued on or before this date.

## `mode` (type: `string`):

With <b>Yes</b>, each run remembers what it already returned (key-value store <code>eudragmdp-registry-state</code>) and only outputs new or updated documents. Ideal for weekly alerts.

## `updatedSince` (type: `string`):

Return only documents updated on or after this date. Example: <code>2026-09-01</code>. Leave empty to get everything.

## `maxConcurrency` (type: `integer`):

Capped at 2 out of respect for the public EMA website.

## `proxyConfiguration` (type: `object`):

Not needed: the source is public.

## Actor input object example

```json
{
  "modules": [
    "WDA"
  ],
  "countries": [
    "ES"
  ],
  "fetchDetails": false,
  "maxItems": 50,
  "includeNonCompliance": true,
  "gdpOperation": "ALL",
  "mode": "full",
  "maxConcurrency": 2,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `documents` (type: `string`):

No description

## `runStats` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "modules": [
        "WDA"
    ],
    "countries": [
        "ES"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("rastriq/eudragmdp-pharma-registry").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "modules": ["WDA"],
    "countries": ["ES"],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("rastriq/eudragmdp-pharma-registry").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "modules": [
    "WDA"
  ],
  "countries": [
    "ES"
  ],
  "maxItems": 50
}' |
apify call rastriq/eudragmdp-pharma-registry --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rastriq/eudragmdp-pharma-registry"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ziA5IIhPXNE7UyBva/builds/KloNcaxMjbVbvqc5t/openapi.json
