# FDA Medical Device Suppliers & Manufacturers Finder (`rel8ble/fda-device-suppliers-scraper`) Actor

Use this to find medical device manufacturers and suppliers registered with the FDA, from the official openFDA API. Input: device word, country, role. One result = one listing: firm, address, owner, brand names, product codes, class, 510(k). $0.75 per 1,000.

- **URL**: https://apify.com/rel8ble/fda-device-suppliers-scraper.md
- **Developed by:** [Giovanni Rich](https://apify.com/rel8ble) (community)
- **Categories:** Lead generation, Business, E-commerce
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.75 / 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/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 Suppliers & Manufacturers Finder

This **FDA medical device supplier finder** turns the FDA's establishment registration and device listing database into clean **supplier lists**: type a device such as `catheter`, `surgical mask` or `orthopedic implant`, pick countries, and get one row per device listing with the **registered firm, its address, owner company, role (manufacturer, contract manufacturer, sterilizer, repackager, exporter), brand names, FDA product codes, device class and 510(k) or PMA number**.

Use it as a **medical device manufacturer directory**, an **FDA registration lookup API**, a **contract manufacturer finder** for white-label sourcing, or a **competitor map** of who sells a device type into the US, from your own code, Make, Zapier, n8n or an AI agent.

It reads the official **openFDA API** (`api.fda.gov/device/registrationlisting`), with **no browser and no login**. The prefilled demo returns 20 rows. **$0.75 per 1,000 results, no start fee.**

**What goes in:** device words, and optional filters on country, US state, establishment role, FDA product code, device class, medical specialty or company name. **What comes out:** one row per device listing (or one per supplier, with a switch). **When to use it:** you need to know which firms are registered with the FDA to make or handle a device type, where they are, and what else they list.

**What it does not have:** **no prices, no minimum order quantities, no e-mails and no phone numbers.** The FDA file names people (US agents, official correspondents) with their phone and e-mail; this actor leaves all of that out on purpose and keeps only company data.

### What you get

- **Supplier**: registered establishment name, FDA registration number, FEI number, street, city, state, postal code, country.
- **Owner**: owner/operator company and number (groups all sites of one parent), owner city and country; the US agent's **company** name for foreign sites.
- **Role**: what the site does, e.g. "Manufacture Medical Device", "Manufacture Medical Device for Another Party (Contract Manufacturer)", "Sterilize Medical Device for Another Party (Contract Sterilizer)", "Repack or Relabel Medical Device".
- **Devices**: brand / proprietary names, FDA product codes, generic device names, device class, review panel (medical specialty), 21 CFR regulation number, listing date per product.
- **Regulatory**: 510(k) number or PMA number on the listing, registration year, initial-importer flag.

Fill rates in a 2,500-row test (`catheter`, all countries, run 5 November 2026): firm, registration, address, city, owner, role, product codes, device names and class 100%; brand names 78%; 510(k) number 50%; US agent company 32% (foreign sites); PMA number 1%. Country mix: US 1,457, MX 203, CN 143, CA 76, CR 75, IE 60, GB 49, DE 41. 817 different registered sites.

### Sample output

Real rows from the prefilled run (`catheter`, Germany, manufacturers, 5 November 2026), a few of the 27 fields, long device names shortened:

| firm | city | brand names | device | code | class | 510(k) |
|---|---|---|---|---|---|---|
| AESCULAP AG | TUTTLINGEN, DONAU Baden-Wurttemberg | Aesculap | Catheter, Irrigation | GBX | 1 | |
| Contract Medical International GmbH | DRESDEN Saxony | Fortress | Introducer, Catheter / Dilator, Vessel | DYB, DRE | 2 | K203179 |
| BIOTRONIK SE & CO. KG | BERLIN | Selectra 3D-65-39 (and 7 more) | Catheter, Percutaneous | DQY | 2 | K193474 |
| B. BRAUN MELSUNGEN AG | MELSUNGEN Hesse | Perifix ONE Pediatric Catheter | Catheter, Conduction, Anesthetic | BSO | 2 | K090884 |
| VYGON Germany GmbH | AACHEN North Rhine-Westphalia | Multicath Expert | Catheter, Intravascular, Therapeutic, Short-Term | FOZ | 2 | K061250 |

### Use cases

- **Supplier sourcing**: find registered manufacturers or contract manufacturers of a device type, by country
- **White-label / OEM search**: filter on the contract manufacturer role to find sites that make devices for other brands
- **Competitor mapping**: who lists a product code, under which brands, and where they make it
- **Due diligence**: check that a supplier is registered, what it lists and whether a 510(k) is on file
- **Lead generation for suppliers to the industry**: lists of device makers by specialty and country (company data only)

### Pricing

**$0.75 per 1,000 results** (pay per result, $0.00075 each), no start fee, platform usage included. A result is one row saved to your dataset. Searches that find nothing, duplicates, rows skipped by "one row per supplier" and failed requests are never charged. Set **Max results per search** to cap the cost of a run.

The data comes from a free public API. You pay for the ready rows, the filters and the clean company-only output, not for access. If you prefer, call openFDA yourself.

Nearest Store actors on 21 October 2026 (Apify Store snapshot): a general openFDA scraper for recalls, labels and adverse events at $1.60 per 1,000 (free tier) down to $0.80 (gold), with no registration / supplier search. Prices change; check before you compare.

### FAQ

**Where does the data come from?** The FDA's establishment registration and device listing file, served by openFDA. openFDA data is public domain (CC0); the FDA asks for, but does not require, the credit "Data provided by the U.S. Food and Drug Administration (https://open.fda.gov)". The FDA says not to rely on openFDA for medical decisions and that results are unvalidated.

**How fresh is it?** As fresh as openFDA. On 5 November 2026 the API reported `last_updated` 2026-10-26.

**Does it include phone numbers or e-mails?** No. The FDA file holds the names, phones and e-mails of people (US agents, official correspondents). The actor never copies them. You get company names and site addresses.

**Is a listing a product I can buy?** A listing says a firm is registered to make or handle a device type for the US market. It is not a catalogue entry, and it has no price or stock.

**Does a 510(k) number mean the device is cleared?** It is the number filed on the listing. Check the FDA's 510(k) database before relying on it.

**How do I get one row per company?** Turn on **One row per supplier**. The first listing of each registered site is kept; the rest are read but not charged.

**What does "U", "N" or "f" mean in device class?** Values the FDA file holds besides 1, 2 and 3. The actor passes them through as filed.

**Are there limits?** openFDA allows 240 requests a minute and, without a key, 1,000 requests a day per IP. Each request returns up to 1,000 rows, so normal runs use a handful. If you run very large jobs, add your free openFDA key in **openFDA API key**; it is sent in a header and never written to the log.

**Why are some cities odd, like "TUTTLINGEN, DONAU Baden-Wurttemberg"?** That is how the firm filed it. The actor does not rewrite addresses.

**Known gaps**: one row per listing means a big firm appears many times (use the supplier switch); the address is the registered site, which can be a plant rather than a sales office; firms that are not registered with the FDA are not in it; device words match the FDA generic name and the brand name only, not marketing text. Runs above about 25,000 rows per search were not tested.

### How to use

1. Open the actor and type one or more device words, e.g. `catheter`.
2. Optional: set countries (`DE`, `CN`), a role (`Manufacture Medical Device`), product codes or device class.
3. Set **Max results per search** (start with 20).
4. Click **Start**, then export the dataset as CSV, Excel or JSON.

### Input

| Field | What it does |
|---|---|
| `searchTerms` | Device words; each runs as its own search on the FDA device name and the brand name. |
| `countries`, `states` | ISO country codes, US state codes. Any of them matches. |
| `establishmentTypes` | FDA roles, e.g. manufacturer, contract manufacturer, sterilizer, repackager. |
| `productCodes`, `deviceClasses`, `medicalSpecialties` | FDA product codes, class 1 / 2 / 3, review panel. |
| `firmNames` | Find what one company lists (establishment or owner name). |
| `uniqueSuppliers` | One row per registered site instead of per listing. |
| `maxResultsPerSearch` | Rows per search; 0 = all. |
| `apiKey` | Optional free openFDA key (secret). |

Invalid filter values are ignored and listed in the run summary. A filter where no value is valid stops the run instead of widening the search.

### Input example

```json
{
    "searchTerms": ["catheter", "surgical mask"],
    "countries": ["DE", "CN"],
    "establishmentTypes": ["Manufacture Medical Device"],
    "deviceClasses": ["2"],
    "maxResultsPerSearch": 200
}
```

### Output example

One real row from the prefilled run (5 November 2026):

```json
{
    "firmName": "AESCULAP AG",
    "registrationNumber": "9610612",
    "feiNumber": "3002806315",
    "establishmentTypes": ["Manufacture Medical Device"],
    "street": "AM AESCULAP PLATZ",
    "city": "TUTTLINGEN, DONAU Baden-Wurttemberg",
    "state": null,
    "postalCode": "D-78532",
    "countryCode": "DE",
    "ownerOperatorName": "Aesculap AG",
    "ownerOperatorNumber": "8010193",
    "ownerCity": "Tuttlingen",
    "ownerCountryCode": "DE",
    "usAgentCompany": "Aesculap, Inc.",
    "initialImporter": false,
    "registrationExpiryYear": 2027,
    "deviceBrandNames": ["Aesculap"],
    "productCodes": ["GBX"],
    "deviceNames": ["Catheter, Irrigation"],
    "deviceClasses": ["1"],
    "medicalSpecialties": ["General, Plastic Surgery"],
    "premarketNumber510k": null,
    "premarketApprovalNumber": null,
    "products": [
        {
            "productCode": "GBX",
            "deviceName": "Catheter, Irrigation",
            "deviceClass": "1",
            "medicalSpecialty": "General, Plastic Surgery",
            "regulationNumber": "878.4200",
            "listedDate": "2008-07-30",
            "exempt": null
        }
    ],
    "searchTerm": "catheter",
    "position": 1,
    "scrapedAt": "2026-11-05T18:31:44.876Z"
}
```

A `RUN_SUMMARY` record in the key-value store lists, per search, how many listings match, how many were saved, why the search stopped and any input that was ignored.

### Integrations

Export the dataset as JSON, CSV, Excel, XML or HTML, or pull it with the Apify API and the JavaScript / Python clients. Connect it to Make, Zapier, n8n, Google Sheets, HubSpot or Slack with Apify integrations and webhooks, or let an AI agent call it through the Apify MCP server.

Need a custom scraper or a ready dataset? Hire me on Fiverr: https://www.fiverr.com/rel8ble

# Actor input Schema

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

Device words or phrases, e.g. "catheter" or "surgical mask". Each runs as its own search, matched on the FDA device name and the brand name. Leave empty to search on the filters only.

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

Two-letter ISO codes of the establishment, e.g. "DE", "CN", "US". Any of them matches.

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

Two-letter US state codes, e.g. "CA", "MN". Any of them matches.

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

Keep only sites with one of these roles. Pick "Manufacture Medical Device" for makers, or the contract manufacturer role for white-label sourcing.

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

Three-character codes, e.g. "HRY". Exact way to find everyone listing one device type.

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

FDA risk class.

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

Review panels, e.g. "Dental", "Orthopedic", "Cardiovascular".

## `firmNames` (type: `array`):

Find what one company lists: matched on the establishment name and the owner/operator name.

## `uniqueSuppliers` (type: `boolean`):

On: keep only the first listing of each registered establishment, which gives a supplier list instead of a product list. Listings read and dropped are not charged.

## `maxResultsPerSearch` (type: `integer`):

Rows to save per search term. 0 = everything that matches. You pay per row saved, so start small.

## `apiKey` (type: `string`):

Free key from open.fda.gov. Not needed for normal runs. Without one, openFDA allows 1,000 requests a day per IP, and each request returns up to 1,000 rows.

## `maxRequestRetries` (type: `integer`):

Retries per failed request.

## Actor input object example

```json
{
  "searchTerms": [
    "catheter"
  ],
  "countries": [
    "DE"
  ],
  "establishmentTypes": [
    "Manufacture Medical Device"
  ],
  "uniqueSuppliers": false,
  "maxResultsPerSearch": 20,
  "maxRequestRetries": 5
}
```

# Actor output Schema

## `suppliers` (type: `string`):

One row per FDA device listing: establishment, owner, address, role, brand names, product codes, device class, 510(k) or PMA number.

## `summary` (type: `string`):

Counts per search, stop reasons and any ignored input.

# 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"
    ],
    "countries": [
        "DE"
    ],
    "establishmentTypes": [
        "Manufacture Medical Device"
    ],
    "maxResultsPerSearch": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("rel8ble/fda-device-suppliers-scraper").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"],
    "countries": ["DE"],
    "establishmentTypes": ["Manufacture Medical Device"],
    "maxResultsPerSearch": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("rel8ble/fda-device-suppliers-scraper").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"
  ],
  "countries": [
    "DE"
  ],
  "establishmentTypes": [
    "Manufacture Medical Device"
  ],
  "maxResultsPerSearch": 20
}' |
apify call rel8ble/fda-device-suppliers-scraper --silent --output-dataset

```

## MCP server setup

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

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/nv57p7dEXdAYsuIGf/builds/VFwiBnvPWYHOfMbX3/openapi.json
