# Pharma Regulatory Intelligence — FDA, EMA & Clinical Trials (`sweet-orb/pharma-regulatory-intelligence`) Actor

Search FDA drug approvals and recalls, EMA medicines and ClinicalTrials.gov trials by therapeutic area. Get sponsor organisations, phases, indications, statuses and source links. No personal data.

- **URL**: https://apify.com/sweet-orb/pharma-regulatory-intelligence.md
- **Developed by:** [Karol Olechno](https://apify.com/sweet-orb) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$20.00 / 1,000 calls

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Pharma Regulatory Intelligence — FDA, EMA & Clinical Trials

Search drug approvals, device recalls and clinical trials in one place. Results come from three official public sources:

- **openFDA** — FDA-approved drug labels (marketed products) and drug/device enforcement (recall) records.
- **EMA** — centrally authorised medicines from the European Medicines Agency's public JSON data file.
- **ClinicalTrials.gov** — registered clinical studies from the US National Library of Medicine.

Each record is normalised into one clean JSON shape with the identifiers, dates, sponsor organisation (company or institution, never an individual investigator), status, indication, therapeutic area, trial phase and source URL. No login, no proxy, no browser. **No personal data.**

### What can you do with it?

- **Pharma suppliers and CROs:** "Which sponsors are running Phase 2/3 trials in diabetes, and what drugs or devices in that space were recalled recently?" — sales targeting and safety context.
- **Investors and analysts:** "Approvals, trial phases and recall risk for a therapeutic area" — pipeline screening and diligence.
- **Researchers and medical writers:** "The current trial landscape and approved products for Alzheimer disease" — one query, three sources.
- **AI agents:** one tool call answers "FDA approvals and active trials for diabetes in 2026" with structured, cited data.

### Data source and coverage

| | |
|---|---|
| Sources | openFDA drug label (`/drug/label.json`), openFDA drug enforcement (`/drug/enforcement.json`), openFDA device recall (`/device/recall.json`), EMA medicines JSON, ClinicalTrials.gov API v2 |
| Coverage | FDA-approved marketed drug products; FDA drug and device recalls; EMA centrally authorised human and veterinary medicines; 500,000+ registered clinical studies |
| Freshness | openFDA updates daily; EMA updates its JSON file twice a day (06:00 and 18:00 CET); ClinicalTrials.gov updates continuously. Each run reads the live sources |
| Personal data | None. Sponsor fields contain company or institution names only. No investigators, patients, phone numbers or emails |
| Rate limits | The Actor sends at most 4 requests per second and backs off when a source is busy. openFDA allows 240 requests/minute without an API key |

**FDA approvals:** the Actor uses the openFDA drug label endpoint, which lists FDA-approved marketed drug products and carries the indication text. The application number links to the Drugs@FDA approval record. The primary date is the label's effective date. If you need the original approval date only, use the `applicationNumber` identifier to look it up in Drugs@FDA.

**EMA:** the Actor downloads the EMA medicines JSON file (about 7 MB) and filters it locally by therapeutic area, keywords, status (`Authorised`) and decision date. The first run of a session takes about 10–20 seconds because of the download.

The data is supplied by the regulators. openFDA states that results are unvalidated and should not be relied on for medical decisions. EMA data is reusable under the EU Open Data Directive; attribute the European Medicines Agency. ClinicalTrials.gov data is public domain. This Actor is independent and is not endorsed by the FDA, EMA or NIH.

### Input

Every filter is optional. With an empty input you get the newest 100 records from the last 12 months across FDA approvals, FDA recalls, EMA approvals and ClinicalTrials.gov trials.

| Field | What it does |
|---|---|
| `therapeuticArea` | Disease or therapeutic area, e.g. `"diabetes"`, `"Alzheimer disease"`, `"oncology"`. Used as the ClinicalTrials.gov condition query, the openFDA label indication search and the EMA local filter |
| `keywords` | Extra terms matched against brand names, generic names, trial titles and recall descriptions. Combined with the therapeutic area using AND |
| `agency` | `both`, `fda` or `ema`. FDA covers US drug labels and drug/device recalls. EMA covers EU centrally authorised medicines. ClinicalTrials.gov is included for trial records regardless of agency |
| `recordType` | `all`, `approval`, `recall` or `trial` |
| `phase` | Trial phases: `phase1`, `phase2`, `phase3`, `phase4`, `na`. Empty = all. Only applies to trial records |
| `sponsorType` | `all`, `industry`, `academic` or `government`. Filters ClinicalTrials.gov lead sponsor class |
| `dateFrom` / `dateTo` | `YYYY-MM-DD` or a relative period like `"12 months"`, `"90 days"`. Default: last 12 months up to today |
| `maxResults` | Default 100, up to 5,000 |
| `includeRaw` | Adds the complete raw source object under `raw` |

#### Example input

Diabetes approvals, recalls and trials from 2025–2026, ten records:

```json
{
    "therapeuticArea": "diabetes",
    "agency": "both",
    "recordType": "all",
    "dateFrom": "2025-01-01",
    "dateTo": "2026-12-31",
    "maxResults": 10
}
```

### Output

One record per approval, recall or trial. These five records come from a live run on 3 Nov 2026 with the example input (`maxResults: 5`), one from each source:

```json
[
    {
        "id": "fda-approval-ANDA078043",
        "recordType": "approval",
        "agency": "fda",
        "source": "openFDA Drug Label (FDA-approved)",
        "title": "Amlodipine Besylate",
        "brandName": "Amlodipine Besylate",
        "genericName": "amlodipine besylate",
        "sponsor": "Lupin Pharmaceuticals, Inc.",
        "sponsorType": "industry",
        "status": "Approved",
        "indication": "1 INDICATIONS AND USAGE Amlodipine besylate tablets are calcium channel blocker ...",
        "therapeuticArea": "diabetes",
        "phase": null,
        "primaryDate": "2026-04-20",
        "secondaryDate": null,
        "identifiers": { "applicationNumber": "ANDA078043" },
        "sourceUrl": "https://www.accessdata.fda.gov/scripts/cder/daf/index.cfm?event=overview.process&ApplNo=078043"
    },
    {
        "id": "fda-device-recall-Z-0088-2027",
        "recordType": "recall",
        "agency": "fda",
        "source": "openFDA Device Recall",
        "title": "Brand Name: MiniMed Flex Product Name: MiniMed Flex Insulin Pump Model/Catalog Numbers: MMT-8062; MMT-8072 ...",
        "brandName": null,
        "genericName": null,
        "sponsor": "Medtronic MiniMed, Inc.",
        "sponsorType": "industry",
        "status": "Recall",
        "indication": "Some MiniMed Flex insulin pumps were released with missing ...",
        "therapeuticArea": "diabetes",
        "phase": null,
        "primaryDate": "2026-08-20",
        "secondaryDate": null,
        "identifiers": { "recallNumber": "Z-0088-2027" },
        "sourceUrl": "https://api.fda.gov/device/recall.json?search=product_res_number:%22Z-0088-2027%22"
    },
    {
        "id": "ema-EMEA/H/C/006615",
        "recordType": "approval",
        "agency": "ema",
        "source": "EMA Medicines",
        "title": "Liraglutide STADA",
        "brandName": "Liraglutide STADA",
        "genericName": "liraglutide",
        "sponsor": "STADA Arzneimittel AG",
        "sponsorType": "industry",
        "status": "Authorised",
        "indication": "Treatment of adults, adolescents and children aged 10 years and above with insufficiently controlled type 2 diabetes mellitus ...",
        "therapeuticArea": "Diabetes Mellitus",
        "phase": null,
        "primaryDate": "2026-10-29",
        "secondaryDate": "2026-10-29",
        "identifiers": { "emaProductNumber": "EMEA/H/C/006615" },
        "sourceUrl": "https://www.ema.europa.eu/en/medicines/human/EPAR/liraglutide-stada"
    },
    {
        "id": "ct-NCT07670572",
        "recordType": "trial",
        "agency": "clinicaltrials",
        "source": "ClinicalTrials.gov",
        "title": "Think-Find-Solve Activities for Insulin Self-Management in Type 1 Diabetes",
        "brandName": null,
        "genericName": null,
        "sponsor": "Marmara University",
        "sponsorType": "other",
        "status": "RECRUITING",
        "indication": "Type 1 Diabetes, Children, Activity, Insulin, Self Management, Parent",
        "therapeuticArea": "Type 1 Diabetes",
        "phase": "NA",
        "primaryDate": "2026-10-05",
        "secondaryDate": null,
        "identifiers": { "nctId": "NCT07670572" },
        "sourceUrl": "https://clinicaltrials.gov/study/NCT07670572"
    }
]
```

The actual run also returned a second FDA device recall (`Z-0732-2026`, "Diabetes HbA1c Test", GET TESTED INTERNATIONAL AB). Dates are `YYYY-MM-DD`. Fields a source did not supply are `null`. The dataset has an **Overview** table view. The run also writes a `RUN_SUMMARY` record (saved, total matches, requests, filters) to the key-value store.

### Pricing

Pay per result, no subscription and no start fee:

| Event | Price |
|---|---|
| `pharma-record`: one approval, recall or trial written to the dataset | **$0.02** ($20 per 1,000) |

- You only pay for records you receive. Filtered-out records are free.
- The Actor never returns more records than your run's **maximum cost** allows; it stops cleanly at that limit.
- Examples: a 10-result query costs $0.20; a 100-result query costs $2.00; a 500-result query costs $10.00.
- Set the run's maximum cost high enough for your query. The default local test budget in this repo's environment stopped at one record; on the Apify platform, set the max cost to cover the number of records you expect.

### Use with AI agents (MCP)

The input schema is written for language models: every filter has a plain-English description and examples.

Add the Apify MCP server with only this Actor enabled:

```
https://mcp.apify.com/?tools=<username>/pharma-regulatory-intelligence
```

Example questions the agent can answer with a single call:

- "Which companies are sponsoring Phase 3 diabetes trials in 2026?"
- "List FDA drug approvals and device recalls for insulin pumps since 2025."
- "What EMA-authorised medicines target Alzheimer disease, and what trials are recruiting?"

Tips for agents:

- Keep `maxResults` small (10–50) for exploratory questions.
- Use `recordType: "trial"` with `phase: ["phase2", "phase3"]` to focus on late-stage trials.
- Use `agency: "ema"` for EU-only approvals; `agency: "fda"` for US drug labels and recalls.

### Run it from code

```bash
curl -X POST "https://api.apify.com/v2/acts/<username>~pharma-regulatory-intelligence/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"therapeuticArea":"diabetes","agency":"both","recordType":"all","dateFrom":"2025-01-01","maxResults":25}'
```

### FAQ

**Why does an FDA approval record have a label effective date instead of an approval date?**
The openFDA drug label endpoint carries the indication text and the application number. The label's `effective_time` is the version date of the approved label. Use the `applicationNumber` to look up the original approval date in Drugs@FDA. The label endpoint is the only openFDA endpoint that pairs an indication with an approved product, so it is the best fit for the output schema.

**Why are some EMA records missing?**
The EMA dataset covers centrally authorised medicines. Nationally authorised medicines are not included. The Actor filters to `medicine_status: "Authorised"` and to records with a European Commission decision date or marketing authorisation date in the requested range. Records without a usable date are excluded.

**Why did my run stop early?**
The run hit the **maximum cost** you set. Each record costs $0.02. Raise the run's maximum cost or reduce `maxResults`. The `RUN_SUMMARY` key-value record shows `stoppedByBudget: true` when this happens.

**Is this legal to use?**
The Actor reads only public, keyless APIs and public data files. It sends at most 4 requests per second. It returns no personal data. You are responsible for how you use the results. openFDA data is unvalidated; do not use it for medical decisions.

**How fresh is the data?**
openFDA updates daily; EMA updates its JSON twice a day; ClinicalTrials.gov updates continuously. Each run reads the live sources.

**Something looks wrong or a filter is missing?**
Open an issue on the Actor's Issues tab. Issues are answered within a few days.

# Actor input Schema

## `therapeuticArea` (type: `string`):

Therapeutic area or disease to search for, e.g. "oncology", "Alzheimer disease", "type 2 diabetes", "Gaucher disease". Used as the ClinicalTrials.gov condition query and as the openFDA label indication search. Leave empty to search all areas.

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

Additional keywords matched against drug brand names, generic names, trial titles and recall product descriptions. Combine with the therapeutic area using AND. Example: \["pembrolizumab", "immunotherapy"].

## `agency` (type: `string`):

Which regulator to query. FDA covers US drug approvals and drug/device recalls. EMA covers EU centrally authorised medicines. "both" queries both and merges the results.

## `recordType` (type: `string`):

Type of record to return. approval = FDA Drugs@FDA or EMA medicines; recall = FDA drug or device enforcement; trial = ClinicalTrials.gov studies; all = every matching type.

## `phase` (type: `array`):

Trial phases to include. Empty means all phases. Only applies to trial records. Phase NA covers early-phase and device studies.

## `sponsorType` (type: `string`):

Sponsor organisation type for clinical trials. Maps to the ClinicalTrials.gov lead sponsor class. "all" includes industry, academic and government sponsors.

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

Start of the date range for the record's primary date (approval date, recall initiation date or trial start date). Use YYYY-MM-DD or a relative period such as "12 months" or "90 days". Default: 12 months ago.

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

End of the date range. Use YYYY-MM-DD or a relative period. Default: today.

## `maxResults` (type: `integer`):

Maximum number of records to return across all sources. Default 100, up to 5,000. Each record is charged once.

## `includeRaw` (type: `boolean`):

Add the complete raw source object to each record under "raw". Useful for debugging or custom downstream processing.

## Actor input object example

```json
{
  "agency": "both",
  "recordType": "all",
  "sponsorType": "all",
  "maxResults": 100,
  "includeRaw": false
}
```

# Actor output Schema

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

All matching records with identifiers, dates, sponsor organisation, status, indication, therapeutic area, phase and source URL.

## `overview` (type: `string`):

The same records in the compact overview view of the dataset.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("sweet-orb/pharma-regulatory-intelligence").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("sweet-orb/pharma-regulatory-intelligence").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 '{}' |
apify call sweet-orb/pharma-regulatory-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sweet-orb/pharma-regulatory-intelligence"
        }
    }
}
```

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/jdGswXldbf3YjVfGn/builds/rZLFGs7GRdGEMPWYi/openapi.json
