# FDA Device Establishment Registration — Bulk Supplier Lookup (`malekh/fda-device-establishment-registration`) Actor

Look up FDA device establishment registration records in bulk. Screen a supplier list by firm name, registration number, FEI number or owner/operator number and get registration status, establishment types, US agent and every listed device with product code, device class and CFR regulation.

- **URL**: https://apify.com/malekh/fda-device-establishment-registration.md
- **Developed by:** [Malek H](https://apify.com/malekh) (community)
- **Categories:** Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 1,000 results

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 web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 Device Establishment Registration — Bulk Supplier Qualification Lookup

Look up **FDA device establishment registration** records in bulk. Give this
Actor a list of suppliers, contract manufacturers, contract sterilizers,
repackagers, specification developers or importers, and it returns each firm's
FDA device establishment registration, its status, its establishment types and
every device it has listed.

Built for the supplier-qualification and regulatory-intelligence job: *"are all
300 firms on our approved supplier list currently registered with FDA, and for
what?"* — answered in one run instead of 300 manual searches in the FDA
Establishment Registration & Device Listing database.

**Data source:** the [openFDA `device/registrationlisting`
endpoint](https://open.fda.gov/apis/device/registrationlisting/) — the FDA's own
public, versioned, documented API. US Government work, public domain. No
scraping, no CAPTCHAs, no HTML parsing that silently breaks.

***

### What it does

For each supplier you supply, the Actor:

1. Looks the firm up by **registration number**, **FEI number** or **owner /
   operator number** if you have one — these are unambiguous.
2. Falls back to the **exact legal name** as filed with FDA.
3. Falls back again to a **token search with local similarity scoring**, and
   reports the result as a *potential* match only.
4. Returns every matching establishment with its registration status, address,
   US agent, owner/operator, establishment types and listed device products
   (product code, device name, device class, 21 CFR regulation number, medical
   specialty, K-number / PMA number where present).

### Why the output is graded rather than a yes/no

A firm's registered legal name is very often not the name on your purchase
order — `MEDTRONIC, INC.` vs `Medtronic`, or a transliterated foreign
establishment name. Reporting "not registered" because a string did not match
would disqualify a legitimate supplier.

So this Actor only sets `registered: true` on an **identifier-grade or
exact-name** match with an active registration. Everything else is returned with
`requiresManualVerification: true` and guidance explaining what the result does
and does not mean. If openFDA is unreachable or rate-limits the run, the Actor
**fails loudly** rather than reporting everyone as unregistered.

***

### Input

```json
{
  "suppliers": [
    { "supplierId": "SUP-001", "firmName": "MEDTRONIC, INC." },
    { "supplierId": "SUP-002", "registrationNumber": "2124215" },
    { "supplierId": "SUP-003", "feiNumber": "2182208" },
    { "supplierId": "SUP-004", "ownerOperatorNumber": "2112641" }
  ],
  "fuzzyThreshold": 0.5,
  "maxEstablishmentsPerSupplier": 10,
  "openFdaApiKey": ""
}
```

| Field | Type | Default | Meaning |
|---|---|---|---|
| `suppliers` | array | *required* | One object per firm. Any combination of `firmName`, `registrationNumber`, `feiNumber`, `ownerOperatorNumber`. Extra fields (`supplierId`, your internal keys) are echoed back in `input`. |
| `fuzzyThreshold` | number | `0.5` | Minimum token-overlap similarity for a name-only match to be reported at all. Raise it to cut noise, lower it to widen the net. |
| `maxEstablishmentsPerSupplier` | number | `10` | Cap on establishments returned per supplier. Large corporations have hundreds of registered sites. |
| `maxRowsPerQuery` | number | `1000` | Cap on raw openFDA rows fetched per lookup. |
| `openFdaApiKey` | string | `""` | Optional. Anonymous openFDA access is capped at 1,000 requests/day per IP; a [free openFDA key](https://open.fda.gov/apis/authentication/) raises that to 120,000/day. Recommended for lists over ~200 suppliers. |

### Output

One dataset item per supplier:

```json
{
  "input": { "supplierId": "SUP-001", "firmName": "MEDTRONIC, INC." },
  "screenedAt": "2026-07-29T05:00:00+00:00",
  "dataLastUpdated": "2026-07-20",
  "matchType": "name_exact",
  "matchCount": 3,
  "registered": true,
  "activeRegistrationCount": 3,
  "requiresManualVerification": false,
  "guidance": "Identifier-grade match: 3 active FDA device establishment registration(s) found.",
  "establishments": [
    {
      "registrationNumber": "2182208",
      "feiNumber": "2182208",
      "firmName": "MEDTRONIC, INC.",
      "statusCode": "1",
      "registrationActive": true,
      "registrationExpiryYear": "2026",
      "initialImporter": false,
      "establishmentTypes": ["Manufacture Medical Device"],
      "address": { "city": "MINNEAPOLIS", "stateCode": "MN", "countryCode": "US" },
      "ownerOperator": { "number": "2112641", "firmName": "Medtronic, Inc." },
      "usAgent": null,
      "listedProductCount": 42,
      "listedProducts": [
        {
          "productCode": "LWP",
          "deviceName": "Pacemaker, Permanent, Implantable",
          "deviceClass": "3",
          "regulationNumber": "870.3610",
          "medicalSpecialty": "Cardiovascular"
        }
      ]
    }
  ]
}
```

`matchType` is one of `registration_number_exact`, `fei_number_exact`,
`owner_operator_exact`, `name_exact`, `name_fuzzy`, `none` — in descending order
of confidence.

***

### Typical uses

- **Supplier qualification** — confirm every firm on an approved supplier list
  holds a current FDA device establishment registration, on a recurring schedule.
- **Contract manufacturer / contract sterilizer due diligence** — the
  `establishmentTypes` field tells you what the site is actually registered to
  do, not just that it is registered.
- **Import readiness** — check the `initialImporter` flag and the US agent on
  record for foreign establishments.
- **Competitive and market intelligence** — pull every establishment listing a
  given product code or operating in a given country.
- **M\&A and audit prep** — reconcile a target's claimed registrations against
  FDA's own file.

### Notes and limits

- This is the **device** establishment registration file. Drug establishment
  registration is a different FDA dataset.
- Registration is not clearance or approval. A registered establishment may
  still list devices under exemptions; check `listedProducts[].exempt`,
  `kNumber` and `pmaNumber`.
- Registration data is a **snapshot** — check `dataLastUpdated` in every item
  for the vintage of the file you were served.
- openFDA's own disclaimer applies: do not rely on it for decisions regarding
  medical care. For a regulatory decision, confirm against
  [FDA's Establishment Registration & Device Listing database](https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfRL/rl.cfm).

# Actor input Schema

## `suppliers` (type: `array`):

Your supplier list, as objects. Identify each supplier by whichever field you actually hold — "registrationNumber", "feiNumber", "ownerOperatorNumber" or "firmName". Numbers match exactly and are the reliable way to ask; a firm name is matched exactly first, then fuzzily, so a purchase-order name like "Boston Scientific" still resolves to the filed legal name. Add your own "supplierId" and it is echoed on every result — including no-match and error rows — so the output joins straight back onto your approved-vendor list.

## `fuzzyThreshold` (type: `number`):

How close a firm name must be to count as a match, from 0 (anything) to 1 (exact only). Used only when a supplier is identified by name and no exact match exists. Raise it toward 0.7 if you are getting wrong firms back; lower it toward 0.4 if trade names in your list are missing their FDA legal names. Exact and number-based matches ignore this entirely.

## `maxEstablishmentsPerSupplier` (type: `integer`):

A large manufacturer registers many plants. This caps how many establishment records are returned for any one supplier, so a single household name cannot dominate the output. Maximum 100.

## `maxRowsPerQuery` (type: `integer`):

How deep to page into openFDA when resolving one supplier. The default is enough for ordinary lookups; raise it only if a very common firm name is being truncated before its real match is found.

## `openFdaApiKey` (type: `string`):

Optional. openFDA works without a key at 240 requests/minute, which is ample for normal supplier lists. Supply a free key (open.fda.gov/apis/authentication) only if you are screening a very large list and hitting rate limits.

## Actor input object example

```json
{
  "suppliers": [
    {
      "supplierId": "V-1",
      "registrationNumber": "2182208"
    },
    {
      "supplierId": "V-2",
      "firmName": "Boston Scientific"
    }
  ],
  "fuzzyThreshold": 0.5,
  "maxEstablishmentsPerSupplier": 10,
  "maxRowsPerQuery": 1000
}
```

# 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 = {
    "suppliers": [
        {
            "supplierId": "V-1",
            "registrationNumber": "2182208"
        },
        {
            "supplierId": "V-2",
            "firmName": "Boston Scientific"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("malekh/fda-device-establishment-registration").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 = { "suppliers": [
        {
            "supplierId": "V-1",
            "registrationNumber": "2182208",
        },
        {
            "supplierId": "V-2",
            "firmName": "Boston Scientific",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("malekh/fda-device-establishment-registration").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 '{
  "suppliers": [
    {
      "supplierId": "V-1",
      "registrationNumber": "2182208"
    },
    {
      "supplierId": "V-2",
      "firmName": "Boston Scientific"
    }
  ]
}' |
apify call malekh/fda-device-establishment-registration --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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