openFDA Drug, Device & Biologics Recall Scraper (USA)
Pricing
from $9.20 / 1,000 results
openFDA Drug, Device & Biologics Recall Scraper (USA)
Scrape FDA drug, medical device and biologics recalls and enforcement reports from the official openFDA API. Extract recall number, hazard class, product, reason, recalling firm, location, dates, product codes and 510(k) numbers. Export JSON, CSV or Excel.
Pricing
from $9.20 / 1,000 results
Rating
0.0
(0)
Developer
Scrapers Lat
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
openFDA Drug, Device & Biologics Recall Scraper (USA)
Here is one real result, with every field the actor returns (the distributionPattern is trimmed here for length; AI add-on fields included):
{"source": "enforcement","endpoint": "/device/enforcement.json","recallNumber": "Z-2372-2023","status": "Ongoing","classification": "Class I","productType": "Devices","productDescription": "MAHURKAR 12 Fr High Pressure Triple Lumen Acute Dialysis Catheter, 24 cm, Straight Extensions, IC Tray REF: 8888102004HP","reasonForRecall": "Catheter center lumen was found to have an occlusion in the tip of the catheter; the source of the occlusion an excessive MDX, a silicone-based lubricant which coats the catheter tip. An occluded catheter may lead to full obstruction resulting in delay to treatment, hemolysis, embolism or thrombosis.","recallingFirm": "Covidien LP","city": "Mansfield","state": "MA","country": "United States","postalCode": "02048-1113","addressLine1": "15 Hampshire St","addressLine2": null,"distributionPattern": "US Nationwide - Worldwide Distribution. Foreign: Argentina Austria Bahrain Bangladesh Belgium Brazil Canada China ...","productQuantity": "685 units","codeInfo": "GTIN: 20884521128009 LOT Numbers: 2200400154","moreCodeInfo": null,"voluntaryMandated": "Voluntary: Firm initiated","initialFirmNotification": "Letter","recallInitiationDate": "2023-06-28","centerClassificationDate": "2023-08-11","reportDate": "2023-08-23","terminationDate": null,"eventId": "92660","productCode": null,"kNumbers": null,"rootCauseDescription": null,"action": null,"firmFeiNumber": null,"additionalInfoContact": null,"classificationLevel": 1,"active": true,"firmAddress": "15 Hampshire St, Mansfield, MA 02048-1113, United States","recallAgeDays": 1087,"distributionNationwide": true,"distributionStates": ["PR"],"riskScore": 90,"openfda": null,"observedAt": "2026-08-14T07:37:17.542Z","aiSummary": "The MAHURKAR High Pressure Triple Lumen Acute Dialysis Catheter was recalled due to an occlusion in the catheter's center lumen, caused by excessive silicone-based lubricant. This poses a serious hazard as it can lead to full catheter obstruction, delaying treatment, or cause complications such as hemolysis, embolism, or thrombosis.","aiSeverity": "critical","aiSeverityScore": 95,"error": null}
The most complete FDA drug and device recall scraper available. It returns every field the FDA drug, device and biologics enforcement reports expose (recall number, class, product, reason, firm, distribution, code info and dates), adds the richer device recall database (product code, 510(k) numbers, root cause, firm action) and derived fields like riskScore and distributionStates, and offers optional AI summary and severity add-ons, with 15+ filters to target exactly the recalls you need.
📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples
Table of contents
- What it does
- Quickstart
- Input reference
- Output reference
- Example output record
- Run via API and CLI
- Fetch results
- Billing and limits
- FAQ and troubleshooting
What it does
The actor queries the openFDA drug and device enforcement datasets, applies the filters you pass, paginates through the matching recalls, and writes one normalized record per recall to the run's dataset. Choose productType to pull drugs, devices, biologics, or all combined. Enable deviceRecallDatabase for the richer FDA device recall database, which adds product code, 510(k) numbers, root cause and firm action.
Dates are normalized to YYYY-MM-DD, missing source values are returned as null, and a set of derived fields (riskScore, distributionStates, distributionNationwide, firmAddress, recallAgeDays, classificationLevel, active) is computed on top of the raw FDA fields. Two optional AI add-ons produce a plain-English summary and a health-risk severity rating.
Quickstart
Open the actor, paste this into the input, and press Run. It returns the 10 most recent Class I device recalls, newest first.
{"productType": "Devices","classification": "Class I","sortOrder": "Newest first","maxRecalls": 10}
Leave every field empty to pull the most recent drug and device recalls combined. Add searchQuery, state, recallingFirm or a date range to narrow the results.
Input reference
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
productType | enum | no | (all) | `` (all: drug + device), Drugs, Devices, Biologics. |
deviceRecallDatabase | boolean | no | false | Pull from the richer FDA device recall database instead of enforcement reports. Adds product code, 510(k) numbers, root cause and firm action. Overrides productType (device-only). |
searchQuery | string | no | (empty) | A keyword matched to the recall reason (for example contamination, sterility, malfunction), or a raw openFDA expression such as product_description:insulin or recalling_firm:Pfizer. |
classification | enum | no | (any) | Hazard class: Class I (most serious), Class II, Class III. Applies to enforcement reports. |
status | enum | no | (any) | Ongoing, Completed, Terminated, Pending, or Open (device recall database). |
state | enum | no | (any) | Two-letter US state code of the recalling firm, for example CA, NY, NJ. |
recallingFirm | string | no | (empty) | Firm or manufacturer name phrase, for example Pfizer, Medtronic, Baxter. |
productDescription | string | no | (empty) | Word or phrase in the product description, for example insulin, catheter, pacemaker, vaccine. |
productCode | string | no | (empty) | FDA device product code, for example LWS, DXN. Only applies to the device recall database. |
city | string | no | (empty) | City of the recalling firm, for example Minneapolis, Boston. |
country | string | no | (empty) | Country of the recalling firm, for example United States, Germany. Applies to enforcement reports. |
voluntaryMandated | enum | no | (any) | Voluntary (firm initiated) or Mandated (FDA ordered). Applies to enforcement reports. |
dateFrom | string | no | (empty) | Include recalls on or after this date (YYYY-MM-DD). Applies to dateField. |
dateTo | string | no | (empty) | Include recalls on or before this date (YYYY-MM-DD). Applies to dateField. |
dateField | enum | no | report_date | Which date the range applies to: report_date, recall_initiation_date, center_classification_date, termination_date. |
sortOrder | enum | no | (relevance) | Newest first or Oldest first, ordered on dateField. Empty keeps openFDA relevance order. |
recallNumber | string | no | (empty) | Look up one exact FDA recall number, for example D-321-2016 (drug), Z-2372-2023 (device). |
eventId | string | no | (empty) | Pull every recall in one FDA recall event, for example 92660. Applies to enforcement reports. |
withAiSummary | boolean | no | false | AI add-on: plain-English summary of each recall (paid). |
withAiSeverity | boolean | no | false | AI add-on: health-risk severity rating with a 0-100 score (paid). |
maxRecalls | integer | no | 10 | Maximum recall records to collect. openFDA paginates with skip up to 25000. |
Filters combine with logical AND.
Output reference
One dataset item per recall. Types: string, integer, boolean, string[], object, or null when the source value is absent. The productCode through additionalInfoContact fields populate mainly from the device recall database. Fields prefixed ai populate only when the matching AI add-on is enabled.
| Field | Type | Description |
|---|---|---|
source | string | Which dataset the record came from (enforcement or device-recall). |
endpoint | string | The openFDA endpoint queried, for example /device/enforcement.json. |
recallNumber | string | FDA recall number (unique per recall). |
status | string | Recall status: Ongoing, Completed, Terminated, Pending, or Open. |
classification | string | Hazard class: Class I, Class II, or Class III. |
productType | string | Drugs, Devices, or Biologics. |
productDescription | string | Full description of the recalled product. |
reasonForRecall | string | Narrative reason the product was recalled. |
recallingFirm | string | Firm or manufacturer subject to the recall. |
city | string | City of the recalling firm. |
state | string | Two-letter state code of the recalling firm. |
country | string | Country of the recalling firm. |
postalCode | string | Postal code of the recalling firm. |
addressLine1 | string | First line of the firm street address. |
addressLine2 | string | Second line of the firm street address, or null. |
distributionPattern | string | Free-text description of where the product was distributed. |
productQuantity | string | Quantity of product in distribution. |
codeInfo | string | Lot codes, GTINs, best-by dates identifying affected product. |
moreCodeInfo | string | Additional code information, or null. |
voluntaryMandated | string | Whether the recall was firm initiated (voluntary) or FDA mandated. |
initialFirmNotification | string | How the firm first notified the public or trade. |
recallInitiationDate | string | Date the firm started the recall (YYYY-MM-DD). |
centerClassificationDate | string | Date the FDA center classified the recall (YYYY-MM-DD). |
reportDate | string | Date the recall was first reported by the FDA (YYYY-MM-DD). |
terminationDate | string | Date the recall was terminated (YYYY-MM-DD), or null if still open. |
eventId | string | FDA event ID grouping related recalls. |
productCode | string | FDA device product code (device recall database). |
kNumbers | string[] | Related 510(k) numbers (device recall database). |
rootCauseDescription | string | Root cause of the device recall (device recall database). |
action | string | Firm action taken (device recall database). |
firmFeiNumber | string | Firm FDA Establishment Identifier (device recall database). |
additionalInfoContact | string | Additional information contact (device recall database). |
classificationLevel | integer | Numeric hazard rank: 1 = Class I, 2 = Class II, 3 = Class III, null if unknown. |
active | boolean | true while the recall is Ongoing, Pending or Open, otherwise false. |
firmAddress | string | Single-line firm postal address, ready for CRM or mapping. |
recallAgeDays | integer | Whole days between reportDate and the run time. |
distributionNationwide | boolean | true when the distribution text names nationwide or all-states distribution. |
distributionStates | string[] | US state codes parsed from distributionPattern. |
riskScore | integer | Composite 0 to 100 hazard score combining severity, recency and distribution scope. null if severity is unknown. |
openfda | object | The openFDA harmonization block when present, otherwise null. |
observedAt | string | ISO 8601 timestamp of when the record was collected. |
aiSummary | string | AI plain-English summary of the recall (AI). |
aiSeverity | string | AI health-risk rating: low, medium, high, critical (AI). |
aiSeverityScore | integer | AI severity score, 0 to 100 (AI). |
error | string | null on success. On a failed run, a single item with a populated error field is written instead. |
Example output record
The hero record at the top of this page is a real record from a live run (input {"productType":"Devices","classification":"Class I","withAiSummary":true,"withAiSeverity":true,"maxRecalls":10}), with the distributionPattern trimmed for length.
Run via API and CLI
Start a run and wait for it to finish, then read the dataset. Replace <TOKEN> with your Apify API token.
Run synchronously and get dataset items in one call:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~fda-drug-device-recalls-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"productType":"Drugs","classification":"Class I","searchQuery":"contamination","maxRecalls":25,"sortOrder":"Newest first"}'
Start a run asynchronously:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~fda-drug-device-recalls-scraper/runs?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"deviceRecallDatabase":true,"recallingFirm":"Medtronic","maxRecalls":100}'
Apify CLI:
apify call scrapers_lat/fda-drug-device-recalls-scraper \--input '{"eventId":"92660"}'
Fetch results
Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:
# JSONcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"# CSVcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"# Paginate large datasetscurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
<DATASET_ID> is returned as defaultDatasetId in the run object. Use offset and limit to page through large result sets. clean=true drops empty and internal fields.
Billing and limits
- Pay per result. You are charged per recall returned (
resultevent). See the pricing tab for the current per-result price. - AI add-ons are billed separately.
withAiSummaryandwithAiSeverityare paid add-ons, charged only when they return usable output. - No charge on failure. If a run errors, the actor writes a single item with a populated
errorfield and does not charge for it. Empty runs cost nothing. - Spend cap respected. Set
maxTotalChargeUsdon the run; once reached, the actor stops emitting and charging further billable results. - Free Apify plans are capped at 10 records per run. Upgrade for higher
maxRecalls. - Source pagination ceiling. openFDA allows a
skipoffset up to 25000 per query. For larger pulls, split the work with narrower filters or date ranges.
FAQ and troubleshooting
A run returned 0 records. Why?
The filter combination matched nothing. Loosen filters (remove state or classification, widen the date range), or confirm the keyword exists in the recall reason. Zero-result runs are not charged.
How do I get product code, 510(k) numbers and root cause?
Enable deviceRecallDatabase. It pulls from the richer FDA device recall database and adds productCode, kNumbers, rootCauseDescription, action and firmFeiNumber. It is device-only and overrides productType.
What is the difference between drugs, devices and biologics?
Drugs and biologics come from the drug enforcement endpoint; devices from the device enforcement endpoint. productType empty combines drug and device enforcement reports.
What do the AI add-ons do?
withAiSummary adds a plain-English summary. withAiSeverity adds a health-risk rating and a 0-100 score. Both are optional, paid, and charged only when they return usable output.
Why is terminationDate null?
The recall is still open (Ongoing, Pending or Open), so the FDA has not set a termination date. Missing values are returned as null, never invented.
Is this an official FDA tool? No. This actor is independent and has no affiliation with the FDA or openFDA. It reads only data that is publicly available through the openFDA API. Use it in accordance with the openFDA terms of service.
Related scrapers
- openFDA Food Recalls Scraper: US FDA food recall enforcement records.
- openFDA Drug Events & Recalls Scraper: FDA drug adverse events (FAERS) and recalls.
- FDA Warning Letters Scraper: FDA warning letters with full text.
- FDA Drug Labels Scraper: structured FDA drug label data.
- NHTSA Recalls Scraper: US vehicle safety recalls and complaints.
- CPSC Recalls Scraper: US consumer product safety recalls.
More scrapers at scrapers.lat
Built and maintained by scrapers.lat, where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at scrapers.lat.
Independent tool, not affiliated with the FDA or openFDA. Accesses only publicly available openFDA data. Use in accordance with the openFDA terms of service.
