# openFDA Drug, Device & Biologics Recall Scraper (USA) (`scrapers_lat/fda-drug-device-recalls-scraper`) Actor

Scrape FDA drug, medical device and biologics recalls and enforcement reports from the official openFDA API. Extract recall number, hazard class, product, reason, recalling firm, location, dates, product codes and 510(k) numbers. Export JSON, CSV or Excel.

- **URL**: https://apify.com/scrapers\_lat/fda-drug-device-recalls-scraper.md
- **Developed by:** [Scrapers Lat](https://apify.com/scrapers_lat) (community)
- **Categories:** Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $9.20 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

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

## openFDA Drug, Device & Biologics Recall Scraper (USA)

Get **FDA drug, medical device and biologics recalls and enforcement reports** as clean, structured data — the same official source used by compliance, pharma safety, medical-device quality, and product-liability legal teams. Filter by hazard class, status, firm, state, product, and date, then export to JSON, CSV, or Excel.

This is the drug/device/biologics companion to our FDA Food Recall scraper — same authoritative FDA data, the categories that matter to healthcare and life-sciences.

### What you get

Each record includes:

- **Recall number** and **FDA event ID** (groups related product recalls)
- **Hazard classification** — Class I (most serious), II, III — plus a numeric `classificationLevel`
- **Status** — ongoing, completed, terminated, pending, or open
- **Product type** — Drugs, Medical Devices, Biologics
- **Product description**, **reason for recall**, and **quantity**
- **Recalling firm** with full **address, city, state, ZIP, country**, and a ready-to-use single-line `firmAddress`
- **Distribution pattern**, plus derived `distributionNationwide` flag and parsed `distributionStates`
- **Key dates** — recall initiation, center classification, FDA report/posted, termination — normalized to `YYYY-MM-DD`
- **Voluntary vs FDA-mandated** and initial firm notification method
- **Code / lot info**
- **Device recall database extras** (optional): FDA **product code**, **510(k) numbers**, **root-cause description**, firm **action**, **FEI number**, and contact
- **Risk score (0–100)** — a composite hazard signal combining severity, recency, and distribution scope
- **openFDA** enrichment block (brand/generic names, manufacturer, NDC, device identifiers when available) and `recallAgeDays`

### Filters

- **Product type** — All (drug + device), Drugs, Medical Devices, or Biologics
- **Detailed device recall database** — switch on for product codes, 510(k) numbers, and root cause
- **Classification** — Class I / II / III
- **Status** — ongoing / completed / terminated / pending / open
- **Recalling firm** — e.g. Pfizer, Medtronic, Baxter
- **State** and **city** of the firm, and **country**
- **Product keyword** — e.g. insulin, catheter, vaccine, syringe
- **Device product code** — for the device recall database
- **Voluntary or FDA-mandated**
- **Date range** on your choice of date field, with newest/oldest sorting
- **Recall number** or **Event ID** exact lookup
- **Free-text or raw** openFDA search expressions

### Example input

```json
{
  "maxRecalls": 100,
  "productType": "Devices",
  "classification": "Class I",
  "status": "Ongoing",
  "dateFrom": "2025-01-01",
  "sortOrder": "Newest first"
}
```

### Output

One row per recall, available as JSON, CSV, or Excel. A ready-made **table view** highlights recall number, class, product, reason, firm, state, date, and risk score.

### Notes

- Data comes from the U.S. FDA's official openFDA program and covers U.S.-regulated products.
- Biologics recalls are served from the FDA drug enforcement dataset (openFDA does not publish a separate biologics recall feed); coverage there is limited compared with drugs and devices.
- Free Apify plans are capped at 10 records per run.

# Actor input Schema

## `maxRecalls` (type: `integer`):

Maximum number of recall records to collect. Optional. openFDA paginates with skip up to 25000, so for very large pulls narrow the filters or date range.

## `productType` (type: `string`):

Which FDA recall category to pull. 'All' combines drug and device enforcement reports. Drugs, Biologics come from the drug enforcement endpoint; Devices from the device enforcement endpoint.

## `deviceRecallDatabase` (type: `boolean`):

Pull from the richer FDA device recall database instead of enforcement reports. Adds product code, 510(k) numbers, root cause and firm action. Overrides Product Type (device-only).

## `searchQuery` (type: `string`):

A simple keyword (matched to the recall reason, e.g. contamination, mislabeling, sterility, malfunction), or a raw openFDA search expression containing a field, e.g. product\_description:insulin or recalling\_firm:Pfizer. Leave empty to pull the most recent recalls.

## `classification` (type: `string`):

Recall hazard class. Class I is the most serious (reasonable probability of serious health consequences or death). Applies to enforcement reports.

## `status` (type: `string`):

Recall status.

## `state` (type: `string`):

Two-letter US state code of the recalling firm, e.g. CA, NY, NJ.

## `recallingFirm` (type: `string`):

Filter by the recalling firm or manufacturer name, e.g. Pfizer, Medtronic, Baxter. Matches firms whose name contains this phrase.

## `productDescription` (type: `string`):

Filter by a word or phrase in the product description, e.g. insulin, catheter, pacemaker, vaccine, syringe.

## `productCode` (type: `string`):

Filter by the FDA device product code, e.g. LWS, DXN. Only applies to the detailed device recall database.

## `city` (type: `string`):

Filter by the city of the recalling firm, e.g. Minneapolis, Boston.

## `country` (type: `string`):

Filter by the recalling firm country, e.g. United States, Germany. Applies to enforcement reports.

## `voluntaryMandated` (type: `string`):

Whether the recall was firm-initiated (voluntary) or ordered by the FDA (mandated). Applies to enforcement reports.

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

Only include recalls with a date on or after this date (YYYY-MM-DD). Applies to the Date Field selected below.

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

Only include recalls with a date on or before this date (YYYY-MM-DD). Applies to the Date Field selected below.

## `dateField` (type: `string`):

Which recall date the Date From / Date To range applies to.

## `sortOrder` (type: `string`):

Order results by the selected Date Field. Leave as default to use the openFDA relevance order.

## `recallNumber` (type: `string`):

Look up one exact FDA recall number, e.g. D-321-2016 (drug), Z-2372-2023 (device).

## `eventId` (type: `string`):

Pull every recall that belongs to one FDA recall event, e.g. 92660. A single event often groups many related product recalls. Applies to enforcement reports.

## `withAiSummary` (type: `boolean`):

Add an AI-generated plain-English summary of each recall (paid add-on).

## `withAiSeverity` (type: `boolean`):

Rate each recall's health risk low/medium/high/critical with a 0-100 score (paid add-on).

## Actor input object example

```json
{
  "maxRecalls": 10,
  "productType": "",
  "deviceRecallDatabase": false,
  "classification": "",
  "status": "",
  "state": "",
  "voluntaryMandated": "",
  "dateField": "report_date",
  "sortOrder": "",
  "withAiSummary": false,
  "withAiSeverity": false
}
```

# 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 = {
    "maxRecalls": 10,
    "searchQuery": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers_lat/fda-drug-device-recalls-scraper").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 = {
    "maxRecalls": 10,
    "searchQuery": "",
}

# Run the Actor and wait for it to finish
run = client.actor("scrapers_lat/fda-drug-device-recalls-scraper").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 '{
  "maxRecalls": 10,
  "searchQuery": ""
}' |
apify call scrapers_lat/fda-drug-device-recalls-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapers_lat/fda-drug-device-recalls-scraper"
        }
    }
}

```

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/FJl1AYtjkzSeoKS5X/builds/ASqjvpmKaGFMb98qn/openapi.json
