# FDA Medical Device Shortages & Discontinuance List Actor (`tehsnarf/fda-medical-device-shortages`) Actor

Scrapes FDA's official Section 506J medical device shortage list and device discontinuance list into structured records.

- **URL**: https://apify.com/tehsnarf/fda-medical-device-shortages.md
- **Developed by:** [Chris Hoover](https://apify.com/tehsnarf) (community)
- **Categories:** Lead generation, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## 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

### What does FDA Medical Device Shortages and Discontinuance List Actor do?

This Actor scrapes the FDA's official **Section 506J Medical Device Shortage List** and
**Device Discontinuance List** — the two tables FDA publishes at
[fda.gov/medical-devices/.../medical-device-shortages-list](https://www.fda.gov/medical-devices/medical-device-supply-chain-and-shortages/medical-device-shortages-list)
identifying devices currently in shortage (per the FD\&C Act's Section 506J reporting requirement)
and devices whose manufacture has been permanently discontinued. It returns a normalized,
per-row export covering both tables — shortage category, product code, availability/duration,
interruption reason, and shortage date for active shortages; date posted, category, product code,
manufacturer, device trade name, and discontinuance reason for discontinued devices — pulled
directly from FDA's own published tables.

### Why use this FDA medical device shortage scraper?

- **Hospital & GPO sourcing teams** — monitor active device shortages and permanent
  discontinuances to plan substitute sourcing before a supply gap hits patient care.
- **Medical device distributors** — track category-level shortage/discontinuance signals across
  the FDA's regulated device categories.
- **Medtech market researchers & analysts** — build a structured dataset of supply-chain
  disruption events without manually parsing FDA's HTML tables.
- **Regulatory affairs teams** — cross-reference a manufacturer or product code against FDA's
  authoritative shortage/discontinuance record.

### How to use FDA Medical Device Shortages and Discontinuance List Actor

1. Click **Try for free**.
2. Leave the default **Start URLs** field as-is — it already points at FDA's medical device
   shortages page (this is a single static page containing both tables, not a multi-page directory).
3. Optionally set `maxItems` to cap how many rows are scraped (default 200, enough to capture both
   tables in full as of 2026-08-06 — 6 shortage + 145 discontinuance rows).
4. Click **Start** and wait for the run to finish (typically well under a minute — both tables load
   in a single page fetch).
5. Download the results from the **Dataset** tab in JSON, CSV, Excel, or HTML.

### Input

| Field | Type | Description |
|---|---|---|
| `startUrls` | array (required) | FDA medical device shortages page(s). Defaults to the official page — normally leave as-is. |
| `maxItems` | integer (default 200) | Maximum rows to scrape, across both tables combined. |
| `delaySeconds` | number (default 1.0) | Polite delay before each page fetch. Raise to 30 if you add extra start URLs, per FDA's robots.txt `Crawl-Delay: 30` for general crawlers. |
| `concurrency` | integer (default 1) | How many start URLs to fetch at once. Defaults to sequential to respect FDA's crawl-delay guidance; irrelevant for the normal single-URL case. |

### Output

Shortage-list row:

```json
{
  "listType": "shortage",
  "shortageCategory": "Neurology – Neurosurgical, Neurointerventional and Neurodiagnostic Devices",
  "productCodeDescription": "HBA(Neurosurgical pattie)",
  "availabilityEstimatedDuration": "Estimated through Q4 2026",
  "additionalInformation": "Neurosurgical patties, sponges & strip products are in shortage...",
  "interruptionReason506J": "Shortage or discontinuance of a component, part or accessory of the device.",
  "shortageDate": "2026/05/06 initial",
  "sourceRowOrder": 1,
  "scrapedAt": "2026-08-06T00:18:15.974434+00:00"
}
```

Discontinuance-list row:

```json
{
  "listType": "discontinuance",
  "discontinuanceDatePosted": "6/16/2026",
  "discontinuanceCategory": "GENERAL & PLASTIC SURGERY - Plastic & Reconstructive Surgery Devices",
  "discontinuanceProductCode": "FTM",
  "manufacturerName": "DSM Biomedical Inc",
  "deviceTradeName": "XCM Biologic® Tissue Matrix",
  "reasonForDiscontinuance": "Discontinuance of the manufacture of the device",
  "sourceRowOrder": 1,
  "scrapedAt": "2026-08-06T00:18:15.974434+00:00"
}
```

Every dataset item carries all fields from both shapes (empty string for whichever list it isn't
from) — filter on `listType` to isolate one table.

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Data table

| Field | Description |
|---|---|
| listType | `shortage` or `discontinuance` — which FDA table this row came from |
| shortageCategory | (shortage rows) Device category |
| productCodeDescription | (shortage rows) FDA product code + description |
| availabilityEstimatedDuration | (shortage rows) Availability and estimated shortage duration |
| additionalInformation | (shortage rows) Free-text additional context |
| interruptionReason506J | (shortage rows) Reason for interruption per Section 506J |
| shortageDate | (shortage rows) Date posted/updated |
| discontinuanceDatePosted | (discontinuance rows) Date posted |
| discontinuanceCategory | (discontinuance rows) Device category |
| discontinuanceProductCode | (discontinuance rows) FDA product code |
| manufacturerName | (discontinuance rows) Manufacturer name |
| deviceTradeName | (discontinuance rows) Device trade name |
| reasonForDiscontinuance | (discontinuance rows) Reason for discontinuance |
| sourceRowOrder | 1-indexed row position within its source table |
| scrapedAt | ISO-8601 UTC scrape timestamp |

### Pricing

$5.99 per 1,000 results. Example costs: 100 results ≈ $0.60, 500 results ≈ $3.00, 1,000 results ≈
$5.99, 5,000 results ≈ $29.95. Single-request, no-detail-page-fetch design (both tables load in one
page fetch), pricing set slightly above the sibling FDA AI-Enabled Medical Devices Actor to reflect
normalizing two distinct tables into one dataset.

### Tips or advanced options

- Run on a schedule (e.g. weekly) to catch newly-added shortages or discontinuances as FDA updates
  the list — `listType` + `sourceRowOrder` make new additions easy to diff against a prior run.
- Filter the dataset on `listType == "shortage"` for active supply-chain risk monitoring, or
  `listType == "discontinuance"` for permanent-substitution planning.

### FAQ, disclaimers, and support

This Actor scrapes only FDA's publicly-published medical device shortage and discontinuance lists —
no login is required and no personal/private data is collected. Data accuracy depends on FDA's
published records at scrape time; always confirm against the official FDA source for
regulatory-critical decisions. This Actor is not affiliated with or endorsed by the FDA. Found a bug
or need a custom field/filter? Open an issue in the Actor's **Issues** tab.

# Actor input Schema

## `startUrls` (type: `array`):

FDA medical device shortages page(s) to scrape. This is a single static page containing both the shortage and discontinuance tables — normally leave the default.

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

Maximum number of rows to scrape across both the shortage list and discontinuance list

## `delaySeconds` (type: `number`):

Polite delay before requesting each page. FDA's robots.txt declares Crawl-Delay: 30 for general crawlers — the default 1.0s is fine for the normal single-start-URL case (one request per run), but if you add extra start URLs, raise this to 30 to stay within that guidance.

## `concurrency` (type: `integer`):

How many start URLs to fetch at once (each still waits delaySeconds before requesting). Defaults to 1 (sequential) to respect FDA's 30s Crawl-Delay if extra start URLs are added — this list is normally just the single default page.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.fda.gov/medical-devices/medical-device-supply-chain-and-shortages/medical-device-shortages-list"
    }
  ],
  "maxItems": 200,
  "delaySeconds": 1,
  "concurrency": 1
}
```

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

// Run the Actor and wait for it to finish
const run = await client.actor("tehsnarf/fda-medical-device-shortages").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("tehsnarf/fda-medical-device-shortages").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 tehsnarf/fda-medical-device-shortages --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tehsnarf/fda-medical-device-shortages"
        }
    }
}

```

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/mMfVCTpSfJKgDgbiS/builds/gfcR1OBMwwx8VAKtg/openapi.json
