# CPSC Recalls Scraper: Consumer Product Safety Recall Alerts (`radiant_opuntia/cpsc-recall-alerts`) Actor

Monitor US Consumer Product Safety Commission (CPSC) recalls via the official SaferProducts.gov API, no key needed. Filter by keyword, category, hazard, retailer (Amazon, Walmart), country and units. Flat JSON with hazard, injuries, remedy, units, UPCs. 'Only new' mode for daily alerts.

- **URL**: https://apify.com/radiant_opuntia/cpsc-recall-alerts.md
- **Developed by:** [GovData Feeds](https://apify.com/radiant_opuntia) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

**Get US consumer product safety recalls from CPSC as clean rows, with hazard, units recalled, remedy, where it was sold and manufacturing country, plus new-recall alerts.**

**Rate your experience:** if you have used this Actor, you can tell us how it went on the [reviews page](https://apify.com/radiant_opuntia/cpsc-recall-alerts/reviews). Honest feedback of any kind helps us improve it.

### What it does and who it is for

This Actor reads the **official CPSC Recalls API** (US Consumer Product Safety Commission) and returns one flat record per recall: **title, description, product names and types, models, units recalled (parsed to a number), hazard and hazard tags, reported injuries, remedy and remedy options, consumer contact, manufacturers, importers, distributors, where it was sold, manufacturer countries, UPCs, image links and the CPSC page**.

Filter by keyword, product category, hazard type (fire, choking, laceration and more), retailer ("sold at"), manufacturer country, minimum units and recall date range. Turn on **Only new** to receive each recall once.

#### Use cases

- **Retailers, marketplaces and importers:** check whether recalled products are in your catalog.
- **Product safety and compliance teams:** monitor hazards in your product category.
- **Insurers and law firms:** early notice of recalls linked to a brand or retailer.
- **Parents' groups, bloggers and journalists:** a feed of new child-product and household recalls.
- **AI agents:** answer "which strollers or lithium battery products were recalled this month?".

### Why use this instead of the free official site or API

The underlying data is public and the official sources are free. What this Actor adds is convenience: the recall feed is parsed into numbers, flags and tags you can filter on.

| What you need | Official site / API | This Actor |
|---|---|---|
| Searching recalls | CPSC website search and a JSON API with nested fields | Keyword, category, hazard, retailer, country and unit filters in one input |
| Units recalled | Free text such as "About 53,634" | `unitsText` kept, plus a numeric `unitsRecalled` parsed from it |
| Where was it sold | Free text | `soldAt` text plus `soldOnAmazon` and `soldAtWalmart` flags |
| Only new recalls | You compare to yesterday's list yourself | **Only new** mode with a named alert |

If you only need a single lookup now and then, the official site is fine. If you want the same data on a schedule, as flat rows you can feed to a spreadsheet, CRM or agent, this saves the glue work.

### Data fields

| Field | Type | What it contains |
|---|---|---|
| `recallId` | integer | CPSC internal recall ID. |
| `recallNumber` | text | Official CPSC recall number. |
| `recallDate` | date | Date the recall was announced. |
| `lastPublishDate` | date | Date the recall page was last published or updated. |
| `title` | text | Recall title. |
| `url` | text | Link to the recall on cpsc.gov. |
| `description` | text | Description of the recalled product. |
| `productNames` | text | Product names, joined with semicolons. |
| `productTypes` | text | CPSC product types. |
| `models` | text | Model numbers, when given. |
| `unitsText` | text | Number of units as written by CPSC. |
| `unitsRecalled` | integer | Number of units parsed from the text, when a number is given. |
| `hazard` | text | Description of the hazard. |
| `hazardTags` | text | Hazard categories derived from the hazard text (for example fire; burn). |
| `reportedInjuries` | text | Incidents and injuries reported, when stated. |
| `remedy` | text | What consumers should do. |
| `remedyOptions` | text | Remedy type (for example Refund, Repair, Replace). |
| `consumerContact` | text | Contact details for consumers as published by CPSC. |
| `manufacturers` | text | Manufacturer names. |
| `importers` | text | Importer names. |
| `distributors` | text | Distributor names. |
| `soldAt` | text | Where the product was sold, as written by CPSC. |
| `soldOnAmazon` | boolean | true when the sold-at text mentions Amazon. |
| `soldAtWalmart` | boolean | true when the sold-at text mentions Walmart. |
| `countries` | text | Manufacturer countries. |
| `upcs` | text | UPC codes, when listed. |
| `imageUrls` | array | Links to recall images on cpsc.gov. |
| `scrapedAt` | datetime | When the Actor collected the record (UTC). |

Fields a source does not publish are `null`.

### "New since yesterday" alerts

Turn on **Only new** and the Actor remembers what it has already returned, so each scheduled run delivers only records you have not seen before.

1. Open the Actor in Apify Console and set the input, with **Only new since last run** switched on and a fixed alert name (`stateKey`). Example input:

```json
{
  "hazardTypes": ["fire", "choking", "strangulation"],
  "daysBack": 30,
  "maxResults": 100,
  "onlyNew": true,
  "stateKey": "daily-cpsc-recalls"
}
```

2. Click **Save as task**, then open **Schedules**, create a schedule (for example the cron expression `0 7 * * *` for every day at 7:00 in the time zone you pick) and add the task to it.
3. Under the task's **Integrations**, send the results to Slack, email, Google Sheets, a webhook or your own system.

A 30-day window with Only new gives each recall exactly once.

The first run returns everything that matches your window (all matching recalls from the last 30 days); later runs return only unseen records. Use a different alert name for each task so each keeps its own memory. A run with nothing new returns no results.

### Cost per run

This Actor uses **pay-per-result pricing: $3.00 per 1,000 results ($0.003 per result)**, with the Apify platform fee included. You are charged for the records a run returns and nothing is added on top for platform usage. A run that finds nothing new returns no results, so it has no per-result charge. The **Max results** input caps what a run can return (and so what it can cost).

**Worked example:** a weekly alert that returns 8 new recalls costs 8 × $0.003 = $0.024 per run. Pulling 2,000 recalls costs 2 × $3.00 = $6.00.

The pricing is configured in Apify Console; the Pricing tab on this page is the authoritative source if it ever differs from this text.

### Example input and output

The output below comes from real test runs of this Actor. Email addresses are masked and very long text is shortened here; the Actor returns the full values.

Input used for the example:

```json
{
  "keyword": "battery",
  "hazardTypes": ["fire", "burn"],
  "soldAt": ["Amazon", "Walmart"],
  "minUnits": 1000,
  "daysBack": 30,
  "onlyNew": true,
  "stateKey": "battery-fire-recalls",
  "maxResults": 200
}
```

Output (the first 1 records of a test run):

```json
[
  {
    "recallId": 11007,
    "recallNumber": "27011",
    "recallDate": "2026-10-01",
    "lastPublishDate": "2026-10-01",
    "title": "Kobayashi Recalls Rechargeable Hand Warmers Due to Risk of Serious Injury from Fire and Burn Hazards",
    "url": "https://www.cpsc.gov/Recalls/2027/Kobayashi-Recalls-Rechargeable-Hand-Warmers-Due-to-Risk-of-Serious-Injury-from-Fire-and-Burn-Hazards",
    "description": "This recall involves Kobayashi's HotHands-branded rechargeable hand warmers. The white with orange hand warmers were sold in packs of two warmers that can be magnetically joined together and include a charging cable. The…",
    "productNames": "HotHands® Rechargeable Hand Warmers",
    "productTypes": "Electric Blankets/Warmers",
    "models": null,
    "unitsText": "About 77,000 (In addition, about 72 were sold in Canada)",
    "unitsRecalled": 77000,
    "hazard": "The lithium-ion battery and electrical components in the recalled hand warmers can overheat and ignite, posing a risk of serious injury from fire and burn hazards.",
    "hazardTags": "fire; burn; injury or death",
    "reportedInjuries": null,
    "remedy": "Consumers should stop using the recalled hand warmers immediately and contact Kobayashi for a full refund. Consumers will be asked to go to [link removed] and follow the instructions to o…",
    "remedyOptions": "Refund",
    "consumerContact": "Kobayashi at 866-534-9986 from 8 a.m. to 5 p.m. ET Monday through Friday, by email at [email masked], or online at [link removed] or [link removed] and click on \"PRODUCT…",
    "manufacturers": null,
    "importers": null,
    "distributors": "Kobayashi Consumer Products, LLC, of Dalton, Georgia",
    "soldAt": "Bass Pro Shops, Meijer, Target and The Home Depot and other stores nationwide and online, including Amazon.com from July 2025 through August 2026 for between $30 and $40.",
    "soldOnAmazon": true,
    "soldAtWalmart": false,
    "countries": "China",
    "upcs": null,
    "imageUrls": ["https://www.cpsc.gov/s3fs-public/Kobayashi1.png", "https://www.cpsc.gov/s3fs-public/Kobayashi2.png", "https://www.cpsc.gov/s3fs-public/Kobayashi3.png"],
    "scrapedAt": "2026-10-23T10:42:43.494Z"
  }
]
```

### Limits worth knowing

- Results reflect the CPSC Recalls API at the time of the run, so a recall appears once CPSC has published it there.
- `unitsRecalled` is parsed from CPSC text, so it is empty when no number is given.
- `hazardTags`, `soldOnAmazon` and `soldAtWalmart` are derived from CPSC text by simple rules.
- Contact details are copied as published in the CPSC recall.
- Retailer and category filters use text matching, so spelling matters (for example Walmart, not Wal-Mart).

### FAQ

#### Do I need an API key?

No. The CPSC Recalls API is public.

#### Does it include old recalls?

Yes. Set the look-back to 0 to remove the date limit and read the full history.

#### How do I watch one brand?

Put the brand in **Keyword**; it is matched against the title, description, product names and company names.

#### Does it cover food and drug recalls?

No. Those are FDA and USDA recalls. See the FDA recall Actor below.

#### Is this a replacement for checking CPSC?

No. Confirm on the linked cpsc.gov page before acting on a recall.

### Related Actors

More Actors from GovData Feeds, all on Apify:

- [grants-gov-alerts](https://apify.com/radiant_opuntia/grants-gov-alerts): US federal grant opportunities (Grants.gov): ceilings, deadlines, eligibility
- [sec-form-d-alerts](https://apify.com/radiant_opuntia/sec-form-d-alerts): SEC Form D filings: companies that just raised money
- [usaspending-awards-alerts](https://apify.com/radiant_opuntia/usaspending-awards-alerts): New federal contract, grant and loan awards (USAspending)
- [sec-form4-insider-alerts](https://apify.com/radiant_opuntia/sec-form4-insider-alerts): SEC Form 4 insider buys and sells, one row per transaction
- [fda-recall-alerts](https://apify.com/radiant_opuntia/fda-recall-alerts): FDA food, drug and medical device recalls
- [fda-compliance-alerts](https://apify.com/radiant_opuntia/fda-compliance-alerts): FDA 510(k) clearances, MAUDE adverse events and warning letters
- [us-building-permits-alerts](https://apify.com/radiant_opuntia/us-building-permits-alerts): New building permits from nine city open-data portals
- [clinical-trials-alerts](https://apify.com/radiant_opuntia/clinical-trials-alerts): New ClinicalTrials.gov studies by condition, sponsor and phase
- [federal-register-alerts](https://apify.com/radiant_opuntia/federal-register-alerts): Federal Register rules, proposed rules and notices
- [contractor-license-alerts](https://apify.com/radiant_opuntia/contractor-license-alerts): New contractor licenses in WA, OR and NY with bond and insurance
- [ofac-sanctions-alerts](https://apify.com/radiant_opuntia/ofac-sanctions-alerts): OFAC sanctions screening and change alerts
- [new-business-registrations-alerts](https://apify.com/radiant_opuntia/new-business-registrations-alerts): New LLC and corporation registrations (NY, CO, OR, CT)
- [epa-echo-enforcement-alerts](https://apify.com/radiant_opuntia/epa-echo-enforcement-alerts): EPA ECHO facilities with new environmental penalties
- [restaurant-inspections-alerts](https://apify.com/radiant_opuntia/restaurant-inspections-alerts): Restaurant health inspections from seven US jurisdictions
- [code-violations-alerts](https://apify.com/radiant_opuntia/code-violations-alerts): Building, housing and property code violations from six cities

*Data comes from the US Consumer Product Safety Commission, a US government source. This Actor is not affiliated with or endorsed by CPSC.*

# Actor input Schema

## `keyword` (type: `string`):

Matches the recall title, description, product names, hazard and company names. Examples: 'stroller', 'lithium battery', 'Fisher-Price'. Leave empty for all.

## `productCategories` (type: `array`):

CPSC product type text to match, e.g. Toys, Bicycles, Heaters, Furniture, Child Care, Electric. Any one match keeps the recall.

## `hazardTypes` (type: `array`):

Keep recalls whose hazard text mentions one of these risks.

## `soldAt` (type: `array`):

Keep recalls whose 'sold at' text mentions any of these, e.g. Amazon, Walmart, Target, Home Depot, Costco, Temu.

## `manufacturerCountries` (type: `array`):

e.g. China, Vietnam, Mexico. Leave empty for all.

## `minUnits` (type: `integer`):

Only recalls of at least this many units (parsed from CPSC text such as 'About 53,634'). 0 = off.

## `daysBack` (type: `integer`):

Ignored if a start date is set. 0 = no date limit (full history).

## `startDate` (type: `string`):

Recall date in YYYY-MM-DD format. Overrides 'Recalled within last N days'.

## `endDate` (type: `string`):

Recall date in YYYY-MM-DD format. Defaults to today.

## `onlyNew` (type: `boolean`):

Remember what was already returned and output only recalls not seen in earlier runs of this same search. Ideal with a daily Schedule + email/Slack/webhook integration.

## `stateKey` (type: `string`):

Separate memory for 'only new' mode. Defaults to a key derived from your filters.

## `maxResults` (type: `integer`):

Stop after this many recalls.

## Actor input object example

```json
{
  "keyword": "battery",
  "productCategories": [],
  "hazardTypes": [],
  "soldAt": [],
  "manufacturerCountries": [],
  "minUnits": 0,
  "daysBack": 90,
  "onlyNew": false,
  "maxResults": 50
}
```

# Actor output Schema

## `results` (type: `string`):

All CPSC recalls returned by this run (flat JSON items in the default dataset).

## `runSummary` (type: `string`):

Counts of items pushed and items skipped as already seen (only-new mode).

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keyword": "battery",
    "minUnits": 0,
    "daysBack": 90,
    "onlyNew": false,
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("radiant_opuntia/cpsc-recall-alerts").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keyword": "battery",
    "minUnits": 0,
    "daysBack": 90,
    "onlyNew": False,
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("radiant_opuntia/cpsc-recall-alerts").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keyword": "battery",
  "minUnits": 0,
  "daysBack": 90,
  "onlyNew": false,
  "maxResults": 50
}' |
apify call radiant_opuntia/cpsc-recall-alerts --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,radiant_opuntia/cpsc-recall-alerts"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/3z1YuV6JDutCIzjqa/builds/3Qf5py5xrDhj69a7d/openapi.json
