FDA Medical Device Recall Search avatar

FDA Medical Device Recall Search

Pricing

from $2.00 / 1,000 recall fetcheds

Go to Apify Store
FDA Medical Device Recall Search

FDA Medical Device Recall Search

Search FDA medical device recalls via openFDA API. Filter by keyword, company, recall class (I/II/III), status, US state, date range. Returns recall details, reasons, product descriptions, distribution patterns, quantities. Free API, no key needed.

Pricing

from $2.00 / 1,000 recall fetcheds

Rating

0.0

(0)

Developer

ryan clinton

ryan clinton

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

0

Monthly active users

7 minutes ago

Last modified

Share

What does FDA Medical Device Recall Search do?

FDA Medical Device Recall Search queries the U.S. Food and Drug Administration's openFDA device enforcement endpoint to retrieve detailed, structured data about medical device recalls. The FDA issues recalls when devices -- from pacemakers and insulin pumps to surgical robots and diagnostic imaging systems -- are found to be defective, mislabeled, or potentially harmful. This actor gives you clean, programmatic access to that recall database with six combinable filters and 20 output fields per record.

You can search by keyword (matched across product descriptions and recall reasons), recalling company, recall severity classification (Class I/II/III), recall status (Ongoing/Completed/Terminated), U.S. state, and recall initiation date range. Results are always sorted newest first. Each record includes recall identification, severity, company details, product description, reason for recall, distribution scope, lot/serial code information, and four distinct dates covering the full recall lifecycle.

Why use FDA Medical Device Recall Search on Apify?

  • No API complexity -- The openFDA query syntax uses bracket-delimited date ranges, +AND+ joins, and quoted field searches. This actor builds the correct query from simple input fields.
  • Automatic pagination -- openFDA limits responses to 100 records per page with a 25,000 skip ceiling. The actor handles all pagination transparently, fetching up to 5,000 results across multiple API calls.
  • Clean date formatting -- Raw openFDA dates (YYYYMMDD) are converted to standard YYYY-MM-DD format in every output record.
  • Schedule for monitoring -- Run daily or weekly on Apify to catch new device recalls as they are published, with webhook alerts to Slack, email, or any endpoint.
  • No API key required -- The openFDA API is completely free and open. The only cost is minimal Apify platform compute time.

Key features

  • Multi-field keyword search -- Keywords are matched across both product_description and reason_for_recall using OR logic, so you catch recalls whether the term appears in the device name or the defect explanation.
  • Six combinable filters -- Keyword, recalling firm, classification, status, state, and date range can be used in any combination.
  • Date range filtering -- Filter by recall initiation date (the date the firm started the recall), not report date. This gives you the actual timeline of when recalls began.
  • 20-field structured output -- Every record includes recall number, event ID, classification, status, company details, product description, quantity, reason, distribution pattern, notification method, code info, and four distinct dates.
  • Run summary logging -- The actor logs a summary with classification counts, status counts, and top 5 recalling firms by frequency.
  • Sorted by recency -- Results always come back with the most recent recalls first (recall_initiation_date:desc).
  1. Navigate to the FDA Medical Device Recall Search actor page on Apify.
  2. Click Try for free to open the actor in Apify Console.
  3. Enter your search parameters. At minimum, provide a keyword like "pacemaker" or a company name like "Medtronic". You can also leave all filters blank to retrieve the most recent recalls across all categories.
  4. Set Max Results to control how many records you want (default 100, maximum 5,000).
  5. Click Start to run the actor.
  6. When the run finishes, view results in the Dataset tab. Export as JSON, CSV, Excel, or access via the Apify API.

Input parameters

