# FDA Device Establishment Lookup (`sovereign_workspace/fda-device-establishment-lookup`) Actor

One record per FDA-registered medical device establishment matching your firm, number, product code, device or country search, with its listed devices and their 510(k)/De Novo/PMA numbers. Public openFDA source.

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

## Pricing

from $10.00 / 1,000 establishment-records

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 Device Establishment Lookup

One **record per FDA-registered medical device establishment** that
matches your search: firm name, registration or FEI number, product
code, device class, brand name, 510(k)/De Novo/PMA number, country,
state or the operations the facility performs (manufacturer, contract
manufacturer, sterilizer…). Each record joins the facility's
registration (status, address, owner/operator, US agent) to the device
listings that matched, with each listing's product codes, device names,
classes, regulation numbers and the premarket numbers it cites, linked to
FDA's own databases. Built for medtech QA, supplier-qualification,
regulatory and sales teams who need "every contract sterilizer in
California" or "who manufactures under product code DXY", not the raw
listing download.

**Pricing: pay per event.** `establishment-record`: one event per
establishment returned (not per listing). A search with no matches costs
you nothing.

A search is required: at least one of **firm names**, **registration /
FEI numbers**, **product codes**, **proprietary names**, **premarket
numbers**, **states**, **countries** or a **listing-date window**.
Operations and device classes only narrow another filter. Different
fields combine with AND; entries within one field combine with OR.

**Product filters apply to one device.** "Product code JJE, class III"
means one listed device that is both. openFDA's own search matches those
conditions across *different* devices of a listing: in a live check,
all 3 hits for that query were near-misses. This Actor re-checks every
hit and never charges for one.

### Input

```json
{"states": ["CA"], "establishment_types": ["contract_sterilizer"]}
```

Who makes devices under a product code, class III only:

```json
{"product_codes": ["DXY"], "device_classes": ["3"]}
```

Which establishments cite a clearance or approval:

```json
{"premarket_numbers": ["K103680", "DEN220039", "P990040"]}
```

Firm names are whole-word phrases matched against both the facility
name and its owner/operator (`steris` finds STERIS-owned Isomedix
sites).

**Scheduled watches:** turn on **Changes only**. The first run records a
baseline of the search and charges nothing. Later runs return only
establishments that are new, changed (device listings added or removed,
registration status, operations, registration year) or gone, each with
`change_type` and `change_details`. A change is reported exactly once.
openFDA refreshes this data monthly, and a run on unchanged data stops
after one request. A watch can cover up to 15,000 listings.

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

```json
{
 "establishment_key": "reg:3007904765",
 "registration_number": "3007904765",
 "fei_number": "3007904765",
 "name": "ABIOMED EUROPE GMBH",
 "status": "Active",
 "registration_expiry_year": "2026",
 "city": "Aachen North Rhine-Westphalia",
 "country": "DE",
 "owner_operator_name": "Abiomed Europe GmbH",
 "us_agent_business_name": "Abiomed, Inc.",
 "establishment_types": [
  "Manufacture Medical Device"
 ],
 "product_codes": [
  "PYX",
  "OZD"
 ],
 "device_classes": [
  "3"
 ],
 "pma_numbers": [
  "P170011",
  "P140003"
 ],
 "listing_count": 2,
 "listings": [
  {
   "product_codes": [
    "PYX"
   ],
   "device_names": [
    "Temporary Non-Roller Type Right Heart Support Blood Pump"
   ],
   "device_classes": [
    "3"
   ],
   "regulation_numbers": [
    "870.4360"
   ],
   "proprietary_names": [
    "Impella RP",
    "Impella RP Flex with SmartAssist",
    "Impella RP with SmartAssist"
   ],
   "pma_number": "P170011",
   "premarket_type": "PMA",
   "premarket_url": "https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfpma/pma.cfm?id=P170011",
   "listed_dates": [
    "2017-11-09"
   ]
  }
 ],
 "fda_registration_url": "https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfRL/rl.cfm?start_search=1&RegistrationNumber=3007904765",
 "change_type": null,
 "data_last_updated": "2026-09-14"
}
```

(Abridged: every field in the table below is always present, empty or
null when the source has no value.)

### Output fields

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

| Field | Type | Description |
|---|---|---|
| `establishment_key` | string | Stable id: reg:<registration number>, fei:<FEI>, or pending:\<owner/operator number>:<name> for status-5 registrations |
| `registration_number` | string | FDA establishment registration number (null while awaiting assignment) |
| `fei_number` | string | FDA Establishment Identifier (FEI) |
| `name` | string | Establishment (facility) name |
| `status` | string | Registration status: Active, or Active awaiting assignment of registration number |
| `status_code` | string | Registration status code (1 or 5) |
| `registration_expiry_year` | string | Year the registration expires (on 31 December) |
| `initial_importer` | boolean | Whether the facility is an initial importer |
| `address_line_1` | string | Facility address line 1 |
| `address_line_2` | string | Facility address line 2 |
| `city` | string | Facility city |
| `state` | string | Facility US state code |
| `postal_code` | string | Facility ZIP or postal code |
| `country` | string | Facility ISO country code |
| `owner_operator_name` | string | Owner/operator firm name |
| `owner_operator_number` | string | Owner/operator number assigned by CDRH |
| `owner_operator_country` | string | Owner/operator contact country |
| `us_agent_business_name` | string | US agent business name (foreign establishments) |
| `us_agent_country` | string | US agent country |
| `establishment_types` | array | Operations performed, across the returned listings |
| `product_codes` | array | Product codes across the returned listings |
| `device_classes` | array | Device classes across the returned listings (1, 2, 3, U, N, F = HDE) |
| `k_numbers` | array | 510(k) numbers cited by the returned listings |
| `de_novo_numbers` | array | De Novo numbers cited by the returned listings |
| `pma_numbers` | array | PMA numbers cited by the returned listings |
| `listing_count` | integer | Number of returned (matching) device listings |
| `listings_truncated` | boolean | True when more than 300 listings matched and only the first 300 are carried |
| `listings` | array | The matching device listings: product codes, device names, classes, regulation numbers, specialties, proprietary names, operations, 510(k)/De Novo/PMA number with type and FDA database link, exempt flag, listing dates |
| `fda_registration_url` | string | FDA Establishment Registration & Device Listing page for this registration number |
| `change_type` | string | Changes-only mode: new\_establishment, updated or removed; null in lookup mode |
| `change_details` | object | Changes-only mode: added\_listings, removed\_listings and changed\_fields (old/new); null in lookup mode |
| `data_last_updated` | string | openFDA dataset refresh date (openFDA refreshes this data monthly) |

