openFDA Food Recall & Enforcement Scraper (USA)
Pricing
from $6.15 / 1,000 results
openFDA Food Recall & Enforcement Scraper (USA)
Scrape FDA food recall and enforcement actions from the official openFDA API. Extract recall number, hazard class, product description, reason, recalling firm, city, state and dates across the United States. Export to JSON, CSV or Excel.
Pricing
from $6.15 / 1,000 results
Rating
5.0
(1)
Developer
Scrapers Lat
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
3
Monthly active users
20 hours ago
Last modified
Categories
Share
openFDA Food Recall & Enforcement Scraper (USA)
Here is one real result, with every field the actor returns:
{"recallNumber": "F-2059-2016","status": "Terminated","classification": "Class II","productType": "Food","productDescription": "Product label reads in part: \"MR.SPECIAL PANCAKES***PANCAKES & WAFFLE MIX***Peso Neto/Net Weight 11 gr\"","reasonForRecall": "Undeclared allergen: Soy lecithin","recallingFirm": "Productos La Finca, Inc.","city": "Sabana Grande","state": "PR","country": "United States","postalCode": "00637","addressLine1": "Zona Industrial Machuchal","addressLine2": "Ave. Quilinchini #61","distributionPattern": "Puerto Rico only.","productQuantity": "163 boxes of 12 (16 oz) canister each","codeInfo": "Lots: 15280 and 16118","moreCodeInfo": null,"voluntaryMandated": "Voluntary: Firm initiated","initialFirmNotification": "Letter","recallInitiationDate": "2016-07-12","centerClassificationDate": "2016-09-02","reportDate": "2016-09-14","terminationDate": "2017-07-03","eventId": "74684","classificationLevel": 2,"active": false,"firmAddress": "Zona Industrial Machuchal, Ave. Quilinchini #61, Sabana Grande, PR 00637, United States","recallAgeDays": 3622,"distributionNationwide": false,"distributionStates": ["PR"],"riskScore": 42,"openfda": null,"observedAt": "2026-08-15T02:14:22.606Z","error": null}
The most complete openFDA food recall scraper available. It returns every field the FDA food enforcement database exposes for each recall, plus derived fields for faster analysis, and gives you nine filters to target exactly the recalls you need.
📥 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 calls the openFDA food enforcement dataset, applies the filters you pass as input, paginates through the matching recalls, and writes one normalized record per recall to the run's dataset. Dates are normalized to YYYY-MM-DD, missing source values are returned as null, and a set of derived fields (riskScore, distributionStates, distributionNationwide, firmAddress, recallAgeDays, classificationLevel, active) is computed on top of the raw FDA fields so you can sort and filter without extra parsing.
Data covers US food recalls only (product_type = Food). It does not include drug or device recalls (see the openFDA Drug Events & Recalls Scraper for drugs).
Quickstart
Open the actor, paste this into the input, and press Run. It returns the 10 most recent Listeria food recalls.
{"maxRecalls": 10,"searchQuery": "listeria","dateField": "report_date","sortOrder": "Newest first"}
Leave searchQuery empty to pull the most recent food recalls with no keyword filter. Every input field is optional; with an empty input the actor returns the most recent food recalls (default maxRecalls is 10).
Input reference
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
maxRecalls | integer | no | 10 | Maximum records to collect. openFDA paginates with a skip offset up to 25000 per query; for larger pulls, narrow the filters or date range. |
searchQuery | string | no | (empty) | A plain keyword matched against reason_for_recall (for example listeria, salmonella, undeclared allergen), OR a raw openFDA field expression such as product_description:cheese or recalling_firm:Tyson. A value containing field: is treated as a raw expression. |
classification | enum | no | (any) | Hazard class. One of Class I, Class II, Class III. Class I is most serious. |
status | enum | no | (any) | Recall status. One of Ongoing, Completed, Terminated, Pending. |
state | enum | no | (any) | Two-letter US state code of the recalling firm, for example CA, NY, TX. |
recallingFirm | string | no | (empty) | Firm or manufacturer name phrase, for example Tyson, Dole, Nestle. |
productDescription | string | no | (empty) | Word or phrase in the product description, for example cheese, spinach, peanut butter. |
city | string | no | (empty) | City of the recalling firm, for example Los Angeles. |
country | string | no | (empty) | Country of the recalling firm, for example United States, Canada, Mexico. |
voluntaryMandated | enum | no | (any) | Voluntary (firm initiated) or Mandated (FDA ordered). |
dateFrom | string | no | (empty) | Include recalls on or after this date (YYYY-MM-DD). Applies to dateField. |
dateTo | string | no | (empty) | Include recalls on or before this date (YYYY-MM-DD). Applies to dateField. |
dateField | enum | no | report_date | Which date the range applies to. One of report_date, recall_initiation_date, center_classification_date, termination_date. |
sortOrder | enum | no | (relevance) | Newest first or Oldest first, ordered on dateField. Empty keeps openFDA relevance order. |
recallNumber | string | no | (empty) | Look up one exact FDA recall number, for example F-0609-2015. |
eventId | string | no | (empty) | Pull every recall in one FDA recall event, for example 69516. One event often groups many related product recalls. |
proxyConfiguration | object | no | (none) | Standard Apify proxy configuration. Not required; the source is not bot protected. |
Filters combine with logical AND. If you pass no filters at all, the actor defaults to product_type:Food so you get food recalls only.
Output reference
One dataset item per recall. Types: string, integer, boolean, string[], object, or null when the source value is absent.
| Field | Type | Description |
|---|---|---|
recallNumber | string | FDA recall number (unique per recall), for example F-0609-2015. |
status | string | Recall status: Ongoing, Completed, Terminated, or Pending. |
classification | string | Hazard class: Class I, Class II, or Class III. |
productType | string | Product type. Always Food for this actor. |
productDescription | string | Full labeled description of the recalled product. |
reasonForRecall | string | Narrative reason the product was recalled. |
recallingFirm | string | Firm or manufacturer that initiated or is subject to the recall. |
city | string | City of the recalling firm. |
state | string | Two-letter state code of the recalling firm. |
country | string | Country of the recalling firm. |
postalCode | string | Postal code of the recalling firm. |
addressLine1 | string | First line of the firm street address. |
addressLine2 | string | Second line of the firm street address, or null. |
distributionPattern | string | Free-text description of where the product was distributed. |
productQuantity | string | Quantity of product in distribution. |
codeInfo | string | Lot codes, UPCs, best-by dates identifying affected product. |
moreCodeInfo | string | Additional code information, or null. |
voluntaryMandated | string | Whether the recall was firm initiated (voluntary) or FDA mandated. |
initialFirmNotification | string | How the firm first notified the public or trade. |
recallInitiationDate | string | Date the firm started the recall (YYYY-MM-DD). |
centerClassificationDate | string | Date the FDA center classified the recall (YYYY-MM-DD). |
reportDate | string | Date the recall was first reported by the FDA (YYYY-MM-DD). |
terminationDate | string | Date the recall was terminated (YYYY-MM-DD), or null if still open. |
eventId | string | FDA event ID grouping related recalls. |
classificationLevel | integer | Numeric hazard rank: 1 = Class I, 2 = Class II, 3 = Class III, null if unknown. |
active | boolean | true while the recall is Ongoing or Pending, otherwise false. |
firmAddress | string | Single-line firm postal address, ready for CRM or mapping. |
recallAgeDays | integer | Whole days between reportDate and the run time. |
distributionNationwide | boolean | true when the distribution text names nationwide or all-states distribution, else false or null. |
distributionStates | string[] | US state codes parsed from distributionPattern. Empty array when none are named. |
riskScore | integer | Composite 0 to 100 hazard score combining severity (Class I/II/III), recency, and distribution scope. Higher = more urgent. null if severity is unknown. |
openfda | object | The openFDA harmonization block when present, otherwise null. |
observedAt | string | ISO 8601 timestamp of when the record was collected. |
error | string | null on success. On a failed run, a single item with a populated error field is written instead. |
Derived field notes
riskScoreweighting: severity is the dominant component (Class I = 60, II = 40, III = 20), plus up to +20 for recency (fading over about 6 years), plus up to +20 for distribution scope (nationwide = +20, otherwise +2 per affected state, capped).distributionStatesparses full state names and standalone two-letter codes from the free-textdistributionPattern. Nationwide or international text yields an empty array.
Example output record
Real record from a live run (input {"searchQuery": "listeria", "maxRecalls": 10}):
{"recallNumber": "F-0609-2015","status": "Terminated","classification": "Class I","productType": "Food","productDescription": "Crema GuateLinda (Guatemalan Style Cream) in individually soft poly/plastic bags labeled in part: Lacteos Santa Martha Crema GuateLinda Guatemalan Style Cream Net WT 1 LB (16 oz)","reasonForRecall": "Virginia State (VDACS) found Listeria monocytogenes in Lacteos Santa Martha Quesito Casero Fresh Curd (Best by 9/27/14), FDA made an inspection, were the environmental samples collected came up positive also for Listeria monocytogenes, also the Oasis Brands Inc. sent finish products samples to a private lab, the Lacteos Santa Martha Cuajada en Hoja Queso Casero Hecho a Mano Fresh Curd (Best By dates of 10/18/14 and 11/25/14) came also positive for Listeria monocytogenes. Oasis Brands Inc. is voluntarily recalling ALL their Lacteos Santa Martha brand products manufactured that are within expiration date.","recallingFirm": "Oasis Brands, Inc","city": "Miami","state": "FL","country": "United States","postalCode": "33182","addressLine1": "13439 NW 19 LANE","addressLine2": null,"distributionPattern": "FL, GA. NC, and TN","productQuantity": "144 pieces","codeInfo": "UPC 635349 000390 Best By dates: 07/01/14 thru 12/31/14","moreCodeInfo": null,"voluntaryMandated": "Voluntary: Firm initiated","initialFirmNotification": "Two or more of the following: Email, Fax, Letter, Press Release, Telephone, Visit","recallInitiationDate": "2014-10-10","centerClassificationDate": "2014-12-02","reportDate": "2014-12-10","terminationDate": "2017-03-28","eventId": "69516","classificationLevel": 1,"active": false,"firmAddress": "13439 NW 19 LANE, Miami, FL 33182, United States","recallAgeDays": 4261,"distributionNationwide": false,"distributionStates": ["FL", "GA", "NC", "TN"],"riskScore": 68,"openfda": null,"observedAt": "2026-08-10T14:05:09.001Z","error": null}
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~openfda-food-recalls-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"searchQuery":"listeria","classification":"Class I","maxRecalls":25,"sortOrder":"Newest first"}'
Start a run asynchronously:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~openfda-food-recalls-scraper/runs?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"searchQuery":"salmonella","state":"CA","maxRecalls":100}'
Apify CLI:
apify call scrapers_lat/openfda-food-recalls-scraper \--input '{"eventId":"69516"}'
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 record returned (
resultevent). See the pricing tab for the current per-result price. - 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 records per run. Upgrade for higher
maxRecalls. - Source pagination ceiling. openFDA allows a
skipoffset up to 25000 per query. For pulls beyond that, split the work with narrower filters or date ranges.
FAQ and troubleshooting
A run returned 0 records. Why?
The filter combination matched nothing in the source. Loosen filters (for example remove state or widen the date range), or confirm the keyword exists in reason_for_recall. Zero-result runs are not charged.
How do I get only the most serious recalls?
Set classification to Class I. Combine with a keyword such as listeria and optionally a state code.
What is the difference between searchQuery keyword mode and raw mode?
A plain word (for example listeria) is matched against the recall reason. A value containing field: (for example product_description:cheese) is passed through as a raw openFDA search expression against that field.
Why is terminationDate null?
The recall is still open (Ongoing or Pending) so the FDA has not set a termination date. Missing source values are returned as null, never invented.
Which date does the date range filter apply to?
The field named in dateField (report_date by default). Change dateField to filter on initiation, classification, or termination date instead.
Can I pull all recalls for one incident?
Yes. Pass the eventId. A single FDA event often groups many related product recalls.
Is this an official FDA tool? No. This actor is independent and has no affiliation with the FDA or openFDA. It reads only data that is publicly available through the openFDA API. Use it in accordance with the openFDA terms of service.
Example tasks
Preconfigured templates for common scenarios. Open one and press Run, or use it as a starting point:
- openFDA Dietary Supplement Recalls
- openFDA E. coli Food Recalls
- openFDA Foreign Material Food Recalls
- openFDA Ice Cream Recalls
- openFDA Infant Formula Recalls
- openFDA Undeclared Milk Allergen Recalls
- openFDA Undeclared Peanut Allergen Recalls
- Find Class I Allergen Food Recalls
- Track Listeria Food Recalls
- Monitor Salmonella Food Recalls
Related scrapers
- openFDA Drug Events & Recalls Scraper: FDA drug adverse events (FAERS) and drug recalls.
- SEC EDGAR Company Filings Scraper: SEC filings by ticker or CIK.
- USAspending Federal Award Scraper: US federal prime awards.
- OFAC Sanctions List Scraper: US Treasury OFAC SDN and Consolidated lists.
- Grants.gov Opportunity Scraper: US federal grant opportunities.
- Federal Register Document Scraper: US Federal Register documents.
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 or openFDA. Accesses only publicly available openFDA data. Use in accordance with the openFDA terms of service.
