FDA Warning Letters Scraper: Company, Office & Full Text
Pricing
from $12.48 / 1,000 results
FDA Warning Letters Scraper: Company, Office & Full Text
Scrape FDA Warning Letters (pharma, food, devices, tobacco). Get company, issuing office/center, subject, posted & issue dates, closeout status, letter URL, plus full letter text, recipient, product area and cited violations. Filter by keyword, office, date. Export JSON, CSV, Excel.
Pricing
from $12.48 / 1,000 results
Rating
0.0
(0)
Developer
Scrapers Lat
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
FDA Warning Letters Scraper: Company, Office & Full Text
Here is one real result, with every field the actor returns (the letterText is trimmed here for length; AI add-on fields included):
{"postedDate": "2026-07-21","issueDate": "2026-07-10","companyName": "ejuicedemand.com","issuingOffice": "Center for Tobacco Products","subject": "Family Smoking Prevention and Tobacco Control Act/Adulterated/Misbranded","responseLetter": false,"closeoutLetter": false,"letterUrl": "https://www.fda.gov/inspections-compliance-enforcement-and-criminal-investigations/warning-letters/ejuicedemandcom-733740-07102026","recipientName": null,"recipientTitle": null,"recipientAddress": "7753 NW 53rd Street, Doral, FL, 33166, United States","recipientEmail": "sales@ejuicedemand.com","emails": ["sales@ejuicedemand.com"],"deliveryMethod": "VIA UPS and Electronic Mail","referenceNumber": "RW2602432","productArea": "Tobacco","issuingOfficeDetail": "Center for Tobacco Products","letterText": "To Whom It May Concern: The Center for Tobacco Products of the U.S. Food and Drug Administration (FDA) recently reviewed the website https://ejuicedemand.com and determined that e-liquid products listed there are offered for sale ...","letterLength": 4949,"citations": ["section 201(rr)", "21 U.S.C. § 321", "section 901", "21 U.S.C. § 387a", "section 906(d)(5)", "section 903(a)(7)(B)", "Section 910(a)"],"citationsCount": 10,"source": "FDA Warning Letters","observedAt": "2026-08-14T07:35:44.192Z","aiSummary": "The FDA issued a warning to eJuice Demand for selling Nitro's Cold Brew Smoothies e-liquid to a person under 21 years of age, violating the Federal Food, Drug, and Cosmetic Act. The FDA requires a written response detailing corrective actions within 15 working days.","aiExtract": null,"aiSeverity": "high","aiSeverityScore": 85,"error": null}
The most complete FDA warning letters scraper available. It returns every field the FDA warning letter record exposes (company, issuing office, subject, issue and posted dates, recipient address and email, delivery method, reference number and product area) plus the full letter text and parsed legal citations, and offers optional AI add-ons for a plain-English summary, a structured extract and a severity score.
📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples
Table of contents
- What it does
- Quickstart
- Input reference
- Output reference
- Example output record
- Run via API and CLI
- Fetch results
- Billing and limits
- FAQ and troubleshooting
What it does
The actor searches the FDA warning letters index, applies your keyword, office, company, subject and date filters, paginates through the matches, and writes one normalized record per letter to the run's dataset. Each record carries the company name, issuing office, subject, issue and posted dates, and a direct link to the letter.
With fetchDetails on (the default), the actor opens each letter's detail page to add the full letter text, recipient name, title and address, contact emails, delivery method, reference number, product area and parsed legal citations. Three optional AI add-ons produce a plain-English summary, a structured extract, and a severity rating. Dates are normalized to YYYY-MM-DD, and missing source values are returned as null, never invented.
Note: fda.gov is bot protected. The actor defaults to Apify Residential (US) proxy, which is required to reach the site reliably.
Quickstart
Open the actor, paste this into the input, and press Run. It returns up to 50 CGMP-related warning letters, newest first, with full text.
{"searchQuery": "CGMP","fetchDetails": true,"maxLetters": 50}
Leave searchQuery empty to list all warning letters newest first. Add issuingOffice, year, or a dateFrom/dateTo range to narrow the results.
Input reference
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
searchQuery | string | no | (empty) | Full-text search across company names and letter content, for example a company, drug, brand, or violation term (CGMP, data integrity, unapproved new drug). Empty lists all letters newest first. |
issuingOffice | string | no | (any) | Restrict to a specific FDA issuing office or center, for example CDER, Center for Tobacco Products, CFSAN, CDRH, or a district office name. |
companyKeyword | string | no | (any) | Only return letters whose company name contains this text (case-insensitive). Applied in addition to the keyword search. |
subjectKeyword | string | no | (any) | Only return letters whose subject contains this text, for example tobacco, adulterated, misbranded, CGMP. |
postedWithin | enum | no | Any | Restrict by how recently the letter was posted: Any, Last 7 days, Last 30 days, Last 60 days, Last 90 days. |
issuedWithin | enum | no | Any | Restrict by how recently the letter was issued to the company (same options as postedWithin). |
dateFrom | string | no | (empty) | Only letters posted on or after this date (YYYY-MM-DD). The scraper stops paging once it passes below this date. |
dateTo | string | no | (empty) | Only letters posted on or before this date (YYYY-MM-DD). |
year | string | no | (empty) | Only letters posted in this calendar year, for example 2025. |
fetchDetails | boolean | no | true | When on, each letter is enriched from its detail page with full text, recipient name/title/address, delivery method, reference number, product area and cited violations. |
withAiSummary | boolean | no | false | AI add-on: plain-English summary of each letter (paid). |
withAiExtract | boolean | no | false | AI add-on: structured extract of violations, products, required actions and response deadline (paid). |
withAiSeverity | boolean | no | false | AI add-on: severity rating (low/medium/high/critical) with a 0-100 score (paid). |
maxLetters | integer | no | 50 | Maximum warning letters to collect. |
proxyConfiguration | object | no | Residential US | Proxy settings. Defaults to Apify Residential (US), required to reach fda.gov reliably. |
Filters combine with logical AND.
Output reference
One dataset item per warning letter. Types: string, integer, boolean, string[], object, or null when the source value is absent. Fields from recipientName through citationsCount come from the detail page and populate when fetchDetails is on. Fields prefixed ai populate only when the matching AI add-on is enabled.
| Field | Type | Description |
|---|---|---|
postedDate | string | Date the letter was posted by the FDA (YYYY-MM-DD). |
issueDate | string | Date the letter was issued to the company (YYYY-MM-DD). |
companyName | string | Recipient company name. |
issuingOffice | string | FDA issuing office or center. |
subject | string | Letter subject or topic. |
responseLetter | boolean | Whether this record is a response letter. |
closeoutLetter | boolean | Whether this record is a closeout letter. |
letterUrl | string | Direct link to the letter on fda.gov. |
recipientName | string | Named recipient, or null (detail). |
recipientTitle | string | Recipient title, or null (detail). |
recipientAddress | string | Recipient postal address (detail). |
recipientEmail | string | Primary recipient email, or null (detail). |
emails | string[] | All contact emails found in the letter (detail). |
deliveryMethod | string | How the letter was delivered, for example VIA UPS and Electronic Mail (detail). |
referenceNumber | string | FDA reference number (detail). |
productArea | string | Product area, for example Tobacco, Drugs, Devices (detail). |
issuingOfficeDetail | string | Issuing office as stated on the detail page (detail). |
letterText | string | Full text of the warning letter (detail). |
letterLength | integer | Character length of the letter text (detail). |
citations | string[] | Legal citations parsed from the letter (detail). |
citationsCount | integer | Number of citations found (detail). |
source | string | Data source (FDA Warning Letters). |
observedAt | string | ISO 8601 timestamp of when the record was collected. |
aiSummary | string | AI plain-English summary (AI). |
aiExtract | object | AI structured extract of violations, products, actions and deadline (AI). |
aiSeverity | string | AI severity rating: low, medium, high, critical (AI). |
aiSeverityScore | integer | AI severity score, 0 to 100 (AI). |
error | string | null on success. On a failed run, a single item with a populated error field is written instead. |
Example output record
The hero record at the top of this page is a real record from a live run (input {"issuingOffice":"Center for Tobacco Products","fetchDetails":true,"withAiSummary":true,"withAiSeverity":true,"maxLetters":50}), with the letterText and citations trimmed for length. A full run returns the complete text and every citation.
Run via API and CLI
Start a run and wait for it to finish, then read the dataset. Replace <TOKEN> with your Apify API token.
Run synchronously and get dataset items in one call:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~fda-warning-letters-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"searchQuery":"data integrity","issuingOffice":"CDER","fetchDetails":true,"maxLetters":25}'
Start a run asynchronously:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~fda-warning-letters-scraper/runs?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"year":"2025","subjectKeyword":"CGMP","maxLetters":100}'
Apify CLI:
apify call scrapers_lat/fda-warning-letters-scraper \--input '{"companyKeyword":"pharma","dateFrom":"2025-01-01","dateTo":"2025-12-31"}'
Fetch results
Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:
# JSONcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"# CSVcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"# Paginate large datasetscurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
<DATASET_ID> is returned as defaultDatasetId in the run object. Use offset and limit to page through large result sets. clean=true drops empty and internal fields.
Billing and limits
- Pay per result. You are charged per warning letter returned (
resultevent). See the pricing tab for the current per-result price. - AI add-ons are billed separately.
withAiSummary,withAiExtractandwithAiSeverityare paid add-ons, charged only when they return usable output. - No charge on failure. If a run errors, the actor writes a single item with a populated
errorfield and does not charge for it. Empty runs cost nothing. - Spend cap respected. Set
maxTotalChargeUsdon the run; once reached, the actor stops emitting and charging further billable results. - Free Apify plans are capped at 10 letters per run. Upgrade for higher
maxLetters. - Proxy required. fda.gov is bot protected; the actor defaults to Apify Residential (US) proxy to reach it reliably.
FAQ and troubleshooting
A run returned 0 letters. Why?
The filter combination matched nothing, or the date range excluded every letter. Loosen searchQuery, remove issuingOffice/year, or widen the date range. Zero-result runs are not charged.
How do I get the full letter text and citations?
Leave fetchDetails on (the default). The actor then opens each letter and adds letterText, citations, recipientAddress, emails, deliveryMethod and referenceNumber.
What do the AI add-ons do?
withAiSummary adds a plain-English summary. withAiExtract adds a structured extract of violations, products, required actions and response deadline. withAiSeverity adds a severity rating and 0-100 score. All are optional, paid, and charged only when they return usable output.
Why is recipientName null?
The letter was addressed generically (for example "To Whom It May Concern") so no individual recipient was named. Missing values are returned as null, never invented.
How do I pull a whole year of letters efficiently?
Set year, or a dateFrom/dateTo range. The scraper stops paging once it passes below dateFrom, so bounded date pulls are efficient.
Is this an official FDA tool? No. This actor is independent and has no affiliation with the FDA. It reads only warning letters that are publicly available on fda.gov. Use it in accordance with the FDA's terms.
Related scrapers
- FDA Drug & Device Recalls Scraper: US FDA drug and device recalls.
- openFDA Food Recalls Scraper: US FDA food recall enforcement records.
- openFDA Drug Events & Recalls Scraper: FDA drug adverse events and recalls.
- FDA Drug Labels Scraper: structured FDA drug label data.
- HHS OIG Exclusions Scraper: US healthcare exclusion list.
- CFPB Complaints Scraper: US consumer financial complaints.
More scrapers at scrapers.lat
Built and maintained by scrapers.lat, where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at scrapers.lat.
Independent tool, not affiliated with the FDA. Accesses only publicly available FDA warning letters. Use in accordance with the FDA's terms of service.
