openFDA recalls monitor (drug, device, food)
Pricing
$2.00 / 1,000 results
openFDA recalls monitor (drug, device, food)
Monitor drug, device, and food enforcement recalls from openFDA.
Pricing
$2.00 / 1,000 results
Rating
0.0
(0)
Developer
Chee Chiaw Lim
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
This Apify Actor returns drug, device, and food enforcement recalls reported within a UTC date window. It supports classification filters and a recalling firm watchlist.
Coverage and source
The Actor queries the openFDA enforcement APIs. Teams can use the output to track recent reports and recurring firms in one dataset. Report date determines inclusion, rather than recall initiation date.
The endpoints are https://api.fda.gov/{drug,device,food}/enforcement.json. No API key or proxy is required.
Input
| Field | Default | Meaning |
|---|---|---|
productTypes | ["drug", "device", "food"] | Product types to query, in this order. |
sinceDays | 30 | Integer from 1 to 3650. Reports from midnight UTC N days ago through today UTC, inclusive. |
classifications | [] | Classifications such as Class I or Class II. Empty selects all. |
firmWatchlist | [] | Recalling firm names. Empty selects all firms. |
onlyNew | false | Skip recall IDs already emitted to the state store. |
maxItems | 100 | Integer from 1 to 10000. Maximum source records examined across all types before duplicate and onlyNew filtering. |
stateStoreName | fda-recalls-monitor-state | Named store for cross-run history. |
Values within each filter are alternatives. Classification and firm filters combine with AND. Firm queries use openFDA quoted phrase matching. matchedFirm is the first watchlist entry found as a case-insensitive substring in the returned firm name, or null if none matches literally.
Results sort by report date descending within each product type. Types run sequentially, so an earlier type can consume the entire maxItems budget. The output is not globally sorted across types.
Output
Each record contains recall identifiers, classification, status, firm and location, report and recall dates, distribution, product details, recall reason, and source attribution. Missing fields are null. Dates use YYYY-MM-DD.
Example from the supplied drug fixture follows.
{"recallNumber": "D-0041-2027","productType": "drug","classification": "Class II","status": "Ongoing","recallingFirm": "Houston Rx LLC","city": "Houston","state": "TX","country": "United States","reportDate": "2026-10-21","recallInitiationDate": "2026-09-25","centerClassificationDate": "2026-10-13","voluntaryMandated": "Voluntary: Firm initiated","initialFirmNotification": "Two or more of the following: Email, Fax, Letter, Press Release, Telephone, Visit","distributionPattern": "Nationwide in the USA.","productDescription": "Sermorelin, 1 mg/mL, 10 ml vial, Sterile injectable solution, RX Only, Houston RX LLC, 15430 Vantage Parkway E STE 220, Houston, TX 77032.","productQuantity": "7 vials","reasonForRecall": "Lack of process control","codeInfo": "Lot# SER-081726-1-10, Beyond Use Date: 10/01/2026.","eventId": "99990","matchedFirm": null,"source": "U.S. Food and Drug Administration (openFDA)","sourceUrl": "https://api.fda.gov/drug/enforcement.json?search=recall_number:%22D-0041-2027%22","licence": "CC0 1.0 (https://open.fda.gov/terms/)","disclaimer": "Data provided by the U.S. Food and Drug Administration (https://open.fda.gov). Do not rely on openFDA to make decisions regarding medical care. Not endorsed by FDA.","generatedId": "drug:D-0041-2027","changeType": "new","scrapedAt": "2026-10-30T00:00:00.000Z"}
The dataset has a table view of key fields. RUN_SUMMARY in the default key-value store records timestamps, fetched, eligible, and pushed counts, charge-limit status, and any error.
State and pricing
Pricing is $0.002 per result, no start fee. Each emitted record uses the result billing event. Records skipped by onlyNew do not incur a result charge. Platform compute and storage charges may apply separately.
The state store keeps generated IDs under SEEN_RECALL_IDS. Only successful pushes enter the set. An unseen ID gets changeType new; a stored ID gets seen. With onlyNew false, seen records appear again. This tracks recall identity, not changes to existing recalls. Use a separate named store for independent monitors. If named-store access returns 403, the Actor warns, uses the default store, and disables onlyNew for that run.
Licence and disclaimer
Source is U.S. Food and Drug Administration (openFDA). Licence is CC0 1.0 (https://open.fda.gov/terms/). Each record includes an API query URL for its recall number.
Data provided by the U.S. Food and Drug Administration (https://open.fda.gov). Do not rely on openFDA to make decisions regarding medical care. Not endorsed by FDA.
Limits
The API allows 1,000 requests per day per IP without a key and 240 requests per minute. The Actor waits at least one second between request starts and retries HTTP 429 and 5xx responses up to three times. Other failures stop the run and appear in RUN_SUMMARY. HTTP 404 with NOT_FOUND means zero results.
Pages contain up to 100 records. Paging stops at the reported total, maxItems, an empty page, or the openFDA maximum skip of 25000. Duplicate and onlyNew filtering can reduce the emitted count. The API can change during paging, and equal report dates can affect page boundaries. Source reports can lag events or contain omissions.
Local verification
Run npm test for offline tests. Run the real Actor entry point with supplied fixtures and all network calls blocked using a fresh local storage directory.
CRAWLEE_STORAGE_DIR=/tmp/fda-check APIFY_LOCAL_STORAGE_DIR=/tmp/fda-check NODE_OPTIONS="--import ./scripts/offline-fixture.js" npm startnode scripts/verify-output.js /tmp/fda-check
The preload supplies saved API responses and does not simulate date or firm filtering. This verifies execution and output, not live API availability.