# FDA PMA Medical Device Approval Search (`ryanclinton/fda-pma-approvals`) Actor

Search the FDA's database of **55,000+ Premarket Approval (PMA) records** for Class III medical devices — the most stringent pathway for high-risk devices like implantable defibrillators, heart valves, hip implants, and cochlear implants.

- **URL**: https://apify.com/ryanclinton/fda-pma-approvals.md
- **Developed by:** [ryan clinton](https://apify.com/ryanclinton) (community)
- **Categories:** Other, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

$30.00 / 1,000 result returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## FDA PMA Medical Device Approval Search

Search the FDA's database of **55,000+ Premarket Approval (PMA) records** for Class III medical devices — the most stringent pathway for high-risk devices like implantable defibrillators, heart valves, hip implants, and cochlear implants. Filter by device name, company, product code, advisory committee, PMA number, decision code, supplement type, or date range. Each result includes computed days-to-decision timelines not available in the raw FDA data.

No API key required. Just enter a device name like `defibrillator` or a company like `Medtronic` and get structured approval data in seconds.

### Why Use FDA PMA Medical Device Approval Search?

The PMA pathway is reserved for Class III medical devices that "support or sustain human life, are of substantial importance in preventing impairment of human health, or present a potential unreasonable risk of illness or injury." Finding PMA data means navigating the FDA's AccessData interface or constructing complex openFDA queries. This actor handles query construction, pagination (up to 1,000 results), date normalization, decision code mapping, address merging, and computation of days-to-decision — giving you clean, structured JSON ready for analysis pipelines.

### Features

- **Device name search** — find approvals by trade name or generic name (e.g., "defibrillator", "hip implant", "heart valve", "cochlear implant")
- **Company lookup** — search by applicant company (e.g., "Medtronic", "Boston Scientific", "Edwards Lifesciences", "Stryker")
- **Product code filtering** — use FDA's three-letter classification codes (e.g., "NKE" for pacemakers, "DTB" for hip prostheses)
- **PMA number lookup** — retrieve all supplements/amendments for a specific PMA (e.g., "P070008")
- **Advisory committee filter** — narrow by FDA specialty area (20 committees from Anesthesiology to Toxicology)
- **Decision code filter** — filter by outcome: Approved, 30-Day Notice Accepted, Approvable (Letter), Approved (Withdrawn)
- **Supplement type filter** — Original PMA, Panel Track, Real-Time, 180-Day, 30-Day Notice, or Special
- **Date range filtering** — search by decision date range in YYYY-MM-DD format
- **Days-to-decision computation** — calculates elapsed time from FDA receipt to decision, a metric not in the raw API
- **Approval order statement** — includes the FDA's official approval order statement describing what was approved
- **Summary statistics** — automatic decision breakdown, committee distribution, supplement type tallies, and avg/min/max review timelines
- **Retry with backoff** — built-in exponential backoff for API rate limits and transient errors

### How to Use

1. **Enter search criteria** — provide at least one filter: device name, applicant, product code, PMA number, advisory committee, decision code, supplement type, or date range.

2. **Set the result limit** — choose how many records to return (1–1,000). The default is 100. The openFDA API caps results at 1,000 per query.

3. **Run and download** — click "Start" and wait for the run to complete (typically 5–30 seconds). Download the structured JSON dataset.

4. **Review summary stats** — check the run log for automatic summary statistics including avg days-to-decision, decision breakdown, and supplement type distribution.

### Input Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `deviceName` | String | No* | — | Device name search — searches both trade name and generic name |
| `applicant` | String | No* | — | Company/applicant name (e.g., "Medtronic", "Edwards Lifesciences") |
| `productCode` | String | No* | — | FDA three-letter product code (e.g., "NKE", "DTB") |
| `pmaNumber` | String | No* | — | Specific PMA number (e.g., "P070008") — returns all supplements |
| `advisoryCommittee` | Select | No | All | FDA advisory committee code (20 options) |
| `decisionCode` | Select | No | All | Approval decision: Approved, 30-Day Notice, etc. |
| `supplementType` | Select | No | All | Original PMA, Panel Track, Real-Time, 180-Day, 30-Day Notice, Special |
| `decisionDateFrom` | String | No | — | Start of decision date range (YYYY-MM-DD) |
| `decisionDateTo` | String | No | — | End of decision date range (YYYY-MM-DD) |
| `maxResults` | Integer | No | `100` | Maximum records to return (1–1,000) |

*At least one search parameter is required.

#### Input Examples

**Find all pacemaker PMA approvals:**

```json
{
    "deviceName": "pacemaker",
    "maxResults": 100
}
````

**Look up all supplements for a specific PMA:**

```json
{
    "pmaNumber": "P070008",
    "maxResults": 200
}
```

**Medtronic cardiovascular approvals in 2024:**

```json
{
    "applicant": "Medtronic",
    "advisoryCommittee": "CV",
    "decisionDateFrom": "2024-01-01",
    "decisionDateTo": "2024-12-31",
    "maxResults": 500
}
```

**All orthopedic device approvals since 2023:**

```json
{
    "advisoryCommittee": "OR",
    "decisionDateFrom": "2023-01-01",
    "maxResults": 1000
}
```

**Original PMA approvals only (not supplements):**

```json
{
    "supplementType": "Original",
    "decisionDateFrom": "2020-01-01",
    "maxResults": 500
}
```

**Approved (Withdrawn) PMA records:**

```json
{
    "decisionCode": "APWD",
    "maxResults": 100
}
```

**Hip implant approvals by product code:**

```json
{
    "productCode": "DTB",
    "decisionDateFrom": "2023-01-01",
    "maxResults": 200
}
```

#### Input Tips

- Use `pmaNumber` to retrieve the full regulatory history of a specific PMA, including all supplements and amendments.
- Combine `advisoryCommittee` + date range to analyze approval trends in a specialty area over time.
- Set `supplementType` to "Original" to find only initial PMA approvals (excludes the many supplements that make up the bulk of records).
- `decisionCode: "APWD"` finds approvals that were later withdrawn — useful for identifying devices pulled from the market.
- For large result sets, partition your search using date ranges to stay within the 1,000 result limit.
- Device name searches match both `trade_name` and `generic_name` fields.

### Output

Each PMA record includes:

```json
{
    "pmaNumber": "P070008",
    "supplementNumber": "S070",
    "applicant": "Biotronik, Inc.",
    "address": "6024 Jean Rd.",
    "city": "Lake Oswego",
    "state": "OR",
    "zipCode": "97035",
    "genericName": "Pulse generator, pacemaker, implantable, with cardiac resynchronization (CRT-P)",
    "tradeName": "COROX OTW 75 BP & 85 BP; COROX OTW-L 75 BP & 85 BP",
    "productCode": "NKE",
    "advisoryCommittee": "CV",
    "advisoryCommitteeDescription": "Cardiovascular",
    "supplementType": "Normal 180 Day Track",
    "supplementReason": "Change Design/Components/Specifications/Material",
    "expeditedReview": false,
    "dateReceived": "2015-12-23",
    "decisionDate": "2016-05-02",
    "daysToDecision": 131,
    "docketNumber": "",
    "decisionCode": "APPR",
    "decisionDescription": "Approved",
    "aoStatement": "Approval for full body scanning of the ProMRI CRT-D System.",
    "deviceClass": "3",
    "regulationNumber": null,
    "openfdaDeviceName": "Pulse Generator, Pacemaker, Implantable, With Cardiac Resynchronization (Crt-P)",
    "openfdaSpecialty": "Unknown"
}
```

#### Output Fields

| Field | Type | Description |
|-------|------|-------------|
| `pmaNumber` | String | PMA application number (e.g., "P070008") |
| `supplementNumber` | String | Supplement/amendment number (e.g., "S070", "" for originals) |
| `applicant` | String | Company that submitted the PMA |
| `address` | String | Applicant street address |
| `city` | String | Applicant city |
| `state` | String | Applicant state (US two-letter code) |
| `zipCode` | String | Applicant ZIP code |
| `genericName` | String | Generic device name |
| `tradeName` | String | Commercial trade/brand name |
| `productCode` | String | FDA three-letter product classification code |
| `advisoryCommittee` | String | Two-letter advisory committee code |
| `advisoryCommitteeDescription` | String | Full name of the advisory committee |
| `supplementType` | String | Type of submission (Original, 180-Day, 30-Day Notice, etc.) |
| `supplementReason` | String | Reason for the supplement (e.g., design change, labeling, manufacturing) |
| `expeditedReview` | Boolean | Whether the submission received expedited review |
| `dateReceived` | String | Date FDA received the submission (YYYY-MM-DD) |
| `decisionDate` | String | Date of FDA decision (YYYY-MM-DD) |
| `daysToDecision` | Integer / null | Computed days from receipt to decision (not in raw API) |
| `docketNumber` | String | Federal Register docket number |
| `decisionCode` | String | FDA decision code (APPR, OK30, APWD, APRL) |
| `decisionDescription` | String | Human-readable decision (e.g., "Approved", "30-Day Notice Accepted") |
| `aoStatement` | String | FDA Approval Order statement describing what was approved |
| `deviceClass` | String / null | FDA device classification (always "3" for PMA devices) |
| `regulationNumber` | String / null | CFR regulation number |
| `openfdaDeviceName` | String / null | Standardized device name from openFDA enrichment |
| `openfdaSpecialty` | String / null | Medical specialty description from openFDA |

#### Decision Codes

| Code | Meaning | Count |
|------|---------|-------|
| APPR | Approved | 28,022 |
| OK30 | 30-Day Notice Accepted | 26,989 |
| APWD | Approved (Withdrawn) | 393 |
| APRL | Approvable (Letter) | 339 |

#### Supplement Types

| Type | Description |
|------|-------------|
| Original | Initial PMA application for a new device |
| Panel Track | Supplement requiring advisory panel review |
| Real-Time Process | Expedited review for minor changes |
| Normal 180 Day Track | Standard supplement review (180-day timeline) |
| 135 Review Track For 30-Day Notice | 30-day notice with 135-day review track |
| 30-Day Notice | Minor manufacturing/labeling changes |
| Special (Immediate Track) | Expedited for urgent safety-related changes |

### Use Cases

- **Medical device companies** tracking competitor PMA approvals to identify new market entrants and regulatory strategy shifts
- **Regulatory affairs teams** benchmarking FDA review timelines by product code and supplement type to set realistic submission expectations
- **Healthcare investors** researching a company's approved device portfolio for due diligence before funding or acquisition decisions
- **Regulatory consultants** analyzing PMA approval histories to advise clients on supplement strategies and review track selection
- **Patent attorneys** cross-referencing PMA approvals with patent filings to establish prior art and identify licensing opportunities
- **Market research firms** mapping the Class III medical device landscape by advisory committee, applicant, and approval date
- **Quality and compliance auditors** verifying that marketed Class III devices have valid PMA approvals
- **Academic researchers** studying FDA regulatory science — approval timelines, supplement patterns, and market access trends

### How to Use the API

#### Python

```python
import requests
import time

run = requests.post(
    "https://api.apify.com/v2/acts/ryanclinton~fda-pma-approvals/runs",
    params={"token": "YOUR_APIFY_TOKEN"},
    json={
        "applicant": "Medtronic",
        "advisoryCommittee": "CV",
        "decisionDateFrom": "2024-01-01",
        "maxResults": 100
    },
    timeout=30,
).json()

run_id = run["data"]["id"]
while True:
    status = requests.get(
        f"https://api.apify.com/v2/actor-runs/{run_id}",
        params={"token": "YOUR_APIFY_TOKEN"},
        timeout=10,
    ).json()
    if status["data"]["status"] in ("SUCCEEDED", "FAILED", "ABORTED"):
        break
    time.sleep(3)

dataset_id = status["data"]["defaultDatasetId"]
items = requests.get(
    f"https://api.apify.com/v2/datasets/{dataset_id}/items",
    params={"token": "YOUR_APIFY_TOKEN"},
    timeout=30,
).json()

for item in items:
    print(f"{item['pmaNumber']}/{item['supplementNumber']} | {item['tradeName']} | {item['applicant']} | {item['daysToDecision']} days")
```

#### JavaScript

```javascript
const response = await fetch(
    "https://api.apify.com/v2/acts/ryanclinton~fda-pma-approvals/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN",
    {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({
            applicant: "Medtronic",
            advisoryCommittee: "CV",
            decisionDateFrom: "2024-01-01",
            maxResults: 100,
        }),
    }
);

const approvals = await response.json();
approvals.forEach(a =>
    console.log(`${a.pmaNumber}/${a.supplementNumber} | ${a.tradeName} | ${a.daysToDecision} days`)
);
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/ryanclinton~fda-pma-approvals/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "applicant": "Medtronic",
    "advisoryCommittee": "CV",
    "decisionDateFrom": "2024-01-01",
    "maxResults": 100
  }'
