# Biotech Catalyst Tracker: FDA & MHRA Approvals, Trials, AdComs (`seaf999ield/biotech-catalyst-tracker`) Actor

Biotech and pharma catalysts from official public sources: FDA approvals and CRLs (openFDA), FDA approval news, FDA advisory committee calendar, MHRA UK authorisations and ClinicalTrials.gov results and status changes. Company and condition filters, tickers.

- **URL**: https://apify.com/seaf999ield/biotech-catalyst-tracker.md
- **Developed by:** [RustonRoad](https://apify.com/seaf999ield) (community)
- **Categories:** Business, News, Open source
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 catalyst rows

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

## Biotech Catalyst Tracker: FDA & MHRA Approvals, Clinical Trials, AdComs and CRLs

**One clean feed of biotech and pharma catalysts from official public sources.** Get new FDA drug approvals, complete response letters (CRLs), FDA approval press releases, upcoming FDA advisory committee (AdComm) meetings, MHRA UK marketing authorisations and ClinicalTrials.gov results and status changes in a single normalised dataset. Filter by company or sponsor and by condition, and get tickers for major listed pharma and biotech companies.

- **Official data only:** openFDA, FDA.gov, GOV.UK (MHRA) and the ClinicalTrials.gov API v2. No logins, no paid data, no proxies.
- **One schema for every source:** `eventType`, `date`, `company`, `product`, `indication`, `phase`, `status`, `summary`, `sourceName`, `sourceUrl`, `ticker`.
- **Monitoring mode:** turn on `onlyNew`, schedule it daily, and get only catalysts you have not seen before. Trial status changes are detected between runs.
- **Lean and cheap:** plain API calls at 256 MB, with a typical run under 3 minutes.

> **Disclaimer:** This actor provides data only. It is **not investment, medical or regulatory advice**. Check every item against the linked official source before you act on it. The data is provided as published by each source, which can contain errors, delays or later corrections.

### What you get

| eventType | Source | What it means |
|---|---|---|
| `fda_approval` | Drugs@FDA via openFDA | Original NDA or BLA approval (new drug, new dosage form or new formulation) |
| `fda_new_indication_approval` | Drugs@FDA via openFDA | Efficacy supplement approved (usually a new indication or population) |
| `fda_tentative_approval` | Drugs@FDA via openFDA | Tentative approval |
| `fda_complete_response_letter` | openFDA CRL dataset | FDA complete response letter (application not approved), with a link to the published letter |
| `fda_approval_press_release` | FDA press announcements RSS | FDA's own approval announcements, with product, indication and the company the approval was granted to |
| `fda_advisory_committee_meeting` | FDA advisory committee calendar | Upcoming and recent drug and biologic AdComm meetings, with the application, product, sponsor and proposed indication from the agenda |
| `mhra_new_medicine_authorisation` | MHRA press releases on GOV.UK | New UK medicine authorisations announced by the MHRA, with indication, licence holder and route (for example the International Recognition Procedure) |
| `mhra_marketing_authorisation` | MHRA "Marketing authorisations granted" lists on GOV.UK | Every UK product licence (PL) granted, with holder, product, active ingredient and legal status |
| `trial_results_posted` | ClinicalTrials.gov API v2 | Results first posted for a study |
| `trial_status_update` | ClinicalTrials.gov API v2 | Study updated with a key status: completed, terminated, suspended, withdrawn or active not recruiting |
| `trial_registered` | ClinicalTrials.gov API v2 | Newly registered study (optional) |

#### Real sample from a test run on 23 Oct 2026 (lookback 7 days)

| eventType | date | company | ticker | product | indication / status |
|---|---|---|---|---|---|
| fda_approval_press_release | 20 Oct 2026 | GSK plc | GSK | Hibsago (bepirovirsen) | chronic hepatitis B virus (HBV) infection in certain adults without cirrhosis |
| fda_new_indication_approval | 19 Oct 2026 | GlaxoSmithKline | GSK | dostarlimab (Jemperli) | efficacy supplement, priority review |
| fda_new_indication_approval | 16 Oct 2026 | Merck Sharp Dohme | MRK | KEYTRUDA QLEX | efficacy supplement |
| fda_approval | 19 Oct 2026 | Fresenius Medical Care | | CALREZDY | Type 2, new active ingredient |
| fda_advisory_committee_meeting | 30 Oct 2026 | Sydnexis | | atropine sulfate ophthalmic solution 0.01% | slowing of myopia progression in children 3 years of age or older (upcoming) |
| fda_complete_response_letter | 7 Aug 2026 | ITM Solucin GmbH | | NDA 218705, lutetium Lu177 edotreotide injection | complete response |
| mhra_new_medicine_authorisation | 19 Oct 2026 | Arrowhead Pharmaceuticals Ireland Limited | ARWR | plozasiran (Redemplo) | familial chylomicronaemia syndrome |
| mhra_marketing_authorisation | 13 Oct 2026 | Eli Lilly Nederland B.V. | LLY | Onswik 500 units/ml KwikPen | granted |
| trial_results_posted | 22 Oct 2026 | Merck Sharp & Dohme LLC | MRK | pembrolizumab + chemotherapy | triple negative breast neoplasms, Phase 3 |
| trial_status_update | 22 Oct 2026 | Sanofi | SNY | balinatunfib | ulcerative colitis, Crohn's disease, Phase 2, TERMINATED |

**Sample item (JSON)**

```json
{"eventType": "mhra_new_medicine_authorisation", "date": "2026-10-19", "company": "Arrowhead Pharmaceuticals Ireland Limited",
 "product": "plozasiran (Redemplo)", "indication": "familial chylomicronaemia syndrome", "phase": "", "status": "Authorised",
 "summary": "MHRA authorises plozasiran (Redemplo) for adults with familial chylomicronaemia syndrome. ... Route: International Recognition Procedure (IRP), Route B, with the European Medicines Agency (EMA) as the reference regulator.",
 "sourceName": "MHRA press releases (GOV.UK)", "sourceUrl": "https://www.gov.uk/government/news/mhra-authorises-plozasiran-redemplo-for-adults-with-familial-chylomicronaemia-syndrome",
 "ticker": "ARWR", "source": "mhra_press", "regulator": "MHRA", "recordId": "mhra:/government/news/mhra-authorises-plozasiran-redemplo-for-adults-with-familial-chylomicronaemia-syndrome"}
```

### Use cases

- **Biotech investors' research:** a daily list of FDA approvals, CRLs, AdComm dates and late stage trial readouts, tagged with tickers, to feed your own research process.
- **Pharma business development and competitive intelligence:** follow competitors' approvals in the US and the UK, trials that complete or are terminated, and new registrations in your therapy area.
- **Journalists and newsletter writers:** a factual, sourced feed of regulatory decisions and trial events, with a link to the official record on every row.
- **Healthcare and market access analysts:** track UK licences (MHRA) next to US approvals, and check uptake later with our [UK NHS Prescribing Data actor](https://apify.com/seaf999ield/uk-nhs-prescribing-data) (GP prescribing by drug, ICB and practice across all four UK nations).

**Pair it with NHS prescribing data:** when a drug gets an MHRA authorisation in this feed, run the NHS prescribing actor on the same molecule a few months later to see real world UK uptake by area.

### Input

| Field | What it does | Default |
|---|---|---|
| Sources | Any of `fda_approvals`, `fda_crl`, `fda_press`, `fda_adcomm`, `mhra_press`, `mhra_ma_list`, `clinical_trials` | all |
| Lookback days | Window for approvals, press releases, grants and trial updates | 7 |
| Company or sponsor filter | For example `Novo Nordisk`, `Lilly`, `AstraZeneca`. Sent to ClinicalTrials.gov as a sponsor search | none |
| Condition keywords | For example `obesity`, `Alzheimer`. ClinicalTrials.gov uses its own condition search with synonyms | none |
| Max rows / max rows per source | Caps. Sources are interleaved so a cap keeps a fair mix | 200 / 50 |
| Only new (monitoring) | Return only rows not returned before for this monitor name | off |
| FDA approval scope | Originals and efficacy supplements, all NDA/BLA actions, or everything including generics (ANDA) | originals and efficacy |
| CRL lookback days | openFDA publishes CRLs in batches, so CRLs use a longer window | 90 |
| Trial events, phases, sponsor type | Results posted and status updates; Phase 2 and 3; industry sponsors | as shown |
| Advisory committees, days ahead | Drugs and biologics only, or all centres; how far ahead | CDER and CBER, 120 days |
| FDA detail pages | AdComm agendas and press pages opened for product, sponsor and indication (about 30 s each, see notes) | 4 |
| MHRA lists: skip likely generics | Drop list rows whose name starts with the active ingredient | off |

**Example: daily obesity and diabetes monitor**

```json
{"lookbackDays": 2, "conditions": ["obesity", "diabetes", "weight"], "onlyNew": true, "monitorName": "metabolic"}
```

**Example: big pharma watchlist, FDA and MHRA only**

```json
{"sources": ["fda_approvals", "fda_press", "fda_crl", "mhra_press", "mhra_ma_list"], "companies": ["Novo Nordisk", "Lilly", "AstraZeneca", "GSK", "Pfizer", "Moderna"], "lookbackDays": 30}
```

**Example: Phase 3 readouts by oncology sponsors**

```json
{"sources": ["clinical_trials"], "trialPhases": ["PHASE3"], "trialEvents": ["results_posted", "status_update"], "conditions": ["cancer", "carcinoma", "lymphoma"], "lookbackDays": 7}
```

### Pricing (pay per event)

| Event | Price | Per 1,000 |
|---|---|---|
| `event-row`: one catalyst row in the dataset | $0.003 | **$3 per 1,000 rows** |

Examples: the default run (all sources, 7 days, 50 rows per source) returns about 100 to 200 rows, so **about $0.30 to $0.60**. A daily `onlyNew` monitor with a company or condition filter usually returns a handful of rows, **a few cents a day**. The `RUN_SUMMARY` record carries no charge.

### Data sources and terms

| Source | Access | Notes |
|---|---|---|
| [openFDA Drugs@FDA](https://open.fda.gov/apis/drug/drugsfda/) and [drug label](https://open.fda.gov/apis/drug/label/) | Public API, no key needed | Indication comes from the current label when it is indexed (new approvals often are not yet) |
| [openFDA complete response letters](https://open.fda.gov/apis/transparency/completeresponseletters/) | Public API | Published in batches, weeks or months after the letter date |
| [FDA press announcements RSS](https://www.fda.gov/about-fda/contact-fda/stay-informed/rss-feeds) | Public RSS | Only approval related items are kept |
| [FDA advisory committee calendar](https://www.fda.gov/advisory-committees/advisory-committee-calendar) | Public page data | Detail pages are opened at the 30 second pace that fda.gov's robots.txt asks for |
| [GOV.UK search and content APIs](https://docs.publishing.service.gov.uk/repos/search-api/public-api.html) (MHRA) | Public API | Contains public sector information licensed under the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/) |
| [ClinicalTrials.gov API v2](https://clinicaltrials.gov/data-api/api) | Public API | Requests are spaced to stay under the documented fair use rate |

openFDA data is provided by the US FDA, which notes that it is unvalidated and must not be used for medical decisions. This actor is independent and is **not affiliated with or endorsed by** the FDA, the MHRA, the NIH/NLM or any company listed.

#### Not included, and why

- **PDUFA goal dates:** the FDA does not publish PDUFA dates, and the sites that compile them from company announcements are paywalled or do not allow automated reuse. There is no open, permitted, reliable source, so the actor includes the **FDA advisory committee calendar** instead. AdComm meetings are usually the clearest public signal of an upcoming FDA decision.
- **London Stock Exchange RNS:** RNS is a licensed news service with no open public feed or API, so it is not included.

### Notes and known limits

- **Dates:** FDA approvals use the action date, CRLs the letter date, MHRA rows the grant or publication date, and trials the ClinicalTrials.gov posting date.
- **MHRA lists come out every two weeks** and lag grants by about a week. When a new list is published inside your window, all its rows are included, even if the grant date is a little older.
- **"Status update" is not a full status history.** ClinicalTrials.gov's public API does not expose the previous status. In `onlyNew` mode the actor remembers each trial's status, so later runs add `statusChangedFrom`.
- **Tickers** come from a small built in map of major listed pharma and biotech companies (for example NVO, LLY, AZN, GSK, PFE, MRNA, MRK, RHHBY). Other companies are left blank. Subsidiaries are mapped where the link is clear (for example Genentech to Roche, Alexion to AstraZeneca, Kite to Gilead).
- **Company names are as filed** (for example "MERCK SHARP DOHME" in Drugs@FDA). The company filter is a simple case insensitive text match, so use short names like `Merck` or `Lilly`.

### FAQ

**Is this investment advice?** No. It is a data feed of public regulatory and clinical trial records. Do your own research.

**How do I get alerts?** Turn on `onlyNew`, set a `monitorName`, schedule the actor daily, and connect a webhook, Slack, email or Google Sheets integration in Apify.

**Can I track one company?** Yes. Put its name in the company filter. For trials it searches the lead sponsor; for FDA and MHRA rows it matches the applicant or holder name and the summary text.

**Does it cover the EMA?** Not yet. MHRA rows often show when a UK licence used the EMA as the reference regulator.

*Keywords: biotech catalyst tracker, FDA approvals API, PDUFA alternative, FDA advisory committee calendar, complete response letter, CRL tracker, openFDA, Drugs@FDA, MHRA marketing authorisations, UK drug approvals, ClinicalTrials.gov API, clinical trial results, trial terminated, pharma competitive intelligence, biotech stock research data.*

# Actor input Schema

## `sources` (type: `array`):

Which official sources to include. PDUFA goal dates and LSE RNS are not available from a free, permitted source; the FDA advisory committee calendar is included instead (see README).

## `lookbackDays` (type: `integer`):

Window for approvals, press releases, MHRA grants and trial updates. Advisory committee meetings also include upcoming dates.

## `companies` (type: `array`):

Optional. Keep only rows whose company, sponsor or text mentions any of these (case-insensitive), e.g. 'Novo Nordisk', 'Lilly', 'AstraZeneca', 'GSK'. For ClinicalTrials.gov it is sent as a sponsor search.

## `conditions` (type: `array`):

Optional. Keep only rows whose indication, product or summary mentions any of these, e.g. 'obesity', 'Alzheimer', 'lung cancer'. ClinicalTrials.gov uses its own condition search (with synonyms). Rows with no indication (e.g. MHRA list rows) are dropped when this is set.

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

Total cap on output rows. Sources are interleaved so a cap keeps a fair mix.

## `maxItemsPerSource` (type: `integer`):

Cap per source, newest first.

## `onlyNew` (type: `boolean`):

Remember output rows in a named key-value store and only return rows not returned before. Schedule daily for alerts. The first run is the baseline and returns everything in the window. Trial status changes are also detected across runs (statusChangedFrom).

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

Separate monitors keep separate memory (store name biotech-catalysts-<name>).

## `fdaScope` (type: `string`):

Which Drugs@FDA submission actions to include.

## `crlLookbackDays` (type: `integer`):

openFDA publishes complete response letters in batches, weeks after the letter date, so CRLs use a longer window (at least Lookback days).

## `trialEvents` (type: `array`):

ClinicalTrials.gov event types.

## `trialPhases` (type: `array`):

Leave empty for all phases.

## `trialSponsorClass` (type: `string`):

Lead sponsor class.

## `adcommCenters` (type: `string`):

Which FDA centres' advisory committee meetings to include.

## `adcommDaysAhead` (type: `integer`):

Include meetings up to this many days in the future.

## `fdaGovDetailPages` (type: `integer`):

Advisory committee agendas and press releases opened for product, sponsor and indication. www.fda.gov asks for 30 seconds between requests, so each page adds about 30 seconds.

## `mhraBrandedOnly` (type: `boolean`):

Drop MHRA list rows whose licensed name starts with the active ingredient (a heuristic for generics).

## `openFdaApiKey` (type: `string`):

Free key from open.fda.gov. Raises the openFDA daily limit; not needed for normal use.

## Actor input object example

```json
{
  "sources": [
    "fda_approvals",
    "fda_crl",
    "fda_press",
    "fda_adcomm",
    "mhra_press",
    "mhra_ma_list",
    "clinical_trials"
  ],
  "lookbackDays": 7,
  "companies": [],
  "conditions": [],
  "maxItems": 200,
  "maxItemsPerSource": 50,
  "onlyNew": false,
  "monitorName": "default",
  "fdaScope": "brand_key",
  "crlLookbackDays": 90,
  "trialEvents": [
    "results_posted",
    "status_update"
  ],
  "trialPhases": [
    "PHASE2",
    "PHASE3"
  ],
  "trialSponsorClass": "industry",
  "adcommCenters": "drugs_biologics",
  "adcommDaysAhead": 120,
  "fdaGovDetailPages": 4,
  "mhraBrandedOnly": false
}
```

# Actor output Schema

## `catalysts` (type: `string`):

No description

## `runSummary` (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 = {
    "sources": [
        "fda_approvals",
        "fda_crl",
        "fda_press",
        "fda_adcomm",
        "mhra_press",
        "mhra_ma_list",
        "clinical_trials"
    ],
    "companies": [],
    "conditions": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("seaf999ield/biotech-catalyst-tracker").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 = {
    "sources": [
        "fda_approvals",
        "fda_crl",
        "fda_press",
        "fda_adcomm",
        "mhra_press",
        "mhra_ma_list",
        "clinical_trials",
    ],
    "companies": [],
    "conditions": [],
}

# Run the Actor and wait for it to finish
run = client.actor("seaf999ield/biotech-catalyst-tracker").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 '{
  "sources": [
    "fda_approvals",
    "fda_crl",
    "fda_press",
    "fda_adcomm",
    "mhra_press",
    "mhra_ma_list",
    "clinical_trials"
  ],
  "companies": [],
  "conditions": []
}' |
apify call seaf999ield/biotech-catalyst-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,seaf999ield/biotech-catalyst-tracker"
        }
    }
}
```

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/qOG8UsyaBTctmj3bT/builds/wphPr3iQwQkv6TpPH/openapi.json
