Product Safety Recall Scraper avatar

Product Safety Recall Scraper

Pricing

from $9.00 / 1,000 results

Go to Apify Store
Product Safety Recall Scraper

Product Safety Recall Scraper

Protect your ecommerce storefront by scraping official FDA and CPSC databases. Extract dangerous item alerts, docket numbers, and agency data daily.

Pricing

from $9.00 / 1,000 results

Rating

0.0

(0)

Developer

太郎 山田

太郎 山田

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Product Safety Recall Digest | CPSC + openFDA Alerts

Protect your retail inventory and customer base by continuously tracking consumer product safety recalls. This specialized web scraper empowers ecommerce merchants, marketplace operators, and supply chain managers to automatically extract the latest enforcement actions directly from official regulatory sources like the CPSC and openFDA. Instead of manually navigating complex government databases to check for recalled inventory, you can schedule this tool to run daily or weekly, turning unorganized alerts into a structured, easy-to-read data digest. Integrate these results into your daily operations to dramatically reduce liability.

By utilizing custom keyword watchlists, retail operators can search specifically for the exact brands, product categories, or retail items they currently sell. This ensures that any dangerous or defective products are flagged before they reach consumers. The scraped results deliver comprehensive regulatory details, including the responsible government agency, publication dates, official docket numbers, document types, and direct URLs to the original federal filings. Whether you are auditing a massive online product catalog, managing a niche dropshipping business, or ensuring vendor compliance, this scraper provides the critical intelligence needed to instantly identify unsafe consumer goods and protect your storefront's reputation.

Store Quickstart

Run this actor with your target input. Results appear in the Apify Dataset and can be piped to webhooks for real-time delivery. Use dryRun to validate before committing to a schedule.

Key Features

  • 🏛️ Government-sourced — Pulls directly from official agency feeds — no third-party aggregators
  • ⏱️ Timely digests — Daily/weekly rollups of new filings, rulings, or actions
  • 🔍 Keyword watchlists — Flag items matching your compliance/legal watch terms
  • 📊 Structured metadata — Agency, date, docket, document type, link — all dataset-ready
  • 📡 Webhook alerts — Push to legal/compliance teams the moment new items match watchlist

Use Cases

WhoWhy
DevelopersAutomate recurring data fetches without building custom scrapers
Data teamsPipe structured output into analytics warehouses
Ops teamsMonitor changes via webhook alerts
Product managersTrack competitor/market signals without engineering time

Input