ParameterTypeRequiredDefaultDescription
keywordstringNo"pacemaker" (prefill)Search term matched against product descriptions and recall reasons. Examples: "pacemaker", "insulin pump", "hip implant", "ventilator".
recallingFirmstringNo--Filter by company name. Examples: "Medtronic", "Abbott", "Philips", "Baxter".
classificationselectNo--Recall severity: "Class I" (most serious), "Class II" (moderate), or "Class III" (least serious).
statusselectNo--Recall status: "Ongoing", "Completed", or "Terminated".
statestringNo--Two-letter U.S. state code where the recalling firm is located (e.g., CA, MN, MA). Automatically uppercased.
dateFromstringNo--Start of recall initiation date range (YYYY-MM-DD format).
dateTostringNo--End of recall initiation date range (YYYY-MM-DD format).
maxResultsintegerNo100Maximum number of recall records to return (1--5,000).

Input examples

Basic keyword search (pacemaker):

{
"keyword": "pacemaker",
"maxResults": 100
}

Company + Class I recalls:

{
"recallingFirm": "Medtronic",
"classification": "Class I",
"maxResults": 500
}

Date range + state filter:

{
"keyword": "insulin pump",
"state": "CA",
"dateFrom": "2024-01-01",
"dateTo": "2024-12-31",
"maxResults": 200
}

All recent recalls (no filters):

{
"maxResults": 100
}

Tips for best results

  • Be specific with keywords. Terms like "insulin pump" or "cardiac defibrillator" return more targeted results than generic terms like "device" or "medical".
  • Combine filters for precision. Use keyword plus classification together to find, for example, all Class I recalls related to surgical robots.
  • Date ranges use recall initiation date. This is the date the firm initiated the recall -- not the date FDA classified it or the date it was reported to the FDA.
  • State codes are auto-uppercased. You can enter "ca" or "CA" -- both work.
  • Leave all filters blank to get the most recent recalls across all device categories, useful for general monitoring dashboards.
  • Use date ranges for trend analysis. Split long time periods into smaller windows if you need more than 5,000 results for a given query.

Output example

{
"recallNumber": "Z-0839-2024",
"eventId": "92134",
"classification": "Class I",
"status": "Ongoing",
"recallingFirm": "Medtronic, Inc.",
"city": "Minneapolis",
"state": "MN",
"country": "United States",
"productDescription": "Cardiac Resynchronization Therapy Defibrillator (CRT-D), Model DTBA2D1, used for the treatment of heart failure in patients who also have ventricular arrhythmias.",
"productQuantity": "45,230",
"reasonForRecall": "The firmware in the device may cause an unexpected device reset during normal operation, potentially resulting in loss of pacing therapy.",
"distributionPattern": "Worldwide Distribution -- US (nationwide) and international including EU, Canada, Japan, Australia.",
"voluntaryMandated": "Voluntary: Firm Initiated",
"initialNotification": "Letter",
"codeInfo": "Serial numbers: PXR1000001 through PXR1045230, manufactured between January 2022 and March 2024.",
"recallDate": "2024-06-15",
"classificationDate": "2024-07-02",
"reportDate": "2024-06-28",
"terminationDate": null,
"extractedAt": "2025-01-15T14:32:08.123Z"
}

Output fields reference

FieldTypeDescription
recallNumberstringUnique FDA recall identification number (e.g., "Z-0839-2024")
eventIdstringFDA event ID grouping related recall records
classificationstringSeverity level: "Class I", "Class II", or "Class III"
statusstringCurrent recall status: "Ongoing", "Completed", or "Terminated"
recallingFirmstringName of the company responsible for the recall
citystringCity where the recalling firm is located
statestringU.S. state where the recalling firm is located (two-letter code)
countrystringCountry where the recalling firm is located
productDescriptionstringDetailed description of the recalled medical device
productQuantitystringNumber or description of units affected
reasonForRecallstringThe specific defect or issue that triggered the recall
distributionPatternstringGeographic scope of where the device was distributed
voluntaryMandatedstringWhether the recall was voluntary or FDA-mandated
initialNotificationstringHow the firm initially notified customers (e.g., "Letter", "Press Release")
codeInfostringLot numbers, serial numbers, or other identifying codes for affected units
recallDatestringDate the firm initiated the recall (YYYY-MM-DD)
classificationDatestringDate the FDA classified the recall severity (YYYY-MM-DD)
reportDatestringDate the recall was reported to the FDA (YYYY-MM-DD)
terminationDatestring or nullDate the recall was terminated (YYYY-MM-DD), or null if still active
extractedAtstringISO 8601 timestamp of when the data was extracted

