# FDA Warning Letters Monitor 🔔 (drug & device alerts) (`tagadanar/fda-warning-letters`) Actor

Track new FDA warning letters the week they post: company, issuing office, subject, program area and letter link. Filter by program or keyword, or watch on a schedule and get only what is new since your last run. No API key. Platform usage included.

- **URL**: https://apify.com/tagadanar/fda-warning-letters.md
- **Developed by:** [Tagada Data](https://apify.com/tagadanar) (community)
- **Categories:** Automation, News, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.00 / 1,000 letter founds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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 Warning Letters Monitor

Get every new FDA warning letter the day it is posted. This actor reads the
warning letters the FDA publishes on fda.gov and returns each one as a clean row:
the company, the issuing office and program, the subject, whether it has been
closed out, and a link to the letter itself. Filter by program or keyword, run it
on a schedule, and get a Slack digest of only the letters that are new since your
last run.

No API key. You only pay for letters you actually get back.

### Who uses this

- **Regulatory affairs and quality teams** tracking enforcement in their sector
  and against named competitors and contract manufacturers.
- **Consultants and law firms** in FDA-regulated industries who need to spot new
  letters fast and reach affected companies.
- **Pharma, device, food and supplement suppliers** screening partners and CDMOs
  for compliance history.
- **Investors and analysts** watching enforcement as a risk signal.
- **Data teams** who want the warning-letters feed as tidy JSON instead of
  scraping the table by hand.

### What you get

One record per warning letter:

| Field | Description |
| --- | --- |
| `companyName` | Company the letter was issued to |
| `issueDate` | Date the letter was issued |
| `postedDate` | Date the FDA posted it publicly |
| `issuingOffice` | The FDA office that issued it (e.g. CDER) |
| `program` | Program in plain words: Drugs, Medical devices, Food, Biologics, Tobacco, Veterinary, Imports |
| `subject` | The violation subject line |
| `excerpt` | Short excerpt, where the FDA provides one |
| `letterUrl` | Link to the full letter |
| `responseLetterUrl` | Link to the company's response, if published |
| `closeoutLetterUrl` / `hasCloseout` | Close-out letter and whether the case is closed |
| `isNew` | In monitor mode, whether the letter is new since the last run |

### Input examples

All new drug and device letters from the last 60 days:

```json
{
  "programs": ["drugs", "medical-devices"],
  "sinceDays": 60,
  "maxLetters": 500
}
````

Scheduled monitor with a Slack alert on new letters mentioning data integrity:

```json
{
  "keywords": ["data integrity", "CGMP"],
  "sinceDays": 3,
  "monitorMode": true,
  "webhookUrl": "https://hooks.slack.com/services/XXX/YYY/ZZZ"
}
```

Watch a specific company or contract manufacturer:

```json
{
  "keywords": ["Fareva"],
  "sinceDays": 1825
}
```

### How monitor mode works

Turn on `monitorMode` and schedule the actor (daily is typical). The first run
records what is already posted as a baseline. Every run after that returns, and
charges for, only letters that are new since the previous run, and posts them to
your webhook if you set one. A daily run costs you a handful of new letters, not
the whole archive each time.

### Pricing

Pay per event, no subscription. Users on higher Apify plans get automatic discounts.

| Event | Price | When |
|---|---|---|
| Run started | **$0.005** | Flat, once per run |
| Letter found | **$0.01** | Per new/matched warning letter returned with its data |
| Digest sent | **$0.03** | Monitor mode only, per Slack/webhook digest actually posted |

Platform usage is included in the price. In monitor mode the persistent seen-set means you are never billed twice for the same letter, so a quiet scheduled run only pays the small run fee.

### FAQ

**Where does the data come from?** The FDA's own published warning letters on
fda.gov. These are public enforcement records.

**Do I need an account or API key?** No. Nothing to set up.

**How fresh is it?** Letters appear here as soon as the FDA posts them, which is
the same list the public warning-letters page shows.

**Can I filter to my industry?** Yes, use `programs` for drugs, devices, food,
biologics, tobacco, veterinary or imports, and `keywords` to narrow further by
company or subject.

**Does it include close-out letters?** Yes. When the FDA closes a case it posts a
close-out letter, and the `hasCloseout` flag and `closeoutLetterUrl` tell you.

**How far back can I go?** Up to five years with `sinceDays`. The FDA keeps
several years of letters online.

***

FDA warning letters, FDA enforcement monitor, CGMP violations, drug device food
compliance, regulatory affairs alerts, FDA compliance tracking, warning letter
scraper, 483 warning letter, pharma quality intelligence.

# Actor input Schema

## `programs` (type: `array`):

Limit to letters from these FDA programs. Leave empty for every program.

## `keywords` (type: `array`):

Only return letters whose company name or subject contains one of these words. Leave empty to get every letter in the window. Example: <code>CGMP</code>, <code>data integrity</code>, or a specific company name.

## `sinceDays` (type: `integer`):

Only letters issued within this many days are returned. A daily scheduled run needs just 1-2 days; a first sweep can look back further.

## `maxLetters` (type: `integer`):

Stop after this many letters across the whole run.

## `monitorMode` (type: `boolean`):

Remember letters already reported across runs and return only newly published ones. Built for a scheduled run: the first run sets the baseline, later runs report and charge for new letters only.

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

When monitor mode finds new letters, post a text digest here (Slack incoming webhook or any endpoint accepting <code>{"text": "..."}</code> JSON).

## Actor input object example

```json
{
  "programs": [],
  "keywords": [],
  "sinceDays": 30,
  "maxLetters": 200,
  "monitorMode": false
}
```

# Actor output Schema

## `letters` (type: `string`):

One item per matched warning letter in the default dataset.

# 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 = {
    "sinceDays": 30,
    "maxLetters": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("tagadanar/fda-warning-letters").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 = {
    "sinceDays": 30,
    "maxLetters": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("tagadanar/fda-warning-letters").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 '{
  "sinceDays": 30,
  "maxLetters": 200
}' |
apify call tagadanar/fda-warning-letters --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "FDA Warning Letters Monitor 🔔 (drug & device alerts)",
        "description": "Track new FDA warning letters the week they post: company, issuing office, subject, program area and letter link. Filter by program or keyword, or watch on a schedule and get only what is new since your last run. No API key. Platform usage included.",
        "version": "0.1",
        "x-build-id": "eXWUC1krsLWCZX4xa"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/tagadanar~fda-warning-letters/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-tagadanar-fda-warning-letters",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/tagadanar~fda-warning-letters/runs": {
            "post": {
                "operationId": "runs-sync-tagadanar-fda-warning-letters",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/tagadanar~fda-warning-letters/run-sync": {
            "post": {
                "operationId": "run-sync-tagadanar-fda-warning-letters",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "programs": {
                        "title": "FDA programs",
                        "type": "array",
                        "description": "Limit to letters from these FDA programs. Leave empty for every program.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "drugs",
                                "medical-devices",
                                "food",
                                "biologics",
                                "tobacco",
                                "veterinary",
                                "imports"
                            ],
                            "enumTitles": [
                                "Drugs",
                                "Medical devices",
                                "Food & dietary supplements",
                                "Biologics",
                                "Tobacco",
                                "Veterinary",
                                "Imports"
                            ]
                        },
                        "default": []
                    },
                    "keywords": {
                        "title": "Company / subject watchlist (optional)",
                        "type": "array",
                        "description": "Only return letters whose company name or subject contains one of these words. Leave empty to get every letter in the window. Example: <code>CGMP</code>, <code>data integrity</code>, or a specific company name.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "sinceDays": {
                        "title": "Look-back window (days)",
                        "minimum": 1,
                        "maximum": 1825,
                        "type": "integer",
                        "description": "Only letters issued within this many days are returned. A daily scheduled run needs just 1-2 days; a first sweep can look back further.",
                        "default": 30
                    },
                    "maxLetters": {
                        "title": "Max letters",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Stop after this many letters across the whole run.",
                        "default": 200
                    },
                    "monitorMode": {
                        "title": "Monitor mode (alert on new letters only)",
                        "type": "boolean",
                        "description": "Remember letters already reported across runs and return only newly published ones. Built for a scheduled run: the first run sets the baseline, later runs report and charge for new letters only.",
                        "default": false
                    },
                    "webhookUrl": {
                        "title": "Webhook URL (Slack-compatible)",
                        "type": "string",
                        "description": "When monitor mode finds new letters, post a text digest here (Slack incoming webhook or any endpoint accepting <code>{\"text\": \"...\"}</code> JSON)."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
