# FDA Device Establishment Leads via openFDA (`infocomp/fda-device-establishment-leads`) Actor

FDA medical device establishment leads from registration and listing data via openFDA: makers, contract manufacturers, sterilizers and relabelers. Filter by state, country, type, product code, class, specialty. Firm-level only: no personal names, phones or emails. $3/1,000. Not affiliated with FDA.

- **URL**: https://apify.com/infocomp/fda-device-establishment-leads.md
- **Developed by:** [InfoComp Data](https://apify.com/infocomp) (community)
- **Categories:** Lead generation, Business, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 device establishment leads

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 Medical Device Establishment Leads | Business Leads

**Build lead lists of medical device companies from FDA's establishment registration and device listing data.** Filter by country, US state, establishment type (manufacturer, contract manufacturer, contract sterilizer, repackager/relabeler, specification developer and more), FDA product code, device class and medical specialty. You get one clean row per FDA-registered establishment, with its firm name, registration and FEI numbers, registered business address, owner/operator company, establishment types, product codes, device classes and specialties.

- 🏭 **Find suppliers and prospects:** contract manufacturers, sterilizers, relabelers and device makers, by state or country.
- 🎯 **Filters:** countries, states, establishment types, product codes, device class, medical specialty, company name.
- 🔒 **Firm-level data only:** no personal names, phone numbers or email addresses. Correspondent and US agent contacts are left out on purpose.
- 💲 **$3.00 per 1,000 leads** ($0.003 per row). No start fee. Empty and failed runs are free.

> **Data source:** Data provided by the U.S. Food and Drug Administration (https://open.fda.gov): the openFDA device registration & listing dataset, which openFDA publishes as public domain (CC0 1.0). Every row has a `source` credit and a `sourceUrl` link to the openFDA record.
>
> **Disclaimer:** Not affiliated with, endorsed by or sponsored by the U.S. FDA. FDA registration and listing is **not** FDA approval or clearance of a firm or its devices. openFDA data is unvalidated. Confirm details in FDA's own Establishment Registration & Device Listing database (each row's `fdaDatabaseUrl`) before you rely on them.

### What does it do?

1. It turns your filters into one query to the **official openFDA API** (no API key needed) and reads the matching device listing records, 1,000 per request, sorted by FDA registration number.
2. It merges each establishment's listings into **one row per establishment**, with product codes, device names, classes and specialties de-duplicated.
3. It stops as soon as it has **Max results** establishments, or when it reaches the maximum cost you set for the run.

In local tests on 2026-10-28, the default input (US contract manufacturers, 100 leads) took **1.0 to 1.6 seconds** of Actor time with **1 openFDA request** and about 76 MB of memory. All 2,202 US contract manufacturers took 12.5 seconds (26 requests). All 10,358 US establishments took 74 seconds (158 requests) and peaked at 111 MB.

### Who is it for?

- **Suppliers to device makers:** components, packaging, sterilization, testing labs, software and regulatory services.
- **Medical device companies:** find contract manufacturers, sterilizers and relabelers near you.
- **Recruiters and staffing firms:** map device manufacturing sites by state.
- **Consultants and market researchers:** size a niche by product code, device class or specialty.

### Input

| Field | Default | What it does |
|---|---|---|
| `countries` | `["US"]` | 2-letter ISO codes of the establishment address (`US`, `CA`, `DE`, `CN`...). Empty = all countries. |
| `states` | all | US states: `TX`, `ca`, `Minnesota`... |
| `establishmentTypes` | `contract_manufacturer` | Any of: `manufacturer`, `contract_manufacturer`, `contract_sterilizer`, `repackager_relabeler`, `specification_developer`, `complaint_file`, `foreign_exporter`, `us_export_only_manufacturer`, `remanufacturer`, `single_use_reprocessor`, `foreign_private_label_distributor`. Empty = all types. |
| `productCodes` | all | 3-letter FDA product codes, e.g. `FRO` (wound dressings). Look them up in FDA's Product Classification database. |
| `deviceClasses` | all | `1`, `2`, `3`, `U` (unclassified), `N` (not classified), `F` (HDE). |
| `medicalSpecialties` | all | FDA review panels, e.g. `Orthopedic`, `Dental`, `Cardiovascular`. |
| `companyName` | empty | A word or phrase matched against the establishment name and the owner/operator company name. |
| `onlyInitialImporters` | false | Keep only establishments FDA flags as initial importers. |
| `maxResults` | 100 | Stop after this many establishments (up to 50,000). |
| `maxProductsPerRow` | 25 | Caps the `products`, `deviceNames`, `proprietaryNames` and `premarketNumbers` lists. `productCodes` and `medicalSpecialties` are always complete. |
| `maxApiCalls` | 400 | Safety cap on openFDA requests per run (each reads up to 1,000 listing records). |
| `openFdaApiKey` | empty | Optional, secret. Not needed. If you already have your own free openFDA key, add it to use openFDA's higher daily limit. |

```json
{
  "countries": ["US"],
  "states": ["MN", "MA", "CA"],
  "establishmentTypes": ["contract_manufacturer", "contract_sterilizer"],
  "deviceClasses": ["2", "3"],
  "maxResults": 1000
}
```

All filters are combined with AND. Values inside one filter are combined with OR.

### What's in each row?

| Area | Fields |
|---|---|
| Company | `companyName` (establishment name as registered), `registrationNumber`, `feiNumber`, `registrationStatus`, `registrationExpiresYear`, `ownerOperatorName` (owner/operator company), `ownerOperatorNumber` |
| Registered business address | `street`, `city`, `state`, `zipCode`, `country`, `address` (one line) |
| Establishment type | `establishmentTypes`, `isManufacturer`, `isContractManufacturer`, `isContractSterilizer`, `isRepackagerRelabeler`, `isInitialImporter` |
| Devices | `productCodes`, `productCodeCount`, `deviceClasses`, `highestDeviceClass`, `medicalSpecialties`, `deviceNames`, `proprietaryNames`, `premarketNumbers` (510(k)/PMA/De Novo), `products` (code, device name, class, specialty, regulation number, exempt flag, listed date), `productsTruncated`, `listingRecords`, `firstListedDate`, `latestListedDate` |
| Links and credit | `fdaDatabaseUrl` (FDA's own record search), `sourceUrl` (the openFDA API record), `source`, `disclaimer`, `dataLastUpdated`, `retrievedAt` |

There are **no personal names, phone numbers or email addresses** in the output: the official correspondent, the US agent and the owner/operator contact address are never copied. Phone numbers and emails are also stripped from names and address lines. A run summary (filters, counts, openFDA requests) is saved as `RUN_SUMMARY` in the run's key-value store.

### Output example

A real row from a local run of the default input on 2026-10-28. The `proprietaryNames` list is shortened here from 25 to 5 names; everything else is as saved.

```json
{
  "companyName": "FIVE STAR ORTHODONTIC LABORATORY & SUPPLY, INC.",
  "registrationNumber": "1000118628",
  "feiNumber": "1000118628",
  "registrationStatus": "Active",
  "registrationExpiresYear": "2026",
  "establishmentTypes": [
    "Manufacture Medical Device for Another Party (Contract Manufacturer)",
    "Repack or Relabel Medical Device",
    "Manufacture Medical Device"
  ],
  "isManufacturer": true,
  "isContractManufacturer": true,
  "isContractSterilizer": false,
  "isRepackagerRelabeler": true,
  "isInitialImporter": true,
  "street": "2928 Metro Street, Suite 102",
  "city": "Denton",
  "state": "TX",
  "zipCode": "76207",
  "country": "US",
  "address": "2928 Metro Street, Suite 102, Denton, TX 76207, US",
  "ownerOperatorName": "Five Star Orthodontic Laboratory & Supply, Inc.",
  "ownerOperatorNumber": "10033551",
  "productCodes": [
    "LQZ",
    "LRK",
    "DZC"
  ],
  "productCodeCount": 3,
  "deviceClasses": [
    "1",
    "2"
  ],
  "highestDeviceClass": "Class II",
  "medicalSpecialties": [
    "Dental"
  ],
  "deviceNames": [
    "Device, Jaw Repositioning",
    "Device, Anti-Snoring",
    "Wire, Orthodontic"
  ],
  "proprietaryNames": [
    "mmRNA",
    "Vivos mRNA Appliance",
    "TAP III Anti-Snoring Device",
    "DreamTAP",
    "Elastic Mandibular Advancement (EMA)"
  ],
  "premarketNumbers": [],
  "products": [
    {
      "productCode": "LQZ",
      "deviceName": "Device, Jaw Repositioning",
      "deviceClass": "2",
      "deviceClassLabel": "Class II",
      "medicalSpecialty": "Dental",
      "regulationNumber": "872.5570",
      "exempt": null,
      "listedDate": "2021-08-19"
    },
    {
      "productCode": "LRK",
      "deviceName": "Device, Anti-Snoring",
      "deviceClass": "2",
      "deviceClassLabel": "Class II",
      "medicalSpecialty": "Dental",
      "regulationNumber": "872.5570",
      "exempt": null,
      "listedDate": "2021-08-19"
    },
    {
      "productCode": "DZC",
      "deviceName": "Wire, Orthodontic",
      "deviceClass": "1",
      "deviceClassLabel": "Class I",
      "medicalSpecialty": "Dental",
      "regulationNumber": "872.5410",
      "exempt": null,
      "listedDate": "2013-02-08"
    }
  ],
  "productsTruncated": false,
  "listingRecords": 5,
  "firstListedDate": "2013-02-05",
  "latestListedDate": "2021-08-19",
  "fdaDatabaseUrl": "https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfRL/rl.cfm?start_search=1&RegistrationNumber=1000118628",
  "sourceUrl": "https://api.fda.gov/device/registrationlisting.json?search=registration.registration_number%3A%221000118628%22&limit=100",
  "source": "Data provided by the U.S. Food and Drug Administration (https://open.fda.gov), openFDA device registration & listing dataset, public domain (CC0 1.0).",
  "disclaimer": "Not affiliated with, endorsed by or sponsored by the U.S. FDA. FDA registration and listing does not mean FDA approval or clearance of a firm or its devices. openFDA data is unvalidated; confirm details in FDA's own Establishment Registration & Device Listing database (fdaDatabaseUrl).",
  "dataLastUpdated": "2026-10-19",
  "retrievedAt": "2026-10-28T17:27:45Z"
}
```

### Pricing

**$3.00 per 1,000 leads.** One `lead` event ($0.003) per saved establishment row. There's no start fee and no run fee. Runs that find nothing, and runs that fail because openFDA can't be reached, are free. If you set a maximum cost per run, the Actor stops cleanly when it reaches it.

### Good to know

- **Filters match listings.** With a product code, class or specialty filter, a row's product lists contain only the listings that matched your filter, not everything the firm lists.
- **Class III devices often have no specialty** in openFDA, so a `medicalSpecialties` filter can miss them. Use `deviceClasses` or `productCodes` for Class III.
- **Brand names** in `proprietaryNames` are listed exactly as filed with FDA. A contract manufacturer may list its customers' brands. Trademarks belong to their owners.
- **Registration isn't approval.** Being listed doesn't mean FDA approved or cleared a firm or a device.
- **Freshness:** `dataLastUpdated` shows openFDA's last update of this dataset (2026-10-19 at the time of our tests). FDA's own database can be newer.
- **Limits:** openFDA allows 240 requests a minute and 1,000 a day per IP address without a key. A full US pull takes about 160 requests. If openFDA refuses requests, the run stops with a clear message and nothing is charged for missing rows.
- Use the data in line with your own legal and marketing obligations, such as CAN-SPAM and state privacy laws.

### Related InfoComp tools

- [Form D Funding Leads: New Startup & Private Raise Filings](https://apify.com/infocomp/form-d-funding-leads): companies that just raised private capital, from public SEC EDGAR Form D filings.
- [New Business Filings Leads: Colorado | Business Leads](https://apify.com/infocomp/new-business-filings-colorado): newly registered Colorado LLCs, corporations and nonprofits from the State's public open data.
- [FMCSA New Carrier Leads: New MC Authorities | Business Leads](https://apify.com/infocomp/fmcsa-new-carrier-leads): trucking companies, freight brokers and forwarders whose FMCSA operating authority was just granted.
- [FMCSA Carrier Vetting & Watchlist: Authority, Insurance, Flags](https://apify.com/infocomp/fmcsa-carrier-vetting): bulk-check USDOT numbers: operating authority, insurance on file, safety flags and change alerts from FMCSA public data.
- [OIG Exclusion Check & Medicare Opt-Out Screen - Bulk NPI LEIE](https://apify.com/infocomp/oig-exclusion-optout-screen): bulk-check NPIs against the HHS-OIG LEIE file and the CMS Medicare opt-out list.
- [SAM.gov Contract Opportunities Scraper: Federal RFPs & Bids](https://apify.com/infocomp/sam-gov-opportunities): US federal contract opportunities (RFPs, solicitations, awards) from the official SAM.gov API.
- [Tender Feed API: EU TED, UK Find a Tender & Contracts Finder](https://apify.com/infocomp/eu-uk-tenders): EU and UK public tenders in one feed, from official TED, Find a Tender and Contracts Finder APIs.
- [Greenhouse, Lever, Ashby & SmartRecruiters Jobs Scraper API](https://apify.com/infocomp/ats-jobs-feed): live job postings from Greenhouse, Lever, Ashby and SmartRecruiters via their public job-board APIs.
- [US Address Geocoder & FEMA Flood Zone Risk API](https://apify.com/infocomp/us-address-risk-enricher): batch-geocode US addresses with the Census Bureau and add FEMA flood zone and National Risk Index ratings.
- [VIN Decoder Bulk: Specs, Recalls, MPG & Fuel Cost per Mile](https://apify.com/infocomp/bulk-vin-decoder-recalls-mpg): decode VINs in bulk with NHTSA vPIC, plus recall campaigns and EPA fuel economy.
- [Academic Paper Scraper: arXiv, PubMed, Crossref & OpenAlex API](https://apify.com/infocomp/scholarly-paper-search): search arXiv, PubMed, Crossref and OpenAlex in one run, de-duplicated by DOI.
- [CMS Home Health, Hospice & Dialysis Leads | Business Leads](https://apify.com/infocomp/cms-facility-leads): Medicare-certified home health agencies, hospices and dialysis centers from CMS open data, facility-level.
- [HUD Multifamily Owner/Manager Leads | Business Leads](https://apify.com/infocomp/hud-multifamily-leads): HUD-assisted apartment properties with management company, firm phone, Section 8 contract expiry and REAC score.
- [Company Name to Website Finder & Enrichment | Business Leads](https://apify.com/infocomp/wikidata-company-finder): turn company names into official websites, HQ, employees, industry, ticker, LEI and SEC CIK from Wikidata.
- [FDA 510(k) New Clearance Leads | Business Leads](https://apify.com/infocomp/fda-510k-clearance-leads): companies that just got a medical device cleared by FDA: new 510(k) decisions from openFDA.

### FAQ

**Is this an official FDA list?** No. It's an independent tool built on openFDA's public data. It is not affiliated with or endorsed by FDA.

**Does it include contact people, phones or emails?** No, by design. You get the firm, its registered business address, its owner/operator company and links to FDA's own records.

**Do I need an openFDA API key?** No. The Actor works without one. You can optionally add your own key for a higher daily limit.

**Is it legal to use this data?** openFDA publishes this dataset as public domain (CC0 1.0). Use the results in line with your own legal and compliance obligations.

# Actor input Schema

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

Two-letter ISO country codes of the establishment address, e.g. US, CA, DE, CN. Empty = all countries.

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

Optional. Two-letter codes or US state names of the establishment address, e.g. TX, CA, Minnesota. Empty = all states.

## `establishmentTypes` (type: `array`):

Which FDA establishment operations to include (any of them). Empty = all types.

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

Optional. Three-letter FDA device product codes, e.g. FRO (wound dressing), DXT, LLZ. Look codes up in FDA's Product Classification database. Empty = all products.

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

Optional. Keep firms listing at least one device in these classes. Empty = all classes.

## `medicalSpecialties` (type: `array`):

Optional. FDA regulation medical specialty of the listed devices, e.g. Orthopedic, Dental, Cardiovascular. Empty = all.

## `companyName` (type: `string`):

Optional. Word or phrase matched against the establishment name and the owner/operator company name, e.g. medtronic or "argon medical".

## `onlyInitialImporters` (type: `boolean`):

Keep only establishments flagged by FDA as initial importers.

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

Stop after this many establishment leads. Each saved row is one $0.003 lead.

## `maxProductsPerRow` (type: `integer`):

Cap on the products, device names, brand names and premarket numbers listed per row. productCodes and medicalSpecialties are always complete for the listings that matched your filters.

## `maxApiCalls` (type: `integer`):

Safety cap. Each call reads up to 1,000 listing records. Without a key, openFDA allows 1,000 calls per day per IP address.

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

Optional. Not needed: the Actor works without a key. If you have your own free openFDA key, add it to use openFDA's higher daily limit.

## Actor input object example

```json
{
  "countries": [
    "US"
  ],
  "states": [],
  "establishmentTypes": [
    "contract_manufacturer"
  ],
  "productCodes": [],
  "deviceClasses": [],
  "medicalSpecialties": [],
  "onlyInitialImporters": false,
  "maxResults": 100,
  "maxProductsPerRow": 25,
  "maxApiCalls": 400
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "countries": [
        "US"
    ],
    "states": [],
    "establishmentTypes": [
        "contract_manufacturer"
    ],
    "productCodes": [],
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("infocomp/fda-device-establishment-leads").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 = {
    "countries": ["US"],
    "states": [],
    "establishmentTypes": ["contract_manufacturer"],
    "productCodes": [],
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("infocomp/fda-device-establishment-leads").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 '{
  "countries": [
    "US"
  ],
  "states": [],
  "establishmentTypes": [
    "contract_manufacturer"
  ],
  "productCodes": [],
  "maxResults": 100
}' |
apify call infocomp/fda-device-establishment-leads --silent --output-dataset

```

## MCP server setup

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

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/r6hJhonqtmGenLhNN/builds/lnhD2z4e1kxDjLBu1/openapi.json
