FDA Recalls API Scraper - Drug, Device & Food Enforcement Data avatar

FDA Recalls API Scraper - Drug, Device & Food Enforcement Data

Pricing

$3.00 / 1,000 recall scrapeds

Go to Apify Store
FDA Recalls API Scraper - Drug, Device & Food Enforcement Data

FDA Recalls API Scraper - Drug, Device & Food Enforcement Data

Scrape FDA drug, device & food recall and enforcement reports as clean JSON. Filter by classification, status, firm, state & date. Free tier, no API key. Works in Claude, ChatGPT & any MCP agent.

Pricing

$3.00 / 1,000 recall scrapeds

Rating

0.0

(0)

Developer

The Mine Works

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

FDA Recalls Scraper — Drug, Device & Food Enforcement Data

Pull official FDA recall and enforcement reports for drugs, medical devices, and food as clean, structured JSON. Filter by hazard classification, status, recalling firm, US state, and date range, then sort newest-first. The actor runs as pure HTTP against the official, fully-open openFDA enforcement APIno API key, no login, no scraping fragility. The first 25 recalls are free per Apify account (lifetime), after which it is pay-per-result. Works in Apify, and directly inside Claude, ChatGPT, and any MCP agent.

What it does

The actor queries the openFDA enforcement endpoints (/drug/enforcement.json, /device/enforcement.json, /food/enforcement.json) using the dataset you select. It builds a Lucene-style search query from your filters, pages through results (100 per page, newest report date first), normalizes every record into a flat, consistent shape, and pushes it to the dataset.

Each output record is normalized from the raw openFDA fields plus any available openfda metadata (brand name, generic name, manufacturer name). Missing values are returned as null so your downstream code never breaks on absent keys. A final summary record (_type: "summary") reports how many recalls were scraped, how many were charged, and the total available matches.

Pricing is pay-per-event: you are charged once per recall actually delivered to your dataset. Empty runs (no matching recalls) and failures are never charged.

Input

Every field is optional. Leave a filter empty to match all values for that field.

FieldTypeDefaultDescription
productTypeenum: drug, device, fooddrugWhich FDA enforcement dataset to search.
searchTermstringmetformin (prefill)Free-text term matched against the product description (e.g. metformin, infant formula, insulin pump). Leave empty to match all products.
recallingFirmstringFilter to recalls by firms whose name matches this text (e.g. Pfizer).
classificationenum: "", Class I, Class II, Class III"" (all)FDA hazard class. Class I = most serious.
statusenum: "", Ongoing, Completed, Terminated"" (all)Current status of the recall.
statestringTwo-letter US state code of the recalling firm (e.g. CA, NY).
dateFromstring (YYYY-MM-DD)Earliest recall report date. No lower bound if empty.
dateTostring (YYYY-MM-DD)Latest recall report date. No upper bound if empty.
maxResultsinteger (1–25000)100 (prefill 25)Maximum number of recall records to return, newest first.

Example input

{
"productType": "drug",
"searchTerm": "metformin",
"classification": "Class II",
"status": "Ongoing",
"state": "NJ",
"dateFrom": "2023-01-01",
"dateTo": "2024-12-31",
"maxResults": 50
}

Output

Each recall is one dataset record. Example:

{
"recall_number": "D-1234-2024",
"product_type": "drug",
"classification": "Class II",
"status": "Ongoing",
"recalling_firm": "Example Pharma Inc.",
"product_description": "Metformin Hydrochloride Extended-Release Tablets, 500 mg",
"reason_for_recall": "Out of specification results for dissolution during stability testing.",
"distribution_pattern": "Nationwide in the United States.",
"product_quantity": "12,400 bottles",
"voluntary_mandated": "Voluntary: Firm initiated",
"initial_firm_notification": "Letter",
"city": "Trenton",
"state": "NJ",
"country": "United States",
"report_date": "20240315",
"recall_initiation_date": "20240201",
"center_classification_date": "20240310",
"code_info": "Lot 23A456, Exp 2025-08",
"event_id": "90876",
"brand_name": "Example Metformin ER",
"generic_name": "Metformin Hydrochloride",
"manufacturer_name": "Example Pharma Inc.",
"scraped_at": "2024-04-01T12:00:00.000Z"
}

Fields brand_name, generic_name, and manufacturer_name come from openFDA enrichment metadata and may be null when not provided. report_date, recall_initiation_date, and center_classification_date are returned in openFDA's native YYYYMMDD format. A single summary record is appended at the end of each run.

Use cases

  • Pharmacovigilance & drug safety monitoring — track Class I and Class II drug recalls by ingredient or firm and feed them into a safety dashboard.
  • Medical device compliance — monitor device enforcement actions by manufacturer or product category for regulatory and quality teams.
  • Food safety alerting — watch for food recalls (allergens, contamination, mislabeling) by firm or region and trigger notifications.
  • Supplier & vendor risk — screen recalling firms by name and US state to flag suppliers with recurring enforcement history.
  • Competitive & market intelligence — analyze recall volume, reasons, and classifications across competitors over a date range.
  • Research & journalism — build datasets of historical recalls for analysis, reporting, or academic study without touching the raw API.

FAQ

Does this scraper need an FDA or openFDA API key? No. It calls the public openFDA enforcement API anonymously. There is no key, no account, and no rate-limit registration required on your part.

Which FDA recall datasets are covered? Three: drug enforcement, device (medical device) enforcement, and food enforcement reports. Select one per run via the productType input.

How do I filter recalls by severity? Use the classification input. Class I is the most serious hazard (reasonable probability of serious harm or death), Class II is moderate, and Class III is the least serious. Leave it empty to return all classes.

How many recalls can I return in one run, and how are dates handled? Up to 25,000 records per run via maxResults, returned newest-first by report date (openFDA's hard skip cap is 25,000 without a key). Input dates use YYYY-MM-DD; output dates are returned in openFDA's native YYYYMMDD format.

What happens if no recalls match my filters, and how is pricing calculated? If nothing matches, the run finishes cleanly with zero records and you are not charged. Pricing is pay-per-result — charged once per recall delivered — with the first 25 results free per Apify account (lifetime). Empty runs and failed runs are never charged.

Use in Claude, ChatGPT & any MCP agent

This actor is exposed as an MCP tool, so AI agents can call it directly. Point your MCP client at:

https://mcp.apify.com/?tools=themineworks/fda-recalls-scraper

Once connected, an agent can ask for things like "find all ongoing Class I drug recalls in California from 2024" and get structured records back.

You can also run it programmatically with the Apify client:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('themineworks/fda-recalls-scraper').call({
productType: 'drug',
searchTerm: 'metformin',
classification: 'Class II',
status: 'Ongoing',
maxResults: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);