FDA Recalls API — FDA Enforcement Reports (Food, Drug, Device)
Pricing
from $33.50 / 1,000 recall records
FDA Recalls API — FDA Enforcement Reports (Food, Drug, Device)
FDA recalls as clean records: FDA enforcement reports from openFDA for food, drugs and devices — recalling firm, product, classification, reason, distribution and status, with an optional alert feed. openFDA disclaimer carried. No API key. Part of NexGen Signal — official-source data products
Pricing
from $33.50 / 1,000 recall records
Rating
0.0
(0)
Developer
NexGen Signal
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 days ago
Last modified
Categories
Share
FDA recalls, from the official FDA enforcement reports. Every food, drug and device recall published through openFDA — recalling firm, product, classification, reason and status — as clean records, with an optional new-since-last-check alert feed.
Official source. No API key. Pay per record.
This actor turns the U.S. FDA's recall/enforcement data (via openFDA) into clean, per-recall records across food, drug, and device. Each run reads the official openFDA enforcement endpoints and delivers one record per recall — the recalling firm, the product, the classification (Class I/II/III), the reason, the distribution pattern, and the status — with openFDA's own accuracy disclaimer carried on every record.
What this is, in one paragraph
The FDA publishes recall and enforcement actions for food, drugs, and medical devices. This actor reads them through openFDA's keyless API and flattens each into a row: who recalled, what product, why, how serious (classification), where it was distributed, and the current status. Values are verbatim. Because openFDA explicitly labels its data as unvalidated, that disclaimer travels on every record.
Who buys this and for what job
- Supply-chain, QA, and compliance teams screening suppliers and products against FDA recalls across food/drug/device in one feed.
- Risk and insurance analysts tracking recall classification and reasons over time.
- Researchers and journalists who need the structured recall facts with firm and product detail.
- Data engineers wanting a keyless, one-call recall feed.
Buyers usually search for this as "FDA recalls" or "FDA enforcement reports".
openFDA disclaimer (carried verbatim)
openFDA labels its data as unvalidated. This actor carries that disclaimer, exactly as published, on every record and in this listing:
"Do not rely on openFDA to make decisions regarding medical care. While we make every effort to ensure that data is accurate, you should assume all results are unvalidated. We may limit or otherwise restrict your access to the API in line with our Terms of Service."
These are recall records for information and screening — not medical, legal, or safety advice.
Sample output