How it works

Input (keyword, recallingFirm, classification, status, state, dateFrom, dateTo)
|
v
+-----------------------------------------------------------+
| Query Builder |
| - Joins all filter clauses with +AND+ |
| - Keywords: OR across product_description |
| and reason_for_recall |
| - Dates: strip dashes, wrap in [FROM+TO+TO] |
| - Special chars (+, &, |, parens) stripped from keywords |
+----------------------------+------------------------------+
|
v
+-----------------------------------------------------------+
| Paginated Fetch |
| api.fda.gov/device/enforcement.json |
| ?limit=100&skip=N&sort=recall_initiation_date:desc |
| &search=<query> |
| |
| - 100 results per page (openFDA maximum) |
| - Stops at maxResults, end of data, or skip >= 25000 |
| - First-page 404 = no results found |
| - Later-page 404 = end of available data |
+----------------------------+------------------------------+
|
v
+-----------------------------------------------------------+
| Transform |
| - 20 output fields per record |
| - Dates: YYYYMMDD -> YYYY-MM-DD (substring slicing) |
| - terminationDate: null if recall is still active |
| - extractedAt: ISO 8601 timestamp added |
+----------------------------+------------------------------+
|
v
+-----------------------------------------------------------+
| Output & Summary |
| - Push each record to Apify dataset |
| - Log classification counts (Class I / II / III) |
| - Log status counts (Ongoing / Completed / Terminated) |
| - Log top 5 recalling firms by frequency |
+-----------------------------------------------------------+

openFDA query construction

The actor maps each input field to an openFDA query fragment, then joins all fragments with +AND+:

Input fieldQuery fragmentExample
keyword(product_description:"K"+reason_for_recall:"K")(product_description:"pacemaker"+reason_for_recall:"pacemaker")
recallingFirmrecalling_firm:"FIRM"recalling_firm:"Medtronic"
classificationclassification:"CLASS"classification:"Class I"
statusstatus:"STATUS"status:"Ongoing"
statestate:"ST" (uppercased)state:"CA"
dateFrom / dateTorecall_initiation_date:[FROM+TO+TO]recall_initiation_date:[20240101+TO+20241231]

The keyword field uses OR logic (the + between quoted field searches inside parentheses acts as OR in openFDA syntax). Special characters (+, &, |, (, )) in keyword input are stripped before querying to prevent malformed API calls.

Date handling

Input dates in YYYY-MM-DD format have their dashes stripped to produce the YYYYMMDD format required by the openFDA API. For example, an input of "2024-01-15" becomes 20240115 in the query. If only dateFrom is specified, the range extends to 20991231. If only dateTo is specified, the range starts from 19000101. The formatDate() function reverses this for output, converting raw YYYYMMDD responses back to YYYY-MM-DD using substring slicing.

Skip-based pagination and the 25,000 limit

The openFDA API uses skip-based pagination (not cursor-based). Each request specifies a skip offset and a limit (max 100). The actor increments skip by the number of results received after each page. Pagination stops when any of three conditions are met: the total number of collected results reaches maxResults, a page returns fewer results than requested (end of data), or skip reaches 25,000 (the hard ceiling imposed by the openFDA API). The page size is also optimized on the final page: Math.min(100, maxResults - collected) to avoid over-fetching.

404 handling

The openFDA API returns HTTP 404 when no records match a query -- not a 200 with an empty array. The actor distinguishes between two cases: if the 404 occurs on the first page (no results collected yet), it means the search matched nothing and outputs a diagnostic message. If the 404 occurs on a subsequent page, it simply means pagination has reached the end of available data, and the actor stops fetching.

