# ⚖️ FDA Recalls, Warning Letters & Enforcement Scraper (`automation_studio/fda-compliance-recall-radar`) Actor

Enterprise compliance radar. Scrapes real-time FDA Class I, II, III Recalls (Food, Drugs, Devices, Cosmetics) and official Warning Letters via openFDA API & FDA.gov.

- **URL**: https://apify.com/automation\_studio/fda-compliance-recall-radar.md
- **Developed by:** [Automation Studio](https://apify.com/automation_studio) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 compliance records

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## ⚖️ FDA Recalls, Warning Letters & Enforcement Radar

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-orange?style=flat-square\&logo=apify)](https://apify.com)
[![Data Source: US FDA](https://img.shields.io/badge/Data%20Source-Official%20US%20FDA-blue?style=flat-square)](https://fda.gov)
[![Data Integrity: 100% Real](https://img.shields.io/badge/Data%20Integrity-100%25%20Verified%20Gov%20Data-brightgreen?style=flat-square)](https://api.fda.gov)
[![Zero Headless Overhead](https://img.shields.io/badge/Architecture-Pure%20REST%20%2B%20HTTP-success?style=flat-square)](https://apify.com)

An enterprise-grade regulatory compliance radar monitoring the **United States Food and Drug Administration (FDA)** in real time. Aggregates official **Enforcement Reports & Recalls** (Class I, II, III across Food, Drugs, Medical Devices, and Cosmetics) directly from the `openFDA` REST API, combined with live **Official FDA Warning Letters & cGMP Citations** from `FDA.gov`.

***

### 🎯 Why This Actor Exists

Every week, the FDA issues recall notices and warning letters citing severe safety hazards:

- **Class I Recalls**: Situations with a reasonable probability that product use will cause **serious adverse health consequences or death** (e.g., *Listeria monocytogenes*, undeclared life-threatening allergens, microbial contamination in sterile injectables).
- **Current Good Manufacturing Practice (cGMP) Citations**: Facilities failing sanitary standards, sterility testing, or stability validation.
- **Unapproved & Misbranded Drugs**: Peptides, counterfeit supplements, unauthorized active pharmaceutical ingredients (APIs).

Corporate legal teams, e-commerce brand aggregators, supplement manufacturers, cosmetics brands, pharmaceutical distributors, and hedge funds pay thousands of dollars per month for compliance monitoring. This Actor automates that surveillance instantly at a fraction of the cost.

***

### ⚡ Key Capabilities

- **Dual-Feed Regulatory Pipeline**: Simultaneously queries **openFDA REST API** (87,000+ historical & active recall reports) and scrapes the live **FDA.gov Warning Letters & Inspection Index**.
- **100% Real US Government Records**: Strictly zero synthetic, mock, or generated records. Every row is verified against US government databases with direct official URLs.
- **Unified Severity Normalization**: Translates disparate government classifications into actionable risk tiers (`CRITICAL`, `MODERATE`, `MINOR`).
- **Targeted Brand & Firm Intelligence**: Search by company name (e.g., *Pfizer*, *Bausch & Lomb*, *Whole Foods*) or keyword (e.g., *Salmonella*, *Lead*, *Sildenafil*, *Sterility*).
- **Automated Webhook Alerts**: Connects directly to Discord or Slack to send instant alert cards when critical Class I recalls are detected.
- **Zero Browser Overhead**: Powered by pure HTTP requests and optimized JSON parsing. Runs in 1–3 seconds using only 256MB of container RAM.

***

### 📊 Who Uses This Actor?

| Audience | Primary Use Case |
| :--- | :--- |
| **E-Commerce & Amazon Sellers** | Audit private label suppliers and competitors to ensure zero banned ingredients or warning letters. |
| **Dietary Supplement & Cosmetics Brands** | Monitor ingredient safety alerts (e.g., lead, unapproved peptides, adulterants) before formulating batches. |
| **Regulatory & Quality Assurance (QA/QC)** | Maintain audit-ready compliance logs for internal risk management and FDA inspection readiness. |
| **Law Firms & Litigation Teams** | Discover product liability cases and class-action candidates within hours of official FDA publication. |
| **Hedge Funds & Equity Analysts** | Track material regulatory headwinds, facility shutdowns, and recall liabilities for publicly traded healthcare stocks. |

***

### ⚙️ Input Configuration

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `feedTypes` | Array | `["RECALLS", "WARNING_LETTERS"]` | Feeds to monitor: `RECALLS` (openFDA) and/or `WARNING_LETTERS` (FDA.gov). |
| `categories` | Array | `["food", "drug", "device"]` | Target FDA centers: Food & Cosmetics (`food`), Human Drugs (`drug`), Medical Devices (`device`). |
| `searchKeyword` | String | `""` | Filter by contaminant, ingredient, or violation keyword (e.g., `"Salmonella"`, `"cGMP"`, `"Listeria"`). |
| `firmName` | String | `""` | Filter by specific manufacturer, recalling firm, or distributor name. |
| `classifications` | Array | `["Class I", "Class II"]` | Hazard classes: `Class I` (fatal/severe), `Class II` (temporary harm), `Class III` (minor/technical). |
| `recallStatus` | String | `"ALL"` | Active status filter: `"ALL"`, `"Ongoing"` (currently active), or `"Terminated"` (archived). |
| `daysBack` | Integer | `90` | Scan window in calendar days (1 to 1825 days). |
| `maxResults` | Integer | `100` | Maximum number of compliance records to extract per run (up to 2000). |
| `webhookUrl` | String | `""` | Optional Discord or Slack webhook URL for real-time critical alert delivery. |
| `openFdaApiKey` | String | `""` | Optional openFDA API key for high-throughput enterprise tiers (up to 120k requests/day). |

***

### 📋 Sample Output Record

Each item in the default dataset is normalized into a unified, clean schema:

```json
{
  "recordId": "F-0452-2024",
  "recordType": "RECALL",
  "productCategory": "FOOD_COSMETICS",
  "severityLevel": "CRITICAL",
  "classification": "Class I",
  "companyName": "WFM Purchasing, LP",
  "productName": "Whole Foods Medium Pico de Gallo Guacamole Dip",
  "violationReason": "Potential contamination with Listeria monocytogenes",
  "distributionPattern": "Distributed to retail stores in CA, NV, OR, and WA.",
  "status": "Ongoing",
  "incidentDate": "2024-08-07",
  "reportDate": "2024-08-14",
  "fdaOfficialUrl": "https://www.accessdata.fda.gov/scripts/ires/index.cfm?Event=94821",
  "lotNumbers": "Use By Dates: 08/14/2024 through 08/21/2024",
  "city": "Austin",
  "state": "TX",
  "country": "US",
  "fullDescription": "Whole Foods Market Medium Pico de Gallo Guacamole, net wt 8 oz plastic tub.",
  "scrapedAt": "2026-09-20T01:10:00.000Z"
}
```

***

### 🚨 FDA Hazard Classifications Explained

- **Class I (Critical)**: Dangerous or defective products that could cause serious adverse health consequences or death. Examples: food containing *Listeria*, unapproved prescription active ingredients in over-the-counter supplements, defective infusion pumps.
- **Class II (Moderate)**: Products that might cause temporary or medically reversible health problems, or where the probability of serious adverse health consequences is remote. Examples: mislabeled dosage strengths, subpotent pharmaceuticals.
- **Class III (Minor)**: Products that are unlikely to cause any adverse health reaction, but violate FDA labeling or manufacturing regulations. Examples: minor packaging defects, unapproved container closures.
- **Warning Letters**: Formal notification from the FDA notifying an establishment that significant regulatory violations (such as cGMP breaches or unapproved new drug claims) were observed during an inspection or review.

***

### 🔔 Automated Alert Webhooks (Discord & Slack)

Set the `webhookUrl` input parameter to your team's Discord or Slack webhook URL.
When the Actor runs, it generates formatted alert cards summarizing:

- Total records found
- Count of **Critical Class I** actions
- Direct links to official FDA letters and enforcement dockets

***

### 💰 Monetization & Economics

- **Pricing Model**: Pay-Per-Event (PPE)
  - **Actor Startup**: `$0.005` per run
  - **Dataset Item**: `$0.003` per verified compliance record
- **Platform Usage**: Paid by user (`isPPEPlatformUsagePaidByUser: true`).
- **Compute Efficiency**: Runs in ~2–4 seconds using 256MB memory. Platform compute cost is ~$0.0001 per run.

# Actor input Schema

## `feedTypes` (type: `array`):

Select which FDA enforcement feeds to monitor. Both feeds can be queried concurrently.

## `categories` (type: `array`):

Target FDA centers and product silos for recall monitoring.

## `searchKeyword` (type: `string`):

Filter by specific ingredients, contaminants, or violations (e.g., 'Salmonella', 'Listeria', 'Peptides', 'Lead', 'cGMP', 'Sterility'). Leave empty to fetch latest.

## `firmName` (type: `string`):

Filter by specific manufacturer, distributor, or facility name (e.g., 'Bausch & Lomb', 'Pfizer', 'Teva'). Leave empty for all firms.

## `classifications` (type: `array`):

Filter by FDA health hazard classification.

## `recallStatus` (type: `string`):

Filter by active enforcement status.

## `daysBack` (type: `integer`):

Number of past calendar days of enforcement actions to scan (e.g., 30 = past month, 90 = past quarter, 365 = past year).

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

Maximum number of compliance and recall records to collect across selected feeds.

## `webhookUrl` (type: `string`):

Optional: Discord or Slack incoming webhook URL to receive instant notification cards when Class I critical recalls or targeted violations are discovered.

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

Optional: openFDA API key for high-volume enterprise runs (120,000 req/day). Not required for standard runs.

## Actor input object example

```json
{
  "feedTypes": [
    "RECALLS",
    "WARNING_LETTERS"
  ],
  "categories": [
    "food",
    "drug",
    "device"
  ],
  "searchKeyword": "",
  "firmName": "",
  "classifications": [
    "Class I",
    "Class II"
  ],
  "recallStatus": "ALL",
  "daysBack": 90,
  "maxResults": 100
}
```

# Actor output Schema

## `dataset` (type: `string`):

Default dataset containing verified FDA recalls and warning letters with severity levels, violation reasons, company names, and official enforcement URLs.

# 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 = {
    "feedTypes": [
        "RECALLS",
        "WARNING_LETTERS"
    ],
    "categories": [
        "food",
        "drug",
        "device"
    ],
    "searchKeyword": "",
    "firmName": "",
    "classifications": [
        "Class I",
        "Class II"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation_studio/fda-compliance-recall-radar").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 = {
    "feedTypes": [
        "RECALLS",
        "WARNING_LETTERS",
    ],
    "categories": [
        "food",
        "drug",
        "device",
    ],
    "searchKeyword": "",
    "firmName": "",
    "classifications": [
        "Class I",
        "Class II",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("automation_studio/fda-compliance-recall-radar").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 '{
  "feedTypes": [
    "RECALLS",
    "WARNING_LETTERS"
  ],
  "categories": [
    "food",
    "drug",
    "device"
  ],
  "searchKeyword": "",
  "firmName": "",
  "classifications": [
    "Class I",
    "Class II"
  ]
}' |
apify call automation_studio/fda-compliance-recall-radar --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation_studio/fda-compliance-recall-radar"
        }
    }
}
```

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/VBoH7zRMGfvZl3ZBg/builds/WDO6NcGN51Rs4deEX/openapi.json
