# Recall Watch (`matteogenovese/recall-watch`) Actor

Monitor product recall and safety alert pages with keyword filters and alerts.

- **URL**: https://apify.com/matteogenovese/recall-watch.md
- **Developed by:** [Matteo Genovese](https://apify.com/matteogenovese) (community)
- **Categories:** Developer tools, Automation
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$490.00 / 1,000 monitored pages

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 web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Recall Watch

Turn public recall and safety alert pages into short, actionable alerts.

### Why it matters

Most recall pages are noisy, fragmented, and hard to watch manually. This Actor trims the noise and surfaces the bits that matter fast.

### What it does

- watches one or more public recall / safety alert URLs
- extracts readable page text
- keeps the last snapshot for comparison
- highlights likely relevant lines using keywords
- sends optional webhook alerts when a page changes

### Best for

- compliance teams
- brand and product ops
- retailers and distributors
- small teams that need recall visibility without babysitting pages

### Why it wins

- short, actionable diffs instead of raw page-change noise
- tuned specifically for recall and safety alert pages
- webhook-friendly output
- can be narrowed to a brand or category list

### Input

- `urls` — required list of public recall or safety alert URLs, or leave empty and use presets
- `sourcePresets` — optional official presets for `cpsc`, `fda`, `usda`, `nhtsa`
- `keywords` — optional brand, product, or category filters
- `excludeKeywords` — optional filters to cut noise
- `monitorMode` — keep snapshots and compare against the next run
- `dryRun` — skip state writes and webhooks
- `webhookUrl` — optional alert destination
- `webhookFormat` — `generic`, `slack`, or `discord`
- `maxItemsPerPage` — cap extracted hits per source
- `minLineLength` — ignore very short lines
- `userAgent` — custom fetch user agent

### Output

Each dataset item contains:

- URL
- page title
- baseline / changed flags
- change score
- current and previous hashes
- matched keywords
- added / removed lines
- short preview

### Competition

- generic page monitors
- recall email lists
- broad consumer safety alert pages

### Pricing

- launch pricing: $0.49 per monitored page snapshot
- effective from: 2026-07-18
- billing model: pay per event via default dataset items
- primary event: `Monitored page`
- rationale: priced as a narrow recall monitor, not a generic crawler

### MVP scope

This Actor is intentionally narrow:

- no login-heavy portals in v1
- no claims / refunds workflow
- no dashboard UI
- no enterprise case management
- no broad web monitoring platform

### Publish status

- private, ready to publish
- store terms accepted: pending console publish
- last deploy: build `0.1.2`
- known blockers: none yet

# Actor input Schema

## `urls` (type: `array`):

Public recall or safety alert page URLs to monitor. Leave empty if you use source presets.

## `sourcePresets` (type: `array`):

Optional official sources to preload: cpsc, fda, usda, nhtsa.

## `keywords` (type: `array`):

Optional brand, product, or category keywords used to focus the alerts.

## `excludeKeywords` (type: `array`):

Optional keywords that should be filtered out of the extracted lines.

## `monitorMode` (type: `boolean`):

If enabled, the Actor stores snapshots and compares them with the next run.

## `dryRun` (type: `boolean`):

Skip state writes and webhooks while still producing output.

## `webhookUrl` (type: `string`):

Optional webhook destination for change alerts.

## `webhookFormat` (type: `string`):

Payload shape for the webhook.

## `maxItemsPerPage` (type: `integer`):

Maximum number of added or removed lines to include in output.

## `minLineLength` (type: `integer`):

Ignore shorter lines while extracting page text.

## `userAgent` (type: `string`):

Custom user agent used for page fetches.

## Actor input object example

```json
{
  "urls": [],
  "sourcePresets": [
    "cpsc",
    "fda",
    "usda",
    "nhtsa"
  ],
  "keywords": [
    "battery",
    "charger",
    "toy"
  ],
  "monitorMode": true,
  "dryRun": false,
  "webhookFormat": "generic",
  "maxItemsPerPage": 40,
  "minLineLength": 4,
  "userAgent": "recall-watch/1.0"
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `state` (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 = {
    "urls": [],
    "sourcePresets": [
        "cpsc",
        "fda",
        "usda",
        "nhtsa"
    ],
    "keywords": [
        "battery",
        "charger",
        "toy"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("matteogenovese/recall-watch").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 = {
    "urls": [],
    "sourcePresets": [
        "cpsc",
        "fda",
        "usda",
        "nhtsa",
    ],
    "keywords": [
        "battery",
        "charger",
        "toy",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("matteogenovese/recall-watch").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 '{
  "urls": [],
  "sourcePresets": [
    "cpsc",
    "fda",
    "usda",
    "nhtsa"
  ],
  "keywords": [
    "battery",
    "charger",
    "toy"
  ]
}' |
apify call matteogenovese/recall-watch --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=matteogenovese/recall-watch",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/xxwtMU1Vx3fdhXqMf/builds/ZekiZTuzNt1hRTzAX/openapi.json