FieldTypeDefaultDescription
feedsarrayOne entry per monitored feed/source. Each produces one digest row. Leave empty to use all 4 default feeds (CPSC, FDA foo
lookbackDaysinteger30Number of days back to search for recalls. Applies to all feeds unless overridden per feed.
recallClassesarray["I","II"]Filter openFDA results to specific recall classes. Valid values: I (most serious), II, III. Does not apply to CPSC (whic
maxRecallsPerFeedinteger50Upper bound on recall records fetched per feed per run. Lower = faster and less data; keep ≤ 50 for recurring digests.
deliverystring"dataset"dataset stores digest rows in the Apify dataset. webhook posts the digest JSON to webhookUrl.
webhookUrlstringPOST target for the recall digest payload. Leave empty for dataset delivery.
datasetModestring"all"all emits every feed digest row. action_needed emits only feeds with new or first-run recalls. new_only emits only feeds
snapshotKeystring"product-safety-recall-digest-state"Stable key used to persist seen recall IDs across recurring runs so new_only and action_needed modes stay comparable. Us

Input Example

{
"lookbackDays": 30,
"recallClasses": [
"I",
"II"
],
"maxRecallsPerFeed": 50,
"delivery": "dataset",
"datasetMode": "all",
"snapshotKey": "product-safety-recall-digest-state",
"notifyOnNoNew": true,
"requestTimeoutSeconds": 30,
"batchDelayMs": 800,
"dryRun": false
}

Input Examples

Example: Single-target audit

{
"targets": [
"example-target-1"
],
"maxResultsPerTarget": 30
}

Example: Bulk portfolio

{
"targets": [
"target-1",
"target-2",
"target-3"
],
"maxResultsPerTarget": 50,
"snapshotKey": "product-safety-recall-digest-state"
}

Example: Recurring delta watch

{
"targets": [
"target-1"
],
"snapshotKey": "product-safety-recall-digest-state",
"emitChangedOnly": true
}

Output

FieldTypeDescription
metaobject
errorsarray
digestsarray
digests[].feedIdstring
digests[].feedNamestring
digests[].sourcestring
digests[].checkedAttimestamp
digests[].windowStarttimestamp
digests[].lookbackDaysnumber
digests[].statusstring
digests[].newRecallCountnumber
digests[].totalRecallCountnumber
digests[].actionNeededboolean
digests[].recallClassBreakdownobject
digests[].topFirmsarray
digests[].recommendedActionstring
digests[].signalTagsarray
digests[].newRecallsarray
digests[].evidencearray
digests[].errornull

Output Example

{
"meta": {
"generatedAt": "2026-04-01T10:30:00.000Z",
"now": "2026-04-01T10:00:00.000Z",
"feedCount": 4,
"totalRecallsFound": 18,
"newRecallsFound": 5,
"actionNeededCount": 3,
"errorCount": 0,
"snapshot": {
"key": "recall-digest-quickstart",
"loadedFrom": "local",
"savedTo": "local"
},
"warnings": [],
"executiveSummary": {
"overallStatus": "action_needed",
"brief": "5 new recall(s) across 3 feed(s).",
"actionItems": [
"Class I recalls detected in: FDA Food Enforcement. Review immediately — Class I indicates serious risk.",
"CPSC Consumer Product Recalls: 2 new recall(s). Review 2 new CPSC consumer product recall(s) in the past 30 days.",
"FDA Food Enforcement: 2 new recall(s) (including 1 Class I — serious risk). Review 2 new FDA food enforcement recall(s) in the past 30 days.",
"FDA Drug Enforcement: 1 new recall(s). Review 1 new FDA drug enforcement recall(s) in the past 30 days."
],
"feedStatuses": [
{
"feedId": "cpsc",
"feedName": "CPSC Consumer Product Recalls",
"status": "new_recalls",
"newRecallCount": 2,
"totalRecallCount": 7,
"actionNeeded": true
},
{
"feedId": "fda_food",
"feedName": "FDA Food Enforcement",
"status": "new_recalls",
"newRecallCount": 2,
"totalRecallCount": 4,
"actionNeeded": true

API Usage

Run this actor programmatically using the Apify API. Replace YOUR_API_TOKEN with your token from Apify Console → Settings → Integrations.

cURL

curl -X POST "https://api.apify.com/v2/acts/taroyamada~product-safety-recall-digest/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "lookbackDays": 30, "recallClasses": [ "I", "II" ], "maxRecallsPerFeed": 50, "delivery": "dataset", "datasetMode": "all", "snapshotKey": "product-safety-recall-digest-state", "notifyOnNoNew": true, "requestTimeoutSeconds": 30, "batchDelayMs": 800, "dryRun": false }'

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("taroyamada/product-safety-recall-digest").call(run_input={
"lookbackDays": 30,
"recallClasses": [
"I",
"II"
],
"maxRecallsPerFeed": 50,
"delivery": "dataset",
"datasetMode": "all",
"snapshotKey": "product-safety-recall-digest-state",
"notifyOnNoNew": true,
"requestTimeoutSeconds": 30,
"batchDelayMs": 800,
"dryRun": false
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

JavaScript / Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('taroyamada/product-safety-recall-digest').call({
"lookbackDays": 30,
"recallClasses": [
"I",
"II"
],
"maxRecallsPerFeed": 50,
"delivery": "dataset",
"datasetMode": "all",
"snapshotKey": "product-safety-recall-digest-state",
"notifyOnNoNew": true,
"requestTimeoutSeconds": 30,
"batchDelayMs": 800,
"dryRun": false
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Tips & Limitations

  • Run daily for active watchlists; weekly for passive monitoring.
  • Webhook delivery works well for compliance team Slack channels — include docket URL for 1-click access.
  • Use watchKeywords generously — false positives are cheap to triage, false negatives miss filings.
  • Pair with regulatory-change-monitor for cross-agency coverage.
  • Archive Dataset rows weekly for long-term compliance evidence retention.

FAQ

How far back does history go?

This actor monitors forward-only — new items since first run. For historical data, use the agency's own search tool.

What timezones are used?

All timestamps are UTC. Use your downstream pipeline to convert to agency-local time if needed.

Does it translate non-English content?

No — original language is preserved. Use downstream translation services if needed.

Is the data official?

Yes — sourced directly from official government websites and feeds. Not a third-party aggregator.

Can I use this for legal research?

For alerting and monitoring, yes. For litigation research, cross-verify with primary sources (agency websites) — this actor is a monitoring tool, not a legal database.

Government & Regulatory cluster — explore related Apify tools:

Cost

Pay Per Event:

  • actor-start: $0.01 (flat fee per run)
  • dataset-item: $0.003 per output item

Example: 1,000 items = $0.01 + (1,000 × $0.003) = $3.01

No subscription required — you only pay for what you use.

⭐ Was this helpful?

If this actor saved you time, please leave a ★ rating on Apify Store. It takes 10 seconds, helps other developers discover it, and keeps updates free.

Bug report or feature request? Open an issue on the Issues tab of this actor.