FDA Recall Checker API — Food, Drug & Device Recalls
Pricing
from $2.00 / 1,000 recall / label / ndc / 510(k) records
FDA Recall Checker API — Food, Drug & Device Recalls
Check products (keywords, brands, UPC, NDC) against official FDA food, drug and device recalls, or get only new recalls on a schedule. Also drug labels, NDC directory, 510(k) and adverse-event counts. openFDA data, no API key needed.
Pricing
from $2.00 / 1,000 recall / label / ndc / 510(k) records
Rating
0.0
(0)
Developer
SmartMoney Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
FDA Recall Checker: Watchlist, Monitor & openFDA Search
Check your product list (keywords, brands, UPC/GTIN, NDC) against official FDA food, drug and device recalls and enforcement reports. You can also monitor only the NEW recalls since your last run. The data comes from the official api.fda.gov (openFDA) API, which is public domain under CC0. You don't need an API key.
It's for e‑commerce sellers (Amazon, Shopify, eBay, Walmart), private-label brands, retailers, distributors, pharmacies, med‑device resellers and compliance / QA teams who need to know whether something they sell has been recalled.
Unofficial tool. Not affiliated with or endorsed by the U.S. FDA. See Data license & disclaimers below.
What it does
| Mode | Use it for | Output |
|---|---|---|
| watchlist (default) | "Is anything on my SKU list recalled?" | One row per matching recall, with matched_items (which of your products matched, how, and how confident) plus one summary row per product (MATCHES_FOUND / NO_MATCH_FOUND) for your audit trail |
| monitor | Scheduled daily or weekly alerts | Only recalls not seen in previous runs. State is kept in a named key-value store. Pair it with an Apify schedule and a webhook, Slack or email integration |
| search | Research and bulk export | Filtered recalls (keyword, firm, Class I/II/III, status, state, date), or reference data: drug labels, NDC directory, 510(k) clearances |
| adverseEventCounts | Safety-signal overview for a product | Aggregated counts only (top reactions, outcomes, event types, reports per month). It never returns patient-level reports |
Datasets (official openFDA endpoints): food/enforcement, drug/enforcement, device/enforcement, device/recall, drug/label, drug/ndc, device/510k. Adverse-event counts use drug/event, device/event and food/event.
Why this Actor
- It checks your whole product list in one run. You can mix plain keywords,
brand:,upc:andndc:items, or pass objects with your ownsku. - Identifier matching. UPC/GTIN is tried with and without leading zeros (UPC‑A, EAN‑13, GTIN‑14). NDC is tried as product and package codes, including the 11-digit billing format. Each match is then re-checked in the record text and labelled
exact,strongorapi_match. - Private-label aware. Brand search covers both the recalling firm and the product description. That catches, for example, "Trader Joe's Vegetable Fried Rice" recalled by a co-manufacturer.
- Monitoring that doesn't repeat itself. A watermark plus seen-ID state, with an overlap window for records FDA posts late.
- Complete paging. The Actor pages with
skipand then follows openFDA'ssearch_aftercursor (Linkheader), so it goes past the 25,000-record skip ceiling. In testing it exported all 29,415 food enforcement records in one run. - Clean flat fields plus the untouched raw record. Dates come out as ISO
YYYY-MM-DD. Optional dedupe, and retries with backoff on 429/5xx. - Privacy by default. Fields naming individual people (device recall
additional_info_contact, 510(k)contact) are removed. Adverse events are available as aggregate counts only. - Fair use. Keyless by default, throttled to 3.5 requests/s (openFDA allows 240/min), with a request budget per run.
Input examples
Check a product list
{"mode": "watchlist","products": ["peanut butter","brand:Trader Joe's","upc:632687615989","ndc:27241-255-01",{"sku": "SKU-9", "brand": "Medtronic", "keyword": "insulin pump"}],"dateFrom": "2024-01-01"}
Weekly monitor of Class I food and drug recalls in California (schedule it)
{"mode": "monitor","endpoints": ["food/enforcement", "drug/enforcement"],"classifications": ["Class I"],"states": ["CA"],"monitorStateKey": "class1-ca","lookbackDays": 30}
Search 510(k) clearances or NDC listings
{ "mode": "search", "endpoints": ["device/510k", "drug/ndc"], "keywords": ["pulse oximeter"], "dateFrom": "2025-01-01" }
Adverse-event counts (aggregated)
{ "mode": "adverseEventCounts", "aeEndpoint": "drug/event", "aeProducts": ["ozempic"], "aeCountBy": "reaction", "aeTopN": 25 }
Key input fields
| Field | Default | Notes |
|---|---|---|
mode | watchlist | watchlist, monitor, search, adverseEventCounts |
products | — | Plain text is a keyword phrase. 12–14 digits is read as a UPC/GTIN. NNNNN-NNNN-NN is read as an NDC. You can also use the prefixes brand:, upc:, ndc:, keyword: |
endpoints | 4 recall datasets | Add drug/label, drug/ndc, device/510k for reference data |
dateFrom / dateTo | — | Filters on the dataset's main date (enforcement report_date, device recall event_date_posted, …) |
keywords, firms, classifications, statuses, states, rawSearch | — | Filters. rawSearch accepts an openFDA Lucene clause |
maxResults / maxResultsPerQuery | 200 / 100 | Row caps (the Console form is prefilled with maxResults: 50 for a small first run) |
dedupe | true | One row per recall. Several matching products are merged into matched_items |
includeRaw / trimRawLists | true / true | Raw openFDA JSON. Very long openfda.* ID lists are cut to 20 items (original lengths are recorded) |
includePersonContacts | false | Keep named individual contacts (not recommended) |
apiKey | — | Optional, free from openFDA. Raises the daily limit from 1,000 to 120,000 requests |
maxApiRequests | 900 keyless / 20,000 keyed | Request budget per run |
Output
A recall row (flattened; raw omitted here):
{"record_type": "recall","source_endpoint": "drug/enforcement","record_id": "D-0836-2026","record_date": "2026-09-16","classification": "Class III","status": "Ongoing","recalling_firm": "Ajanta Pharma USA Inc","product_description": "Fluphenazine Hydrochloride Tablets, USP, 1mg, 100-count bottles, ... NDC 27241-255-01.","reason_for_recall": "Failed impurities/degradation specifications ...","code_info": "Lot #: DJ23254, Exp. Date 11/30/2026; DJ10205, Exp. Date 04/30/2027.","distribution_pattern": "Nationwide within the U.S","recall_initiation_date": "2026-08-25","product_ndcs": ["27241-252", "27241-255", "27241-254", "27241-253"],"upcs": ["0327241255014", "..."],"api_url": "https://api.fda.gov/drug/enforcement.json?search=recall_number:%22D-0836-2026%22","matched_items": [{"item": "ndc:27241-255-01", "match_type": "ndc", "match_confidence": "exact","evidence": "NDC 27241-255-01 found in record"}],"license": "CC0 1.0 (public domain) per https://open.fda.gov/license/ — not FDA-endorsed; results unvalidated"}
A watchlist summary row:
{ "record_type": "watchlist_summary", "item": "peanut butter", "status": "MATCHES_FOUND","match_count": 50, "total_available": 684, "truncated": true,"most_severe_classification": "Class I", "latest_match_date": "2026-06-10","endpoints_checked": ["food/enforcement", "drug/enforcement", "device/enforcement", "device/recall"] }
The dataset has three views (Recalls & records, Watchlist summary, Adverse-event counts). The run summary (request counts, errors, dataset freshness, disclaimer) is saved as the OUTPUT key-value record.
Pricing
This Actor uses pay-per-event pricing. You pay only for the events below; Apify platform usage is included.
| Event | When it's charged | Price |
|---|---|---|
record | Each recall, drug label, NDC or 510(k) row in the dataset | $0.002 |
product-checked | Each watchlist product that was checked (one summary row per product) | $0.005 |
count-row | Each aggregated adverse-event row (one per term or month, including a "no reports found" row) | $0.001 |
Products that couldn't be checked because the run's request budget ran out (NOT_CHECKED_BUDGET) are not charged. The run summary in the OUTPUT record is free.
Worked examples
- Checking 500 SKUs and finding 20 matching recalls: 500 × $0.005 + 20 × $0.002 = $2.54. (A list this long needs your free openFDA
apiKey: each product uses about 4 API requests, and keyless runs have a 900-request budget, enough for roughly 200 products.) - The prefilled example (4 products against the four recall datasets, capped at 50 result rows) costs at most 50 × $0.002 + 4 × $0.005 = $0.12. Without the cap it would return 200 rows (the default
maxResults), about $0.42. - A weekly monitor of all four recall datasets typically finds about 100–300 new recalls (about 8,600 a year across the four datasets as of September 2026), which is about $0.20–$0.60 a week.
- Top 25 adverse-event reactions for 4 drugs: 100 × $0.001 = $0.10.
You can cap your spend with the maximum-cost-per-run setting in Apify Console; the Actor stops cleanly when the cap is reached.
Rate limits & API key
These are openFDA's documented limits (open.fda.gov/apis/authentication):
- Without a key: 240 requests per minute and 1,000 requests per day per IP address
- With a free key: 240 per minute and 120,000 per day per key
Cloud IP addresses can be shared, so if you see 429 errors, add your own free key in apiKey. Without a key, count queries with limit=1000 are refused (the Actor caps them at 999). The Actor retries 429/5xx responses with backoff and stops cleanly when its request budget is reached, marking the run PARTIAL_BUDGET.
Data license & disclaimers
- License: CC0 1.0 public domain. openFDA Terms of Service: "Unless otherwise noted, the content, data, documentation, code, and related materials on openFDA is public domain and made available with a Creative Commons CC0 1.0 Universal dedication. … You can copy, modify, distribute, and perform the work, even for commercial purposes, all without asking permission." See also the openFDA license page.
- No endorsement. License page: "When using or citing the work, you should not imply endorsement by the author or the affirmer." This Actor is not affiliated with FDA.
- Not for medical decisions. openFDA API 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."
- Recall status. openFDA enforcement docs: "FDA does not update the status of a recall after the recall has been classified according to its level of hazard. As such, the status of a recall (open, completed, or terminated) will remain unchanged after published in the Enforcement Reports." Treat
statusas the status at publication. - Adverse events. openFDA food adverse events docs: "a causal relationship cannot be established between product and reactions listed in a report." The counts are voluntary reports and do not measure incidence.
- No match does not mean safe. Recall text is written by firms and FDA and isn't standardized. Identifiers may be missing or formatted differently. Use the results as a screening aid, not a certification.
- Attribution (requested by FDA, not required): "Data provided by the U.S. Food and Drug Administration (https://open.fda.gov)."
Privacy
Recall and clearance records can name individual contact people. By default the Actor removes those fields (device recall additional_info_contact, 510(k) contact) from both the flat and the raw output; turn on includePersonContacts only if you have a legitimate need. Adverse-event data is returned as aggregate counts only, never as individual reports.
Limitations
- FDA only. Covers FDA food, drug and device datasets on openFDA. CPSC, USDA FSIS and NHTSA recalls are not included.
- Text matching is a screening aid. Recall text isn't standardised and identifiers can be missing or formatted differently, so a keyword or brand search can return false matches and miss real ones. Check
match_confidenceand read the record. - Recall status is frozen at publication (see the FDA quote above).
- Keyless daily limit. Without an API key, openFDA allows 1,000 requests per day per IP address, and cloud IPs can be shared. Add a free key for large or frequent runs.
- Row caps.
maxResultsandmaxResultsPerQuerylimit output; a watchlist summary showstruncated: truewhen more matches were available. device/recallhas no recall class, so it is skipped when you filter by Class I/II/III.
FAQ
Do I need an openFDA account? No. The Actor works without a key. A key is optional for heavy use.
How fresh is the data? Enforcement reports are published weekly. OUTPUT.dataset_last_updated shows openFDA's last_updated value for each dataset.
Does it cover CPSC, USDA FSIS or NHTSA recalls? Not yet. It covers FDA food, drug and device recalls only.
Why was device/recall skipped when I filtered by class? That dataset has no recall-class field. Use device/enforcement for Class I/II/III filtering.