FDA Recalls Scraper - openFDA Enforcement avatar

FDA Recalls Scraper - openFDA Enforcement

Pricing

from $2.00 / 1,000 recalls

Go to Apify Store
FDA Recalls Scraper - openFDA Enforcement

FDA Recalls Scraper - openFDA Enforcement

Scrape FDA recalls for food, drugs and medical devices in one feed and one schema, from openFDA enforcement reports: severity class decoded, days open computed, product, reason and the recalling firm's address. Filter by product type, class, firm and date.

Pricing

from $2.00 / 1,000 recalls

Rating

0.0

(0)

Developer

Tom Awake

Tom Awake

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

18 hours ago

Last modified

Categories

Share

What does FDA Recalls Scraper do?

Food, drug and medical device recalls in one feed and one schema — with severity explained, days open computed, and the recalling firm's address.

No login. No API key. No proxies.

Three endpoints, one answer

FDA splits recalls across three separate APIs. A quality or compliance team does not think in FDA endpoints — it thinks in suppliers. Query all three here and get one table.

Two things the source leaves out

What the class actually means. FDA publishes Class I and stops there.

ClassWhat it means
IReasonable probability of serious adverse health consequences or death
IITemporary or medically reversible consequences
IIIUnlikely to cause adverse consequences

Both the code and the sentence ship on every row, so nobody has to remember the nomenclature to triage a list.

How long it has been open. The source gives dates, never elapsed time. A real result, monitoring one supplier:

FirmClassDays openReason
Abbott Diabetes CareI781FreeStyle Libre 3 sensors
Abbott Point Of CareII388Lack of 510(k) premarket clearance

A Class I recall open for 781 days reads very differently from one opened last week — and no column in the source tells you which you are looking at.

Rows come back most severe and longest running first.

Output

FieldExample
recallingFirmAbbott Diabetes Care, Inc.
address, city, state, postalCode, countryfull firm address
productTypeFood / Drug / Device
classification, severityLevel, severityMeaningClass I, I, and the sentence
status, isOngoingOngoing / Terminated
daysSinceInitiation781
daysToTerminationhow long a closed recall took
reasonForRecallthe failure, in FDA's words
productDescription, productQuantity, codeInfolots and volumes
distributionPatternUS Nationwide, Worldwide, single state
voluntaryOrMandated, firmNotificationhow it started
recallInitiationDate, reportDate, terminationDate
recallNumber, eventIdFDA identifiers

Input

{
"productTypes": ["food", "drug", "device"],
"reportedAfter": "2026-01-01",
"maxItems": 500
}
FieldDefaultNotes
productTypesall threeQueried separately, returned together
reportedAfter2026-01-01Weekly enforcement reports
classificationClass I, II or III
ongoingOnlyfalseExcludes terminated recalls
maxItems500Split evenly across product types
recallingFirmMonitor one supplier
stateFirm's state
reportedBeforetoday

maxItems is divided between the product types you select, so a high-volume domain cannot crowd out the others. Device recalls outnumber drug recalls roughly four to one in 2026 — without the split you would barely see the drugs.

Use cases

  • Supplier monitoring — name a firm, see every recall it has issued, how severe and how long open.
  • Quality and compliance — Class I recalls in your category, ongoing only, with distribution pattern.
  • Insurance and risk — recall history by company and state.
  • Retail and distribution — what is being pulled, in what quantity, across which territory.
  • Journalism and research — the full recall record, searchable.

Running this as a scheduled watch

A recall is time-critical. Knowing a week late that a component in your supply chain was pulled is not the same as knowing the day it happened.

{
"productTypes": ["device"],
"reportedWithinDays": 7,
"classification": "Class I",
"maxItems": 500
}

Why not a fixed reportedAfter date? A schedule replays the same input every time, so a fixed date returns the same recalls at every run — and charges for them again. reportedWithinDays moves the window.


Limits, honestly

  • FDA posts recalls in weekly enforcement reports, so the most recent days are always incomplete. A recall can also be classified weeks after it began.
  • daysSinceInitiation is computed against the run date, so a saved export ages. The dates themselves do not.
  • device/recall.json is deliberately excluded. It is a fourth FDA dataset with different field names, and mapping it into this schema would mean guessing at equivalences. The three enforcement endpoints share 23 of 24 fields; that one does not.
  • Firm names are not normalised: Abbott appears as several distinct entities. Search broadly, then group.
  • openFDA stops paginating past 25,000 results per query.
  • A recall is a safety action, not a verdict. Most are voluntary and many are precautionary.
  • Requests are paced out of courtesy to a free public service.
  • Not affiliated with the FDA.

How much does it cost?

You pay per recall returned: $0.003 each, that is $3.00 per 1,000. There is no start fee, and subscription plans pay less per recall.

The example input below asks for up to 500 recalls, so it costs $1.50 at most.

If a run reaches the spending limit you set, the output stops at that limit and never goes past it. You are never charged for rows that were not delivered.

Use FDA Recalls Scraper as an API

Call it from your own code with the Apify client, here in Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("DataIO/openfda-recalls-enforcement").call(run_input={
'productTypes': ['food', 'drug', 'device'],
'reportedAfter': '2026-01-01',
'maxItems': 500,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

It also works from JavaScript, Make, Zapier, n8n, and from AI agents through the Apify MCP server.

Other actors you might like

FAQ

The actor reads public data from its official source, without logging in and without bypassing any access control. What you do with the data, for example contacting people listed in it, is your responsibility under the laws that apply to you, such as GDPR in Europe.

Can I run it on a schedule?

Yes. See Running this as a scheduled watch above: use the rolling-window setting so each run returns only what is new.

Can AI agents use it?

Yes. It is available through the Apify MCP server, and every input field is described in its input schema, so an agent can call it directly.