FDA Medical Device Recall Search
Pricing
from $2.00 / 1,000 recall fetcheds
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
Actor stats
0
Bookmarked
3
Total users
0
Monthly active users
7 minutes ago
Last modified
Categories
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_descriptionandreason_for_recallusing 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).
How to use FDA Medical Device Recall Search
- Navigate to the FDA Medical Device Recall Search actor page on Apify.
- Click Try for free to open the actor in Apify Console.
- 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.
- Set Max Results to control how many records you want (default 100, maximum 5,000).
- Click Start to run the actor.
- When the run finishes, view results in the Dataset tab. Export as JSON, CSV, Excel, or access via the Apify API.
Input parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
keyword | string | No | "pacemaker" (prefill) | Search term matched against product descriptions and recall reasons. Examples: "pacemaker", "insulin pump", "hip implant", "ventilator". |
recallingFirm | string | No | -- | Filter by company name. Examples: "Medtronic", "Abbott", "Philips", "Baxter". |
classification | select | No | -- | Recall severity: "Class I" (most serious), "Class II" (moderate), or "Class III" (least serious). |
status | select | No | -- | Recall status: "Ongoing", "Completed", or "Terminated". |
state | string | No | -- | Two-letter U.S. state code where the recalling firm is located (e.g., CA, MN, MA). Automatically uppercased. |
dateFrom | string | No | -- | Start of recall initiation date range (YYYY-MM-DD format). |
dateTo | string | No | -- | End of recall initiation date range (YYYY-MM-DD format). |
maxResults | integer | No | 100 | Maximum 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
| Field | Type | Description |
|---|---|---|
recallNumber | string | Unique FDA recall identification number (e.g., "Z-0839-2024") |
eventId | string | FDA event ID grouping related recall records |
classification | string | Severity level: "Class I", "Class II", or "Class III" |
status | string | Current recall status: "Ongoing", "Completed", or "Terminated" |
recallingFirm | string | Name of the company responsible for the recall |
city | string | City where the recalling firm is located |
state | string | U.S. state where the recalling firm is located (two-letter code) |
country | string | Country where the recalling firm is located |
productDescription | string | Detailed description of the recalled medical device |
productQuantity | string | Number or description of units affected |
reasonForRecall | string | The specific defect or issue that triggered the recall |
distributionPattern | string | Geographic scope of where the device was distributed |
voluntaryMandated | string | Whether the recall was voluntary or FDA-mandated |
initialNotification | string | How the firm initially notified customers (e.g., "Letter", "Press Release") |
codeInfo | string | Lot numbers, serial numbers, or other identifying codes for affected units |
recallDate | string | Date the firm initiated the recall (YYYY-MM-DD) |
classificationDate | string | Date the FDA classified the recall severity (YYYY-MM-DD) |
reportDate | string | Date the recall was reported to the FDA (YYYY-MM-DD) |
terminationDate | string or null | Date the recall was terminated (YYYY-MM-DD), or null if still active |
extractedAt | string | ISO 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 field | Query fragment | Example |
|---|---|---|
keyword | (product_description:"K"+reason_for_recall:"K") | (product_description:"pacemaker"+reason_for_recall:"pacemaker") |
recallingFirm | recalling_firm:"FIRM" | recalling_firm:"Medtronic" |
classification | classification:"CLASS" | classification:"Class I" |
status | status:"STATUS" | status:"Ongoing" |
state | state:"ST" (uppercased) | state:"CA" |
dateFrom / dateTo | recall_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 field | Meaning |
|---|---|
recallDate | The date the recalling firm initiated the recall. This is the primary date used for sorting and filtering. |
reportDate | The date the recall was reported to the FDA. Typically the same day or shortly after the recall initiation date. |
classificationDate | The 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. |
terminationDate | The 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?
| Scenario | Records | API calls | Approx. time | Est. cost |
|---|---|---|---|---|
| Quick keyword search | 100 | 1 | ~5 sec | ~$0.002 |
| Company monitoring | 200--500 | 2--5 | ~10 sec | ~$0.005 |
| Date range trend analysis | 1,000 | 10 | ~30 sec | ~$0.008 |
| Maximum extraction | 5,000 | 50 | ~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
- 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.
- 5,000 result cap -- The actor limits output to 5,000 records per run for practical performance.
- Keyword searches two fields only -- Keywords match
product_descriptionandreason_for_recall. Searching by lot number or serial number is not supported through the keyword field; use thecodeInfooutput field after extraction. - State filter is firm location -- The
statefilter matches where the recalling firm is headquartered, not where the device was distributed. Check thedistributionPatternoutput field for geographic distribution scope. - Date format required -- Dates must be entered in YYYY-MM-DD format. Other formats will produce incorrect API queries.
- Device recalls only -- This actor covers the
/device/enforcement.jsonendpoint. 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
| Class | Severity | Description |
|---|---|---|
| Class I | Most serious | Could cause serious health problems or death |
| Class II | Moderate | May cause temporary or reversible health problems |
| Class III | Least serious | Unlikely to cause adverse health effects |
Programmatic access
Python:
from apify_client import ApifyClientclient = 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 runcurl "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.
Related actors
FDA regulatory intelligence suite
| Actor | Description | Use together for |
|---|---|---|
| FDA 510(k) Device Clearances | Pre-market 510(k) clearance search | Pre-market clearance to post-market recall pipeline |
| FDA PMA Device Approvals | Class III PMA approval search | High-risk device approval to recall correlation |
| FDA Device Adverse Events (MAUDE) | Medical device adverse event reports | Adverse event signals leading to recall actions |
| FDA Drug Approval Search | NDA/ANDA/BLA drug approval search | Cross-domain FDA approval monitoring |
| openFDA Drug Event Monitor | FDA adverse drug event reports (FAERS) | Full FDA safety monitoring across drugs and devices |
| FDA Drug Recall Search | FDA drug enforcement actions | Complete recall coverage across drugs and devices |
| FDA Food Recall Monitor | FDA food enforcement actions | Complete FDA recall monitoring across all product types |
| FDA Food Adverse Events (CAERS) | Food/supplement adverse event reports | Full adverse event coverage across FDA domains |
| FDA Product Intelligence | Cross-domain FDA intelligence with risk assessment | Single query across all 9 openFDA endpoints |
| FDA Intelligence MCP | MCP server with 11 FDA tools | AI agent access to the full FDA intelligence suite |
Other safety and regulatory actors
| Actor | Description | Use together for |
|---|---|---|
| CPSC Product Recall Monitor | U.S. Consumer Product Safety Commission recalls | Multi-agency product safety tracking |
| Clinical Trial Tracker | ClinicalTrials.gov clinical study data | Device trials to post-market recall surveillance |
| NHTSA Vehicle Safety Search | Vehicle recall and complaint data | Comprehensive U.S. safety recall coverage |