# FDA Warning Letters Monitor: By Company & Subject (`offerastudio/fda-warning-letters-monitor`) Actor

Get FDA warning letters from fda.gov's official list by company, issuing office, subject and date. Returns letter and posted dates, subject, product type, response and close-out flags, the letter link, the first 800 characters of the letter and the 21 CFR regulations it cites.

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

## Pricing

from $3.00 / 1,000 letter returneds

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

### What does FDA Warning Letters Monitor do?

**FDA Warning Letters Monitor** returns the **warning letters that FDA publishes on fda.gov**, filtered by **company, issuing office, subject and date**. For each letter it can also read the **letter itself**: the **start of the text**, the **product line** and the **21 CFR regulations the letter cites**. No key, no login, no proxy: it uses the same public list that the FDA page shows.

Each row has:

- **company** and **issuing office** (CDER, CDRH, CBER, Human Foods Program, CVM, CTP ...)
- **letter date** and **posted date**
- **subject** (for example `CGMP/Finished Pharmaceuticals/Adulterated`)
- **product type** (drugs, medical devices, food ...) and where it came from
- **response letter** and **close-out letter** flags, with dates and links
- the **letter link**
- the **first 800 characters of the letter text** (without the date and salutation)
- the **cited regulations**, such as `21 CFR 211.22` or `21 CFR Part 820`

### Who is it for?

- **Pharma, device and food quality and regulatory teams**: new warning letters to competitors, suppliers and contract manufacturers, with the regulations cited.
- **Supplier risk and procurement teams**: check a list of supplier names against FDA warning letters, with fuzzy name matching.
- **Investors and analysts**: spot enforcement against listed companies early, and see whether a letter was closed out.
- **Law firms and consultants**: the subject, office and cited regulations for each letter, ready for a spreadsheet.

