# FDA 510(k) / PMA Clearance Monitor (medical devices) (`sovereign_workspace/fda-510k-pma-monitor`) Actor

Watch openFDA 510(k) and PMA clearances filtered by product code, applicant, panel, or keywords. Charges once per matched clearance; only-new mode skips repeats.

- **URL**: https://apify.com/sovereign\_workspace/fda-510k-pma-monitor.md
- **Developed by:** [Chase Mariano](https://apify.com/sovereign_workspace) (community)
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 clearance-matcheds

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

## FDA 510(k) / PMA Clearance Monitor

One **event per new FDA device decision**: 510(k) clearances and PMA
approvals and supplements, filtered by the product codes, applicants,
device keywords or review panels you watch. Built for medtech RA,
product and competitive-intelligence teams who need "tell me when a
competitor or my product code gets cleared", not a database dump.

**Pricing: pay per event.** `clearance-matched` — one event per decision
returned. Zero matches costs you nothing.

A filter is required: at least one of product codes, applicants, device
keywords or advisory committees. Different filter fields combine with
AND (a Medtronic decision under product code DQY); entries within one
field combine with OR. PMA "30-Day Notice" supplements (routine
manufacturing-change notices, most PMA decisions in a typical year) are
skipped unless you turn that off.

### Input

```json
{"sources": "both", "applicants": ["medtronic", "boston scientific"],
 "product_codes": ["DQY", "QYI"], "since_days": 30}
```

Run it on a schedule: with **Only decisions not seen before** on (the
default), each decision is returned and charged once per watch, even
when windows overlap. FDA decisions reach openFDA days to weeks after
the decision date (openFDA updates these datasets about monthly), so
keep the window at 30 days or more.

### Example output (one dataset item per decision)

```json
{"source": "510k", "decision_id": "K262526", "submission_number": "K262526",
 "supplement_number": null, "decision_date": "2026-09-13",
 "date_received": "2026-07-22", "decision_code": "SESE",
 "decision_description": "Substantially Equivalent",
 "applicant": "Tianjin Huahong Technology Co., Ltd.",
 "device_name": "Safety lancet (XL)",
 "generic_name": "Single Use Only Blood Lancet With An Integral Sharps Injury Prevention Feature",
 "product_code": "FMK", "device_class": "2", "regulation_number": "878.4850",
 "advisory_committee": "SU", "advisory_committee_description": "General, Plastic Surgery",
 "submission_type": "Traditional", "supplement_reason": null, "summary": "Summary",
 "applicant_state": null, "applicant_country": "CN",
 "fda_url": "https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfpmn/pmn.cfm?ID=K262526"}
```

A PMA supplement looks like this (abridged):

```json
{"source": "pma", "decision_id": "P220026S014", "supplement_number": "S014",
 "decision_date": "2026-09-10", "decision_code": "APPR",
 "applicant": "Medtronic, Inc.", "generic_name": "Ablation catheter, renal denervation",
 "product_code": "QYI", "device_class": "3",
 "submission_type": "Normal 180 Day Track No User Fee",
 "supplement_reason": "Labeling Change - PAS",
 "fda_url": "https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfpma/pma.cfm?id=P220026S014"}
```

### Output fields

One dataset item per result; every field is always present
(empty or null when the source has no value). Defined in
`.actor/dataset_schema.json`.

| Field | Type | Description |
|---|---|---|
| `source` | string | 510k or pma |
| `decision_id` | string | K-number, or PMA number + supplement number (e.g. P150031S084) |
| `submission_number` | string | 510(k) K-number or PMA number |
| `supplement_number` | string or null | PMA supplement number (null for 510(k) and original PMAs) |
| `decision_date` | string or null | FDA decision date, YYYY-MM-DD |
| `date_received` | string or null | Date FDA received the submission, YYYY-MM-DD |
| `decision_code` | string or null | FDA decision code (e.g. SESE, APPR) |
| `decision_description` | string or null | Decision description (510(k) only; e.g. Substantially Equivalent) |
| `applicant` | string or null | Applicant (company) |
| `device_name` | string or null | 510(k) device name or PMA trade name |
| `generic_name` | string or null | PMA generic name, or the 510(k) product code's classification name |
| `product_code` | string or null | FDA product code |
| `device_class` | string or null | Device class (1, 2, 3) from the product classification |
| `regulation_number` | string or null | 21 CFR regulation number |
| `advisory_committee` | string or null | Review panel code |
| `advisory_committee_description` | string or null | Review panel name |
| `submission_type` | string or null | 510(k) clearance type (Traditional, Special, ...) or PMA supplement type |
| `supplement_reason` | string or null | PMA supplement reason |
| `summary` | string or null | PMA approval-order statement (max 500 chars), or 510(k) Summary/Statement flag |
| `applicant_state` | string or null | Applicant's US state |
| `applicant_country` | string or null | Applicant's country code (510(k) only) |
| `fda_url` | string | FDA database page for this decision |

Runs stop cleanly at your max-charge limit: nothing is pushed past
what you agreed to pay for.

Source: openFDA device 510(k) and PMA APIs (public, CC0). Without a key
openFDA allows 1,000 requests per day per IP address, and Apify IPs are
shared, so heavy schedules should add a free openFDA API key. openFDA's
disclaimer: "Do not rely on openFDA to make decisions regarding medical
care. While we make every effort to ensure that data is accurate, you
should assume all results are unvalidated." This Actor is not affiliated
with or endorsed by the FDA. Also see the
[FDA Recall Monitor](https://apify.com/sovereign_workspace/openfda-recall-monitor)
for device, drug and food recalls.

# Actor input Schema

## `profile` (type: `string`):

Named config preset applied at start. Any field you set explicitly below overrides the preset.

## `sources` (type: `string`):

Which FDA device decision databases to watch.

## `product_codes` (type: `array`):

3-letter FDA product codes to watch (e.g. DQY, NHL). Up to 20. At least one of product codes, applicants, device keywords or advisory committees is required.

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

Company names or name fragments to watch, matched as phrases (e.g. medtronic, boston scientific). Up to 5.

## `device_keywords` (type: `array`):

Words or phrases matched against the 510(k) device name and the PMA trade and generic names (e.g. catheter, deep brain). Up to 5.

## `advisory_committees` (type: `array`):

2-letter review panel codes (e.g. CV cardiovascular, NE neurology, SU general and plastic surgery). Up to 10.

## `since_days` (type: `integer`):

How many days back to search by decision date (1-365). FDA decisions reach openFDA days to weeks after the decision, so keep this at 30 or more on a schedule; 'Only decisions not seen before' stops repeats.

## `exclude_30_day_notices` (type: `boolean`):

Leave out PMA '30-Day Notice' supplements (routine manufacturing-change notices, most PMA decisions in a typical year).

## `pma_originals_only` (type: `boolean`):

Return only original PMA approvals, not PMA supplements.

## `only_new` (type: `boolean`):

Skip decisions this same watch (same filters) already returned in an earlier run, so overlapping scheduled windows never charge twice. Kept in a named key-value store in your account.

## `api_key` (type: `string`):

Optional free openFDA key. Without one, openFDA allows 1,000 requests per day per IP, and Apify IPs are shared.

## `limit` (type: `integer`):

Maximum number of decisions to return per run (up to 1000).

## Actor input object example

```json
{
  "sources": "both",
  "since_days": 30,
  "exclude_30_day_notices": true,
  "pma_originals_only": false,
  "only_new": true,
  "limit": 100
}
```

# Actor output Schema

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

No description

## `errorCounters` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("sovereign_workspace/fda-510k-pma-monitor").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("sovereign_workspace/fda-510k-pma-monitor").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 '{}' |
apify call sovereign_workspace/fda-510k-pma-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sovereign_workspace/fda-510k-pma-monitor"
        }
    }
}
```

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/zwyM0nhxUUrqW2Du8/builds/HrFNifiViIEwAcTyd/openapi.json
