FDA PMA Medical Device Approvals Scraper (openFDA)
Pricing
from $7.56 / 1,000 pma approval records
FDA PMA Medical Device Approvals Scraper (openFDA)
Scrape FDA Premarket Approval (PMA) medical device decisions from openFDA. Get PMA number, applicant, trade and generic name, product code, specialty, supplement type, decision and dates. Export JSON, CSV, Excel.
Pricing
from $7.56 / 1,000 pma approval records
Rating
0.0
(0)
Developer
Scrapers Lat
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
11 days ago
Last modified
Categories
Share
FDA PMA Medical Device Approvals Scraper (openFDA)
Here is one real result, with every field the actor returns:
{"pmaNumber": "P170030","supplementNumber": "S065","isOriginal": false,"applicant": "Biotronik AG","tradeName": "ORSIRO Sirolimus Eluting Coronary Stent System","genericName": "Coronary drug-eluting stent","productCode": "NIQ","advisoryCommittee": "CV","specialty": "Cardiovascular","supplementType": "Normal 180 Day Track No User Fee","supplementReason": "Postapproval Study Protocol","expeditedReview": false,"dateReceived": "2026-07-10","decisionDate": "2026-08-07","decision": "Approved","decisionCode": "APPR","daysToDecision": 28,"docketNumber": null,"statement": "Post Approval Study Protocol for the EVO Extended Diameter PAS","applicant_street1": "Ackerstrasse 6","applicant_street2": null,"city": "Bülach","state": null,"zip": "8180","applicantAddress": "Ackerstrasse 6, Bülach, 8180","pmaUrl": "https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfpma/pma.cfm?id=P170030S065","openfda": {"device_name": "Coronary Drug-Eluting Stent","device_class": "3","registration_number": ["3008132398", "1000121056"],"fei_number": ["1000121056", "3002806434"]},"aiSummary": null,"aiDeviceCategory": null,"aiBodySystem": null,"aiRiskLevel": null,"aiTags": null,"observedAt": "2026-08-20T00:36:17.734Z","error": null}
The most complete FDA Premarket Approval (PMA) scraper available. It returns every field the openFDA device PMA database exposes for each approval and supplement, plus derived fields (decision in plain English, daysToDecision, isOriginal, applicantAddress, pmaUrl), optional AI enrichment, and fourteen filters to target exactly the device approvals you need.
📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples
Table of contents
- What it does
- Use cases
- Quickstart
- Input reference
- Output reference
- Example output record
- Run via API and CLI
- Fetch results
- Billing
- FAQ and troubleshooting
What it does
The actor queries the openFDA device PMA dataset, applies the filters you pass as input, paginates through the matching approvals, and writes one normalized record per PMA record (original approval or supplement) to the run's dataset. PMA is the FDA's most stringent device review pathway, used for Class III high-risk devices such as coronary stents, heart valves, pacemakers, implantable defibrillators, spinal implants, and intraocular lenses.
Dates are normalized to YYYY-MM-DD, missing source values are returned as null, and derived fields are computed on top of the raw FDA fields: a plain-English decision, daysToDecision (received to decision), isOriginal (original approval versus supplement), a single-line applicantAddress for CRM or mapping, and a direct pmaUrl into the FDA database.
Two optional AI add-ons (opt-in, off by default) enrich each record: a plain-English summary of what the device is and what the approval covers, and a structured classification (device category, body system, risk level, keyword tags).
This actor covers PMA decisions only. For 510(k) clearances of moderate-risk devices, see the FDA 510(k) Clearances Scraper. For device recalls, see the FDA Drug & Device Recalls Scraper.
Use cases
- Medtech competitive intelligence. Track every PMA approval and supplement for a competitor by
applicantand watch new device launches, label expansions, and manufacturing changes. - Regulatory affairs monitoring. Follow approvals in your
specialty(Cardiovascular, Orthopedic, Ophthalmic, Neurology) and benchmark FDA review timelines withdaysToDecision. - Investment and market research. Surface newly approved high-risk devices, expedited-review approvals, and Panel Track supplements to spot commercial and clinical inflection points.
- Supply chain and sourcing. Map applicant companies, addresses, and the registration and FEI numbers of manufacturing establishments in the
openfdablock. - Clinical and academic research. Build a dataset of approved Class III devices by product code, generic name, and approval date.
- Sales lead generation. Export applicant companies and single-line addresses to target medtech manufacturers and their suppliers.
Quickstart
Open the actor, paste this into the input, and press Run. It returns the 10 most recent approved cardiovascular device PMAs, newest first.
{"specialty": "Cardiovascular","decisionCode": "APPR","sortOrder": "Newest first","maxResults": 10}
Leave every filter empty to pull the most recent PMA records with no filter. All input fields are optional. Free Apify accounts return up to 10 records per run.
Input reference
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
searchQuery | string | no | (empty) | Free-text search against the device trade name (for example stent), OR a raw openFDA field expression such as generic_name:pacemaker. A value containing field: is treated as a raw expression. |
applicant | string | no | (empty) | Applicant company that holds the PMA, exact phrase, for example Medtronic, Abbott, Boston Scientific. |
tradeName | string | no | (empty) | Device trade (brand) name phrase. |
genericName | string | no | (empty) | Device generic name or type, for example Coronary drug-eluting stent. |
productCode | string | no | (empty) | Three-letter FDA product code, for example NIQ, ONU, LPL. |
specialty | enum | no | (any) | FDA advisory committee (medical specialty) that reviewed the device, for example Cardiovascular, Orthopedic, Ophthalmic. |
decisionCode | enum | no | (any) | FDA decision code. APPR approved, OK30 30-day notice acknowledged, APWD approved then withdrawn, APRL approvable, DENY denied. |
supplementType | enum | no | (any) | PMA supplement track, for example Normal 180 Day Track, Panel Track, Real-Time Process, 30-Day Notice. |
state | string | no | (empty) | Applicant two-letter US state code, for example CA, MN, MA. |
pmaNumber | string | no | (empty) | Look up a specific PMA number, for example P160049. |
expeditedOnly | boolean | no | false | Only return devices that received expedited (priority) FDA review. |
originalOnly | boolean | no | false | Only return original PMA approvals (exclude supplements and notices). |
dateFrom | string | no | (empty) | Include records on or after this date (YYYY-MM-DD). Applies to dateField. |
dateTo | string | no | (empty) | Include records on or before this date (YYYY-MM-DD). Applies to dateField. |
dateField | enum | no | decision_date | Which date the range applies to: decision_date or date_received. |
sortOrder | enum | no | (relevance) | Newest first or Oldest first, ordered on dateField. Empty keeps openFDA relevance order. |
withSummary | boolean | no | false | Opt-in AI add-on. Add a plain-English summary per record. Billed only when a summary is produced. Disabled for free accounts. |
withClassify | boolean | no | false | Opt-in AI add-on. Add device category, body system, risk level, and tags per record. Billed only when a classification is produced. Disabled for free accounts. |
maxResults | integer | no | 50 (prefill 10) | Maximum records to collect. Free accounts are capped at 10 per run. |
proxyConfiguration | object | no | (none) | Standard Apify proxy configuration. Not required; the source is a public no-key API. |
Filters combine with logical AND. If you pass no filters, the actor returns PMA records ordered by openFDA relevance.
Output reference
One dataset item per PMA record. Types: string, integer, boolean, string[], object, or null when the source value is absent.
| Field | Type | Description |
|---|---|---|
pmaNumber | string | FDA PMA number, for example P160049. |
supplementNumber | string | Supplement number, for example S008. Empty or zero for original approvals. |
isOriginal | boolean | true for the original PMA approval, false for a supplement or notice. |
applicant | string | Applicant company that holds the PMA. |
tradeName | string | Device trade (brand) name. |
genericName | string | Device generic name or type. |
productCode | string | Three-letter FDA product code. |
advisoryCommittee | string | Advisory committee code, for example CV. |
specialty | string | Advisory committee (medical specialty) description. |
supplementType | string | PMA supplement track. |
supplementReason | string | Reason for the supplement, for example Process Change, Labeling. |
expeditedReview | boolean | true when the device received expedited (priority) review. |
dateReceived | string | Date the FDA received the submission (YYYY-MM-DD). |
decisionDate | string | Date of the FDA decision (YYYY-MM-DD). |
decision | string | Plain-English decision derived from decisionCode. |
decisionCode | string | Raw FDA decision code, for example APPR, OK30. |
daysToDecision | integer | Whole days between dateReceived and decisionDate, or null. |
docketNumber | string | Federal docket number when present, else null. |
statement | string | FDA action or order statement describing the decision. |
applicant_street1 | string | Applicant street address line 1. |
applicant_street2 | string | Applicant street address line 2, or null. |
city | string | Applicant city. |
state | string | Applicant state code. |
zip | string | Applicant ZIP code (with extension when present). |
applicantAddress | string | Single-line applicant address, ready for CRM or mapping. |
pmaUrl | string | Direct link to the record in the FDA PMA database. |
openfda | object | The openFDA harmonization block (device name, class, registration and FEI numbers), or null. |
aiSummary | string | AI plain-English summary of the device and approval, or null when the add-on is off. |
aiDeviceCategory | string | AI device category, or null when the add-on is off. |
aiBodySystem | string | AI affected body system, or null when the add-on is off. |
aiRiskLevel | string | AI risk level (high, medium, low), or null when the add-on is off. |
aiTags | string[] | AI keyword tags, or null when the add-on is off. |
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 {"applicant": "Medtronic", "decisionCode": "APPR", "maxResults": 5}):
{"pmaNumber": "P130021","supplementNumber": "S016","isOriginal": false,"applicant": "Medtronic, Inc.","tradeName": "MEDTRONIC COREVALVE AND COREVALVE EVOLUT R SYSTEMS","genericName": "Aortic valve, prosthesis, percutaneously delivered","productCode": "NPT","advisoryCommittee": "CV","specialty": "Cardiovascular","supplementType": "Normal 180 Day Track","supplementReason": "Labeling Change - Indications/instructions/shelf life/tradename","expeditedReview": false,"dateReceived": "2015-07-08","decisionDate": "2015-11-10","decision": "Approved","decisionCode": "APPR","daysToDecision": 125,"docketNumber": null,"statement": "APPROVAL FOR MODIFYING THE LABELING TO REMOVE THE PRECAUTIONS REGARDING PATIENTS WITH LOW FLOW/LOW GRADIENT AND END-STAGE RENAL DISEASE.","applicant_street1": "710 Medtronic Pkwy.","applicant_street2": null,"city": "Miinneapolis","state": "MN","zip": "55432","applicantAddress": "710 Medtronic Pkwy., Miinneapolis, MN 55432","pmaUrl": "https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfpma/pma.cfm?id=P130021S016","openfda": null,"aiSummary": null,"aiDeviceCategory": null,"aiBodySystem": null,"aiRiskLevel": null,"aiTags": null,"observedAt": "2026-08-20T00:36:17.000Z","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~fda-pma-device-approvals-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"specialty":"Cardiovascular","decisionCode":"APPR","maxResults":25,"sortOrder":"Newest first"}'
Start a run asynchronously:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~fda-pma-device-approvals-scraper/runs?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"applicant":"Medtronic","maxResults":100}'
Apify CLI:
apify call scrapers_lat/fda-pma-device-approvals-scraper \--input '{"pmaNumber":"P160049"}'
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
This actor uses pay-per-event pricing. Prices follow a tiered discount ladder across Apify plan tiers (highest on the free tier, lowest on the Diamond tier).
| Event | When it fires | Notes |
|---|---|---|
apify-actor-start | Once per run at start | Covers run setup and query preparation. |
result | Per PMA record returned | The primary event. One charge per normalized record written to the dataset. |
ai_summary | Per record, only when withSummary is on and a summary is produced | Opt-in AI add-on. Off by default. Disabled for free accounts. |
ai_classify | Per record, only when withClassify is on and a classification is produced | Opt-in AI add-on. Off by default. Disabled for free accounts. |
- No charge on failure. If a run errors, the actor writes a single item with a populated
errorfield and does not charge aresultfor it. Empty runs cost nothing. - AI add-ons charge only on success. If the AI model returns nothing usable, no
ai_summaryorai_classifycharge is made and the fields staynull. - Spend cap respected. Set
maxTotalChargeUsdon the run; once reached, the actor stops emitting and charging further billable records. - Free Apify plans are capped at 10 records per run, and paid AI add-ons are disabled for free accounts. Upgrade for higher
maxResultsand AI enrichment. - 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
What is a PMA and how is it different from a 510(k)? Premarket Approval (PMA) is the FDA's most stringent review pathway, required for Class III high-risk devices. A 510(k) clearance is for moderate-risk devices shown to be substantially equivalent to an existing device. This actor covers PMA decisions; use the 510(k) actor for clearances.
What is the difference between an original approval and a supplement?
The original PMA is the first approval of a device. Supplements cover later changes such as expanded indications, labeling updates, or manufacturing changes. Use originalOnly to exclude supplements, or read the isOriginal and supplementNumber fields.
A run returned 0 records. Why?
The filter combination matched nothing in the source. Loosen filters (for example remove state or widen the date range). Zero-result runs are not charged.
What does decisionCode OK30 mean?
OK30 means the FDA acknowledged a 30-day notice for a manufacturing or process change. APPR means approved. The decision field carries the plain-English version.
How do the AI add-ons work?
Set withSummary or withClassify to true on a paid Apify account. Each enabled add-on runs one model call per record and writes its fields, charging only when it produces usable output. They are disabled for free accounts.
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 510(k) Clearances Scraper: FDA 510(k) clearances for moderate-risk devices.
- FDA Drug & Device Recalls Scraper: FDA drug and device recall actions.
- openFDA Device Events Scraper: FDA device adverse event reports (MAUDE).
- openFDA Device Establishments Scraper: FDA device manufacturer registrations and listings.
- openFDA Food Recall & Enforcement Scraper: US FDA food recalls and enforcement actions.
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.
