# FDA Supplier Watch - Warning Letters & Import Alerts by Company (`that_red_bird/fda-supplier-compliance-watch`) Actor

Did a supplier just get an FDA warning letter or land on an import alert? Give company names, get new FDA warning letters and import-alert (Red List) firms, only what is new since your last run, with a link to FDA recall data. Name matching is fuzzy: review hits.

- **URL**: https://apify.com/that_red_bird/fda-supplier-compliance-watch.md
- **Developed by:** [mohamed alaya](https://apify.com/that_red_bird) (community)
- **Categories:** Business, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 company checkeds

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 Supplier Watch - Warning Letters & Import Alerts by Company

Give company names; get their **FDA warning letters** and **import-alert (Red List) listings**, then **only the new ones** on every later run. For pharma, device and food quality and supplier-qualification teams who need to know when a supplier gets in trouble with the FDA.

It uses the FDA's public warning letters database and the public import alert pages. Each company row also links to openFDA recall data.

### Quick start - three copy-paste inputs

Demo (empty input works):

```json
{}
```

Your supplier list, scheduled weekly:

```json
{
  "companies": ["Teva", "Hikma", "Sun Pharmaceutical", "Aurobindo"],
  "importAlerts": ["66-40", "66-41", "66-79", "99-34"],
  "stateStoreName": "acme-supplier-watch",
  "webhookUrl": "https://hooks.slack.com/services/XXX/YYY/ZZZ"
}
```

Food and supplement suppliers, warning letters plus food import alerts:

```json
{ "companies": ["Nature's Bounty", "Herbalife"], "importAlerts": ["54-14", "99-32", "99-35", "99-23"], "historyMonths": 36 }
```

### Input guide

| Field | Meaning |
|---|---|
| `companies` | Names to watch. All words of a name must appear in the FDA company name; Inc, LLC, Ltd, Corp... are ignored; "dba" names are matched on both sides. |
| `sources` | `warning-letters` and/or `import-alerts`. |
| `importAlerts` | Import alert numbers to search (66-40 drug GMP, 66-41, 66-79, 99-34, 99-32, 99-35, 54-14 ...). `ALL` searches every alert (150+ large pages, slow). |
| `historyMonths` | For a company checked for the first time, existing items posted in this window are reported (flagged `isBaseline`); older ones are only counted. |
| `stateStoreName` | Memory store, same name every run. |
| `webhookUrl` | Optional POST of new actions. |

### Output

`company-check` (one per company): counts of letters and listings, `newThisRun`, `matchedNames`, and `recallSearchUrls` (openFDA drug, device and food enforcement searches for that firm: open them for recall data).

`new-action` (one per new item):

| Field | Meaning |
|---|---|
| `action` | `warning-letter` or `import-alert` |
| `matchedName`, `matchScore` | The FDA name that matched, and a 0-1 similarity (1 = same words) |
| `issuingOffice`, `subject`, `letterIssueDate`, `postedDate` | Warning letter facts |
| `alertNumber`, `subject`, `country`, `address`, `postedDate` | Import alert facts (date the firm was listed) |
| `url` | FDA page |
| `isBaseline` | `true` for history reported on a company's first check |

Sample row:

```json
{"type":"new-action","company":"Babikian Healthcare Products","action":"import-alert","matchedName":"BABIKIAN HEALTHCARE PRODUCTS","matchScore":1,"alertNumber":"66-40","postedDate":"2026-06-22","country":"ARMENIA","url":"https://www.accessdata.fda.gov/cms_ia/importalert_189.html"}
```

### Use it with

- Run **openFDA recall searches** from `recallSearchUrls`, or pair it with a recall monitor for the products you buy.
- Webhook to Slack or Teams so QA hears about a new letter the day it is posted.

### FAQ

**Is a match proof it is the same company?** No. Matching is by name only. Check the `matchedName`, address and country before acting.

**Does it cover Form 483s, inspections or recalls?** No. Warning letters and import alerts only; recalls are linked, not copied.

**How new is "new"?** The FDA posts warning letters on Tuesdays; import alert pages are updated as firms are added.

### Honest limits

- Only the import alerts you list are searched (the default list covers the main drug and device ones).
- Names that are too short or generic (a single word under 4 letters) never match.
- If an FDA page cannot be read, that source is skipped for the run and an `error` row says so; nothing is marked as seen for it.

### Price

**$0.002 per company checked, $0.01 per new FDA action found.** Watching 50 suppliers weekly with 2 new items costs about $0.12 per run.

# Actor input Schema

## `companies` (type: `array`):

One name per line, for example Pfizer, Teva, Neogen. All words of a name must appear in the FDA company name; Inc, LLC, Ltd, Corp and similar words are ignored. The sample names are only a demo.

## `sources` (type: `array`):

warning-letters = FDA warning letters database. import-alerts = firms on FDA import alerts (detention without physical examination, the Red Lists).

## `importAlerts` (type: `array`):

FDA import alert numbers whose firm lists are searched, for example 66-40 (drug GMP), 66-41, 66-79, 99-34 (drugs or devices), 99-32, 99-35 and 54-14 for food and supplements. Each page is 1-2 MB. Write ALL to search every alert (150+ pages, slow).

## `historyMonths` (type: `integer`):

The first time a company is checked, its existing warning letters and listings posted within this many months are reported (marked isBaseline) and the older ones are only counted. Later runs report only new items.

## `stateStoreName` (type: `string`):

Named key-value store that remembers which letters and listings were already reported per company. Use the same name on every scheduled run and a different name per client. Empty = every run reports everything again.

## `webhookUrl` (type: `string`):

New FDA actions are POSTed here as JSON with text and content fields (works with Slack, Discord, Zapier, Make). Leave empty for none.

## Actor input object example

```json
{
  "companies": [
    "Babikian Healthcare Products",
    "Neogen Corporation"
  ],
  "sources": [
    "warning-letters",
    "import-alerts"
  ],
  "importAlerts": [
    "66-40",
    "66-41",
    "66-79",
    "99-34"
  ],
  "historyMonths": 24,
  "stateStoreName": "fda-supplier-watch-state",
  "webhookUrl": ""
}
```

# Actor output Schema

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

No description

## `downloadCsv` (type: `string`):

No description

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

No description

## `count` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("that_red_bird/fda-supplier-compliance-watch").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("that_red_bird/fda-supplier-compliance-watch").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 '{}' |
apify call that_red_bird/fda-supplier-compliance-watch --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,that_red_bird/fda-supplier-compliance-watch"
        }
    }
}
```

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/fU502sl6nj79cxhfr/builds/EjAtJI7qpIKCWDghp/openapi.json
