# FDA Drug Approvals Monitor: EMA & Health Canada (`maliksaid/drug-approvals-monitor`) Actor

FDA drug approvals, European Medicines Agency (EMA) decisions and Health Canada product status in one pharma regulatory feed. New approvals, generics, biosimilars, label changes, withdrawals and suspensions with company, active ingredient and application number. Monitor mode returns only new events.

- **URL**: https://apify.com/maliksaid/drug-approvals-monitor.md
- **Developed by:** [Malik Said](https://apify.com/maliksaid) (community)
- **Categories:** News, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.40 / 1,000 medicine events

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

## FDA Drug Approvals Monitor: EMA & Health Canada

Drug Approvals Monitor tracks new drug approvals and medicine status changes from three regulators. It reads the US FDA (Drugs@FDA), the European Medicines Agency (EMA) and Health Canada's Drug Product Database. It returns every event in one schema.

Use it to follow new drug approvals, generic and biosimilar entries, label and variation decisions, withdrawals, suspensions and cancellations. It suits regulatory affairs teams, market access analysts, pharma competitive intelligence and AI agents.

Schedule it daily with monitor mode on. Each run then returns only events you have not seen before.

Every event carries standard flags. Filter for FDA novel drug approvals, orphan medicines, priority reviews, EMA conditional approvals, PRIME or advanced therapy medicines in one click.

### Drug approvals: regulators covered

| Regulator | Data source | What one event means | Events in the last 30 days (21 October 2026) |
|---|---|---|---|
| FDA (United States) | openFDA Drugs@FDA API | One approved or tentatively approved submission: an original application or a supplement | 382 |
| EMA (European Union) | EMA medicines data report (JSON) | One dated step: CHMP opinion, marketing authorisation, European Commission decision, refusal, withdrawal, suspension | 101 human medicines |
| Health Canada | Drug Product Database API | One product status change: approved, marketed, dormant, cancelled | 205 human products |
| FDA drug recalls (opt-in) | openFDA drug enforcement reports | One drug recall notice, with its class (Class I, II or III), reason and recalling firm | 67 recalls (24 Sep to 23 Oct 2026) |

Counts change every day. openFDA refreshes its data weekly. EMA and Health Canada refresh daily.

### Drug approvals data you get

| Field | Meaning |
|---|---|
| `regulator` | FDA, EMA or Health Canada |
| `country` | US, EU or CA |
| `eventDate` | Date of the event, YYYY-MM-DD |
| `eventType` | Original application, Supplement, Marketing authorisation, European Commission decision, Product status change and similar |
| `eventDetail` | FDA submission class and review priority. EMA procedure number and flags such as orphan or biosimilar. Health Canada first market date |
| `status` | Shared status: approved, tentative-approval, opinion-positive, refused, withdrawn, suspended, marketed, dormant, cancelled-post-market and others |
| `statusOriginal` | Status as the regulator wrote it |
| `productName` | Brand or medicine name |
| `activeIngredients` | Active ingredients, separated by semicolons |
| `company` | Applicant, sponsor or marketing authorisation holder |
| `applicationNumber` | FDA application number (NDA, ANDA, BLA), EMA product number or Health Canada DIN |
| `productCategory` | Human, Veterinary, Disinfectant or Radiopharmaceutical |
| `dosageForms`, `routes` | Dosage forms and routes (FDA and Health Canada) |
| `therapeuticArea` | FDA pharmacologic class or EMA therapeutic area |
| `atcCode` | ATC code (EMA and Health Canada) |
| `documentUrls` | FDA approval letters and labels for the submission |
| `flags` | Standard flags, listed below |
| `applicationType` | FDA NDA, ANDA or BLA. Centralised for EMA |
| `submissionClass` | FDA submission class, for example "Type 1 - New Molecular Entity", "Efficacy" or "Labeling" |
| `reviewPriority` | FDA priority or standard. EMA accelerated when the medicine had accelerated assessment |
| `therapeuticIndication` | EMA approved indication text |
| `opinionDate` | EMA CHMP or CVMP opinion date |
| `firstApprovalDate` | FDA original approval date of the application, or EMA marketing authorisation date |
| `currentStatus` | Status today: EMA medicine status, or FDA marketing status (Prescription, Over-the-counter, Discontinued) |
| `recallClass` | FDA recalls only: Class I, Class II or Class III. Null on other rows |
| `sourceUrl` | Link to the medicine on the regulator's site |
| `sourceAttribution` | Source acknowledgement required by the data licence |

#### Drug approval flags

| Flag | FDA | EMA | Meaning |
|---|---|---|---|
| `novel` | Yes | | Original approval of a new molecular entity (Drugs@FDA submission class Type 1) |
| `new-molecular-entity` | Yes | | Submission class Type 1, original or supplement |
| `orphan` | Yes | Yes | Orphan designation on the FDA submission, or EMA orphan medicine |
| `priority-review` | Yes | | FDA priority review |
| `generic` | Yes | Yes | FDA ANDA, or EMA generic |
| `biosimilar` | Yes | Yes | FDA biosimilar submission class, or EMA biosimilar |
| `conditional-approval` | | Yes | EMA conditional marketing authorisation |
| `exceptional-circumstances` | | Yes | EMA authorisation under exceptional circumstances |
| `advanced-therapy` | | Yes | EMA advanced therapy medicinal product |
| `prime` | | Yes | EMA PRIME priority medicine |
| `accelerated-assessment` | | Yes | EMA accelerated assessment |
| `additional-monitoring` | | Yes | EMA additional monitoring (black triangle) |

Health Canada events have no flags. The FDA's own yearly list of novel drug approvals can differ slightly from the `novel` flag. Some FDA biologic originals carry no submission class in Drugs@FDA.

Sample FDA record from a test run:

```json
{
  "id": "fda:NDA220415:ORIG-1:AP",
  "regulator": "FDA",
  "country": "US",
  "eventDate": "2026-09-25",
  "eventType": "Original application",
  "eventDetail": "Type 1 - New Molecular Entity; standard review",
  "status": "approved",
  "statusOriginal": "Approved",
  "productName": "JUVMO; JUVMO (COPACKAGED)",
  "activeIngredients": "TAVAPADON",
  "company": "ABBVIE",
  "applicationNumber": "NDA220415",
  "dosageForms": "TABLET",
  "routes": "ORAL",
  "documentUrls": [
    "https://www.accessdata.fda.gov/drugsatfda_docs/appletter/2026/220415Orig1s000ltr.pdf",
    "https://www.accessdata.fda.gov/drugsatfda_docs/label/2026/220415Orig1s000lbl.pdf"
  ],
  "flags": ["novel", "new-molecular-entity"],
  "applicationType": "NDA",
  "submissionClass": "Type 1 - New Molecular Entity",
  "reviewPriority": "standard",
  "firstApprovalDate": "2026-09-25",
  "currentStatus": "Prescription",
  "sourceUrl": "https://www.accessdata.fda.gov/scripts/cder/daf/index.cfm?event=overview.process&ApplNo=220415"
}
```

Sample European Medicines Agency (EMA) record from a test run with the orphan flag filter:

```json
{
  "id": "ema:EMEA/H/C/004827:ec-decision:2026-08-27",
  "regulator": "EMA",
  "eventDate": "2026-08-27",
  "eventType": "European Commission decision (latest change)",
  "eventDetail": "VR/0000367485; orphan medicine; conditional approval; advanced therapy; PRIME",
  "status": "approved",
  "productName": "Hemgenix",
  "activeIngredients": "Etranacogene dezaparvovec",
  "company": "CSL Behring GmbH",
  "applicationNumber": "EMEA/H/C/004827",
  "therapeuticArea": "Hemophilia B",
  "atcCode": "B02BD",
  "flags": ["orphan", "conditional-approval", "advanced-therapy", "prime", "additional-monitoring"],
  "applicationType": "Centralised",
  "therapeuticIndication": "Treatment of severe and moderately severe Haemophilia B (congenital Factor IX deficiency) in adult patients without a history of Factor IX inhibitors.",
  "opinionDate": "2022-12-15",
  "firstApprovalDate": "2023-02-20",
  "currentStatus": "Authorised",
  "sourceUrl": "https://www.ema.europa.eu/en/medicines/human/EPAR/hemgenix"
}
```

Some fields stay empty for some regulators. EMA's report has no dosage form or route. Health Canada has no therapeutic area. Some FDA tentative approvals list no product details. The Actor never guesses a missing value.

### Drug approvals monitoring: how to use it

1. Pick the regulators. Leave the list empty for all three.
2. Set the date window. The default is the last 30 days.
3. Add keywords to watch an active ingredient, a company or a therapeutic area. Example: `semaglutide`, `pfizer`, `oncology`.
4. Optional: pick flags such as `novel` or `orphan` to keep only those events.
5. Turn on **Monitor mode** and schedule the Actor daily. Each run returns only new events.
6. Connect the output to Google Sheets, Slack, email or your CRM through Apify integrations.

#### Keyword matching

Keywords search the product name, active ingredients, company, application number, therapeutic area, ATC code and EMA therapeutic indication. They match whole words and ignore case. `pfizer` matches "PFIZER INC" and "Pfizer Europe MA EEIG".

#### Monitor mode

Monitor mode remembers which events it returned before. Use a different **Monitor name** (`monitorName`) for each watch list. Example: one name for your competitors and another for one therapeutic area.

### Drug approvals input options

| Option | Default | Meaning |
|---|---|---|
| Regulators | fda, ema, hc | fda, ema, hc, fda-recalls (drug recalls, off by default) |
| Recall classes | All three | Class I, Class II, Class III. Used with fda-recalls |
| Days back | 30 | Events from this many days before the end date |
| Start date, End date | Empty | Optional fixed window, YYYY-MM-DD |
| Keywords | None | Keep only matching events |
| Only events with these flags | None | Keep only events with at least one chosen flag, for example `novel` or `orphan` |
| Human medicines only | On | Skip veterinary medicines, disinfectants and radiopharmaceuticals |
| Monitor mode | Off | Return only events not returned before |
| Monitor name | `default` | Name of the monitor memory. The old field name `stateKey` still works |
| Maximum events | 100 | Stop after this many events, newest first. Set 0 for no limit |

### Drug approvals pricing

The Actor uses pay-per-event pricing:

| Event | Free plan | GOLD plan and higher |
|---|---|---|
| Run start | $0.005 | $0.005 |
| Medicine event | $0.003 ($3.00 per 1,000) | $0.0024 ($2.40 per 1,000) |

| Events in one run | Free plan | GOLD plan and higher |
|---|---|---|
| 100 | $0.305 | $0.245 |
| 1,000 | $3.005 | $2.405 |

Costs include the run start fee.

Events skipped by your filters or by monitor mode cost nothing. A recall row costs the same as any other event. Check the Pricing tab for the current price.

### Drug approvals example: input and output

This input reads EMA decisions from the last 90 days that mention Pfizer, and stops at 5 events:

```json
{
  "regulators": ["ema"],
  "keywords": ["pfizer"],
  "daysBack": 90,
  "maxItems": 5
}
```

One record from that run on 21 October 2026:

```json
{
  "id": "ema:EMEA/H/C/004696:ec-decision:2026-10-05",
  "regulator": "EMA",
  "country": "EU",
  "eventDate": "2026-10-05",
  "eventType": "European Commission decision (latest change)",
  "eventDetail": "VR/0000372519; biosimilar",
  "status": "approved",
  "statusOriginal": "Authorised",
  "productName": "Ruxience",
  "activeIngredients": "rituximab",
  "company": "Pfizer Europe MA EEIG",
  "applicationNumber": "EMEA/H/C/004696",
  "productCategory": "Human",
  "dosageForms": null,
  "routes": null,
  "therapeuticArea": "Leukemia, Lymphocytic, Chronic, B-Cell; Arthritis, Rheumatoid; Microscopic Polyangiitis; Pemphigus",
  "atcCode": "L01XC02",
  "documentUrls": [],
  "sourceUrl": "https://www.ema.europa.eu/en/medicines/human/EPAR/ruxience",
  "sourceAttribution": "Source: European Medicines Agency (EMA), medicines data report. EMA is the source of this material.",
  "scrapedAt": "2026-10-21T10:25:08.081Z"
}
```

This input returns FDA novel drug approvals and orphan medicines from both agencies in the last 90 days:

```json
{
  "regulators": ["fda", "ema"],
  "flags": ["novel", "orphan"],
  "daysBack": 90,
  "maxItems": 50
}
```

### Drug approvals data sources and licences

- openFDA data, recalls included, is public domain under CC0. openFDA says not to rely on it for medical decisions.
- EMA allows reuse, including commercial reuse, when EMA is acknowledged as the source. Each EMA record carries that acknowledgement in `sourceAttribution`.
- Health Canada data is published under the Open Government Licence - Canada. Each record carries the required attribution.
- The Actor reads public APIs and files that need no login. It collects product and company facts only. It does not collect personal data.
- Always check the regulator's site before you act on a record.

### Drug approvals run time

A 30-day run of all three regulators takes about 30 seconds. The regulators and Health Canada's product tables are read at the same time.

### Drug approvals FAQ

#### Does it cover medical devices or biologics outside Drugs@FDA?

No. FDA data comes from Drugs@FDA, which covers drugs and the biologics that CDER reviews. Devices and CBER vaccines are outside its scope.

#### Why do I see Health Canada "marketed" events?

Health Canada records when a company starts selling an approved product. That is a status change, so the Actor reports it. Filter on `status` if you want approvals only.

#### How do I get only FDA novel drug approvals?

Set regulators to `fda` and flags to `novel`. Each event is the original approval of a new molecular entity, with sponsor, review priority, approval letter and label links.

#### Can I get the full history?

Yes. Set a start date in the past and set maximum events to 0. One year of all three regulators is about 10,000 events.

#### Does it track label changes?

Yes. FDA supplements and EMA variation decisions cover label changes. Each one is a separate event with its own date.

#### Can an AI agent use it?

Yes. Agents can find and run it through the Apify MCP server or the Apify API. The output uses one schema for all regulators.

### Related Actors

- [Regulator Circulars Monitor](https://apify.com/maliksaid/regulator-circulars-monitor): new circulars from the Central Bank of Jordan and Saudi NCA.
- [US Building Permits](https://apify.com/maliksaid/us-building-permits): new building permits from ten US cities.
- [Technical SEO Audit](https://apify.com/maliksaid/technical-seo-audit): crawl a site and find broken links and SEO issues.

### Support

Report a problem in the Issues tab. Include the run link.

# Actor input Schema

## `regulators` (type: `array`):

Which medicine regulators to read. Leave empty for FDA, EMA and Health Canada. Add FDA drug recalls to also get recall notices.

## `recallClasses` (type: `array`):

Used with FDA drug recalls. Class I is the most serious: a product that can cause serious harm or death. Leave empty for all three.

## `daysBack` (type: `integer`):

Return events from this many days before the end date. Ignored when you set a start date.

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

Optional. First event date to include, as YYYY-MM-DD. Overrides days back.

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

Optional. Last event date to include, as YYYY-MM-DD. Default is today.

## `keywords` (type: `array`):

Keep only events whose product name, active ingredient, company, application number, therapeutic area, ATC code or EMA therapeutic indication contains at least one keyword. Keywords match whole words. Leave empty to keep every event.

## `humanOnly` (type: `boolean`):

Skip veterinary medicines, disinfectants and radiopharmaceuticals. FDA data in this Actor covers human drugs only.

## `flags` (type: `array`):

Keep only events that carry at least one of these flags. Orphan, priority review and generic work for FDA and EMA. Novel and new molecular entity are FDA. Conditional approval, PRIME, advanced therapy and the other EMA flags are EMA. Leave empty to keep every event.

## `monitorMode` (type: `boolean`):

Return only events that earlier monitor-mode runs with the same monitor name did not return. Schedule the Actor with this on to get a feed of new approvals and status changes.

## `monitorName` (type: `string`):

Name of the memory that monitor mode uses. Use a different name for each separate watch list. Inputs that still send the old field `stateKey` keep working.

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

Stop after saving this many events, newest first. The default keeps test runs short and cheap. Set 0 for no limit.

## Actor input object example

```json
{
  "regulators": [
    "fda",
    "ema",
    "hc"
  ],
  "recallClasses": [
    "Class I",
    "Class II",
    "Class III"
  ],
  "daysBack": 30,
  "keywords": [],
  "humanOnly": true,
  "flags": [],
  "monitorMode": false,
  "monitorName": "default",
  "maxItems": 100
}
```

# Actor output Schema

## `results` (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 = {
    "regulators": [
        "fda",
        "ema",
        "hc"
    ],
    "daysBack": 30,
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("maliksaid/drug-approvals-monitor").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 = {
    "regulators": [
        "fda",
        "ema",
        "hc",
    ],
    "daysBack": 30,
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("maliksaid/drug-approvals-monitor").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 '{
  "regulators": [
    "fda",
    "ema",
    "hc"
  ],
  "daysBack": 30,
  "maxItems": 100
}' |
apify call maliksaid/drug-approvals-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maliksaid/drug-approvals-monitor"
        }
    }
}
```

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/THCVn8gVF5JsvaRh3/builds/60RAwwo2BL4DnT8mc/openapi.json