```

### How It Works

```
Input (deviceName, applicant, productCode, pmaNumber, committee, dates, filters)
  |
  v
+--------------------------------------------------+
|  Step 1: Build Search Query                      |
|  Construct openFDA Lucene-style query string     |
|  from input parameters. Device name searches     |
|  both trade_name and generic_name with OR.       |
|  Date ranges converted to YYYYMMDD for API.      |
|  Terms joined with +AND+ conjunction.            |
+--------------------------------------------------+
  |
  v
+--------------------------------------------------+
|  Step 2: Paginated Fetch                         |
|  Fetch up to 100 results per request using       |
|  skip/limit pagination. Continue until           |
|  maxResults reached or no more results.          |
|  Retry with exponential backoff on 429/errors.   |
+--------------------------------------------------+
  |
  v
+--------------------------------------------------+
|  Step 3: Transform & Enrich                      |
|  Normalize field names to camelCase.             |
|  Format dates from YYYYMMDD to YYYY-MM-DD.       |
|  Merge address fields. Convert Y/N to boolean.   |
|  Map decision codes to human-readable names.     |
|  Extract openFDA enrichment (class, regulation). |
+--------------------------------------------------+
  |
  v
+--------------------------------------------------+
|  Step 4: Compute Days to Decision                |
|  Calculate elapsed days between dateReceived     |
|  and decisionDate for each PMA record.           |
|  This metric is NOT in the raw openFDA data.     |
+--------------------------------------------------+
  |
  v
