# Drug Shortages Monitor: FDA and EMA Shortage List (`maliksaid/drug-shortages-monitor`) Actor

Track drug shortages and medicine shortages from the FDA drug shortage list (openFDA) and the EMA shortages catalogue in one schema. Records give product, active ingredient, company, status, reason, start date and expected end. Filter by ingredient or company. Monitor mode returns changes.

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

## Pricing

from $2.40 / 1,000 shortage 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/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

## Drug Shortages Monitor: FDA and EMA Shortage List

Drug Shortages Monitor tracks drug shortages and medicine shortages from two regulators. It reads the US FDA drug shortage list (openFDA) and the European Medicines Agency (EMA) shortages catalogue. It returns every shortage in one schema.

Each record has the product, active ingredient, company, status, reason, start date, expected resolution, last update and a link to the regulator. Status is one of current, resolved or discontinued.

It suits hospital and retail pharmacies, drug wholesalers and distributors, procurement teams, supply chain analysts and AI agents. Schedule it daily with monitor mode on. Each run then returns only new shortages and shortages that changed.

### Drug shortages covered: FDA and EMA

| Regulator | Data source | What one record means | Records on 21 October 2026 |
|---|---|---|---|
| FDA (United States) | openFDA drug shortages API | One package (NDC) in one shortage posting | 1,608: 1,140 current, 449 to be discontinued, 19 resolved |
| EMA (European Union) | EMA shortages catalogue (JSON report) | One medicine shortage that EMA assessed | 85: 27 ongoing, 53 resolved, 5 discontinued |

Counts change every day. Both sources showed an update dated 21 October 2026 when counted.

Australia's TGA shortage database is not included. Its copyright terms do not allow commercial reuse without written permission.

### Drug shortage data you get

| Field | Meaning |
|---|---|
| `regulator`, `country` | FDA and US, or EMA and EU |
| `status` | Shared status: current, resolved or discontinued |
| `statusOriginal` | Status as the regulator wrote it, for example "To Be Discontinued" or "Shortage ongoing" |
| `changeType` | Monitor mode only: `new` or `updated` |
| `availability` | FDA: Available, Limited Availability or Unavailable |
| `productName` | Brand or medicine name |
| `activeIngredient` | Active ingredient or substance |
| `brandNames` | List of brand names. FDA rows with an openFDA match only. Empty for EMA rows |
| `route` | List of routes of administration, such as ORAL or INTRAVENOUS. FDA rows with an openFDA match only. Empty for EMA rows |
| `company` | Company that reported the shortage (FDA) |
| `presentation` | Affected strength, form and pack |
| `dosageForm` | Dosage form |
| `therapeuticArea` | FDA therapeutic category or EMA therapeutic area |
| `reason` | Shortage reason (FDA) |
| `notes` | FDA notes, for example next delivery and estimated recovery |
| `alternativesAvailable` | EMA: whether alternatives exist |
| `startDate` | Start of the shortage or first posting, YYYY-MM-DD |
| `expectedResolution` | Expected end, as the regulator or company wrote it |
| `discontinuedDate` | FDA discontinuation date |
| `updatedDate` | Last update at the regulator |
| `packageNdc`, `applicationNumber` | FDA package NDC and application number |
| `sourceUrl` | Link to the shortage on the regulator's site |
| `sourceAttribution` | Source acknowledgement required by the data licence |
| `recordId` | Stable ID of the shortage across updates |
| `id` | Version ID. It changes when the shortage changes |

Sample FDA record from a test run:

```json
{
  "recordId": "fda:0409-3182-02:2012-02-22:df072c6332",
  "regulator": "FDA",
  "country": "US",
  "status": "current",
  "statusOriginal": "Current",
  "availability": "Limited Availability",
  "productName": "Epinephrine Bitartrate, Lidocaine Hydrochloride Injection",
  "activeIngredient": "Epinephrine Bitartrate, Lidocaine Hydrochloride",
  "company": "Hospira, Inc., a Pfizer Company",
  "presentation": "Lidocaine Hydrochloride and Epinephrine, Injection, 600 mg/30 mL (2%; 1:100,000) (NDC 0409-3182-02)",
  "dosageForm": "Injection",
  "therapeuticArea": "Anesthesia; Pediatric",
  "reason": "Other",
  "notes": "Limited Supply Available. Next Delivery: May 2027; Estimated Recovery: June 2027; Shortage per Manufacturer: Manufacturing Delay",
  "startDate": "2012-02-22",
  "expectedResolution": "June 2027",
  "updatedDate": "2026-10-08",
  "packageNdc": "0409-3182-02"
}
```

