openFDA Recall Lookup — Drug, Food & Device Enforcement API avatar

openFDA Recall Lookup — Drug, Food & Device Enforcement API

Pricing

from $2.40 / 1,000 successful lookups

Go to Apify Store
openFDA Recall Lookup — Drug, Food & Device Enforcement API

openFDA Recall Lookup — Drug, Food & Device Enforcement API

Look up FDA recalls by recall number or NDC against the official, free openFDA API, searching drug, food, and device databases in turn. Get classification, reason for recall, recalling firm, distribution, and dates. Pay only for matches.

Pricing

from $2.40 / 1,000 successful lookups

Rating

0.0

(0)

Developer

Adrian Voss

Adrian Voss

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

openFDA Recall Lookup

Look up FDA recalls by recall number, drug NDC, or product description against the official, free openFDA API — classification, reason for recall, recalling firm, distribution pattern, and dates. Each identifier is checked against the FDA's drug, food, and device enforcement databases in turn. No API key, no scraping — this hits the official public API directly.

Features

  • One identifier, three databases. A recall number or NDC is checked against drug, food, and device enforcement records in sequence, so you don't need to know which category it belongs to.
  • Full enforcement detail. Classification (Class I/II/III), reason for recall, recalling firm, distribution pattern, and both the recall-initiation and report dates.
  • Status & scope. Recall status, whether it was voluntary or FDA-mandated, and the state/country of the recalling firm.
  • Pay only for hits. Identifiers that don't match any FDA enforcement record cost nothing — see Pricing.
  • Built for bulk. Feed in thousands of identifiers; concurrency, keyword filtering, and column selection are all configurable.

How to use openFDA Recall Lookup — Drug, Food & Device Enforcement API

  1. In the Apify Console. Open the actor page and click Start — the identifiers field is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found.
  2. Via the API. Call it directly with a POST request — no Console needed once you have an API token:
    curl "https://api.apify.com/v2/acts/accountable_eel~openfda-recall-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{"identifiers":["D-321-2016"]}'
  3. On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.

Input

{
"identifiers": [
"D-321-2016"
]
}

One recall number, drug NDC, or product name/description per line. Checked against FDA drug, food, and device enforcement databases in that order. Accepted formats: D-1234-2023, 0002-1433.

{
"identifiers": ["D-321-2016", "0002-1433"],
"testRun": false,
"onlyFound": false,
"maxConcurrency": 5
}

identifiers is a list of recall numbers, drug NDCs, or product names/descriptions — one per line. Each is checked against the FDA drug, food, and device enforcement databases in that order. testRun limits a run to the first 5 items so you can check your input before spending on the full list. onlyFound hides rows where nothing was found (misses are always free regardless). Optional includeKeywords/excludeKeywords filter results by keyword, and maxResults stops the run early once that many results have been found. columns lets you pick which fields to include (all are on by default). maxConcurrency (default 5, max 20) caps parallel requests.

Output

queryfoundstatuscategoryrecallNumberrecallStatusclassificationproductreasonfirmdistributionPatternrecallInitiationDatereportDatevoluntaryMandatedstatecountryscrapedAt
D-321-2016trueOKdrugD-321-2016TerminatedClass IIProgesterone 100 mg/mL in Corn Oil Injection, 2 mL vials, Rx only, Essential Wellness PHARMACY, 4625 N. University, Peoria, IL 61614.Lack of Assurance of Sterility: A recall of all compounded sterile preparations within expiry is being initiated due to observations associated with poor sterile production practices resulting in a lack of sterility assurance for their finished drugs.Kalman Health & Wellness, Inc. dba Essential Wellness PharmaNationwide2015090320151125Voluntary: Firm initiatedILUnited States2026-08-23T21:03:58.215Z

One row per identifier, for example:

{
"query": "D-321-2016",
"found": true,
"status": "OK",
"category": "drug",
"recallNumber": "D-321-2016",
"recallStatus": "Terminated",
"classification": "Class II",
"product": "Acetaminophen 500mg Tablets, 100-count bottle",
"reason": "Subpotent (Single Ingredient)",
"firm": "Example Pharmaceuticals Inc.",
"distributionPattern": "Nationwide",
"recallInitiationDate": "2015-11-02",
"reportDate": "2015-12-10",
"voluntaryMandated": "Voluntary: Firm Initiated",
"state": "NJ",
"country": "United States",
"scrapedAt": "2026-08-21T12:00:00.000Z"
}

An identifier that doesn't match any drug, food, or device enforcement record comes back as "found": false with status: "NOT_FOUND" and a plain-English message — these rows are never charged.

Use cases

  • Supply-chain safety checks. Verify whether a specific NDC or product lot has an open FDA recall before restocking or distributing it.
  • Compliance monitoring. Bulk-check a catalog of drug/food/device identifiers against active enforcement actions.
  • Consumer safety research. Pull recall reason, classification, and scope for a specific incident or product line.
  • Media & watchdog reporting. Cross-reference recall numbers cited in FDA press releases against the underlying enforcement record.
  • Regulatory due diligence. Confirm the classification severity and distribution pattern of a recall before assessing exposure.

Pricing

$4 per 1,000 identifiers, plus a $0.005 start fee. Misses (found:false) are never charged.

Use it from Clay, n8n, Make, or an AI agent

This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.

curl "https://api.apify.com/v2/acts/accountable_eel~openfda-recall-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
-X POST \
-H "Content-Type: application/json" \
-d '{"identifiers":["D-321-2016"]}'

n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~openfda-recall-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"identifiers":["D-321-2016"]} (swap in an expression from an earlier node for a real value).

Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~openfda-recall-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"identifiers":["{{identifier}}"]}, mapping the row's identifier into the identifiers array.

MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "FDA Recall Lookup API — Drug, Food, Device Enforcement" — the agent will find and run this actor.

FAQ

What counts as "not found"? An identifier that returns no match against drug (by recall number and NDC), food, or device enforcement records. This actor tries all of those combinations before marking a row NOT_FOUND — never charged.

Why does it check multiple databases per identifier? Recall numbers and NDCs aren't globally unique across categories, so the actor tries drug recall number, then drug NDC, then food and device recall numbers, in that order, stopping as soon as one hits.

Why does the actor issue separate queries instead of one combined search? OpenFDA's search syntax reliably 404s when certain typed fields (like openfda.product_ndc) are combined with OR in one query — a parser quirk, not a real "not found." Issuing single-field queries in sequence avoids that failure mode without ever missing a real match.

How fresh is the data? Live — every run queries openFDA directly, not a cached snapshot, so results reflect the FDA's current enforcement records.

Does this cover every FDA recall? Coverage is limited to what's indexed in openFDA's enforcement endpoints for drugs, food, and devices — it doesn't cover other openFDA categories like adverse events or labeling.

What proxy should I use? Apify Proxy is enabled by default; openFDA's public API is generally permissive, but residential proxies are available if you see blocks on large runs.