+--------------------------------------------------+
|  Step 5: Summary Statistics                      |
|  Compute avg/min/max daysToDecision.             |
|  Tally decision codes, advisory committees,      |
|  and supplement types. Log to run output.        |
+--------------------------------------------------+
  |
  v
Structured PMA approval records pushed to dataset
```

#### Data Sources

| Source | API Endpoint | Auth Required | Records |
|--------|-------------|---------------|---------|
| FDA openFDA PMA | `https://api.fda.gov/device/pma.json` | No | 55K+ |

#### Advisory Committee Reference

| Code | Specialty | Code | Specialty |
|------|-----------|------|-----------|
| AN | Anesthesiology | MI | Microbiology |
| CH | Clinical Chemistry | NE | Neurology |
| CV | Cardiovascular | OB | Obstetrics/Gynecology |
| DE | Dental | OP | Ophthalmic |
| EN | Ear, Nose & Throat | OR | Orthopedic |
| GU | Gastroenterology/Urology | PA | Pathology |
| HO | General Hospital | PM | Physical Medicine |
| HE | Hematology | RA | Radiology |
| IM | Immunology | SU | General/Plastic Surgery |
| — | — | TX | Clinical Toxicology |

#### Common Product Codes (Class III)

| Code | Device Category | Code | Device Category |
|------|----------------|------|----------------|
| NKE | Pacemakers (CRT-P) | DTB | Hip Prostheses |
| LWS | Defibrillators (ICD) | NIQ | Knee Prostheses |
| DXY | Heart Valves | MGB | Intraocular Lenses |
| QBJ | TAVR Systems | LZG | Cochlear Implants |
| MAF | Coronary Stents | LYZ | Neurostimulators |

