# CPSC Product Recall Monitor (`cemented_jest/cpsc-product-recall-monitor`) Actor

Collect US consumer-product recalls, affected products, hazards, remedies and manufacturers. Compare recall updates across scheduled runs.

- **URL**: https://apify.com/cemented_jest/cpsc-product-recall-monitor.md
- **Developed by:** [CRNO](https://apify.com/cemented_jest) (community)
- **Categories:** Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 delivered records

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

## CPSC Product Recall Monitor

Collect US consumer-product recalls, affected products, hazards, remedies and manufacturers. Compare recall updates across scheduled runs.

### Quick start

Run the example below. No source API key or proxy subscription is required for the supported public endpoints. Source access can still be rate-limited or blocked. Results are stored in the default dataset, ready for JSON, CSV or Excel export.

```json
{
  "maxItems": 20
}
```

### What you receive

Every row includes a stable `id`, `source`, `title`, `url`, UTC `observedAt` and `runId`. Source-specific fields include recallNumber, recallDate, lastPublishDate, products, hazards, remedies, manufacturers, retailers, images. Optional source values may be null or empty. Nested arrays are preserved in JSON.

Default range is the previous 90 days; maximum is 366 days. Results are sorted by recall date descending. Large source responses fail with an explicit size error; narrow the date range. The date filter is recall date, not last-modified date, so updates to older recalls require a wider date selection. Verify critical recall decisions with the linked agency notice.

#### Example result

The following validation result shows the output structure. Long text and arrays are shortened for readability; values are historical examples, not current source values.

```json
{
  "id": "11041",
  "source": "cpsc",
  "title": "Bodum USA Recalls 5.9 Million French Press Coffee Makers with Replaceable Glass Carafes Due to Risk of Serious Burn Injury",
  "url": "https://cpsc.gov/Recalls/2027/Bodum-USA-Recalls-5-9-Million-French-Press-Coffee-Makers-with-Replaceable-Glass-Carafes-Due-to-Risk-of-Serious-Burn-Injury",
  "recallNumber": "27055",
  "recallDate": "2026-10-29T00:00:00",
  "lastPublishDate": "2026-10-29T00:00:00",
  "description": "This recall involves Bodum 8-cup and 12-cup Bistro, Brazil, Caffettiera, Chambord, Crema, Java, Jesper, and Kenya model French Press coffee makers with replaceable glass carafes. The Bodum name appears on the frame and inner lid of most ...",
  "products": [
    {
      "Name": "Bodum French Press coffee makers with 8-cup and 12-cup replaceable glass carafes (Bistro, Brazil, Caffettiera, Chambord, Crema, Java, Jesper, and Kenya models)",
      "Description": "",
      "Model": "",
      "Type": "Unpowered Coffee Makers or Teapots",
      "CategoryID": "585",
      "NumberOfUnits": "5.9 million"
    }
  ],
  "hazards": [
    {
      "Name": "The carafe can unexpectedly break during use if the glass carafe is damaged or cracked, including by use of a metal spoon to stir the coffee, posing a risk of serious burn injuries.",
      "HazardType": "",
      "HazardTypeID": ""
    }
  ],
  "remedies": [
    {
      "Name": "Consumers should stop using metal spoons or utensils to stir coffee in the glass carafe immediately and contact Bodum to receive a plastic Bodum stirring spoon and warning label. The label reminds consumers not to use cracked or damaged ..."
    }
  ],
  "manufacturers": [],
  "retailers": [
    {
      "Name": "Sold At:\nTarget, Walmart, and coffee and home goods stores nationwide and online at Bodum.com, Amazon.com, Target.com, Walmart.com and other online retailers from 1974 through October 2026 for about $15 to $65.",
      "CompanyID": ""
    }
  ],
  "images": [
    {
      "URL": "https://cpsc.gov/s3fs-public/Bodum1.jpg?VersionId=AfcWy.i2qS2KT6Ka0o9Agw7pYARrPXMR",
      "Caption": "Recalled Bodum Brazil French Press"
    },
    {
      "URL": "https://cpsc.gov/s3fs-public/Bodum2.jpg?VersionId=naT8B3sd6Vh34MpmcVamYxpXV0slHhRw",
      "Caption": "Recalled Bodum Chambord French Press"
    }
  ],
  "changeType": "baseline",
  "changedFields": [],
  "previousObservedAt": null,
  "observedAt": "2026-11-05T07:33:32.560Z",
  "runId": "ggUWI0O8bbkgyu3MA"
}
```

### Inputs

| Field | Meaning | Default |
| --- | --- | --- |
| `keyword` | Optional CPSC ProductName search. | `""` |
| `startDate` | YYYY-MM-DD. Empty uses the documented rolling date range. | `""` |
| `endDate` | YYYY-MM-DD. Empty uses today in UTC. | `""` |
| `maxItems` | Maximum matching records to select (1–1000), across all sources in input order. Source APIs may return or scan additional rows before filtering. In changes-only mode this caps compared records, not just delivered changes. | `100` |
| `trackChanges` | Save a private snapshot and compare the same input selection across runs. | `false` |
| `historyStoreName` | Required for change tracking. Choose a private key-value store owned by your account; reuse it on later runs. | `""` |
| `onlyChanges` | Requires change tracking. The first run returns all baseline records; later unchanged records are free and omitted. | `false` |

### Change monitoring

Set `trackChanges: true` and a private `historyStoreName`, then reuse exactly the same search inputs and maximum-results setting on later runs. An Apify schedule can run this daily; scheduling and notifications are configured by you, not automatically created by this Actor. Use `onlyChanges: true` to omit unchanged rows.

The first run emits `baseline` rows. Subsequent rows are `new`, `changed` or `unchanged`, with `changedFields` and `previousObservedAt`. Without tracking, the label is `notTracked`. Comparisons cover only the selected result window and immediately preceding successful snapshot. Newly seen does not mean newly created. Missing records are not declared deleted, closed or resolved. Source-fetch failures and budget-truncated selections do not advance the baseline. A storage failure after delivery can leave saved rows or a saved snapshot; check the dataset and SUMMARY before retrying. Avoid overlapping scheduled runs for the same history; immutable snapshots prevent one run overwriting another. Rotate the history store after 2,000 snapshots per search.

### Pricing

**$5.00 per 1,000 delivered records ($0.005 each).** Only the `record-scraped` event is billed. No startup fee, no separate automatic dataset-item fee. Actor platform usage is included. Empty results and omitted unchanged records have no result fee. Account-level charges for later storage/API usage, schedules or integrations follow your Apify plan.

Set an Apify maximum charge limit to cap result spending. `maxItems` limits inspected records, including unchanged ones. A small charge budget may further limit the selection. The `SUMMARY` record has no result-event fee and reports fetched/saved counts, budget stops, request counts and snapshot status.

### Reliability and limits

At most 1,000 selected records and 60 source requests per run; each request has a 30-second timeout and a 16 MB response limit. Requests are paced, temporary errors receive bounded retries, and source failures or malformed responses fail explicitly. A run collects the selected rows before writing them, so an upstream error does not silently return partial success. Delivery or storage failures can leave output; inspect SUMMARY before retrying. Start a new run instead of resurrecting an existing output dataset.

Public APIs can change, return stale data or limit requests. No scraper can guarantee permanent availability or exhaustive coverage. This is an independent tool, not an official service of the source organization. Users are responsible for their downstream use and applicable source terms; public access is not an unrestricted redistribution license.

### Source documentation

[Official source/API documentation](https://www.cpsc.gov/Recalls/CPSC-Recalls-Application-Program-Interface-API-Information). For support, open an issue on this Actor with the run ID and non-sensitive input. Never include tokens or confidential data.

# Actor input Schema

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

Optional CPSC ProductName search.

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

YYYY-MM-DD. Empty uses the documented rolling date range.

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

YYYY-MM-DD. Empty uses today in UTC.

## `maxItems` (type: `integer`):

Maximum matching records to select (1–1000), across all sources in input order. Source APIs may return or scan additional rows before filtering. In changes-only mode this caps compared records, not just delivered changes.

## `trackChanges` (type: `boolean`):

Save a private snapshot and compare the same input selection across runs.

## `historyStoreName` (type: `string`):

Required for change tracking. Choose a private key-value store owned by your account; reuse it on later runs.

## `onlyChanges` (type: `boolean`):

Requires change tracking. The first run returns all baseline records; later unchanged records are free and omitted.

## Actor input object example

```json
{
  "keyword": "",
  "startDate": "",
  "endDate": "",
  "maxItems": 100,
  "trackChanges": false,
  "historyStoreName": "",
  "onlyChanges": false
}
```

# Actor output Schema

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

No description

## `summary` (type: `string`):

No description

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("cemented_jest/cpsc-product-recall-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("cemented_jest/cpsc-product-recall-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 '{}' |
apify call cemented_jest/cpsc-product-recall-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cemented_jest/cpsc-product-recall-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/IDOhOXTcCDuAVCFdg/builds/YMCgFuI7ns1f5XdYv/openapi.json
