FDA PMA Medical Device Approvals Scraper (openFDA) avatar

FDA PMA Medical Device Approvals Scraper (openFDA)

Pricing

from $7.56 / 1,000 pma approval records

Go to Apify Store
FDA PMA Medical Device Approvals Scraper (openFDA)

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

Scrapers Lat

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

11 days ago

Last modified

Share

FDA PMA Medical Device Approvals Scraper (openFDA)

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

Apify Coverage Output Billing

Table of contents

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 applicant and 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 with daysToDecision.
  • 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 openfda block.
  • 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

FieldTypeRequiredDefaultDescription
searchQuerystringno(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.
applicantstringno(empty)Applicant company that holds the PMA, exact phrase, for example Medtronic, Abbott, Boston Scientific.
tradeNamestringno(empty)Device trade (brand) name phrase.
genericNamestringno(empty)Device generic name or type, for example Coronary drug-eluting stent.
productCodestringno(empty)Three-letter FDA product code, for example NIQ, ONU, LPL.
specialtyenumno(any)FDA advisory committee (medical specialty) that reviewed the device, for example Cardiovascular, Orthopedic, Ophthalmic.
decisionCodeenumno(any)FDA decision code. APPR approved, OK30 30-day notice acknowledged, APWD approved then withdrawn, APRL approvable, DENY denied.
supplementTypeenumno(any)PMA supplement track, for example Normal 180 Day Track, Panel Track, Real-Time Process, 30-Day Notice.
statestringno(empty)Applicant two-letter US state code, for example CA, MN, MA.
pmaNumberstringno(empty)Look up a specific PMA number, for example P160049.
expeditedOnlybooleannofalseOnly return devices that received expedited (priority) FDA review.
originalOnlybooleannofalseOnly return original PMA approvals (exclude supplements and notices).
dateFromstringno(empty)Include records on or after this date (YYYY-MM-DD). Applies to dateField.
dateTostringno(empty)Include records on or before this date (YYYY-MM-DD). Applies to dateField.
dateFieldenumnodecision_dateWhich date the range applies to: decision_date or date_received.
sortOrderenumno(relevance)Newest first or Oldest first, ordered on dateField. Empty keeps openFDA relevance order.
withSummarybooleannofalseOpt-in AI add-on. Add a plain-English summary per record. Billed only when a summary is produced. Disabled for free accounts.
withClassifybooleannofalseOpt-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.
maxResultsintegerno50 (prefill 10)Maximum records to collect. Free accounts are capped at 10 per run.
proxyConfigurationobjectno(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.

FieldTypeDescription
pmaNumberstringFDA PMA number, for example P160049.
supplementNumberstringSupplement number, for example S008. Empty or zero for original approvals.
isOriginalbooleantrue for the original PMA approval, false for a supplement or notice.
applicantstringApplicant company that holds the PMA.
tradeNamestringDevice trade (brand) name.
genericNamestringDevice generic name or type.
productCodestringThree-letter FDA product code.
advisoryCommitteestringAdvisory committee code, for example CV.
specialtystringAdvisory committee (medical specialty) description.
supplementTypestringPMA supplement track.
supplementReasonstringReason for the supplement, for example Process Change, Labeling.
expeditedReviewbooleantrue when the device received expedited (priority) review.
dateReceivedstringDate the FDA received the submission (YYYY-MM-DD).
decisionDatestringDate of the FDA decision (YYYY-MM-DD).
decisionstringPlain-English decision derived from decisionCode.
decisionCodestringRaw FDA decision code, for example APPR, OK30.
daysToDecisionintegerWhole days between dateReceived and decisionDate, or null.
docketNumberstringFederal docket number when present, else null.
statementstringFDA action or order statement describing the decision.
applicant_street1stringApplicant street address line 1.
applicant_street2stringApplicant street address line 2, or null.
citystringApplicant city.
statestringApplicant state code.
zipstringApplicant ZIP code (with extension when present).
applicantAddressstringSingle-line applicant address, ready for CRM or mapping.
pmaUrlstringDirect link to the record in the FDA PMA database.
openfdaobjectThe openFDA harmonization block (device name, class, registration and FEI numbers), or null.
aiSummarystringAI plain-English summary of the device and approval, or null when the add-on is off.
aiDeviceCategorystringAI device category, or null when the add-on is off.
aiBodySystemstringAI affected body system, or null when the add-on is off.
aiRiskLevelstringAI risk level (high, medium, low), or null when the add-on is off.
aiTagsstring[]AI keyword tags, or null when the add-on is off.
observedAtstringISO 8601 timestamp of when the record was collected.
errorstringnull 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:

# JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"
# CSV
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"
# Paginate large datasets
curl "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).

EventWhen it firesNotes
apify-actor-startOnce per run at startCovers run setup and query preparation.
resultPer PMA record returnedThe primary event. One charge per normalized record written to the dataset.
ai_summaryPer record, only when withSummary is on and a summary is producedOpt-in AI add-on. Off by default. Disabled for free accounts.
ai_classifyPer record, only when withClassify is on and a classification is producedOpt-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 error field and does not charge a result for it. Empty runs cost nothing.
  • AI add-ons charge only on success. If the AI model returns nothing usable, no ai_summary or ai_classify charge is made and the fields stay null.
  • Spend cap respected. Set maxTotalChargeUsd on 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 maxResults and AI enrichment.
  • Source pagination ceiling. openFDA allows a skip offset 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.

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.