### How Much Does It Cost?

| Scenario | Results | Est. Time | Est. Cost |
|----------|---------|-----------|-----------|
| Single PMA number lookup | 1–200 | 3–10 sec | < $0.01 |
| Company search (100 results) | 100 | 10 sec | < $0.01 |
| Full committee + year (1,000 results) | 1,000 | 30 sec | ~$0.02 |

The actor uses 256 MB memory and makes lightweight API calls with no browser rendering. The Apify free tier covers thousands of runs per month.

### Tips

- **Use product codes for precision** — device name searches return broad matches. Product codes target exact categories. Look up codes in the [FDA Product Classification Database](https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfpcd/classification.cfm).
- **Filter to "Original" for new device approvals** — most PMA records are supplements to existing approvals. Set `supplementType` to "Original" to find only initial device approvals.
- **PMA number returns full history** — searching by `pmaNumber` returns the original approval plus all subsequent supplements, giving you the complete regulatory lifecycle of a device.
- **Check daysToDecision for timeline planning** — if your company is preparing a PMA submission, filter by your product code and check average review times across supplement types.
- **APWD = withdrawn approvals** — search `decisionCode: "APWD"` to find devices that were approved but later had their approval withdrawn — critical intelligence for safety and competitive analysis.
- **Partition large searches by date** — the openFDA API caps at 1,000 results per query. Use yearly date ranges for comprehensive data.
- **Cross-reference with MAUDE data** — use the `pmaNumber` from MAUDE adverse event reports to look up the original approval record.

