# EMA Medicine Status Records — EU Medicines (`nexgensignal/ema-medicine-status-records`) Actor

Per-record EU medicine regulatory status from the official EMA medicines report. Status, MA holder, therapeutic area, ATC, and authorisation/refusal/withdrawal dates. Keyless, commercial reuse, no personal data.

- **URL**: https://apify.com/nexgensignal/ema-medicine-status-records.md
- **Developed by:** [NexGen Signal](https://apify.com/nexgensignal) (community)
- **Categories:** Business, News, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $33.50 / 1,000 medicine status records

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## EMA Medicine Status Records — EU Medicines

**Official source. No API key. Pay per record.**

This actor turns the **European Medicines Agency's** official medicines report into clean, per-medicine records — the regulatory status of every centrally-authorized EU medicine (and the ones refused, withdrawn, suspended, or revoked). Each run reads EMA's published medicines-output spreadsheet and delivers one row per medicine: the name and EMA product number, the status, the marketing-authorisation holder, the therapeutic and classification detail, and the full set of regulatory dates — authorisation, refusal, withdrawal, suspension. Product and organization grain, EMA-licensed for commercial reuse, no person fields.

### What this is, in one paragraph

EMA publishes the complete list of medicines it has assessed as a downloadable report — every human and veterinary medicine with its current regulatory status and history. This actor reads that official spreadsheet directly, streams it row by row, and flattens each medicine into a single analysis-ready record: what it is, who holds the marketing authorisation, its therapeutic area and ATC code, the regulatory flags (orphan, biosimilar, generic, conditional, PRIME), and every status date on file. Values are verbatim. You are billed only for records actually delivered.

### Who buys this and for what job

- **Pharma regulatory and market-access teams** tracking EU medicine status — new authorisations, refusals, withdrawals, suspensions — across their own and competitors' portfolios.
- **Competitive-intelligence and market analysts** mapping which companies hold authorisations in a therapeutic area, and watching status changes.
- **Health-tech and data products** ingesting a structured EU medicines register keyed by EMA product number and INN.
- **Data engineers** who want a keyless, one-call EU medicines-status feed already reduced to product/org fields.

### Licence — commercial reuse permitted, with acknowledgement

EMA is explicit: *"Information and documents made available on EMA's webpages are public and may be reproduced and/or distributed, totally or in part ... for non-commercial and commercial purposes provided that EMA is always acknowledged as the source of the material."* Every record carries the required attribution: *"Source: European Medicines Agency (EMA)."* EMA notes that third-party content is excepted; this actor carries EMA's own tabular medicine-status data, not third-party documents. These are metadata records for status-tracking, not medical or regulatory advice.

### Product / organization grain — no person data

This actor works at product and organization grain: the medicine and its marketing-authorisation holder (a company). The EMA medicines report carries no natural-person fields — the only party field is the authorisation-holder organisation — and this actor emits none, with a person-key guard on every record as a backstop.

### Pricing

| Event | Free plan | Bronze | Silver | Gold / Platinum / Diamond |
|-------|-----------|--------|--------|---------------------------|
| `medicine_status_record` | $0.05 | $0.045 | $0.04 | $0.0335 |

Delivered before charged. Blocked runs and empty results cost nothing.

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `category` | select | All | Optional. Keep only Human or Veterinary medicines. |
| `statusFilter` | string | — | Optional. Keep only medicines whose status contains this text (e.g. Authorised, Withdrawn, Refused). Applied to delivered records. |
| `maxRecords` | integer | 500 | Ceiling on records delivered and billed. |

### Output

One JSON object per medicine. Example (values verbatim):

```json
{
  "record_id": "EMEA/H/C/005243",
  "category": "Human",
  "name_of_medicine": "Lacosamide UCB",
  "ema_product_number": "EMEA/H/C/005243",
  "medicine_status": "Authorised",
  "inn_common_name": "lacosamide",
  "active_substance": "lacosamide",
  "therapeutic_area": "Epilepsies, Partial",
  "atc_code_human": "N03AX18",
  "orphan_medicine": "No",
  "marketing_authorisation_holder": "UCB Pharma S.A.",
  "european_commission_decision_date": "2024-12-20",
  "marketing_authorisation_date": "2024-12-22",
  "refusal_date": null,
  "revision_number": "3",
  "last_updated_date": "2026-08-01",
  "source": "European Medicines Agency (medicines-output report)",
  "source_url": "https://www.ema.europa.eu/en/medicines/human/EPAR/lacosamide-ucb",
  "licence": "European Medicines Agency (EMA) ... commercial purposes provided that EMA is always acknowledged ...",
  "attribution": "Source: European Medicines Agency (EMA).",
  "observed_at": "2026-08-19T00:00:00Z"
}
```

An unbilled `RUN_RECEIPT` records the robots check, the filters, medicines seen and delivered, and whether charged equals delivered.

### Field reference

Each record is a flat set of medicine-status fields. Identity: `record_id` / `ema_product_number`, `name_of_medicine`, and `category` (Human/Veterinary). Status: `medicine_status` and `opinion_status`. Substance and classification: `inn_common_name`, `active_substance`, `therapeutic_area`, `atc_code_human`, `atcvet_code`, `pharmacotherapeutic_group_human`, and `therapeutic_indication`. Regulatory flags: `accelerated_assessment`, `additional_monitoring`, `advanced_therapy`, `biosimilar`, `conditional_approval`, `exceptional_circumstances`, `generic`, `orphan_medicine`, and `prime_priority_medicine`. Who holds it: `marketing_authorisation_holder` — an organisation. The dates: `ec_decision_date`, `start_of_evaluation_date`, `opinion_adopted_date`, `withdrawal_of_application_date`, `marketing_authorisation_date`, `refusal_date`, `withdrawal_expiry_revocation_date`, and `suspension_date`, plus `revision_number`, `first_published_date`, and `last_updated_date`. Provenance: `source`, `source_url`, `licence`, `attribution`, `disclaimer`, and `observed_at`.

### How a run works

A run first re-reads EMA's robots policy from your runtime and confirms the medicines report path is allowed (EMA's robots file permits it; the run stops at the door only if that changes). It then downloads the official medicines-output spreadsheet and streams it row by row — locating the header row by matching EMA's own column names, so a cosmetic layout shift doesn't break it. Each medicine is flattened to one record, dates normalized to ISO strings and blanks to null, and delivered **before** it is charged, so a blocked or empty run costs you nothing. Your optional category and status filters are applied per record before delivery, so you are billed only for medicines that pass them. The actor stops at your `maxRecords` ceiling, and the receipt's `charge_equals_delivered` flag confirms you were billed for exactly what you received.