Recall classification levels

FDA classifies every device recall into one of three severity levels based on the potential health risk:

  • Class I: Most serious. The device could cause serious adverse health consequences or death.
  • Class II: Moderate. The device may cause temporary or medically reversible adverse health consequences, or the probability of serious harm is remote.
  • Class III: Least serious. The device is unlikely to cause adverse health consequences but still violates FDA regulations.

Understanding the three date fields

Each recall record contains three (sometimes four) dates that represent different milestones in the recall lifecycle:

Date fieldMeaning
recallDateThe date the recalling firm initiated the recall. This is the primary date used for sorting and filtering.
reportDateThe date the recall was reported to the FDA. Typically the same day or shortly after the recall initiation date.
classificationDateThe date the FDA officially classified the recall severity (Class I, II, or III). This is unique to the device endpoint and provides insight into how quickly the FDA assessed severity. It often comes days or weeks after the recall initiation.
terminationDateThe date the recall was terminated (closed). This field is null for ongoing recalls and only populated when the recall has been completed and formally terminated.

How much does it cost to run?

ScenarioRecordsAPI callsApprox. timeEst. cost
Quick keyword search1001~5 sec~$0.002
Company monitoring200--5002--5~10 sec~$0.005
Date range trend analysis1,00010~30 sec~$0.008
Maximum extraction5,00050~90 sec~$0.02

The openFDA API is completely free with no API key required. Apify's free tier includes $5 of monthly platform credits, enough for hundreds of runs of this actor.

Limitations

  1. 25,000 skip ceiling -- The openFDA API stops returning results after a skip offset of 25,000. For very large result sets, use date range filters to split queries into smaller time windows.
  2. 5,000 result cap -- The actor limits output to 5,000 records per run for practical performance.
  3. Keyword searches two fields only -- Keywords match product_description and reason_for_recall. Searching by lot number or serial number is not supported through the keyword field; use the codeInfo output field after extraction.
  4. State filter is firm location -- The state filter matches where the recalling firm is headquartered, not where the device was distributed. Check the distributionPattern output field for geographic distribution scope.
  5. Date format required -- Dates must be entered in YYYY-MM-DD format. Other formats will produce incorrect API queries.
  6. Device recalls only -- This actor covers the /device/enforcement.json endpoint. For drugs, food, or other FDA data, use the corresponding specialized actors listed in the Related Actors section.

Responsible use

  • A recall does not always mean a device is dangerous. Class III recalls address regulatory violations that are unlikely to cause harm. Always check the classification and reason fields for context.
  • When publishing or sharing recall data, provide appropriate context about recall severity and status.
  • Consult healthcare professionals and the FDA directly for clinical decisions.
  • Follow the openFDA Terms of Service when using the data.

FDA recall classification reference

ClassSeverityDescription
Class IMost seriousCould cause serious health problems or death
Class IIModerateMay cause temporary or reversible health problems
Class IIILeast seriousUnlikely to cause adverse health effects

Programmatic access