### Limitations

- **1,000 result cap** — the openFDA API limits results to 1,000 per query. Use date range partitioning for larger datasets.
- **Supplements dominate results** — most records are supplements (30-Day Notices, 180-Day supplements), not original PMAs. Use the `supplementType` filter to narrow results.
- **No clinical trial data** — PMA records include the approval decision and supplement details, but not the underlying clinical trial data submitted to the FDA.
- **No predicate/comparison device** — unlike 510(k), PMA records do not reference predicate devices.
- **openFDA enrichment gaps** — `deviceClass`, `regulationNumber`, and `openfdaDeviceName` come from the openFDA enrichment layer and may be null for some records.
- **Supplement type search is exact match** — the supplement type must match the exact string in the database. Use the provided select options for best results.
- **Rate limiting** — the openFDA API enforces rate limits. The actor handles this with exponential backoff, but rapid sequential runs may experience delays.

### Responsible Use

- **All data is public domain** — FDA PMA data is published by the US government and is freely available without restrictions.
- **Respect openFDA rate limits** — the actor includes built-in retry with backoff. Avoid launching dozens of concurrent runs.
- **Use for legitimate purposes** — designed for regulatory intelligence, market research, due diligence, competitive analysis, and academic research.
- **Verify critical decisions** — for regulatory submissions, always verify PMA data against the official [FDA PMA Database](https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfPMA/pma.cfm).

### FAQ

**Is an API key required?**
No. The openFDA API is free and requires no authentication.

**How current is the data?**
The openFDA database is updated regularly. New PMA decisions typically appear within days to weeks.

**What is the difference between PMA and 510(k)?**
PMA is the most stringent FDA pathway, required for Class III (highest-risk) medical devices. It requires clinical trial evidence. 510(k) is for lower-risk devices that can demonstrate substantial equivalence to a predicate device. PMAs take longer and cost more but are required for devices like pacemakers, heart valves, and hip implants.