Sample EMA record from the same run:

```json
{
  "recordId": "ema:human-normal-immunoglobulins",
  "regulator": "EMA",
  "country": "EU",
  "status": "current",
  "statusOriginal": "Shortage ongoing",
  "productName": "Human normal immunoglobulins",
  "activeIngredient": "human normal immunoglobulins",
  "presentation": "Solution for injection/infusion",
  "therapeuticArea": "Primary Immunodeficiency Diseases; Immunologic Deficiency Syndromes",
  "alternativesAvailable": "Yes",
  "startDate": "2024-06-03",
  "expectedResolution": "March 2027",
  "updatedDate": "2026-09-22",
  "sourceUrl": "https://www.ema.europa.eu/en/medicines/human/shortages/human-normal-immunoglobulins"
}
```

Some fields stay empty for some regulators. EMA does not publish the company or a reason. FDA gives a reason for about one record in four. FDA has no expected resolution field, so the Actor reads it from the FDA note when the note gives an "Estimated Recovery". The Actor never guesses a missing value.

### Drug shortages: how to monitor them

1. Pick the regulators. Leave the list empty for both.
2. Pick the statuses. Example: `current` only, for shortages that are still open.
3. Add keywords to watch an active ingredient, product or company. Example: `amoxicillin`, `lidocaine`, `pfizer`.
4. Turn on **Monitor mode** and schedule the Actor daily.
5. Connect the output to Google Sheets, Slack, email or your purchasing system through Apify integrations.

#### Monitor mode

Monitor mode remembers every shortage version it returned before. A later run returns a record only when it is new or when its status, availability, reason, notes, dates or expected resolution changed. `changeType` says which. A routine FDA reverification with no other change is not returned.

Use a different **Monitor name** for each watch list.

#### Keyword matching

Keywords search the active ingredient, product name, brand names, route, company, presentation, therapeutic area, NDC and application number. They match whole words and ignore case.

### Drug shortages input options

| Option | Default | Meaning |
|---|---|---|
| Regulators | Both | fda, ema |
| Shortage status | All | current, resolved, discontinued |
| Keywords | None | Keep only matching records |
| Updated in the last N days | 0 (all) | Keep only records the regulator updated recently |
| Monitor mode | Off | Return only new or changed shortages |
| Monitor name | `default` | Name of the monitor memory. The old field `stateKey` still works |
| Maximum records | 100 | Stop after this many records, most recently updated first. Set 0 for no limit |

### Drug shortages pricing

This Actor uses pay-per-event pricing. These are the prices on 21 October 2026:

| Event | Price (USD) |
|---|---|
| Actor start, one per GB of memory (the default 256 MB counts as one) | $0.02 |
| Each shortage record saved to your dataset | $0.003 ($3 per 1,000) |

Records skipped by your filters or by monitor mode cost nothing. Check the Pricing tab for the current prices.

### Drug shortage sources and licences

