# CPSC Consumer Product Recall Delta Monitor (`apex-nexus/cpsc-product-recall-delta-monitor`) Actor

- **URL**: https://apify.com/apex-nexus/cpsc-product-recall-delta-monitor.md
- **Developed by:** [Valunex](https://apify.com/apex-nexus) (community)
- **Categories:** Business, E-commerce
- **Stats:** 2 total users, 1 monthly users, 50.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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

## CPSC Consumer Product Recall Delta Monitor

Monitors the public [CPSC recalls REST API](https://www.saferproducts.gov/RestWebServices/Recall?format=json)
for a user-maintained watchlist of brand / product-category / retailer keywords
and emits one dataset item (alert) per newly observed consumer product recall
since the last run — **"free when nothing changes"** (unchanged replays emit
nothing).

### Who it is for

FBA and e-commerce sellers, consumer-product brands / CPG, retail compliance
teams, product-liability insurers, and plaintiff/regulatory lawyers who need an
early-warning signal for CPSC consumer product recalls (toys, appliances,
electronics, furniture, children's products and more) without manually
re-checking saferproducts.gov on a schedule. Run this Actor on a cadence and it
only alerts on what is new.

### What makes it different

Existing CPSC recall coverage on the Apify Store is one-shot, pay-per-event
scraping: you re-pull and re-bill the full recall history on every poll. This
Actor keeps a watchlist and remembers what it already reported (per-watchlist
checkpoint in the Apify key-value store keyed by the stable CPSC RecallID), so
repeat runs emit only genuinely new or amended recalls — free when nothing
changes.

### Data source

Public CPSC data only — no API key, no login, no proxies, no credentials:

- https://www.saferproducts.gov/RestWebServices/Recall?format=json
  (official CPSC Recalls REST service, documented at
  https://www.cpsc.gov/Recalls/CPSC-Recalls-Application-Program-Interface-API-Information)

All HTTP is server-side. Public domain US government data. No commercial
inference (no LLMs) inside the product.

### Pricing (Apify Store)

Listed as **FREE**. The Actor itself costs $0 per run and emits nothing when
there are no new recalls ("free when nothing changes"). Pay-per-event pricing
(a per-run start fee plus a per-alert dataset-item fee) only applies after the
owner sets up payout billing in Apify Console (Actor pricing step + primary
event step) — see POLICY #3: publish free now, enable monetization only at
payout time when the owner completes KYC.

### Input

See actor/.actor/input_schema.json. All fields optional; the default input
watches no keywords (monitors all CPSC recalls) over the last 30 days:

```json
{
  "watchlist": [],
  "sinceDays": 30,
  "maxResults": 25
}
```

Example watching specific brands and retailers:

```json
{
  "watchlist": ["Bodum", "DREO", "Target", "space heater"],
  "sinceDays": 30,
  "maxResults": 25
}
```

- `watchlist`: array of keyword strings (max 50). A recall matches when any
  keyword appears in its title, description, products, retailers or hazards,
  case-insensitively. Leave empty to monitor all CPSC recalls.
- `sinceDays` (1-365, default 30): bounds how far back runs look; the first
  run establishes a baseline of all recalls currently in the window.
- `maxResults` (1-200, default 25): cap on alerts emitted in a single run.

### Output

One dataset item per new or amended recall:

```json
{
  "recallID": 11041,
  "recallNumber": "27055",
  "recallDate": "2026-10-29T00:00:00",
  "lastPublishDate": "2026-10-29T00:00:00",
  "title": "Bodum USA Recalls 5.9 Million French Press Coffee Makers ...",
  "description": "This recall involves Bodum ... French Press coffee makers ...",
  "url": "https://cpsc.gov/Recalls/2027/Bodum-USA-Recalls-...",
  "consumerContact": "Bodum USA toll-free at 888-879-8213 ...",
  "products": [
    {
      "Name": "Bodum French Press coffee makers ...",
      "Type": "Unpowered Coffee Makers or Teapots",
      "CategoryID": "585",
      "NumberOfUnits": "5.9 million"
    }
  ],
  "retailers": [
    { "Name": "Sold At:\\nTarget, Walmart, ...", "CompanyID": "" }
  ],
  "manufacturers": [],
  "importers": [
    { "Name": "Bodum USA, Inc., of New York, New York", "CompanyID": "" }
  ],
  "hazards": [
    { "Name": "The carafe can unexpectedly break during use ...", "HazardType": "", "HazardTypeID": "" }
  ],
  "remedies": [
    { "Name": "Consumers should stop using metal spoons ...", ... }
  ],
  "remedyOptions": [ { "Option": "Repair" } ],
  "manufacturerCountries": [ { "Country": "Portugal" }, { "Country": "Thailand" } ],
  "soldAtLabel": null,
  "newSinceLastRun": true,
  "changeType": "new",
  "watchlistMatched": "Bodum",
  "source": "https://www.saferproducts.gov/RestWebServices/Recall"
}
```

`changeType` is `"new"` for a previously unseen RecallID and `"amended"` for a
known RecallID whose published content changed. Every optional field is `null`
when it could not be parsed — the Actor never guesses.

### Checkpoint / delta behaviour

State (a content fingerprint per RecallID plus the newest recall date seen) is
kept per watchlist configuration in the Actor key-value store. The first run
for a watchlist emits all currently known recalls in the `sinceDays` window as
the baseline. Repeat runs only emit recalls newer than the lookback window
that have not been seen before, or previously seen RecallIDs whose content
changed. Resetting the store re-emits the baseline.

### Limits

- Max 50 watchlist keywords, 200 alerts per run, 365-day lookback.
- One full feed fetch per run (no credentials, no proxies).
- Checkpoints persist per watchlist configuration in the Actor key-value store.

### Verification

Run `pytest actor/tests` before release (builder acceptance criterion).
Default input `{ "sinceDays": 30 }` must return more than 0 dataset items in
under 5 minutes against live saferproducts.gov.

# Actor input Schema

## `watchlist` (type: `array`):

Brand, product-category or retailer keywords (e.g. "Bodum", "space heater", "Target"). A recall matches when any keyword appears in its title, description, products, retailers or hazards. Leave empty to monitor all CPSC recalls.

## `sinceDays` (type: `integer`):

Only recalls published within this many days are considered; the first run establishes a baseline of all recalls currently in the window.

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

Cap the number of new/amended recall alerts emitted in a single run.

## Actor input object example

```json
{
  "watchlist": [],
  "sinceDays": 30,
  "maxResults": 25
}
```

# Actor output Schema

## `overview` (type: `string`):

Dataset items filtered by the overview view defined in the dataset schema.

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

All dataset items emitted by the Actor run (new/amended recalls).

# 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 = {
    "sinceDays": 30,
    "maxResults": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("apex-nexus/cpsc-product-recall-delta-monitor").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 = {
    "sinceDays": 30,
    "maxResults": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("apex-nexus/cpsc-product-recall-delta-monitor").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 '{
  "sinceDays": 30,
  "maxResults": 25
}' |
apify call apex-nexus/cpsc-product-recall-delta-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,apex-nexus/cpsc-product-recall-delta-monitor"
        }
    }
}
```

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/LGLAemY1zfGNsvJ5S/builds/eI7Shzo24x8ua7cEI/openapi.json
