FDA Recall Checker API — Food, Drug & Device Recalls avatar

FDA Recall Checker API — Food, Drug & Device Recalls

Pricing

from $2.00 / 1,000 recall / label / ndc / 510(k) records

Go to Apify Store
FDA Recall Checker API — Food, Drug & Device Recalls

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

SmartMoney Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

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

ModeUse it forOutput
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
monitorScheduled daily or weekly alertsOnly 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
searchResearch and bulk exportFiltered recalls (keyword, firm, Class I/II/III, status, state, date), or reference data: drug labels, NDC directory, 510(k) clearances
adverseEventCountsSafety-signal overview for a productAggregated 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: and ndc: items, or pass objects with your own sku.
  • 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, strong or api_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 skip and then follows openFDA's search_after cursor (Link header), 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

FieldDefaultNotes
modewatchlistwatchlist, 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:
endpoints4 recall datasetsAdd 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 / maxResultsPerQuery200 / 100Row caps (the Console form is prefilled with maxResults: 50 for a small first run)
dedupetrueOne row per recall. Several matching products are merged into matched_items
includeRaw / trimRawListstrue / trueRaw openFDA JSON. Very long openfda.* ID lists are cut to 20 items (original lengths are recorded)
includePersonContactsfalseKeep named individual contacts (not recommended)
apiKey—Optional, free from openFDA. Raises the daily limit from 1,000 to 120,000 requests
maxApiRequests900 keyless / 20,000 keyedRequest 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.

EventWhen it's chargedPrice
recordEach recall, drug label, NDC or 510(k) row in the dataset$0.002
product-checkedEach watchlist product that was checked (one summary row per product)$0.005
count-rowEach 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 status as 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_confidence and 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. maxResults and maxResultsPerQuery limit output; a watchlist summary shows truncated: true when more matches were available.
  • device/recall has 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.