- openFDA data 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`.
- The Actor reads two public files and APIs that need no login. It collects product and company facts only. It does not save the contact phone numbers in the FDA data.
- Always check the regulator's site before you act on a record.

### Drug shortages run time

A full run of both regulators takes under half a minute.

### Drug shortages FAQ

#### Why does one FDA shortage give many records?

FDA lists each affected package (NDC) separately. Each package can have its own availability and notes. Filter or group by `activeIngredient` to see one line per ingredient.

#### Can I get the full list?

Yes. Set maximum records to 0. A full run returns about 1,700 records.

#### 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 both regulators.

#### Which regulators does it cover?

It covers the US FDA drug shortage list through openFDA and the EMA shortages catalogue. Both come back in one schema.

#### How do I get alerts for new drug shortages?

Turn on monitor mode and schedule the Actor daily. Each later run returns only new shortages or shortages whose status, dates or notes changed.

### Drug shortages input and output example

This input comes from a real run:

```json
{
  "maxItems": 5,
  "keywords": [
    "lidocaine"
  ],
  "regulators": [
    "fda",
    "ema"
  ],
  "statuses": [
    "current",
    "resolved",
    "discontinued"
  ],
  "updatedWithinDays": 0,
  "monitorMode": false,
  "monitorName": "default"
}
```

This is one row from that run's dataset:

```json
{
  "id": "fda:0264-9594-10:2017-10-25:90d5105dc6:bec1a1387e",
  "recordId": "fda:0264-9594-10:2017-10-25:90d5105dc6",
  "regulator": "FDA",
  "country": "US",
  "changeType": null,
  "status": "current",
  "statusOriginal": "Current",
  "availability": "Available",
  "productName": "LIDOCAINE HYDROCHLORIDE AND DEXTROSE",
  "activeIngredient": "LIDOCAINE HYDROCHLORIDE ANHYDROUS; DEXTROSE MONOHYDRATE",
  "company": "B. Braun Medical Inc.",
  "presentation": "Lidocaine Hydrochloride And Dextrose, Injection, 5 g/100 mL; .4 g/100 mL (NDC 0264-9594-10)",
  "dosageForm": "Injection",
  "therapeuticArea": "Cardiovascular",
  "reason": null,
  "notes": null,
  "alternativesAvailable": null,
  "startDate": "2017-10-25",
  "expectedResolution": null,
  "discontinuedDate": null,
  "updatedDate": "2026-10-19",
  "packageNdc": "0264-9594-10",
  "applicationNumber": "NDA019830",
  "sourceUrl": "https://www.accessdata.fda.gov/scripts/drugshortages/dsp_ActiveIngredientDetails.cfm?AI=Lidocaine%20Hydrochloride%20Injection&st=c",
  "sourceAttribution": "Source: U.S. Food and Drug Administration, openFDA drug shortages (public domain, CC0).",
  "scrapedAt": "2026-10-21T11:07:04.439Z"
}
```

### Related Actors

- [Drug Approvals Monitor](https://apify.com/maliksaid/drug-approvals-monitor) tracks new drug approvals, withdrawals and label changes from the FDA, EMA and Health Canada.
- [Regulator Circulars Monitor](https://apify.com/maliksaid/regulator-circulars-monitor) tracks circulars from the Central Bank of Jordan and the Saudi National Cybersecurity Authority.

### Support

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

# Actor input Schema

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

Which shortage lists to read. Leave empty for both.

## `statuses` (type: `array`):

Keep only these statuses. Current means the shortage is ongoing. Discontinued covers FDA "To Be Discontinued" and EMA "Medicine discontinued". Leave empty for all.

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

Keep only records whose active ingredient, product name, company, presentation, therapeutic area, NDC or application number contains at least one keyword. Keywords match whole words and ignore case. Leave empty to keep every record.

## `updatedWithinDays` (type: `integer`):

Keep only records the regulator updated in this many days. 0 keeps every record.

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

Return only shortages that are new, or whose status, availability, reason, notes or expected resolution changed since earlier monitor-mode runs with the same monitor name. Schedule the Actor with this on to get a change feed.

## `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 records, most recently updated first. The default keeps test runs short and cheap. Set 0 for no limit.

## Actor input object example

```json
{
  "regulators": [
    "fda",
    "ema"
  ],
  "statuses": [
    "current",
    "resolved",
    "discontinued"
  ],
  "keywords": [],
  "updatedWithinDays": 0,
  "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"
    ],
    "statuses": [
        "current",
        "resolved",
        "discontinued"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("maliksaid/drug-shortages-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",
    ],
    "statuses": [
        "current",
        "resolved",
        "discontinued",
    ],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("maliksaid/drug-shortages-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"
  ],
  "statuses": [
    "current",
    "resolved",
    "discontinued"
  ],
  "maxItems": 100
}' |
apify call maliksaid/drug-shortages-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maliksaid/drug-shortages-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/hL7IqD7VYvVYIE45K/builds/XzhgAPt5q4L3veQtK/openapi.json