Related Actors from the same developer: [US Product Recalls Monitor](https://apify.com/offerastudio/us-product-recalls-monitor) (FDA and CPSC recalls, often the next step after a warning letter) and [OSHA & EPA Violation Monitor](https://apify.com/offerastudio/osha-epa-violation-monitor) (workplace and environmental enforcement for the same company names).

### How to use it

1. Click **Start** with the default input: the 5 newest letters of the last 30 days, with the letter text. This takes about 3 minutes because of FDA's crawl delay (see below).
2. Add filters: company names, issuing offices (`CDER`, `CDRH` ...), subject keywords (`CGMP`, `adulterated`, `misbranded`, `data integrity`), a letter date window.
3. For a fast list without letter text, turn **Read each letter** off: 100 letters take about 30 seconds.
4. **Schedule** it weekly with a short window (for example letters from `14 days`). Letters appear on fda.gov a few days to weeks after their date.

#### Why is it slow?

FDA's robots.txt asks crawlers without their own entry to wait **30 seconds between requests**. This Actor sends one request at a time and waits 30 seconds between them. Reading a letter's text needs one request per letter, so it adds about 30 seconds per letter. The list itself comes 100 letters per request. Plan runs accordingly: 25 letters with text take about 13 minutes; 1,000 letters without text take about 5 minutes.

### Input example

```json
{
    "companyNames": ["Fresenius Kabi", "Teva"],
    "issuingOffices": ["CDER", "CDRH"],
    "subjectKeywords": ["CGMP", "data integrity"],
    "lettersFrom": "90 days",
    "includeLetterText": true,
    "maxResults": 25
}
```

| Field | Meaning |
| --- | --- |
| `companyNames` | Fuzzy: legal suffixes (Inc, LLC, Ltd), plurals and one typo in long words are ignored; all words must appear in the company name. |
| `issuingOffices` | Part of an office name, or `CDER`, `CDRH`, `CBER`, `CVM`, `CTP`, `HFP`, `OPDP`, `OII`. |
| `subjectKeywords` | A letter matches if its subject line contains any keyword. |
| `lettersFrom`, `lettersTo` | `2026-09-01` or relative (`30 days`). Default: the last 30 days. |
| `includeLetterText` | Read each letter page (text start, product, cited regulations). Default on. |
| `maxResults` | Up to 1,000 letters, newest first (default 25). |

### Output example

Real output of a local run on 7 October 2026 with the default input (5 letters, last 30 days):

| Company | Issuing office | Letter date | Subject | Product | Cited |
| --- | --- | --- | --- | --- | --- |
| Terramed | CDER | 2026-10-01 | Unapproved New Drugs | Drugs | 21 CFR 201.128 |
| DesBio/Deseret Biologicals, Inc. | CDER | 2026-10-01 | Unapproved New Drugs | Drugs | 21 CFR 201.128 |
| Aidance Scientific, Inc. | CDER | 2026-10-01 | Unapproved New Drugs | Drugs | 21 CFR 201.128 |
| The Platinum Healthcare LLC | CDER | 2026-10-01 | Unapproved New Drugs | Drugs | 21 CFR 201.128 |
| Graceful Touch, LLC | CDER | 2026-10-01 | Unapproved New Drugs | Drugs | 21 CFR 201.128 |

A CGMP letter in full (letter text shortened):

```json
{
    "company": "Fresenius Kabi USA LLC",
    "issuingOffice": "Center for Drug Evaluation and Research (CDER)",
    "letterDate": "2026-09-22",
    "postedDate": "2026-09-29",
    "subject": "CGMP/Finished Pharmaceuticals/Adulterated",
    "productType": "Drugs",
    "productTypeSource": "letter",
    "hasResponseLetter": false,
    "isClosedOut": false,
    "closeoutLetterDate": null,
    "letterUrl": "https://www.fda.gov/inspections-compliance-enforcement-and-criminal-investigations/warning-letters/fresenius-kabi-usa-llc-733107-09222026",
    "letterTextStatus": "fetched",
    "letterTextPreview": "This warning letter advises you of significant violations observed during a U.S. Food and Drug Administration (FDA) inspection of your facility. Promptly address the violations described herein withou…",
    "citedRegulations": ["21 CFR Part 210", "21 CFR Part 211", "21 CFR 211.192", "21 CFR 211.113(b)", "21 CFR 211.110(a)", "21 CFR 211.42(c)(10)", "21 CFR 211.34"]
}
```

Checked live on 7 October 2026: the default input (6 requests, 2 minutes 31 seconds), a fuzzy company search over 8 months with the letter text off (`Deseret Biologicals` matched `DesBio/Deseret Biologicals, Inc.`; 5 list pages, 2 minutes), and a CDER + CGMP filter.

### How much does it cost?

This Actor uses **pay per event**:

| Event | Price |
| --- | --- |
| Letter returned (one row each) | **$0.003** |
| Info rows, error rows and "no results" rows | **free** |

- 100 letters cost **$0.30**. The default run (5 letters) costs **$0.015**.
- The FDA list is free. Apify also charges a tiny standard start fee per run, and compute time counts: because of the 30-second delay, a run with letter text uses more run time than most Actors (about 0.5 minutes per letter at 256 MB).
- Set **Maximum cost per run** and the Actor stops when it is reached.

### Limitations

- **Only letters that FDA has posted**, in the order FDA lists them. A letter is usually posted a few days to a few weeks after its date.
- **Slow by design**: one request every 30 seconds, as fda.gov's robots.txt asks (see above).
- **Product type is derived**: from the letter page when it is read, else from the issuing office, else from the subject line, and it can be empty. `productTypeSource` says which.
- **Cited regulations are read from the letter text with patterns** (`21 CFR 211.22(d)`, `21 CFR Parts 210 and 211` ...). Other regulations (for example 9 CFR or 42 CFR) are not listed, and an unusual spelling can be missed.
- **The letter text starts after the date and the salutation**, because the salutation names the recipient, which this Actor does not return.
- **Subject keywords match the subject line only**, not the whole letter.
- The listing endpoint is the one fda.gov's own page uses; if FDA changes the page, the Actor returns a free error row until it is updated.
- Company search over many years reads many list pages (about 30 seconds per 100 letters).

### FAQ

#### Is this official data?

Yes. It is FDA's own published warning letter list and letter pages. FDA says the content of fda.gov is in the public domain.

#### Does this use openFDA?

No. openFDA does not offer warning letters. The Actor reads the list that FDA publishes on fda.gov, and follows its robots.txt crawl delay.

#### Can I check a supplier list?

Yes: put the names in `companyNames`. The match is fuzzy and the row says which name matched (`matchedCompany`). Use a long `lettersFrom` (for example `3 years`) and turn the letter text off to keep it quick.

#### What do the response and close-out flags mean?

FDA lists a response letter when the company's response is posted, and a close-out letter when FDA has determined the violations were addressed. The row shows the date and link of each.

#### Does it return people's names?

No. The recipient named in a letter's salutation is not returned, and the text starts after it. The company names, offices and subjects are as FDA publishes them.

### More tools from the same developer

All pay-per-result, no proxy or login needed, built and maintained by the same developer:

**Website audits**

- [Website Accessibility Checker: WCAG 2.2 & EAA](https://apify.com/offerastudio/website-accessibility-audit): accessibility issues with fixes, SEO basics and security headers.
- [Cookie & Tracker Audit: GDPR Consent Checker](https://apify.com/offerastudio/cookie-tracker-audit): cookies and tracking tags that load before consent.
- [AI Crawler Access Checker: robots.txt & llms.txt](https://apify.com/offerastudio/ai-crawler-access-audit): which AI crawlers a site allows, plus llms.txt.
- [Structured Data Validator: Schema & Rich Results](https://apify.com/offerastudio/structured-data-validator): JSON-LD and Microdata checked against Google's rich result rules.
- [Website Change Monitor: Diffs, Prices & Alerts](https://apify.com/offerastudio/website-change-monitor): get a row only when a page changes, with a clean diff.
- [Policy Change Monitor: Privacy & Terms Tracker](https://apify.com/offerastudio/policy-change-monitor): privacy policy and terms changes, classified clause by clause.
- [SaaS Pricing Monitor: Track Competitor Plans](https://apify.com/offerastudio/saas-pricing-monitor): competitor pricing plans as structured data, with price-change diffs.
- [Sitemap Change Monitor: New & Removed URLs](https://apify.com/offerastudio/sitemap-change-monitor): new, removed and changed URLs from a site's sitemaps.
- [Site SEO Crawler: Broken Links & On-Page Audit](https://apify.com/offerastudio/site-seo-crawler-audit): site-wide crawl for broken links, redirects and on-page SEO issues.
- [Website Tech Stack Detector: Bulk Lead Filters](https://apify.com/offerastudio/website-tech-stack-detector): technologies used by websites, with filters for lead lists.
- [Domain Availability & Expiry Checker (RDAP)](https://apify.com/offerastudio/domain-whois-availability): domain availability, registrar and expiry dates from RDAP.
- [Status Page SLA Monitor: Uptime & Incidents](https://apify.com/offerastudio/status-page-sla-monitor): SaaS vendor uptime, incidents and a monthly SLA table from public status pages.

**Company data and compliance**

- [Company Contact Finder: Emails, Phones & Socials](https://apify.com/offerastudio/company-contact-finder): contact details published on company websites.
- [UK New Companies Feed: Companies House Daily](https://apify.com/offerastudio/uk-new-companies-feed): newly incorporated UK companies with sector filters.
- [EU VAT Number Validator: Bulk VIES Checker](https://apify.com/offerastudio/eu-vat-number-validator): bulk VAT checks with name, address and consultation number.
- [LEI Corporate Tree: GLEIF Parents & Subsidiaries](https://apify.com/offerastudio/gleif-lei-corporate-tree): LEI lookup with parents, subsidiaries and a KYC summary.
- [UK Company Distress Watch: Insolvency Alerts](https://apify.com/offerastudio/uk-company-distress-watch): administrations, liquidations and winding-up petitions from The Gazette.
- [IBAN Validator: Bulk Check & Bank Lookup](https://apify.com/offerastudio/iban-bank-validator): IBAN format and checksum, plus bank name and BIC where open data exists.
- [Sanctions Screening: OFAC, EU, UN & UK Lists](https://apify.com/offerastudio/sanctions-screening): names screened against official sanctions lists, with match scores.
- [OSHA & EPA Violation Monitor: Fines by Company](https://apify.com/offerastudio/osha-epa-violation-monitor): US OSHA and EPA enforcement cases and penalties by company.
- [Email List Precheck: Syntax, MX & Disposable Check](https://apify.com/offerastudio/email-list-precheck): cheap email list hygiene before a real verification.
- [UK Company Officer Changes: Director & PSC Alerts](https://apify.com/offerastudio/uk-company-officer-changes): director, owner, address and status changes for a watchlist of UK companies.
- [Supplier Risk Report: Sanctions, VAT & Insolvency](https://apify.com/offerastudio/supplier-risk-report): one risk row per supplier from eight official registers, with changes since last run.
- [Brand Impersonation Domain Monitor: Look-alikes](https://apify.com/offerastudio/brand-impersonation-domain-monitor): look-alike domains and certificates that imitate your brand, with a risk score.

**Media and AI**

- [Audio & Video Transcriber: Podcasts, SRT, Speakers](https://apify.com/offerastudio/audio-video-transcriber): audio, video, podcasts and social links to text, SRT and VTT.
- [Podcast Mention Alerts: Brand Mentions by Second](https://apify.com/offerastudio/podcast-mention-alerts): where your brand is said in new podcast episodes, with the exact second.
- [News Brand Mentions Monitor: New Articles Only](https://apify.com/offerastudio/news-brand-mentions-monitor): new news articles about your brand, people or topics.
- [YouTube Channel Monitor: New Videos & Growth](https://apify.com/offerastudio/youtube-channel-monitor): new videos and view growth of the channels you watch.

**Market signals**

- [US WARN Layoff Notices: 12 States Daily Feed](https://apify.com/offerastudio/us-warn-layoff-notices): layoff and plant closure notices from official state sources.
- [US Product Recalls Monitor: FDA & CPSC Feed](https://apify.com/offerastudio/us-product-recalls-monitor): FDA and CPSC recalls in one feed, with severity.
- [EU Tenders Feed: TED Public Procurement Alerts](https://apify.com/offerastudio/eu-tender-feed): EU public tenders from TED with CPV, country and value filters.
- [Liquor License Openings: New Bars & Stores (US)](https://apify.com/offerastudio/liquor-license-openings): new US liquor licences from official state open data.
- [Clinical Trials Change Monitor: Status & Updates](https://apify.com/offerastudio/clinicaltrials-change-monitor): status, enrollment and results changes on ClinicalTrials.gov studies.
- [Career Site Jobs Monitor: ATS Jobs & New Roles](https://apify.com/offerastudio/career-site-jobs-monitor): open roles from company career sites, with new and closed roles since the last run.
- [App Reviews Monitor: App Store & Google Play](https://apify.com/offerastudio/app-store-reviews-monitor): app reviews from both stores, only new ones in monitor mode.
- [US Federal Contracts Feed: SAM.gov & USAspending](https://apify.com/offerastudio/us-federal-contracts-feed): SAM.gov contract opportunities with the buyer's award history.
- [Grants.gov Opportunities: US Federal Grants Feed](https://apify.com/offerastudio/grants-gov-opportunities): US federal grant opportunities by keyword, eligibility and agency.
- [Federal Register Monitor: US Rules & Notices Feed](https://apify.com/offerastudio/federal-register-monitor): new US rules, proposed rules and notices by agency or topic.
- [B2B Sales Trigger Feed: Hiring + Tech Leads](https://apify.com/offerastudio/b2b-sales-trigger-feed): companies hiring for a role and using (or not using) a technology, with contacts.
- [Local Business Leads: OpenStreetMap, No Website](https://apify.com/offerastudio/local-business-leads-osm): local businesses by city and category, including those with no website.
- [Solana Token Pair Monitor: New & Trending Pairs](https://apify.com/offerastudio/solana-token-pair-monitor): new and trending Solana pairs with liquidity, volume and safety flags.

### Feedback

Missing a field you want to track? Open an issue on the **Issues** tab.

# Changelog

This Actor's version history is a separate document: https://apify.com/offerastudio/fda-warning-letters-monitor/changelog.md

# Actor input Schema

## `companyNames` (type: `array`):

Fuzzy match: legal suffixes (Inc, LLC, Ltd), plurals and one typo in long words are ignored, and all words must appear in the company name. Leave empty for all companies. Looking up a company over several years reads many list pages (about 30 seconds each).

## `issuingOffices` (type: `array`):

Part of an FDA office name or an abbreviation: CDER (drugs), CDRH (devices), CBER (biologics), CVM (veterinary), CTP (tobacco), HFP (human foods), OPDP (drug promotion), OII (inspections and investigations).

## `subjectKeywords` (type: `array`):

A letter matches if its subject contains any keyword, for example CGMP, adulterated, misbranded, data integrity, unapproved, dietary supplement.

## `lettersFrom` (type: `string`):

First letter date, for example 2026-09-01, or relative: "30 days" means 30 days ago. Default: the last 30 days. Letters are posted on fda.gov a few days to weeks after their date.

## `lettersTo` (type: `string`):

Last letter date, inclusive. Default: today.

## `includeLetterText` (type: `boolean`):

Adds the first 800 characters of the letter, the product line and the 21 CFR references it cites. Needs one extra page request per letter, so about 30 seconds per letter (FDA's crawl delay). Turn it off for a fast list: 100 letters per 30 seconds.

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

Stop after this many letters (newest first). You pay $0.003 for each. With letter text on, 5 letters take about 3 minutes.

## Actor input object example

```json
{
  "includeLetterText": true,
  "maxResults": 2
}
```

# Actor output Schema

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

No description

## `regulations` (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 = {
    "maxResults": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("offerastudio/fda-warning-letters-monitor").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 = { "maxResults": 2 }

# Run the Actor and wait for it to finish
run = client.actor("offerastudio/fda-warning-letters-monitor").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 '{
  "maxResults": 2
}' |
apify call offerastudio/fda-warning-letters-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,offerastudio/fda-warning-letters-monitor"
        }
    }
}
```

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/Fz8OT4mgnVOQP7egQ/builds/EePzakxaawrcDY7ZJ/openapi.json
