# RecallWatch — CPSC Catalog Recall Monitor (`rex-law/recallwatch-catalog-monitor`) Actor

Check up to 5,000 catalog products against official U.S. CPSC recalls with exact UPC evidence, conservative brand/model candidates, downloadable reports, and change alerts.

- **URL**: https://apify.com/rex-law/recallwatch-catalog-monitor.md
- **Developed by:** [Rex Law](https://apify.com/rex-law) (community)
- **Categories:** E-commerce, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$9.00 / catalog screening report delivered

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## RecallWatch — Catalog Recall Monitor

Screen a merchant catalog against the official U.S. Consumer Product Safety Commission recall database. RecallWatch accepts JSON products or pasted CSV, produces explainable candidates, and preserves monitoring state for scheduled follow-up runs.

### Why buyers use it

Federal law prohibits selling or offering recalled consumer products in the United States. CPSC also tells online resellers to check products before listing them. RecallWatch turns that manual search into a bounded catalog report while keeping the merchant in control of every decision.

### What a run returns

- `exact_identifier_match`: a normalized UPC, EAN, or GTIN appears in the official notice.
- `strong_candidate`: both the supplied brand and a sufficiently distinctive model appear in the official notice.
- `review_candidate`: brand and multiple distinctive title terms overlap; this is intentionally review-only.
- `no_candidate`: the deterministic rules found no candidate. This is not a safety certification.

Every candidate includes the match reasons, official recall number and date, hazard/remedy text, and the direct CPSC link. The run also produces a self-contained HTML report, a CSV report, and structured dataset rows.

### Input

Provide exactly one of:

1. `products`: up to 5,000 JSON objects; or
2. `catalogCsv`: up to 2 MB of pasted CSV with a header.

Recognized field aliases include:

| Meaning | Accepted examples |
| --- | --- |
| SKU | `sku`, `id`, `product_id`, `variant_id` |
| Title | `title`, `name`, `product_name` |
| Brand | `brand`, `vendor`, `manufacturer` |
| Model | `model`, `model_number`, `mpn`, `part_number` |
| Identifier | `upc`, `gtin`, `ean`, `barcode` |

Use a stable `monitorKey` on an Apify schedule. Later runs compare the current candidate snapshot with the previous successful snapshot. Source or report failures preserve the prior state.

### Safety and operating boundaries

- Only the fixed official CPSC API is queried; no marketplace or customer PII is collected.
- The run fails closed if the official response is truncated, malformed, or older than the configured freshness limit.
- Reports explain candidates; they never auto-delist products or claim legal compliance.
- CPSC data has limited structured identifiers. As a live July 2026 snapshot, only a minority of notices expose UPCs and the API's product `Model` field is generally empty; product descriptions remain important. Expect false negatives and require human confirmation.
- Billing occurs only after the catalog and official source have been processed successfully and before report delivery.

### Automation

Create an Apify schedule using the same input and monitor key. Use Apify's run-status or dataset webhooks to deliver `alertRequired` summaries. A high-confidence new candidate sets `alertRequired: true`; unchanged reports stay quiet when `onlyChanges` is enabled.

### Sources

- [CPSC Recall API information](https://www.cpsc.gov/Recalls/CPSC-Recalls-Application-Program-Interface-API-Information)
- [CPSC guidance for online resale](https://www.cpsc.gov/Business--Manufacturing/Business-Education/ResaleThrift-Stores-Information-Center/Stop-Online-Sale-of-Recalled-Products)
- [CPSC retailer and reverse-logistics guidance](https://www.cpsc.gov/Business--Manufacturing/Recall-Guidance/Guidelines-for-Retailers-and-Reverse-Logistics-Providers)

RecallWatch is a screening and workflow tool, not legal advice, a product-safety certification, or a substitute for reviewing the official notice and the actual item.

# Actor input Schema

## `products` (type: `array`):

Use this or Catalog CSV, not both. Common field aliases such as name/title, vendor/brand, MPN/model, and GTIN/UPC are recognized.
## `catalogCsv` (type: `string`):

Paste a CSV export with a header. Recognized columns include SKU/ID, title/name, brand/vendor, model/MPN, and UPC/GTIN/EAN/barcode.
## `monitorKey` (type: `string`):

Keep this stable across scheduled runs to detect new, changed, and resolved candidates.
## `onlyChanges` (type: `boolean`):

The full HTML and CSV reports are still generated; dataset rows are reduced to changed candidates on later runs.
## `emitBaseline` (type: `boolean`):

Write the first full baseline to the dataset before later change-only runs.
## `sourceMaxAgeDays` (type: `integer`):

The run fails closed instead of delivering a report when the latest CPSC publication is older than this limit.
## `requestTimeoutSecs` (type: `integer`):

Stop waiting for one CPSC API request after this many seconds.
## `maxRetries` (type: `integer`):

Retry temporary network, rate-limit, and server failures up to this many times.

## Actor input object example

```json
{
  "monitorKey": "default",
  "onlyChanges": true,
  "emitBaseline": true,
  "sourceMaxAgeDays": 14,
  "requestTimeoutSecs": 45,
  "maxRetries": 2
}
````

# Actor output Schema

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

Structured per-product screening results.

## `htmlReport` (type: `string`):

No description

## `csvReport` (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("rex-law/recallwatch-catalog-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("rex-law/recallwatch-catalog-monitor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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 rex-law/recallwatch-catalog-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=rex-law/recallwatch-catalog-monitor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "RecallWatch — CPSC Catalog Recall Monitor",
        "description": "Check up to 5,000 catalog products against official U.S. CPSC recalls with exact UPC evidence, conservative brand/model candidates, downloadable reports, and change alerts.",
        "version": "0.1",
        "x-build-id": "9pwIRLFx8Q00COMrX"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/rex-law~recallwatch-catalog-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-rex-law-recallwatch-catalog-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/rex-law~recallwatch-catalog-monitor/runs": {
            "post": {
                "operationId": "runs-sync-rex-law-recallwatch-catalog-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/rex-law~recallwatch-catalog-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-rex-law-recallwatch-catalog-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "products": {
                        "title": "Products (JSON)",
                        "minItems": 1,
                        "maxItems": 5000,
                        "type": "array",
                        "description": "Use this or Catalog CSV, not both. Common field aliases such as name/title, vendor/brand, MPN/model, and GTIN/UPC are recognized.",
                        "items": {
                            "type": "object",
                            "properties": {
                                "sku": {
                                    "type": "string",
                                    "title": "SKU",
                                    "description": "Your stable product or variant identifier."
                                },
                                "title": {
                                    "type": "string",
                                    "title": "Product title",
                                    "description": "The customer-facing catalog title."
                                },
                                "brand": {
                                    "type": "string",
                                    "title": "Brand",
                                    "description": "Brand, vendor, or manufacturer name."
                                },
                                "model": {
                                    "type": "string",
                                    "title": "Model or MPN",
                                    "description": "Exact model, manufacturer part number, or style identifier."
                                },
                                "upc": {
                                    "type": "string",
                                    "title": "UPC, EAN, or GTIN",
                                    "description": "An 8, 12, 13, or 14 digit product identifier. Separate multiple values with commas."
                                }
                            }
                        }
                    },
                    "catalogCsv": {
                        "title": "Catalog CSV",
                        "maxLength": 2000000,
                        "type": "string",
                        "description": "Paste a CSV export with a header. Recognized columns include SKU/ID, title/name, brand/vendor, model/MPN, and UPC/GTIN/EAN/barcode."
                    },
                    "monitorKey": {
                        "title": "Monitor name",
                        "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$",
                        "type": "string",
                        "description": "Keep this stable across scheduled runs to detect new, changed, and resolved candidates.",
                        "default": "default"
                    },
                    "onlyChanges": {
                        "title": "Emit only changes after baseline",
                        "type": "boolean",
                        "description": "The full HTML and CSV reports are still generated; dataset rows are reduced to changed candidates on later runs.",
                        "default": true
                    },
                    "emitBaseline": {
                        "title": "Emit first baseline",
                        "type": "boolean",
                        "description": "Write the first full baseline to the dataset before later change-only runs.",
                        "default": true
                    },
                    "sourceMaxAgeDays": {
                        "title": "Maximum official-source age",
                        "minimum": 3,
                        "maximum": 30,
                        "type": "integer",
                        "description": "The run fails closed instead of delivering a report when the latest CPSC publication is older than this limit.",
                        "default": 14
                    },
                    "requestTimeoutSecs": {
                        "title": "Official-source request timeout",
                        "minimum": 10,
                        "maximum": 60,
                        "type": "integer",
                        "description": "Stop waiting for one CPSC API request after this many seconds.",
                        "default": 45
                    },
                    "maxRetries": {
                        "title": "Official-source retry count",
                        "minimum": 0,
                        "maximum": 3,
                        "type": "integer",
                        "description": "Retry temporary network, rate-limit, and server failures up to this many times.",
                        "default": 2
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