**Why do most results show a supplement number?**
After a PMA is originally approved, any change to the device (design, labeling, manufacturing, materials) requires a PMA supplement. A single PMA can accumulate hundreds of supplements over its lifetime. Use `supplementType: "Original"` to find only initial approvals.

**What does the aoStatement field contain?**
The Approval Order Statement is the FDA's official description of what was approved in that specific submission. For supplements, it describes the specific change (e.g., "Approval for full body scanning of the ProMRI CRT-D System").

**How is daysToDecision calculated?**
It is the number of calendar days between `dateReceived` (when FDA received the submission) and `decisionDate` (when FDA issued its decision). This is computed by the actor — not available in the raw API.

**Can I find which devices had their approvals withdrawn?**
Yes. Set `decisionCode` to "APWD" (Approved, Withdrawn) to find PMA approvals that were later withdrawn from the market.

**How far back does the data go?**
The PMA database contains records from the 1970s to present — the entire history of the PMA program since it was established by the Medical Device Amendments of 1976.

### Integrations

- **Apify API** — trigger runs programmatically for regulatory intelligence pipelines
- **Zapier** — automatically search for new PMA approvals when a competitor is added to your list
- **Make (Integromat)** — build workflows that monitor new approvals in your advisory committee weekly
- **Google Sheets** — export PMA data directly for regulatory strategy analysis and timeline benchmarking
- **Webhooks** — receive approval data as soon as the run completes
- **Scheduled Runs** — run weekly or monthly to track new PMA approvals in your product category

### Related Actors

