openFDA Medical Device Adverse Events & Recalls Scraper
Pricing
from $6.15 / 1,000 results
openFDA Medical Device Adverse Events & Recalls Scraper
Scrape FDA medical device adverse events (MAUDE), device recalls and 510(k) clearances from the official openFDA API. Extract report number, device brand, manufacturer, event type, product problems and dates across the United States. Export to JSON, CSV or Excel.
Pricing
from $6.15 / 1,000 results
Rating
5.0
(1)
Developer
Scrapers Lat
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
19 hours ago
Last modified
Categories
Share
openFDA Medical Device Events Scraper
Here is one real result, with every field the actor returns for an adverse event (the long mdrText narrative is trimmed here with a note; all values are real):
{"reportNumber": "2032227-2020-110169","mdrReportKey": "10000000","eventType": "Malfunction","dateOfEvent": "2020-03-04","dateReceived": "2020-04-27","deviceBrandName": "630G INSULIN PUMP MMT-1715K 630G BLACK MG","deviceGenericName": "ARTIFICIAL PANCREAS DEVICE SYSTEM, THRESHOLD SUSPEND","manufacturerName": "MEDTRONIC PUERTO RICO OPERATIONS CO.","manufacturerStreet": "CEIBA NORTE IND. PARK #50 ROAD","manufacturerCity": "JUNCOS","manufacturerState": null,"manufacturerZip": "00777","manufacturerCountry": null,"regulationNumber": null,"modelNumber": "MMT-1715K","catalogNumber": "MMT-1715K","lotNumber": "HG2UREC","deviceClass": "3","medicalSpecialty": "Unknown","productCode": "OZO","implant": false,"productProblems": ["No Apparent Adverse Event", "Patient Device Interaction Problem"],"patientOutcomes": null,"reporterOccupation": "OTHER","sourceType": ["Consumer"],"eventLocation": null,"mdrText": "THE INSULIN PUMP WAS RECEIVED WITH A CRACKED CASE (BATTERY TUBE), CRACKED BATTERY TUBE THREADS, BROKEN RESERVOIR TUBE LIP, MISSING RETAINER AND MISSING RESERVOIR TUBE O-RING. [trimmed for length]","manufacturerParentName": "MEDTRONIC PUERTO RICO OPERATIONS CO.","contactName": "GERWIN DE GRAAFF","contactPhone": "8185464805","contactCity": "JUNCOS","contactState": null,"contactCountry": null,"feiNumber": "3003166194","registrationNumber": "2032227","udiDi": "00763000190439","udiPublic": "(01)00763000190439(17)210926","deviceOperator": "LAY USER/PATIENT","numberDevicesInEvent": null,"numberPatientsInEvent": null,"reportSourceCode": "Manufacturer report","healthProfessional": false,"mfrReportType": "Thirty-Day","typeOfReport": ["Initial submission", "Followup"],"remedialAction": ["Recall"],"removalCorrectionNumber": "Z-0955-2020","dateManufacturerReceived": "2020-04-23","observedAt": "2026-08-10T14:41:14.415Z","error": null}
The most complete openFDA medical device events scraper available. It returns every field the openFDA device MAUDE database exposes for each adverse event, including the device, manufacturer and contact block, product problems, patient outcomes, UDI, and the full MDR narrative, and can also pull the device Recalls and 510(k) clearance datasets, with keyword and date filters to target exactly the records 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 calls the openFDA device datasets, applies the filters you pass as input, paginates through the matching records, and writes one normalized record per report to the run's dataset. You choose one of three datasets: Adverse Events (the MAUDE database of device malfunction and injury reports), Recalls (the device recall database), or 510(k) Clearances (the premarket clearance database). Dates are normalized to YYYY-MM-DD and missing source values are returned as null.
The output reference below documents the Adverse Events (MAUDE) fields, which is the default dataset. The Recalls and 510(k) datasets return their own dataset-specific fields from the same openFDA source. Data covers US FDA device reporting.
Quickstart
Open the actor, paste this into the input, and press Run. It returns the 10 most recent insulin pump adverse event reports.
{"maxRecords": 10,"dataset": "event","searchQuery": "insulin pump"}
Leave searchQuery empty to pull the most recent records. Every input field is optional.
Input reference
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
dataset | enum | no | event | Which openFDA device dataset to pull. One of event (Adverse Events / MAUDE), recall (Recalls), 510k (510(k) Clearances). |
searchQuery | string | no | insulin pump | A simple keyword (matched to the device brand name for events, product description for recalls, or device name for 510k), or a raw openFDA expression such as manufacturer_name:Medtronic or event_type:Death. Leave empty for the most recent records. |
maxRecords | integer | no | 10 | Maximum number of records to collect. openFDA paginates with skip up to 25000; for larger pulls narrow the search or date range. |
dateFrom | string | no | (empty) | Include records on or after this date (YYYY-MM-DD). For events this filters the FDA date received, for recalls the date initiated, for 510k the decision date. |
dateTo | string | no | (empty) | Include records on or before this date (YYYY-MM-DD). |
Output reference
One dataset item per report. Fields below are for the Adverse Events (MAUDE) dataset. Types: string, boolean, integer, string[], or null when the source value is absent.
| Field | Type | Description |
|---|---|---|
reportNumber | string | FDA MDR report number. |
mdrReportKey | string | Unique MDR report key. |
eventType | string | Event type: Malfunction, Injury, Death, or Other. |
dateOfEvent | string | Date the event occurred (YYYY-MM-DD). |
dateReceived | string | Date the FDA received the report (YYYY-MM-DD). |
deviceBrandName | string | Device brand (trade) name. |
deviceGenericName | string | Device generic name. |
manufacturerName | string | Manufacturer name. |
manufacturerStreet | string | Manufacturer street address. |
manufacturerCity | string | Manufacturer city. |
manufacturerState | string | Manufacturer state, or null. |
manufacturerZip | string | Manufacturer ZIP. |
manufacturerCountry | string | Manufacturer country, or null. |
regulationNumber | string | FDA regulation number, or null. |
modelNumber | string | Device model number. |
catalogNumber | string | Device catalog number. |
lotNumber | string | Device lot number. |
deviceClass | string | FDA device class: 1, 2, or 3. |
medicalSpecialty | string | Medical specialty of the device. |
productCode | string | Three-letter FDA product code. |
implant | boolean | true when the device is an implant. |
productProblems | string[] | Reported product problems. |
patientOutcomes | string[] | Reported patient outcomes, or null. |
reporterOccupation | string | Occupation of the reporter. |
sourceType | string[] | Report source types, for example Consumer, Health Professional. |
eventLocation | string | Location of the event, or null. |
mdrText | string | Full MDR narrative text (event description and manufacturer narrative). |
manufacturerParentName | string | Parent manufacturer name. |
contactName | string | Manufacturer contact name. |
contactPhone | string | Manufacturer contact phone. |
contactCity | string | Manufacturer contact city. |
contactState | string | Manufacturer contact state, or null. |
contactCountry | string | Manufacturer contact country, or null. |
feiNumber | string | FDA Establishment Identifier. |
registrationNumber | string | FDA registration number. |
udiDi | string | UDI Device Identifier, or null. |
udiPublic | string | Full public UDI string, or null. |
deviceOperator | string | Who was operating the device, for example LAY USER/PATIENT. |
numberDevicesInEvent | integer | Number of devices in the event, or null. |
numberPatientsInEvent | integer | Number of patients in the event, or null. |
reportSourceCode | string | Report source code, for example Manufacturer report. |
healthProfessional | boolean | true when a health professional reported the event. |
mfrReportType | string | Manufacturer report type, for example Thirty-Day. |
typeOfReport | string[] | Report types, for example Initial submission, Followup. |
remedialAction | string[] | Remedial actions taken, for example Recall. |
removalCorrectionNumber | string | Related removal/correction (recall) number, or null. |
dateManufacturerReceived | string | Date the manufacturer received the information (YYYY-MM-DD). |
observedAt | string | ISO 8601 timestamp of when the record was collected. |
error | string | null on success. On a failed run, a single item with a populated error field is written instead. |
Example output record
Real record from a live run (input {"dataset":"event","searchQuery":"insulin pump","maxRecords":10}). The long mdrText narrative is trimmed here with a note; all values are real:
{"reportNumber": "2032227-2020-110169","mdrReportKey": "10000000","eventType": "Malfunction","dateOfEvent": "2020-03-04","dateReceived": "2020-04-27","deviceBrandName": "630G INSULIN PUMP MMT-1715K 630G BLACK MG","deviceGenericName": "ARTIFICIAL PANCREAS DEVICE SYSTEM, THRESHOLD SUSPEND","manufacturerName": "MEDTRONIC PUERTO RICO OPERATIONS CO.","manufacturerCity": "JUNCOS","manufacturerZip": "00777","modelNumber": "MMT-1715K","lotNumber": "HG2UREC","deviceClass": "3","productCode": "OZO","implant": false,"productProblems": ["No Apparent Adverse Event", "Patient Device Interaction Problem"],"sourceType": ["Consumer"],"contactName": "GERWIN DE GRAAFF","contactPhone": "8185464805","feiNumber": "3003166194","registrationNumber": "2032227","udiDi": "00763000190439","deviceOperator": "LAY USER/PATIENT","mfrReportType": "Thirty-Day","remedialAction": ["Recall"],"removalCorrectionNumber": "Z-0955-2020","dateManufacturerReceived": "2020-04-23","observedAt": "2026-08-10T14:41:14.415Z","error": null}
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~openfda-device-events-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"dataset":"event","searchQuery":"event_type:Death","maxRecords":50}'
Start a run asynchronously against the recalls dataset:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~openfda-device-events-scraper/runs?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"dataset":"recall","searchQuery":"catheter","dateFrom":"2024-01-01","maxRecords":100}'
Apify CLI:
apify call scrapers_lat/openfda-device-events-scraper \--input '{"dataset":"510k","searchQuery":"insulin pump"}'
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 report returned (
resultevent). See the pricing tab for the current per-result price. - 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
maxRecords. - Source pagination ceiling. openFDA allows a
skipoffset up to 25000 per query. For larger pulls, split the work with narrower searches or date ranges.
FAQ and troubleshooting
A run returned 0 records. Why?
The search matched nothing in the selected dataset. Loosen the keyword or widen the date range, and confirm you picked the right dataset. Zero-result runs are not charged.
What is the difference between the three datasets?
event is the MAUDE adverse event database (malfunctions and injuries). recall is the device recall database. 510k is the premarket clearance database. Each returns its own field set from the same openFDA source.
How do I filter to deaths or a specific manufacturer?
Use a raw openFDA expression in searchQuery, for example event_type:Death or manufacturer_name:Medtronic.
Why is patientOutcomes or manufacturerCountry null?
Those fields are only present when the FDA report includes them. Missing source values are returned as null, never invented.
How do I read the full narrative?
The mdrText field carries the complete MDR narrative (event description plus manufacturer analysis) as filed with the FDA.
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
- FDA Registered Medical Device Establishments Scraper: FDA-registered device facilities and their products.
- openFDA Food Recall & Enforcement Scraper: US FDA food recall and enforcement records.
- openFDA Drug Events & Recalls Scraper: FDA drug adverse events and recalls.
- FDA Warning Letters Scraper: FDA warning letters to firms.
- CPSC Product Recalls Scraper: US consumer product recall records.
- Health Canada Recalls Scraper: Canadian product and device 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.
