# FDA Medical Device Establishment Registry Scraper (`crawlerbros/fda-device-establishment-scraper`) Actor

Search the FDA's public Medical Device Establishment Registration & Listing database (openFDA) by establishment/business name, owner-operator firm, device name, state, or country. Returns real registered business data: company name, full address, establishment type, US agent, and registered devices.

- **URL**: https://apify.com/crawlerbros/fda-device-establishment-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Medical Device Establishment Registry Scraper

Search the FDA's public **Medical Device Establishment Registration & Listing** database (openFDA) by business/establishment name, registered device product name, or an exact FDA registration number. Returns real registered-business data — company name, full address, establishment activity type, owner/operator firm, US agent, and registered devices. HTTP-only via the public `api.fda.gov` REST API. No auth, no login, no proxy required.

### What this actor does

- **Three search modes:** search by establishment/business name, by registered device name, or look up one exact FDA registration number
- **Filters:** US state, ISO country code, establishment activity type
- **Rich company data:** business name, address, owner/operator firm, US agent contact, registered device names & product codes
- **Empty fields are omitted** — every record only contains fields openFDA actually populated

### Output per establishment

- `establishmentName`, `registrationNumber`, `feiNumber`, `registrationExpiryYear`
- `addressLine1`, `addressLine2`, `city`, `stateCode`, `countryCode`, `zipCode`, `fullAddress`
- `establishmentTypes[]` — FDA-defined activity types (manufacture / repack / sterilize / etc.)
- `ownerOperatorName`, `ownerOperatorNumber`
- `usAgentName`, `usAgentBusinessName`, `usAgentCity`, `usAgentStateCode`
- `proprietaryNames[]` — marketed device product names
- `deviceNames[]`, `productCodes[]`, `deviceClasses[]`
- `kNumber`, `pmaNumber` — associated FDA clearance/approval numbers where present
- `sourceUrl` — direct openFDA API query URL for the record
- `recordType: "deviceEstablishment"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `searchByEstablishmentName` | `searchByEstablishmentName` / `searchByDeviceName` / `byRegistrationNumber` |
| `establishmentName` | string | – | Business name (required for mode=searchByEstablishmentName; suggested value `medtronic`) |
| `deviceName` | string | – | Device product name (mode=searchByDeviceName) |
| `registrationNumber` | string | – | Exact FDA registration number (mode=byRegistrationNumber) |
| `stateCode` | select | – | Filter to a US state |
| `countryCode` | select | – | Filter to a specific country (full ISO 3166-1 list, ~250 countries) |
| `establishmentType` | select | – | Filter by FDA establishment activity type |
| `maxItems` | integer | `50` | Hard cap on emitted records (1–1000) |

#### Example: device manufacturers named Medtronic

```json
{
  "mode": "searchByEstablishmentName",
  "establishmentName": "medtronic",
  "maxItems": 50
}
```

#### Example: establishments registered in California that manufacture devices

```json
{
  "mode": "searchByEstablishmentName",
  "establishmentName": "diagnostics",
  "stateCode": "CA",
  "establishmentType": "Manufacture Medical Device"
}
```

### Use cases

- **Supply-chain due diligence** — verify a device manufacturer's FDA registration status and address before onboarding
- **Regulatory affairs** — look up every establishment registered under a given owner/operator firm
- **Competitive intelligence** — find every device manufacturer registered in a specific state or country
- **Compliance monitoring** — track establishment activity types (manufacturing, sterilizing, repackaging) tied to a device product
- **B2B lead generation** — build a list of registered medical device manufacturers by device category

### Data source

Data comes from the [openFDA Device Establishment Registration & Listing API](https://open.fda.gov/apis/device/registrationlisting/), a genuinely public, free, no-authentication REST API published by the U.S. Food & Drug Administration. This actor replaces an originally-planned state Secretary-of-State business search target that was found to be fully blocked by enterprise bot management (Akamai / Cloudflare Turnstile challenges) even under real headless-browser testing — openFDA offers an equivalent, reliably scrapable registered-business directory search.

### FAQs

**Do I need an API key?** No. openFDA's public endpoints work without any key for this actor's usage levels.

**Can I search by partial company name?** Yes — establishment/device name searches are full-text matches (e.g. `medtronic` matches every registered Medtronic subsidiary establishment).

**Why are some fields missing from a record?** Only fields openFDA has actually populated for that establishment are included — no null placeholders or "N/A" values are ever emitted.

# Actor input Schema

## `mode` (type: `string`):

What to search.

## `establishmentName` (type: `string`):

Registered business name (mode=searchByEstablishmentName), e.g. `medtronic`.

## `deviceName` (type: `string`):

Marketed device product name (mode=searchByDeviceName), e.g. `pacemaker`.

## `registrationNumber` (type: `string`):

Exact FDA establishment registration number (mode=byRegistrationNumber).

## `stateCode` (type: `string`):

Filter to establishments registered in a specific US state.

## `countryCode` (type: `string`):

Filter to establishments registered in a specific country.

## `establishmentType` (type: `string`):

Filter to a specific FDA-defined establishment activity type.

## `maxItems` (type: `integer`):

Hard cap on emitted records.

## Actor input object example

```json
{
  "mode": "searchByEstablishmentName",
  "establishmentName": "medtronic",
  "stateCode": "",
  "countryCode": "",
  "establishmentType": "",
  "maxItems": 50
}
```

# Actor output Schema

## `establishments` (type: `string`):

Dataset containing all scraped FDA device establishment registrations.

# 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 = {
    "mode": "searchByEstablishmentName",
    "establishmentName": "medtronic",
    "stateCode": "",
    "countryCode": "",
    "establishmentType": "",
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/fda-device-establishment-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 = {
    "mode": "searchByEstablishmentName",
    "establishmentName": "medtronic",
    "stateCode": "",
    "countryCode": "",
    "establishmentType": "",
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/fda-device-establishment-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 '{
  "mode": "searchByEstablishmentName",
  "establishmentName": "medtronic",
  "stateCode": "",
  "countryCode": "",
  "establishmentType": "",
  "maxItems": 50
}' |
apify call crawlerbros/fda-device-establishment-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/fda-device-establishment-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/YPcMZHQAirISNgJNm/builds/uMR2VhNifSJ9GOuSF/openapi.json