Real rows from a live run of this actor (first 5 rows, selected columns).
One full record from the same run, exactly as delivered:
{"record_id": "F-0276-2017:food","endpoint": "food","recall_number": "F-0276-2017","event_id": "75272","status": "Terminated","classification": "Class II","product_type": "Food","recalling_firm": "Pharmatech LLC","product_description": "CytoDetox, Hydrolyzed Clinoptilolite Fragments, 1 oz./30 mL, OTC Non-Sterile. Dietary supplement.","reason_for_recall": "Recall initiated as a precautionary measure due to potential risk of product contamination with Burkholderia cepacia.","distribution_pattern": "FL, MI, MS, and OH.","product_quantity": "1,990 bottles","voluntary_mandated": "Voluntary: Firm initiated","initial_firm_notification": "Letter","recall_initiation_date": "20160808","report_date": "20161102","state": "FL","country": "United States","city": "Davie","source": "openFDA (FDA enforcement / recalls)","openfda_disclaimer": "Do not rely on openFDA to make decisions regarding medical care. While we make every effort to ensure that data is accurate, you should assume all results are unvalidated. We may limit or otherwise restrict your access to the API in line with our Terms of Service.","licence": "openFDA — U.S. Food & Drug Administration. Public-domain U.S. Government data (https://open.fda.gov/license/). Reformatted to recall records; values verbatim.","attribution": "Source: U.S. FDA openFDA","observed_at": "2026-09-25T17:22:56Z"}
Pricing
| Event | Free plan | Bronze | Silver | Gold / Platinum / Diamond |
|---|---|---|---|---|
recall_record | $0.05 | $0.045 | $0.04 | $0.0335 |
Delivered before charged. Blocked runs and empty results cost nothing.
Input
| Field | Type | Default | Description |
|---|---|---|---|
endpoints | string list | food, drug, device | Which openFDA enforcement datasets to pull. |
sinceDate | string (YYYYMMDD) | — | Optional. Keep recalls with a report date on or after this date. |
classification | select | Any | Optional recall classification filter (Class I/II/III). |
watchFirms | string list | — | Optional watchlist: recalling-firm texts, e.g. Fresenius. |
watchProductTerms | string list | — | Optional watchlist: product-description texts, e.g. insulin, a product or NDC code. |
classifications | multi-select | — | Optional: several classifications at once. |
sinceLastCheck | boolean | false | Alert feed: return only recalls not delivered by an earlier run with the same settings. |
firstRunLookbackDays | integer | 30 | Alert feed: how far back the first check reads. |
maxRecords | integer | 10 | Ceiling on records delivered and billed. |
The actor paces requests under openFDA's published rate limit.
Recall alert feed (watchlist + "new since last check")
Added 3 October 2026. Give a watchlist — firm names and/or product terms — and, if you like, the classifications you care about, then turn on sinceLastCheck and schedule the actor (for example weekly, after FDA's Wednesday enforcement report). Each run returns only the recalls you have not received before, each tagged with the watch entry it matched (matched_watch_entries).
{"endpoints": ["drug", "device"],"watchFirms": ["Fresenius", "Baxter"],"watchProductTerms": ["insulin"],"classifications": ["Class I", "Class II"],"sinceLastCheck": true,"maxRecords": 100}
How it never misses and never repeats:
- The watermark (latest report date delivered, plus the recalls already delivered from the last 14 days of report dates) is saved in a key-value store named
fda-recall-watch-statein your own Apify account, after every delivered record. It survives restarts and only moves forward. Each different combination of endpoints, watchlist and classifications keeps its own watermark. - Each check re-reads the 14 days before the watermark, so a recall FDA adds late to an earlier weekly report is still caught; anything already delivered is skipped.
- If openFDA cannot be read for any endpoint, the run delivers nothing, charges nothing and leaves the watermark where it was.
- If
maxRecordsor your maximum charge stops a run early, the rest are delivered by the next check. - Checks with no new recalls cost nothing. Two runs of the same watch at the same moment are not coordinated; schedule one at a time.
The watchlist also works without sinceLastCheck, as a filter on an ordinary run.
Fixed 3 October 2026: a run with Report date since set returned no records, because the date range reached openFDA in a form it rejected (HTTP 500). Date filtering now works.
Output
One JSON object per recall. Example:
{"record_id": "D-1234-2026:drug","endpoint": "drug","recall_number": "D-1234-2026","status": "Ongoing","classification": "Class II","product_type": "Drugs","recalling_firm": "Example Pharma Inc.","product_description": "Example Tablets 10mg","reason_for_recall": "Failed dissolution specification","distribution_pattern": "Nationwide","voluntary_mandated": "Voluntary: Firm Initiated","recall_initiation_date": "20260710","report_date": "20260805","state": "NJ", "country": "United States", "city": "Trenton","source": "openFDA (FDA enforcement / recalls)","openfda_disclaimer": "Do not rely on openFDA ... assume all results are unvalidated ...","licence": "openFDA — U.S. FDA. Public-domain U.S. Government data ...","attribution": "Source: U.S. FDA openFDA","observed_at": "2026-08-18T00:00:00Z"}
An unbilled RUN_RECEIPT records the robots check, endpoints, the disclaimer seen, records seen/delivered, and whether charged equals delivered.
Cost guidance
One recall_record per delivered recall: cost = recalls pulled × your plan's per-record price. 1,000 recalls is $50 (Free) / $33.50 (Gold). The full enforcement corpus across the three endpoints is roughly 87,000 records.
Honest limitations
- Unvalidated by the source. openFDA states results are unvalidated; treat as informational and verify against FDA.
- Recalls only. This is the enforcement/recall dataset — not approvals, adverse events, or launches.
- Firm-level. Records are firm/product level; there is no person data.
- Rate-limited. Runs pace under openFDA's published limit; very large pulls take longer.
Differentiation
This actor is FDA recalls specifically — U.S. FDA food, drug and device recalls, not consumer-product recalls from other agencies and not product launches.
Input fields
Every input this actor accepts, read from its input schema:
| Field | Type | Default | Description |
|---|---|---|---|
endpoints | array | ["food", "drug", "device"] | Which openFDA enforcement datasets to pull: food, drug, and/or device. |
sinceDate | string | Optional. Keep only recalls with a report_date on or after this date. | |
classification | string | Optional recall classification filter. | |
watchFirms | array | [] | Optional watchlist of recalling-firm texts. |
watchProductTerms | array | [] | Optional watchlist of product-description texts. |
classifications | array | [] | Optional list of classifications. |
sinceLastCheck | boolean | false | Alert feed: only recalls not delivered before (watermark in your account's fda-recall-watch-state store). |
firstRunLookbackDays | integer | 30 | Alert feed: first-check look-back in days. |
maxRecords | integer | 10 | Maximum records delivered and billed. You are billed only for records delivered. |
Default changed on 30 Sep 2026: if you leave maxRecords out, a run now returns up to 10 records (it was 500). Set maxRecords yourself to get more — the maximum is unchanged.
Output fields
Every field in each delivered record, read from its output schema:
| Field | Type | Meaning |
|---|---|---|
record_id | string | Recall number + endpoint. |
endpoint | string | openFDA endpoint (food/drug/device). |
recall_number | string | FDA recall number. |
event_id | string | FDA recall event id. |
status | string | Recall status, verbatim. |
classification | string | Recall classification (Class I/II/III). |
product_type | string | Product type. |
recalling_firm | string | Recalling firm (organisation). |
product_description | string | Product description, verbatim. |
reason_for_recall | string | Reason for recall, verbatim. |
distribution_pattern | string | Distribution pattern, verbatim. |
product_quantity | string | Product quantity, verbatim. |
voluntary_mandated | string | Voluntary or FDA-mandated. |
initial_firm_notification | string | Initial firm notification method. |
recall_initiation_date | string | Recall initiation date. |
report_date | string | Report date. |
state | string | Firm state. |
country | string | Firm country. |
city | string | Firm city. |
source | string | Data source (openFDA). |
openfda_disclaimer | string | openFDA's verbatim results-unvalidated disclaimer. |
licence | string | Licence and reformatting notice. |
attribution | string | Required attribution string. |
observed_at | string | UTC retrieval timestamp. |
FAQ
How much does it cost? You pay $0.05 per recall record delivered to your dataset (less on higher Apify plans). Set the record limit in the input to cap what a run can cost. Records that are not delivered are never charged.
How do I get the data out? Every run saves its records to an Apify dataset. You can download it as JSON, CSV, Excel, XML or HTML from the run page, or read it through the Apify API.
Can I run it on a schedule? Yes. Use Apify Schedules to run it daily, weekly or monthly, with the same input each time.
Can I call it from my own code? Yes. Call nexgensignal/fda-recall-risk-records through the Apify API or the Apify Python and JavaScript clients, pass the same JSON input as the form, and read the dataset when the run finishes.
What happens if the source is down? The run ends with a clear status message, and nothing is charged for records that were not delivered.
The NexGen Signal family
Part of the NexGen Signal family of official-source, pay-per-record products:
- Eurostat House Price Index
- Eurostat Waste Generation
- Eurostat Waste Treatment
- Eurostat Business & Consumer Confidence
- Eurostat Income Distribution (EU-SILC)
- Eurostat Construction Production
- Eurostat Immigration Statistics
- Eurostat Emigration Statistics
- Eurostat Road Freight Transport
- Organization Sanctions & LEI Risk
Source: U.S. FDA via openFDA (public-domain U.S. Government data, https://open.fda.gov/license/). Reformatted to recall records; values verbatim. openFDA's "results are unvalidated" disclaimer is carried on every record.