| Actor | What it does | Use with FDA PMA |
|-------|-------------|------------------|
| [FDA 510(k) Device Clearance Search](https://apify.com/ryanclinton/fda-510k-clearances) | Search 174K+ 510(k) clearances | Compare 510(k) vs PMA pathways for similar devices |
| [FDA Device Adverse Event Search (MAUDE)](https://apify.com/ryanclinton/fda-device-events) | Search 24M+ adverse events | Cross-reference PMA devices with their safety history |
| [FDA Medical Device Recall Search](https://apify.com/ryanclinton/fda-device-recalls) | Search FDA device recalls | Find recalls for PMA-approved devices |
| [openFDA Drug Event Monitor](https://apify.com/ryanclinton/openfda-drug-events) | FDA drug adverse events | Companion for combination drug/device products |
| [Clinical Trial Tracker](https://apify.com/ryanclinton/clinical-trial-tracker) | ClinicalTrials.gov search | Find clinical trials supporting PMA submissions |
| [SEC EDGAR Filing Analyzer](https://apify.com/ryanclinton/sec-edgar-filing-analyzer) | SEC filing analysis | Research financial impact of PMA approvals on public companies |

# Actor input Schema

## `deviceName` (type: `string`):

Search by trade name or generic name (e.g., 'pacemaker', 'defibrillator', 'hip implant')

## `applicant` (type: `string`):

Search by applicant company name (e.g., 'Medtronic', 'Boston Scientific', 'Edwards Lifesciences')

## `productCode` (type: `string`):

Three-letter FDA product classification code (e.g., 'NKE' for pacemakers, 'DTB' for hip implants)

## `pmaNumber` (type: `string`):

Look up a specific PMA by number (e.g., 'P070008')

## `advisoryCommittee` (type: `string`):

Filter by FDA advisory committee specialty

## `decisionCode` (type: `string`):

Filter by FDA decision outcome

## `supplementType` (type: `string`):

Filter by PMA submission/supplement type

## `decisionDateFrom` (type: `string`):

Start of decision date range (YYYY-MM-DD format)

## `decisionDateTo` (type: `string`):

End of decision date range (YYYY-MM-DD format)

## `maxResults` (type: `integer`):

Maximum number of PMA records to return (openFDA limit: 1000 per query)

## Actor input object example

```json
{
  "deviceName": "pacemaker",
  "advisoryCommittee": "",
  "decisionCode": "",
  "supplementType": "",
  "maxResults": 100
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "deviceName": "pacemaker"
};

// Run the Actor and wait for it to finish
const run = await client.actor("ryanclinton/fda-pma-approvals").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "deviceName": "pacemaker" }

# Run the Actor and wait for it to finish
run = client.actor("ryanclinton/fda-pma-approvals").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "deviceName": "pacemaker"
}' |
apify call ryanclinton/fda-pma-approvals --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=ryanclinton/fda-pma-approvals",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "FDA PMA Medical Device Approval Search",
        "description": "Search the FDA's database of **55,000+ Premarket Approval (PMA) records** for Class III medical devices — the most stringent pathway for high-risk devices like implantable defibrillators, heart valves, hip implants, and cochlear implants.",
        "version": "1.0",
        "x-build-id": "8KFqFmT9mcvj0qci9"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/ryanclinton~fda-pma-approvals/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-ryanclinton-fda-pma-approvals",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/ryanclinton~fda-pma-approvals/runs": {
            "post": {
                "operationId": "runs-sync-ryanclinton-fda-pma-approvals",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/ryanclinton~fda-pma-approvals/run-sync": {
            "post": {
                "operationId": "run-sync-ryanclinton-fda-pma-approvals",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "deviceName": {
                        "title": "Device Name",
                        "type": "string",
                        "description": "Search by trade name or generic name (e.g., 'pacemaker', 'defibrillator', 'hip implant')"
                    },
                    "applicant": {
                        "title": "Applicant / Company",
                        "type": "string",
                        "description": "Search by applicant company name (e.g., 'Medtronic', 'Boston Scientific', 'Edwards Lifesciences')"
                    },
                    "productCode": {
                        "title": "FDA Product Code",
                        "type": "string",
                        "description": "Three-letter FDA product classification code (e.g., 'NKE' for pacemakers, 'DTB' for hip implants)"
                    },
                    "pmaNumber": {
                        "title": "PMA Number",
                        "type": "string",
                        "description": "Look up a specific PMA by number (e.g., 'P070008')"
                    },
                    "advisoryCommittee": {
                        "title": "Advisory Committee",
                        "enum": [
                            "",
                            "AN",
                            "CH",
                            "CV",
                            "DE",
                            "EN",
                            "GU",
                            "HO",
                            "HE",
                            "IM",
                            "MI",
                            "NE",
                            "OB",
                            "OP",
                            "OR",
                            "PA",
                            "PM",
                            "RA",
                            "SU",
                            "TX"
                        ],
                        "type": "string",
                        "description": "Filter by FDA advisory committee specialty",
                        "default": ""
                    },
                    "decisionCode": {
                        "title": "Decision",
                        "enum": [
                            "",
                            "APPR",
                            "OK30",
                            "APWD",
                            "APRL"
                        ],
                        "type": "string",
                        "description": "Filter by FDA decision outcome",
                        "default": ""
                    },
                    "supplementType": {
                        "title": "Supplement Type",
                        "enum": [
                            "",
                            "Original",
                            "Panel Track",
                            "Real-Time Process",
                            "Normal 180 Day Track",
                            "135 Review Track For 30-Day Notice",
                            "30-Day Notice",
                            "Special (Immediate Track)"
                        ],
                        "type": "string",
                        "description": "Filter by PMA submission/supplement type",
                        "default": ""
                    },
                    "decisionDateFrom": {
                        "title": "Decision Date From",
                        "type": "string",
                        "description": "Start of decision date range (YYYY-MM-DD format)"
                    },
                    "decisionDateTo": {
                        "title": "Decision Date To",
                        "type": "string",
                        "description": "End of decision date range (YYYY-MM-DD format)"
                    },
                    "maxResults": {
                        "title": "Maximum Results",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of PMA records to return (openFDA limit: 1000 per query)",
                        "default": 100
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