### Coverage and limits

- **Premarket links are partial, as in FDA's data.** 38% of listings
  cite a 510(k) or De Novo number and 0.7% a PMA number; exempt and
  class I devices usually cite none. Links go only to FDA database pages
  verified to resolve (510(k), De Novo, PMA).
- **Counts are openFDA's.** FDA's live Establishment Registration & Device
  Listing site can show more listings for a facility than openFDA carries.
  Each record links the FDA page for the registration.
- **Freshness:** openFDA refreshes this dataset monthly. On 2026-09-23 the
  data was dated 2026-09-14, with listings created through 2026-09-13.
  openFDA notes listing dates "may be unreliable".
- Registrations awaiting a number (status 5) have no registration or FEI
  number and are keyed by owner/operator number and name.
- A lookup reads at most 20,000 listings per run; the status message says
  when a search has more.

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

### Source and terms

Source: the openFDA device registration & listing API
(`api.fda.gov/device/registrationlisting.json`). The data is public domain
(CC0 1.0). 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. An optional free openFDA API key
lifts the unkeyed limit of 1,000 requests per day per IP (Apify IPs are
shared).

Related: the **FDA 510(k) / PMA Clearance Monitor** for new clearance
decisions, the **FDA Drugs@FDA Application Lookup** for drug applications,
and the **FDA Recall Monitor** for enforcement recalls.

# Actor input Schema

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

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

## `firm_names` (type: `array`):

Company names or phrases, matched (case-insensitive, whole words) against the establishment name and its owner/operator firm name, e.g. medtronic, smith & nephew. Up to 5.

## `registration_numbers` (type: `array`):

FDA establishment registration numbers or FEI numbers (5-10 digits). Up to 200.

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

Three-letter FDA device product codes (e.g. DXY, FLL). Only establishments listing a device under one of these codes are returned. Up to 30.

## `device_classes` (type: `array`):

Only listings of devices in these classes. Combined with product codes or a listing window, one listed device must satisfy all of them.

## `proprietary_names` (type: `array`):

Brand names or model phrases matched against the listing's proprietary names, e.g. lifevest. Up to 5.

## `premarket_numbers` (type: `array`):

Find the establishments whose listings cite these premarket numbers, e.g. K103680, DEN220039, P990040. Up to 50.

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

Two-letter ISO country codes of the establishment, e.g. US, DE, CN, MX. Up to 30.

## `states` (type: `array`):

Two-letter US state codes of the establishment, e.g. OH, CA. Up to 60.

## `establishment_types` (type: `array`):

Only listings where the establishment performs one of these operations (manufacturer, contract manufacturer, sterilizer…). Narrows another filter; not a search on its own.

## `listed_since_days` (type: `integer`):

Only devices whose listing was created in the last N days (openFDA notes the listing date may be unreliable); 0 = any date. On its own it's a new-listings feed. Not combinable with changes-only mode.

## `changes_only` (type: `boolean`):

Keep a snapshot of this search in a named key-value store in your account and return only establishments that are new, changed (listings added or removed, status, operations, registration year) or gone since the previous run. The first run records the baseline and charges nothing. A watch may cover up to 15,000 listings.

## `allow_mass_changes` (type: `boolean`):

Changes-only safety guard: if over 20% of 25 or more watched establishments change or vanish at once, the run stops without charging (usually an openFDA data problem). Turn this on to accept it, e.g. after the annual registration renewal.

## `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 establishment records (or changes) to return per run (up to 1000).

## Actor input object example

```json
{
  "firm_names": [
    "zoll"
  ],
  "listed_since_days": 0,
  "changes_only": false,
  "allow_mass_changes": false,
  "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 = {
    "firm_names": [
        "zoll"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sovereign_workspace/fda-device-establishment-lookup").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 = { "firm_names": ["zoll"] }

# Run the Actor and wait for it to finish
run = client.actor("sovereign_workspace/fda-device-establishment-lookup").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 '{
  "firm_names": [
    "zoll"
  ]
}' |
apify call sovereign_workspace/fda-device-establishment-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sovereign_workspace/fda-device-establishment-lookup"
        }
    }
}
```

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/dPaemySZOVyDHMsVa/builds/C9DQrDVFrAr6BK1bK/openapi.json
