FDA Recalls Scraper - Food, Drug & Device Recall Database avatar

FDA Recalls Scraper - Food, Drug & Device Recall Database

Pricing

from $1.00 / 1,000 run start fees

Go to Apify Store
FDA Recalls Scraper - Food, Drug & Device Recall Database

FDA Recalls Scraper - Food, Drug & Device Recall Database

Download FDA recalls for food, drugs and medical devices from the official enforcement reports: recall class, firm, product, reason, distribution, lot codes and dates. Filter by firm, product, state, status or date. For compliance, quality and research teams.

Pricing

from $1.00 / 1,000 run start fees

Rating

0.0

(0)

Developer

SR

SR

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

17 days ago

Last modified

Share

FDA Recalls Scraper

FDA Recalls Scraper turns the official FDA enforcement reports into a clean recall database you can download: food recalls, drug recalls and medical device recalls in one run. Each result includes the recall classification, recalling firm, product description, reason, distribution information, lot codes and available dates. Search a single category or combine categories, filter by firm, product, reason, state, status or report date, and export the dataset as JSON, CSV or Excel for your existing analysis workflow.

The source is the public openFDA enforcement dataset, the same data behind the FDA's weekly enforcement report. You do not need an openFDA account or API key to use this Actor. It covers United States FDA enforcement reports; it does not cover every recall announced in other countries. A missing result means that no matching record was delivered from this source, rather than a guarantee that a product has never been recalled.

FDA Recalls Scraper input

All input fields are optional. The default search uses the food category, includes all classifications and returns up to 100 records. The maximum output is 5000 records per run. Choose a smaller limit when checking a narrow filter or exploring which fields you need.

InputMeaningDefault
categoriesArray containing food, drug, device, or a combinationfood
classificationClass I, Class II or Class III; empty includes all classesall
firmPhrase in the recalling firm's nameno filter
productPhrase in the product descriptionno filter
reasonPhrase in the reason for recallno filter
stateState of the recalling firm; converted to uppercaseno filter
statusRecall status, such as Ongoing, Completed or Terminatedno filter
date_fromEarliest report date, YYYY-MM-DDno lower bound
date_toLatest report date, YYYY-MM-DDno upper bound
limitMaximum number of delivered records, 1–5000100
retriesRequest attempts, 1–63

Filters combine with AND. Dates filter the FDA report date, which can differ from the date when the recall began. The state filter identifies the firm's location; use the returned distribution information to examine where the affected product was distributed.

When combining categories, the Actor collects them in your chosen order and applies the final output limit after collection and deduplication. Category counts do not necessarily divide the requested limit equally. This preserves the existing Actor's record selection. A category with few matches can contribute fewer records, and earlier categories can fill more of the final dataset.

Output fields and downloads

The default dataset contains one row per delivered enforcement record. Existing integrations retain the original field names and JSON types. recall_number identifies the recall, and event_id groups related recalls. Both remain text where supplied by the source. position gives the row's one-based position in this run.

The main fields are category, classification, is_class_i, status, recalling_firm, product_description, product_quantity, reason_for_recall, distribution_pattern, code_info, city, state, country and postal_code. Other retained fields include product_type, voluntary_mandated and initial_firm_notification.

Drug records can include brand_names, generic_names and manufacturer_names. These fields remain arrays of strings when present and null when the source has no names. Dates are normalized from the FDA's YYYYMMDD strings to YYYY-MM-DD. A date field such as termination_date can be absent when the source does not supply it. Product descriptions and reasons are limited to 2000 characters, and lot-code information to 1000 characters, matching the previous output behavior.

Additional fields provide consistent names for downstream use: source, fetched_at, authority, product_category, product, brands, firm, reason, highest_risk, recall_date and published_date. They supplement the existing names. fetched_at records when this collection began; it is not the FDA publication date.

The key-value store also contains summary, with counts, category totals and a classification breakdown for successful collections. Empty searches preserve the existing totals summary field. If a source request fails, the errors record explains the affected category. Results already collected from other categories remain available.

Example output record

A real record from the input {"categories": ["drug"], "firm": "Pfizer", "date_to": "2025-12-31", "limit": 50}, abridged to the main fields:

{
"recall_number": "D-1443-2014",
"category": "drug",
"classification": "Class III",
"is_class_i": false,
"status": "Terminated",
"recalling_firm": "Pfizer Inc.",
"product_quantity": "1200 tablets",
"reason_for_recall": "Labeling: Incorrect or missing lot and or Exp Date: The bottles were labeled with an incorrect expiry date 11/2016. The correct expiry date is 09/2016.",
"distribution_pattern": "Nationwide and Puerto Rico",
"code_info": "Lot H45241, exp. 11/16",
"voluntary_mandated": "Voluntary: Firm initiated",
"city": "New York",
"state": "NY",
"country": "United States",
"event_id": "68660",
"brand_names": ["VIRACEPT"],
"generic_names": ["NELFINAVIR MESYLATE"],
"manufacturer_names": ["AGOURON"],
"recall_initiation_date": "2014-07-08",
"center_classification_date": "2014-07-17",
"termination_date": "2015-07-06",
"report_date": "2014-07-23",
"position": 1,
"highest_risk": false,
"recall_date": "2014-07-08",
"published_date": "2014-07-23"
}

Recall classes and status

Class I indicates a reasonable probability of serious harm or death. Class II indicates temporary or medically reversible harm. Class III indicates that harm is unlikely. The boolean is_class_i makes it straightforward to select Class I records without parsing classification text. Classification is the FDA's categorical assessment, rather than a numeric severity score supplied by this Actor.

A status of Terminated means that the FDA considers the recall action complete. It does not mean that the recall was cancelled. Keep that distinction when estimating ongoing actions or comparing recall history between firms.

Use cases for an FDA recall database

  • Supplier and brand monitoring. Schedule a daily or weekly run with firm set to your suppliers or competitors and a recent date_from, and get a new row whenever the FDA publishes an enforcement record for them.
  • Food safety and retail compliance. Pull food recalls for a product phrase (for example product = "peanut butter" or reason = "Listeria") and match code_info lot codes against your own stock.
  • Pharmacovigilance and drug recall tracking. Drug recalls carry brand_names, generic_names and manufacturer_names, so you can join recalls to your own drug list by generic name.
  • Medical device quality research. Build a medical device recall list by classification and status to compare firms, product types or years.
  • Journalism, legal and market research. Export a complete FDA recall list for a date range and analyse it in a spreadsheet, BI tool or notebook, with event_id grouping related recalls.

FDA Recalls Scraper compared with the FDA website and the openFDA API

The FDA publishes recalls in several places: the recalls page on fda.gov, the weekly enforcement report, and the openFDA API. The website is made for reading one recall at a time; it does not give you a dataset of every matching enforcement record with consistent fields. The openFDA API does, but you have to call a separate endpoint for food, drug and device, build its query syntax, page through results yourself and convert YYYYMMDD dates.

This Actor does that work for you. One input covers all three categories, filters use plain phrases, dates arrive as YYYY-MM-DD, is_class_i is a ready boolean, results are deduplicated across categories, and empty searches finish as a successful run instead of an error. You pay per delivered recall, so a narrow monitoring search costs almost nothing. Use the openFDA API directly if you need other openFDA datasets, such as adverse events or drug labels, which this Actor does not return.

Pricing and free-plan limits

The existing price is $0.001 for the run_start event and $0.001 for each delivered recall event. The start fee applies once per run, including a run with no matches or an invalid category. An empty result has no recall events. There are no separate charges for names, classification fields or dates.

Users on a free Apify plan receive at most ten records per run. Paid-plan users retain the requested limit. Apify's maximum-charge setting can limit the number of events actually charged; consult the run's charge information when applying a spending cap. Prices are defined by the Actor's live pricing model.

Frequently asked questions

What happens when no recalls match?

The run succeeds with an empty dataset and an explanatory record. No recall events are charged. The existing single run-start event still applies. This makes an empty search usable in recurring monitoring workflows.

Can I search food, drugs and devices together?

Yes. Include the desired category names in categories. Every output row retains its category, and the summary reports the available source totals. The final output limit applies across categories.

Does a terminated recall mean the product was never recalled?

No. Terminated describes completion of the action. Read the classification, reason and dates together to understand the enforcement record.

Are all products and brand names complete?

The Actor returns the fields available in openFDA. Names can be missing, especially outside drug records. Null values and absent optional dates preserve that source distinction rather than supplying inferred values.

Can I reuse my existing input and exports?

Yes. Existing input names and defaults, output names, nested types and the two billing events are retained. New output fields provide additional information for integrations that choose to use them.

Is this an official FDA recall API?

No. The Actor reads the official openFDA enforcement data and returns it as a dataset; it is not operated by the FDA. Field values are the FDA's own, apart from the normalised dates and the added convenience fields.

How do I get only new recalls?

Set date_from to the date of your previous run and schedule the Actor in Apify. Join runs on recall_number, which stays stable between runs.