US Recall Change Audit — FDA / CPSC / NHTSA
Pricing
from $5.00 / 1,000 recall records
US Recall Change Audit — FDA / CPSC / NHTSA
Read official U.S. recall records from openFDA, CPSC and NHTSA, normalise them, and optionally report changes observed since your previous snapshot. Not safety, medical or legal advice. NHTSA only covers vehicles you specify.
Pricing
from $5.00 / 1,000 recall records
Rating
0.0
(0)
Developer
Drucilla Seeringtl
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Security
Limited permissionsShare
Read official U.S. recall records from openFDA (food / drug / device enforcement), CPSC (saferproducts.gov), and NHTSA (vehicle recalls by make / model / year). Normalise them into a flat schema, and optionally report changes this Actor observed since your previous snapshot.
This Actor:
- uses official HTTP GET APIs only (no proxies, no social/e-commerce scraping, no image mirroring)
- does not give safety, medical, or legal advice
- does not promise real-time coverage or zero missed recalls
- does not merge recalls across agencies into one “same recall”
- for NHTSA, only queries the vehicle combinations you provide (not a full national vehicle-recall feed)
What you get
Each dataset item includes:
| Field | Meaning |
|---|---|
source | fda_food / fda_drug / fda_device / cpsc / nhtsa |
sourceId | Stable id inside that source (recall_number, CPSC RecallID, or NHTSA campaign+vehicle key) |
officialUrl | Link to the official notice when available |
publishedDate / sourceUpdatedDate | Dates from the source (sourceUpdatedDate is null when the source does not provide one) |
retrievedAt | When this Actor read the record |
recordHash | Hash of the comparable factual fields |
changeType | snapshot, new, changed, or baseline (first delta run) |
changedFields / oldValue / newValue | Populated for changed |
sourceStatus | Per-record source status (ok when built from a successful read) |
| plus | title, summary, organization, productNames, classification, status, hazard, remedy, vehicle fields, attribution |
Street addresses, e-mail fields, and CPSC ConsumerContact phone text are not output. Official remedy / summary text is kept as published by the agency.
Modes
snapshot
Fetch and normalise records for the date window. Every output row has changeType=snapshot and is billable as a recall-record event (when pay-per-event is enabled).
delta
Compare the current fetch to your baseline and output only new / changed rows.
- First run with no baseline: establishes a baseline (
changeType=baseline). Those rows are written for transparency but are not charged asrecall-record. - Baselines are customer-isolated. Provide one of:
baselineRecords— paste prior records / snapshot JSON in the inputbaselineDatasetId— a dataset id from your previous runsnapshotStoreName— a named key-value store you choose; it is created under the Apify account that runs the Actor (not a shared author store)
- This Actor only reports changes it observed between two of its own snapshots. It does not reconstruct official historical edit times. Narrowing the date window can miss edits to older notices.
Input
| Field | Default | Notes |
|---|---|---|
mode | snapshot | snapshot or delta |
sources | ["fda_food","cpsc"] | Add fda_drug, fda_device, nhtsa as needed |
lastNDays | 30 | UTC window ending today; ignored if publishedFrom is set |
publishedFrom / publishedTo | — | Inclusive YYYY-MM-DD |
vehicles | [] | Required for nhtsa; max 10 {make,model,modelYear} objects |
maxItems | 200 | Cap across all sources (1–10,000) |
baselineRecords | — | Delta baseline in-input |
baselineDatasetId | — | Delta baseline from your dataset |
snapshotStoreName | — | Optional named store for saving/loading snapshots |
snapshotKey | recall-snapshot | Key inside that store |
Example (CPSC + FDA food, recent window — matches the Store example intent):
{"mode": "snapshot","sources": ["fda_food", "cpsc"],"lastNDays": 30,"maxItems": 20}
Example with NHTSA (vehicles required):
{"mode": "snapshot","sources": ["cpsc", "nhtsa"],"lastNDays": 365,"maxItems": 50,"vehicles": [{"make": "Honda", "model": "Accord", "modelYear": "2018"}]}
Output
Dataset items as above. The run also writes RUN_SUMMARY to the default key-value store with diagnostics per source (ok, partial, rate_limited, timeout, error, skipped), counts, baseline info, and a disclaimer.
Failures are not reported as “no recalls”. If every requested source errors, the run fails and RUN_SUMMARY.diagnostics explains timeout / rate limit / HTTP errors and lastSuccessAt when available.
Pricing (pay per event)
| Event | Price |
|---|---|
Actor start (apify-actor-start, platform default, per GB of memory) | $0.00005 |
recall-record — one billable normalised recall or observed change written to the dataset | $0.005 ($5.00 per 1,000) |
Not charged as recall-record: baseline establishment rows, unchanged delta rows (omitted), and error diagnostics. The Actor stops cleanly when the run’s max total charge is reached. Default dataset per-item platform charging is not used as a second fee on top of recall-record.
Default run resources: 256 MB memory, 300 s timeout.
Attribution and terms
- openFDA: general content is CC0; third-party material may be excepted. See openFDA terms and authentication / rate limits (anonymous: 1,000 requests/day/IP, 240/minute).
- CPSC: recall notices may be copied with attribution and without implying endorsement. See CPSC API info and privacy / reuse policy. This Actor attributes CPSC and does not use CPSC badges or logos.
- NHTSA: public vehicle-recall API by make/model/year. Coverage equals the vehicles you list only.
Limits and honesty
- Anonymous openFDA quotas apply; on HTTP 429 the Actor backs off / stops that source and records
rate_limited— it does not rotate IPs to bypass limits. - CPSC / NHTSA exact quotas are not published here; requests are rate-limited conservatively.
- Data may be delayed relative to the agencies’ own sites.
- Fuzzy brand / UPC matching is not treated as a definitive hit across sources.
Local development
python -m venv .venv.venv/bin/pip install -r requirements.txt.venv/bin/python -m unittest -v# optional tiny live smoke (few requests only):US_RECALL_LIVE=1 .venv/bin/python -m unittest -v tests.test_recalls.LiveSmokeTests