# FDA Warning Letters Scraper (`parseforge/fda-warning-letters-scraper`) Actor

Scrape FDA Warning Letters with recipient company, issue date, issuing office, product type (drug, device, food, tobacco), subject, violation type, response letters and direct PDF URLs. Ideal for pharma compliance, MedTech regulatory teams, and life-sciences journalism.

- **URL**: https://apify.com/parseforge/fda-warning-letters-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** News, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## 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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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

![ParseForge Banner](https://github.com/ParseForge/apify-assets/blob/ad35ccc13ddd068b9d6cba33f323962e39aed5b2/banner.jpg?raw=true)

## ⚠️ FDA Warning Letters Scraper

> 🚀 **Export FDA warning letters with companies, issuing offices, and subjects in seconds.**

> 🕒 **Last updated:** 2026-05-26 · **📊 9 fields** per record · **3,000+ warning letters · all FDA centers · 9 fields per letter**

The FDA issues warning letters to companies, labs, and individuals when it identifies regulatory violations. This Actor pulls the official FDA warning-letters database into a structured dataset, one row per letter and 9 fields covering posted and issue dates, company, issuing office, subject, response and closeout status.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Pharma & biotech QA | Track FDA enforcement signals |
| Investors & analysts | Monitor regulated firms |
| Compliance teams | Audit suppliers and labs |
| Journalists | Cover health & safety stories |

### 📋 What the FDA Warning Letters Scraper does

- Queries the public FDA Warning Letters source and structures the response
- Returns one record per item with 9 normalized fields
- Supports pagination and optional filters
- Outputs to CSV, Excel, JSON, XML via Apify dataset
- Auto-limits to 10 items on the free plan; up to 1,000,000 on paid

> 💡 **Why it matters:** FDA Warning Letters data is public record. This Actor makes it usable.

### 🎬 Full Demo (_🚧 Coming soon_)

### ⚙️ Input

<table>
<thead><tr><th>Field</th><th>Type</th><th>Description</th></tr></thead>
<tbody><tr><td>maxItems</td><td>integer</td><td>Cap on rows (free: 10)</td></tr><tr><td>startOffset</td><td>integer</td><td>Skip first N letters (0 = newest)</td></tr></tbody>
</table>

```json
{ "maxItems": 50 }
````

```json
{ "maxItems": 300, "startOffset": 100 }
```

> ⚠️ **Good to Know:** The FDA closeout-letter field is populated only after the FDA confirms remediation. Most recent letters have it empty.

### 📊 Output

| Field | Type | Description |
|---|---|---|
| 🔹 postedDate | string | ISO posted date |
| 🔹 letterIssueDate | string | ISO letter issue date |
| 🔹 companyName | string | Recipient company or individual |
| 🔹 letterUrl | string | FDA.gov letter page URL |
| 🔹 issuingOffice | string | FDA center or office that issued the letter |
| 🔹 subject | string | Subject / violation type |
| 🔹 responseLetterDate | string | ISO response letter date or null |
| 🔹 closeoutLetterDate | string | ISO closeout letter date or null |
| 🔹 excerpt | string | Short excerpt from the letter body |
| 🕒 scrapedAt | string | ISO timestamp of when the record was collected |
| ❌ error | string | null | Error message if extraction failed |

### ✨ Why choose this Actor

- Direct FDA Warning Letters source, no third-party caching
- Real-time data, never stale
- Pay-per-result pricing; only charged for what you keep
- Works with Make, Zapier, n8n, Airbyte, GitHub Actions, Google Sheets

### 📈 How it compares to alternatives

| Approach | Cost | Maintenance | Coverage |
|---|---|---|---|
| Manual FDA.gov search | Free | High | No bulk export |
| XLSX export | Free | High | Manual download |
| This actor | Pay per result | None | Direct, structured |

### 🚀 How to use

1. [Create a free account w/ $5 credit](https://console.apify.com/sign-up?fpr=vmoqkp)
2. Open the Actor page
3. Set `maxItems` and any optional filters
4. Run
5. Download dataset as CSV, Excel, JSON, or XML

### 💼 Business use cases

#### Competitor & market intelligence

Track FDA Warning Letters entries relevant to your sector.

#### Compliance monitoring

Spot regulatory or enforcement signals in your industry feed.

#### Lead generation

Use FDA Warning Letters entries as a clean prospect list.

#### Risk & due diligence

Vet counterparties or candidates against the official record.

### 🔌 Automating FDA Warning Letters Scraper

Connects with Make, Zapier, n8n, Slack, Airbyte, GitHub Actions, and Google Drive via Apify's standard integrations.

### 🌟 Beyond business use cases

#### Research

Academic studies on regulation, public policy, and enforcement trends.

#### Personal

Citizens following developments in their communities.

#### Non-profit

Watchdog organizations and civic-tech projects auditing the record.

#### Experimentation

Train models on labeled regulatory data.

### 🤖 Ask an AI assistant about this scraper

ChatGPT, Claude, Perplexity, or Copilot can explain inputs, sample outputs, and integration patterns.

### ❓ Frequently Asked Questions

**Q: Is the data real-time?** A: Yes. FDA.gov is queried directly.
**Q: How far back does data go?** A: All 3,000+ warning letters currently listed on FDA.gov.
**Q: Can I filter by FDA center?** A: Currently no input filter, but the issuingOffice field lets you post-filter.
**Q: Are closeout letters included?** A: Yes, as a separate field. Empty if no closeout yet.
**Q: Does this include 483s?** A: No, only warning letters. Form 483s are separate.
**Q: Is this affiliated with the FDA?** A: No. Independent tool using public FDA data.
**Q: Does pagination work?** A: Yes via startOffset.
**Q: How fresh is each run?** A: Re-fetched on every run, no caching.
**Q: What if a letter is recalled?** A: FDA may unpublish or update; the row reflects current state.
**Q: Can I get the full letter body?** A: An excerpt is returned. Visit letterUrl for full text.

### 🔌 Integrate with any app

Make, Zapier, n8n, Slack, Airbyte, GitHub Actions, Google Sheets, Webhooks, REST API.

### 🔗 Recommended Actors

| Actor | Description |
|---|---|
| [FDA Orange Book Scraper](https://apify.com/parseforge/fda-orange-book-scraper) | FDA approved drug products |
| [SEC Litigation Releases Scraper](https://apify.com/parseforge/sec-litigation-releases-scraper) | SEC enforcement actions |
| [FTC Actions Scraper](https://apify.com/parseforge/ftc-actions-scraper) | FTC enforcement actions |

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge).

**🆘 Need Help?** [Open our contact form](https://tally.so/r/BzdKgA)

> **⚠️ Disclaimer:** independent tool, not affiliated with the FDA Warning Letters source agency or any government. Only publicly available data collected.

# Actor input Schema

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

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000

## `startOffset` (type: `integer`):

Skip the first N letters (0 = newest).

## Actor input object example

```json
{
  "maxItems": 10,
  "startOffset": 0
}
```

# Actor output Schema

## `results` (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 = {
    "maxItems": 10
};

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

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "FDA Warning Letters Scraper",
        "description": "Scrape FDA Warning Letters with recipient company, issue date, issuing office, product type (drug, device, food, tobacco), subject, violation type, response letters and direct PDF URLs. Ideal for pharma compliance, MedTech regulatory teams, and life-sciences journalism.",
        "version": "0.1",
        "x-build-id": "fqookU2nhL7FG0zeg"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/parseforge~fda-warning-letters-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-parseforge-fda-warning-letters-scraper",
                "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/parseforge~fda-warning-letters-scraper/runs": {
            "post": {
                "operationId": "runs-sync-parseforge-fda-warning-letters-scraper",
                "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/parseforge~fda-warning-letters-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-parseforge-fda-warning-letters-scraper",
                "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": {
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000"
                    },
                    "startOffset": {
                        "title": "Start Offset",
                        "minimum": 0,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Skip the first N letters (0 = newest).",
                        "default": 0
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
