# Medical Device Clearance Tracker (`arched_friend/medical-device-clearance-tracker`) Actor

Track FDA 510(k) clearances and PMA approvals by device type, product code or company. Returns device, applicant, class, decision date, review time and the FDA record link, newest first, and flags new clearances since your last run. For medtech teams.

- **URL**: https://apify.com/arched\_friend/medical-device-clearance-tracker.md
- **Developed by:** [Peach O](https://apify.com/arched_friend) (community)
- **Categories:** Business, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 decision 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Medical Device Clearance Tracker: Every New FDA 510(k) and PMA Decision

Track FDA 510(k) clearances and PMA approvals by device type, product code or company. You get the device, the applicant, the device class, the decision and its date, how long FDA took to review it, and a link to the official FDA record, newest first. Schedule it, and each run returns only the decisions published since the last one.

Built for medtech teams who want to know when a competitor gets a device cleared, without searching the FDA databases every week.

### How it works

```mermaid
flowchart LR
    A["Device type, product code<br/>or company"] --> B["openFDA 510(k)"]
    A --> C["openFDA PMA"]
    B --> D["One row per decision,<br/>newest first"]
    C --> D
    D --> E{"Since last run?"}
    E -->|not seen| F["new-decision"]
```

There's no scraping and no API key. It reads openFDA, the FDA's own open data API.

### Built for

- **Regulatory affairs teams** finding predicate devices and benchmarking review times
- **Competitive intelligence and product teams** watching rivals' clearances
- **Medtech sales and business development** finding newly cleared devices and the companies behind them
- **Investors and analysts** tracking which companies are getting products to market
- **Consultants** reporting on a device category for clients

### Input

```json
{
  "searchTerms": ["continuous glucose monitor"],
  "applicants": ["Dexcom", "Abbott"],
  "pathways": ["510k", "pma"],
  "lastDays": 90,
  "onlyChanged": true
}
```

| Setting | What it does |
| --- | --- |
| `searchTerms` | Matched against device name, FDA generic name and applicant |
| `applicants` | Only these companies |
| `productCodes` | Three-letter FDA product codes such as `DXY` |
| `pathways` | `510k`, `pma`, or both |
| `includeSupplements` | Include PMA supplements (off by default) |
| `lastDays` | How far back to look by decision date |
| `countries` / `deviceClasses` | Narrow by applicant country or FDA class |
| `onlyChanged` | Return nothing on a quiet run |

### Output

```json
{
  "pathway": "PMA",
  "number": "P250011",
  "deviceName": "ProVee System for BPH",
  "genericName": "STENT, URETHRAL, PROSTATIC, PERMANENT OR SEMI-PERMANENT",
  "applicant": "Proverum, Ltd.",
  "productCode": "MER",
  "deviceClass": "3",
  "medicalSpecialty": "Gastroenterology, Urology",
  "decision": "Approved",
  "decisionDate": "2025-12-09",
  "dateReceived": "2025-04-02",
  "reviewDays": 251,
  "submissionType": "Original PMA",
  "statement": "The ProVee System for BPH is intended for the treatment of obstructive lower urinary tract symptoms...",
  "url": "https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfpma/pma.cfm?id=P250011",
  "changeType": "new-decision",
  "checkedAt": "2026-09-23T20:27:21.650Z"
}
```

A 510(k) row also carries the applicant's country, the submission contact, the submission type (Traditional, Special or Abbreviated) and whether a third party did the review.

**`reviewDays` is FDA's actual review time**, from receipt to decision. Across a product code, it's a realistic benchmark for planning your own submission. The run summary includes the median.

**PMA supplements are off by default.** Labelling changes, manufacturing site moves and 30-day notices outnumber original approvals about fifty to one: 1,611 PMA decisions so far in 2026, of which 30 were new devices. Turn on `includeSupplements` if you do want them.

### Watch a competitor

```json
{
  "applicants": ["Medtronic"],
  "lastDays": 30,
  "onlyChanged": true
}
```

Schedule it weekly. The first run records existing decisions. After that, you get each new clearance or approval once, the week FDA publishes it.

### Run it as an API

```bash
curl -X POST "https://api.apify.com/v2/acts/arched_friend~medical-device-clearance-tracker/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "productCodes": ["QBJ"],
    "lastDays": 365
  }'
```

### Pricing

You pay $0.002 for each decision returned. A quiet run with `onlyChanged` on costs nothing.

| Watching a device category weekly | Monthly cost |
| --- | --- |
| Searching the FDA 510(k) and PMA databases by hand | an hour or more every week |
| Regulatory intelligence subscriptions | often thousands per year |
| This Actor | under $1 per month for most watch lists |

### Common questions

**Why is `country` empty on PMA rows?** FDA doesn't publish a country for PMA approvals, and the Actor won't guess one. The country filter therefore applies only to 510(k) rows and never drops PMA approvals.

**Does it include De Novo decisions?** No. openFDA publishes 510(k) and PMA decisions. De Novo isn't available there.

**How current is it?** openFDA refreshes its device data weekly, usually a few days after FDA posts the decisions.

**Do I need an API key?** No. openFDA is open and keyless.

### Related products

- **FDA Recall Monitor** for recalls of the same devices after launch
- **Clinical Trial Monitor** for devices still in trials
- **Regulation Change Monitor** for FDA rules and guidance in the Federal Register
- **Company Hiring Monitor** to see which device makers are scaling up

# Actor input Schema

## `searchTerms` (type: `array`):

What to watch, one per line, for example glucose monitor, catheter or a company name. Matched against the device name, the FDA generic name and the applicant.

## `applicants` (type: `array`):

Optional. Only decisions for these applicants, one per line. Use this to watch competitors.

## `productCodes` (type: `array`):

Optional. Three-letter FDA product codes, one per line, for example DXY or QBJ.

## `pathways` (type: `array`):

510(k) clearances, PMA approvals or both.

## `includeSupplements` (type: `boolean`):

PMA supplements (labelling changes, site moves, 30-day notices) outnumber original approvals about fifty to one. Leave off to see only new devices.

## `lastDays` (type: `integer`):

How far back to search by FDA decision date.

## `countries` (type: `array`):

Optional. Two-letter country codes, one per line, for example US or CN. Applies to 510(k) rows only, since FDA publishes no country for PMA approvals.

## `deviceClasses` (type: `array`):

Only these FDA device classes. Leave empty for all.

## `applicantExcludes` (type: `array`):

Drop decisions for applicants whose name contains any of these, one per line.

## `onlyChanged` (type: `boolean`):

Return nothing on a quiet run. Turn on for a scheduled watch so you only hear about decisions published since the last run.

## `maxResultsPerPathway` (type: `integer`):

The most decisions to read from each pathway, newest first.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for one page from openFDA before giving up on it.

## `timeBudgetSecs` (type: `integer`):

How long the run may spend before it returns what it has.

## Actor input object example

```json
{
  "searchTerms": [
    "catheter"
  ],
  "pathways": [
    "510k",
    "pma"
  ],
  "includeSupplements": false,
  "lastDays": 90,
  "deviceClasses": [],
  "onlyChanged": false,
  "maxResultsPerPathway": 200,
  "requestTimeoutSecs": 45,
  "timeBudgetSecs": 150
}
```

# Actor output Schema

## `decisions` (type: `string`):

One row per 510(k) clearance or PMA approval with device, applicant, class, dates, review time and FDA link, newest first.

## `runSummary` (type: `string`):

Counts by pathway, new decisions, applicants and median review time.

# 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 = {
    "searchTerms": [
        "catheter"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("arched_friend/medical-device-clearance-tracker").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 = { "searchTerms": ["catheter"] }

# Run the Actor and wait for it to finish
run = client.actor("arched_friend/medical-device-clearance-tracker").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "catheter"
  ]
}' |
apify call arched_friend/medical-device-clearance-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,arched_friend/medical-device-clearance-tracker"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/VgxQWRDQ7gHaSYYl1/builds/GVOZmF0jVDLMY1vCt/openapi.json
