# CPSC Product Recalls Scraper - SaferProducts Data

Scrape full CPSC product recall data from SaferProducts.gov - retailers, UPCs, hazards, remedies, units affected. No API key. Export JSON/CSV for compliance monitoring.

Canonical product page: https://mayd-it.com/data-tools/actors/us-product-recalls-scraper/
Public Actor: https://apify.com/maydit/us-product-recalls-scraper

## Example input

```json
{
  "recalledSince": "2026-05-01",
  "recalledUntil": "2026-07-20",
  "maxResults": 10
}
```

## Full guide

![Review consumer product recalls — illustrative workflow](https://api.apify.com/v2/key-value-stores/YGxD9JRpduom8Q5Zd/records/us-product-recalls-scraper-0f3276165f44.png?signature=1by5AuQwxujnwdt34gsIV)

## Review consumer product recalls

For product-safety teams and retail researchers, bring CPSC recall notices into a consistent table with the original notice links.

**Coverage:** CPSC consumer-product recalls. Vehicle and FDA-regulated recalls belong to separate agency sources.

[Open this Actor in Console](https://console.apify.com/actors/DqX2SMVuwVL8nPeYB/input) · [First run](#try-this-actor) · [Results](#result-preview) · [Cost](#usage-and-pricing) · [Full guide](#full-guide)

## Try this Actor

1. Use a product or recall-number example already listed below and lower the maximum recall count. An exact recall number overrides other filters.
2. Open the run's dataset for hazards, remedies and notice URLs. Check `SUMMARY` for incomplete date coverage or spending stops.

**Read the results correctly:** UPC availability is limited, and absent model-number fields do not imply that a notice has no model information. Read the notice and its description before matching a product.

## Result preview

The dataset view highlights these columns:

- **CPSC recall number** · `recallNumber`
- **Announcement date** · `recallDate`
- **Recall headline** · `title`
- **Recalled products** · `products`
- **Published hazards** · `hazards`
- **Remedy options** · `remedyOptions`

Use the original source links and the field definitions below when interpreting the results. CSV works well for flat columns; JSON preserves nested values.

## Usage and pricing

Base result rate on the FREE tier: **$4 per 1,000 results**. The [Pricing tab](https://apify.com/maydit/us-product-recalls-scraper/pricing) shows your plan's result rate and any Actor Start charge. Set a small result limit for the first run; the requested limit is not a guarantee of that many results.

---

## Full guide

> Export CPSC recall notices as one structured row per notice, with published retailers, UPCs, hazards, remedies and affected-unit information where available. No API key is required.

### What it does

This **CPSC product recalls scraper** queries the official **CPSC SaferProducts.gov recalls API** and flattens deeply nested responses into one clean record per recall. Unlike a bare keyword scraper, it returns the *full* recall detail buyers actually need for automated compliance monitoring - recalling manufacturers, importers, and **retailers**, product **UPCs**, hazard descriptions, remedy options, and units affected. You can filter by keyword, product name, manufacturer, exact recall number, or date range, then export the **US consumer product recalls dataset** to JSON, CSV, or Excel. It requires no API key because it reads a public government data source. This is the CPSC leg of a three-agency recalls suite alongside FDA and NHTSA scrapers - combine all three for a single **FDA + NHTSA + CPSC recall aggregator** feed.

### Who it's for

- **Retail & e-commerce compliance teams** removing recalled SKUs from shelves and listings
- **Quality assurance & product-safety teams** monitoring hazards across their catalog
- **Online marketplaces** screening third-party listings against active recalls
- **Insurers** assessing risk tied to recalled products and reported injuries
- **Importers & distributors** tracking recall activity by manufacturer
- **Journalists & investigators** reporting on recall trends and safety incidents

### What you get / Output

Each run produces a flat dataset with one record per recall. Fields:

| Field | Description |
|---|---|
| `recallId` | Internal CPSC recall record identifier |
| `recallNumber` | Official CPSC recall number (e.g. `26596`) |
| `recallDate` | Date the recall was announced |
| `title` | Recall headline |
| `description` | Full recall description text |
| `products` | Recalled product name(s) |
| `unitsAffected` | Number of units recalled |
| `hazards` | Hazard descriptions (fire, choking, suffocation, lithium battery, etc.) |
| `injuries` | Reported injuries or incidents |
| `remedies` | The remedy instructions from the recall notice (what consumers should do) |
| `remedyOptions` | Remedy type(s) exactly as CPSC labels them - almost always `Refund`, `Repair` or `Replace`, occasionally `Dispose`, `New Instructions`, `Label`, `Inspect` or `No Remedy Available` |
| `manufacturers` | Recalling manufacturer(s) |
| `retailers` | Where the product was sold (retailer / channel) |
| `importers` | Importer(s) of record |
| `distributors` | Distributor(s), when CPSC lists them |
| `manufacturerCountries` | Country or countries where the product was made |
| `upcs` | Product UPC codes, when CPSC lists them (only a minority of recalls have any) |
| `imageUrl` | Product image URL |
| `imageCount` | Number of product images CPSC attached |
| `consumerContact` | Consumer contact info for the recall |
| `lastPublishDate` | Date CPSC last updated the recall notice |
| `url` | Official CPSC recall webpage |
| `scrapedAt` | When this actor fetched the row |

### Input / How to query

Set any combination of filters. Leave a field empty to skip it.

| Input | What it does |
|---|---|
| `keyword` | Full-text match across title, description, hazard, product, manufacturer, or retailer (e.g. `fire`, `lithium battery`, `Amazon`) |
| `productName` | Case-insensitive partial match on product name (e.g. `crib`, `heater`) |
| `manufacturer` | Case-insensitive partial match on manufacturer (e.g. `Samsung`) |
| `recallNumber` | Exact lookup of one recall by number - overrides all other filters |
| `recalledSince` | Only recalls on or after this date (`YYYY-MM-DD`) |
| `recalledUntil` | Only recalls on or before this date (`YYYY-MM-DD`) |
| `maxResults` | Caps how many recalls one run returns (default 500). Results are sorted newest first before the cap, so you keep the most recent ones |
| `maxRunSeconds` | Wall-clock budget for the run (default 240). Raise it, together with the run timeout, for a deliberately large date range |

Under the hood the actor walks the date range in year-window chunks, newest year first, and applies your keyword filter client-side to every recall in each year. A keyword search therefore covers the whole date range: it only stops early once it already holds `maxResults` matches, and those are then the newest matches in the range. If a run ever reaches its time budget (`maxRunSeconds`, default four minutes, or 25 seconds before the run's own timeout if that comes sooner) it stops searching older years, keeps the recalls it has, and records `stoppedEarlyOnTimeLimit: true` in the run's `SUMMARY` record.

### Example use cases

- **E-commerce compliance sweep** - run `keyword` = `lithium battery` weekly to catch new battery-hazard recalls before they hit your marketplace listings.
- **Catalog match by manufacturer** - pull every recall for a supplier via `manufacturer` = `Samsung` and reconcile against your active SKUs.
- **UPC-level recall check** - export the full feed and join on the `upcs` field to flag any recalled UPC in your inventory system.
- **Litigation research** - use `recallNumber` for an exact recall, or `productName` to gather all recalls for a product family with hazards, injuries, and remedies attached.
- **Historical trend analysis** - set `recalledSince` and `recalledUntil` to pull a multi-year window for reporting on recall volume by hazard or category.

### Recurring use / scheduling

This actor is built for automated monitoring, not one-off pulls. Use Apify **Schedules** to run it on a cron (e.g. every morning or every Monday) with a rolling `recalledSince` window so each run only returns fresh recalls. Because `recallNumber` is a stable unique key, you can deduplicate across runs by keying on `recallNumber` (or `recallId`) in your downstream store - append only records you haven't seen before, and wire new rows into alerts, a Slack/email notification, or your compliance dashboard.

### FAQ

### How do I get CPSC product recall data without an API key?

This actor reads the public **CPSC SaferProducts.gov** recalls API directly - no key, no signup, no auth. Set your filters and run it; results land in an Apify dataset ready to export.

### Is there an API for SaferProducts.gov recalls?

Yes - CPSC publishes a public recalls API, and this actor wraps it into a clean, flat schema. You get one row per recall with retailers, UPCs, hazards, and remedies already unpacked from the raw nested JSON.

### How can I monitor new product recalls automatically?

Schedule the actor on a cron with a rolling `recalledSince` date. Each run returns recent recalls; dedupe on `recallNumber` and push new rows to an alert or dashboard for hands-off monitoring.

### How do I export CPSC recalls to CSV or Excel?

Every run writes a dataset you can download as CSV, Excel, JSON, or XML from the Apify console, or pull via the Apify API for a **product recall JSON / CSV export** into your own systems.

### How do I search product recalls by UPC or manufacturer?

Filter by `manufacturer` for partial-match manufacturer search, or export the full feed and match on the `upcs` field to find recalls tied to a specific UPC in your catalog.

### How do I get recall data with retailers, hazards, and remedies?

Those are first-class output fields here: `retailers`, `hazards`, `remedies` (the remedy instructions) and `remedyOptions` (refund / repair / replace) are filled on nearly every recall announced since 2023, along with `unitsAffected` and `injuries` - the detail most bare recall scrapers drop. Older recalls fill them less consistently (for example, CPSC only lists remedy options on about half of all recalls since 1973).

### How do I set up product recall alerts for my e-commerce store?

Schedule the actor, dedupe on `recallNumber`, and connect the new rows to a notification integration (email, Slack, webhook) or your monitoring stack so your store is alerted the moment a relevant recall posts.

### What is the best way to track consumer product recalls for compliance?

Run a scheduled pull filtered to your product categories or hazards, store results keyed on `recallNumber` for a clean audit trail, and reconcile the `products`, `upcs`, and `manufacturers` fields against your inventory.

### How do I pull historical CPSC recalls by date range?

Set `recalledSince` and `recalledUntil` (both `YYYY-MM-DD`). The actor chunks history into year windows so multi-year pulls come back complete.

### Can I combine CPSC, FDA, and NHTSA recall data in one feed?

Yes - this is the CPSC leg of a three-agency suite. Pair it with the matching FDA and NHTSA actors and merge their datasets into a single **FDA + NHTSA + CPSC recall aggregator** feed on a shared schedule.

### Data source & notes

- **Source:** the official **U.S. Consumer Product Safety Commission (CPSC)** SaferProducts.gov recalls API - public U.S. government data, free to access and use.
- **No API key** is required.
- Coverage is limited to what CPSC publishes: consumer products (toys, appliances, electronics, furniture, nursery, sporting goods, etc.). Vehicle recalls are NHTSA's domain and food/drug/cosmetic recalls are FDA's - use the companion actors for those.
- The actor reflects CPSC's own data; it does not add, infer, or correct fields beyond flattening the API response.
- CPSC's API has a per-product model-number field and a "sold at" label field, but leaves both blank on every recall it publishes (checked across all 10,016 recalls from 1973 to September 2026). The rows still carry `productModels` and `soldAt` columns so existing integrations keep working, but they are always empty. Where CPSC names model numbers, they are in the `description` text, and the places a product was sold are in `retailers`.
- Actor: `maydit/us-product-recalls-scraper` (id `DqX2SMVuwVL8nPeYB`).

### Related actors

Part of a set of US public-records tools that work well together:

- [FDA Recalls Scraper](https://apify.com/maydit/us-fda-recalls-scraper) - drug, device and food recalls
- [NHTSA Recalls Scraper](https://apify.com/maydit/us-vehicle-recalls-scraper) - vehicle recalls and complaints

> Running all three recall sources together (FDA, CPSC and NHTSA) gives near-complete US recall coverage across regulated products.

See the full collection at [apify.com/maydit](https://apify.com/maydit).

**Free guide:** [The CPSC SaferProducts API, pagination and all](https://mayd-it.com/data-tools/guides/cpsc-recall-api/) - the undocumented traps in this data source, measured against the live API.

### Found this useful?

If this actor saved you time, a short review on the Apify Store genuinely helps. Reviews are how the next person decides whether a tool is worth trying.

Something broken, missing a field, or a source you want covered? Open an issue on the **Issues** tab and it will get looked at - that is the fastest route to getting it changed.

#### Run spending limits

The run stops at its spending limit. `SUMMARY.datasetItemsSaved` reports the number of rows actually saved, and `SUMMARY.stoppedOnChargeLimit` identifies this stop. A final batch may be saved only in part; increase the spending limit to collect more results.

## Help with your run

Open the **Issues** tab on this Actor with the run URL, the input field that caused trouble and what you expected to receive. Remove API keys and private information before posting.

[Explore more Mayd-It Actors](https://apify.com/maydit)

## Understand your run

Open **Run report** in the run’s Output tab for saved-record counts, reported source issues and limits, and suggested next steps. Use **CSV export** to take the saved results into a spreadsheet. The existing JSON results and detailed machine-readable summary remain available.

The report reflects this run’s recorded coverage. A successful run or a saved result does not establish that every possible source record was collected.
