FDA Recalls Scraper - openFDA Enforcement
Pricing
from $2.00 / 1,000 recalls
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
17 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.
| Class | What it means |
|---|---|
| I | Reasonable probability of serious adverse health consequences or death |
| II | Temporary or medically reversible consequences |
| III | Unlikely 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:
| Firm | Class | Days open | Reason |
|---|---|---|---|
| Abbott Diabetes Care | I | 781 | FreeStyle Libre 3 sensors |
| Abbott Point Of Care | II | 388 | Lack 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
| Field | Example |
|---|---|
recallingFirm | Abbott Diabetes Care, Inc. |
address, city, state, postalCode, country | full firm address |
productType | Food / Drug / Device |
classification, severityLevel, severityMeaning | Class I, I, and the sentence |
status, isOngoing | Ongoing / Terminated |
daysSinceInitiation | 781 |
daysToTermination | how long a closed recall took |
reasonForRecall | the failure, in FDA's words |
productDescription, productQuantity, codeInfo | lots and volumes |
distributionPattern | US Nationwide, Worldwide, single state |
voluntaryOrMandated, firmNotification | how it started |
recallInitiationDate, reportDate, terminationDate | |
recallNumber, eventId | FDA identifiers |
Input
{"productTypes": ["food", "drug", "device"],"reportedAfter": "2026-01-01","maxItems": 500}
| Field | Default | Notes |
|---|---|---|
productTypes | all three | Queried separately, returned together |
reportedAfter | 2026-01-01 | Weekly enforcement reports |
classification | — | Class I, II or III |
ongoingOnly | false | Excludes terminated recalls |
maxItems | 500 | Split evenly across product types |
recallingFirm | — | Monitor one supplier |
state | — | Firm's state |
reportedBefore | today |
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.
daysSinceInitiationis computed against the run date, so a saved export ages. The dates themselves do not.device/recall.jsonis 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 ApifyClientclient = 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
- FDA 510(k) Scraper: Device Clearances Data
- NPI Registry Scraper: US Healthcare Providers
- CMS Open Payments Scraper: Physician Payments
FAQ
Is it legal to use this data?
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.