### Status categories you can track

The `medicine_status` field is the heart of this feed, and it captures the full regulatory lifecycle: **Authorised** (currently on the EU market), **Refused** (a marketing authorisation the Commission declined), **Withdrawn** (the holder pulled the application or the authorisation), **Suspended**, and **Revoked/Expired/Lapsed**. Because each status also has its own dated column — `marketing_authorisation_date`, `refusal_date`, `withdrawal_expiry_revocation_date`, `suspension_date` — you get not just the current state but when each transition happened, which is what makes this a genuine status-**change** feed rather than a static register. Filter to just refusals or withdrawals with `statusFilter` to build a focused negative-signal watchlist, or pull the whole set and diff on `last_updated_date` between runs to catch every medicine whose status EMA touched since you last looked.

### Cost guidance

One `medicine_status_record` per delivered medicine: cost = medicines delivered × your plan's per-record price. The full EMA medicines report holds about **2,730 medicines**, so a complete pull is roughly **$137** (Free) / **$91** (Gold). Scope with `category` or `statusFilter` (e.g. only withdrawn or refused medicines) to keep runs smaller and cheaper.

### Honest limitations

- **Metadata / status grain.** This is the medicine's regulatory-status record — not the full assessment report or product label text.
- **Centrally-published EMA report.** It reflects the medicines in EMA's official output spreadsheet; nationally-authorised-only medicines are outside this file.
- **Dates are as published by EMA** (normalized to ISO `YYYY-MM-DD`); blank date fields are delivered as null.
- **Point-in-time.** Statuses and dates change; re-run to refresh, and diff by `last_updated_date` to catch changes.
- **No person data** is emitted.

### Differentiation

Distinct from the FDA cells in this fleet — **fda-device-clearance-records** and **fda-recall-risk-records** — which are a different agency (US FDA) and different product events. This is the **EU** medicines register from EMA. There is no other EMA-sourced product in the NexGenData fleets, so this actor does not overlap any internal sibling — it opens EU medicine-status coverage that the fleet did not previously carry.

### The NexGen Signal family

Part of the NexGen Signal family of official-source, pay-per-record products:

- [Drug Label Change Records — NLM DailyMed](https://apify.com/nexgensignal/drug-label-change-records)
- [FDA Device Clearance Records — 510(k)](https://apify.com/nexgensignal/fda-device-clearance-records)
- [FDA Recall Risk Records — openFDA](https://apify.com/nexgensignal/fda-recall-risk-records)
- [EU Regulatory Change Records — EUR-Lex](https://apify.com/nexgensignal/eu-regulatory-change-records)
- [World Bank Project Records — Development Pipeline](https://apify.com/nexgensignal/world-bank-project-records)

*Source: European Medicines Agency (EMA) medicines-output report. EMA information may be reproduced for commercial and non-commercial purposes provided EMA is acknowledged as the source; third-party content excepted. Reformatted to product/org records; values verbatim; no person data emitted.*

# Actor input Schema

## `category` (type: `string`):

Optional. Keep only Human or Veterinary medicines.

## `statusFilter` (type: `string`):

Optional. Keep only medicines whose status contains this text (e.g. Authorised, Withdrawn, Refused). Applied to delivered records.

## `maxRecords` (type: `integer`):

Maximum records delivered and billed. You are billed only for records delivered.

## Actor input object example

```json
{
  "category": "",
  "maxRecords": 500
}
```

# Actor output Schema

## `results` (type: `string`):

The delivered EMA medicine status records.

# 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 = {
    "maxRecords": 500
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexgensignal/ema-medicine-status-records").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 = { "maxRecords": 500 }

# Run the Actor and wait for it to finish
run = client.actor("nexgensignal/ema-medicine-status-records").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 '{
  "maxRecords": 500
}' |
apify call nexgensignal/ema-medicine-status-records --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nexgensignal/ema-medicine-status-records"
        }
    }
}

```

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/gDDiTnhg2kImBXdgi/builds/DgrF7Rr0zqYxXF0rJ/openapi.json