Python:

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("ryanclinton/fda-device-recalls").call(run_input={
"keyword": "pacemaker",
"classification": "Class I",
"maxResults": 200,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(f"[{item['classification']}] {item['recallingFirm']}: {item['reasonForRecall'][:80]}")
print(f" Recall #{item['recallNumber']} | Date: {item['recallDate']} | Status: {item['status']}")

JavaScript:

import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: "YOUR_API_TOKEN" });
const run = await client.actor("ryanclinton/fda-device-recalls").call({
keyword: "pacemaker",
classification: "Class I",
maxResults: 200,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const classI = items.filter((r) => r.classification === "Class I");
console.log(`Found ${classI.length} Class I pacemaker recalls`);

cURL:

# Start a run
curl "https://api.apify.com/v2/acts/ryanclinton~fda-device-recalls/runs" \
-X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-d '{
"keyword": "pacemaker",
"classification": "Class I",
"maxResults": 200
}'
# Fetch results (after run completes)
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?format=json" \
-H "Authorization: Bearer YOUR_API_TOKEN"

FAQ

Do I need an API key? No. The openFDA API is completely free and requires no authentication. You only need an Apify account to run the actor.

How current is the recall data? The openFDA database is updated regularly by the FDA. Most recalls appear within days of being officially announced.

What is the difference between Class I, II, and III recalls? Class I is the most serious -- the device could cause serious injury or death. Class II means the device may cause temporary or reversible health problems. Class III means the device is unlikely to cause harm but still violates FDA regulations.

What is the classificationDate field? This is the date the FDA officially classified the recall severity (Class I, II, or III). It typically comes after the recall initiation date and provides insight into how quickly the FDA assessed severity. This field is unique to the device enforcement endpoint.

Can I get more than 5,000 results? The actor caps at 5,000 for performance reasons, and the openFDA API limits pagination to 25,000 records. For larger datasets, use date range filters to split queries into smaller time windows and combine the results across multiple runs.

What happens if no results match my filters? The actor outputs a single record with a "No device recalls found" message and your filter parameters, so you can see what was searched. The openFDA API returns a 404 when no results match, which the actor handles gracefully.

Use cases

  • Medical device safety monitoring -- Track recalls for specific device categories (pacemakers, insulin pumps, imaging systems) with scheduled daily or weekly runs and webhook alerts to Slack or email.
  • Supplier due diligence -- Investigate a device manufacturer's recall history before procurement decisions. Filter by company name to see all past enforcement actions.
  • Regulatory compliance -- Monitor Class I and Class II recalls in your product category for compliance reporting and risk management.
  • Healthcare facility risk management -- Track recalls for devices in your hospital or clinic inventory. Cross-reference recall numbers with your asset management system.
  • Insurance and liability analysis -- Analyze recall patterns by classification, company, and time period to assess medical device liability risk.
  • Journalism and public interest -- Investigate device safety trends, repeat offenders, or geographic patterns in FDA enforcement actions.
  • Post-market surveillance research -- Combine with the FDA Device Adverse Events (MAUDE) actor to correlate adverse event reports with recall actions for specific device types.

FDA regulatory intelligence suite

ActorDescriptionUse together for
FDA 510(k) Device ClearancesPre-market 510(k) clearance searchPre-market clearance to post-market recall pipeline
FDA PMA Device ApprovalsClass III PMA approval searchHigh-risk device approval to recall correlation
FDA Device Adverse Events (MAUDE)Medical device adverse event reportsAdverse event signals leading to recall actions
FDA Drug Approval SearchNDA/ANDA/BLA drug approval searchCross-domain FDA approval monitoring
openFDA Drug Event MonitorFDA adverse drug event reports (FAERS)Full FDA safety monitoring across drugs and devices
FDA Drug Recall SearchFDA drug enforcement actionsComplete recall coverage across drugs and devices
FDA Food Recall MonitorFDA food enforcement actionsComplete FDA recall monitoring across all product types
FDA Food Adverse Events (CAERS)Food/supplement adverse event reportsFull adverse event coverage across FDA domains
FDA Product IntelligenceCross-domain FDA intelligence with risk assessmentSingle query across all 9 openFDA endpoints
FDA Intelligence MCPMCP server with 11 FDA toolsAI agent access to the full FDA intelligence suite

Other safety and regulatory actors

ActorDescriptionUse together for
CPSC Product Recall MonitorU.S. Consumer Product Safety Commission recallsMulti-agency product safety tracking
Clinical Trial TrackerClinicalTrials.gov clinical study dataDevice trials to post-market recall surveillance
NHTSA Vehicle Safety SearchVehicle recall and complaint dataComprehensive U.S. safety recall coverage