# Product Recall Monitor: EU Safety Gate, CPSC, FDA, UK, Canada (`henri_dewitte/product-recall-monitor`) Actor

Monitor official product recalls and safety alerts from EU Safety Gate, UK OPSS, US CPSC, US FDA and Canada in one format. Match your brands, barcodes (EAN/UPC) or keywords. $3 per 1,000 recalls.

- **URL**: https://apify.com/henri_dewitte/product-recall-monitor.md
- **Developed by:** [Henri De Witte](https://apify.com/henri_dewitte) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 recalls

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

## Product Recall Monitor: EU Safety Gate, CPSC, FDA, UK, Canada

Get **official product recalls and safety alerts from 5 government sources in one clean format**: EU Safety Gate (RAPEX), UK OPSS, US CPSC, US FDA and the Government of Canada. Add your **brands, barcodes (EAN/UPC/GTIN) or keywords** and schedule it: you get an alert as soon as one of your products is recalled anywhere.

- ✅ 5 official sources, 1 format: EU (31 European countries), UK, US and Canada
- ✅ Consumer products, toys, electronics, cosmetics, food, drugs, medical devices and vehicles
- ✅ Barcode matching for your whole catalogue (up to 50,000 EAN/UPC codes); leading zeros don't matter
- ✅ Brand and keyword watch lists (whole words, accent- and case-insensitive)
- ✅ Brand, barcode, model, batch, hazard, risk level, measures, country of origin, photos and the official link
- ✅ "Only new since the last run": schedule it daily and only get new recalls
- ✅ No API keys needed, only public government data. One source down? The others still run.

### Who is it for?

- **Online shops and marketplace sellers**: the EU General Product Safety Regulation (GPSR) requires you to act on recalls of products you sell. Upload your barcodes and brands and get a daily check.
- **Amazon, eBay and Bol sellers, importers and distributors**: see which products from your suppliers are being banned or recalled.
- **Compliance, quality and product safety teams**: one feed for EU, UK, US and Canada instead of five websites.
- **Journalists, researchers and consumer organisations**: analyse dangerous products by country, category or risk.
- **Insurers and law firms**: track recalls in a product category.

### How to use it

1. Choose your **sources** (all 5 by default) and the **period** (last 30 days by default).
2. Optional: add a **watch list** of brands, barcodes or keywords. A recall is returned when it matches **any** of them.
3. Click **Start**. For alerts, turn on **Only new since the last run** and add a daily **schedule**.

### Input examples

Daily recall check for a toy shop:

```json
{
    "brands": ["Lego", "Playmobil", "Hape"],
    "barcodes": ["5702017154206", "4008789712657"],
    "keywords": ["water beads", "magnet"],
    "productTypes": ["consumer-products"],
    "publishedWithinDays": 7,
    "onlyNewSinceLastRun": true
}
```

All EU and UK alerts of the last 30 days:

```json
{ "sources": ["eu-safety-gate", "uk-opss"], "publishedWithinDays": 30 }
```

| Field                 | Default | Meaning                                                                                   |
| --------------------- | ------- | ----------------------------------------------------------------------------------------- |
| `sources`             | all 5   | `eu-safety-gate`, `uk-opss`, `us-cpsc`, `us-fda`, `canada`                                |
| `publishedWithinDays` | 30      | Only recalls published or updated in the last X days                                      |
| `brands`              | empty   | Watch list: brand names                                                                   |
| `barcodes`            | empty   | Watch list: EAN-8, UPC-A, EAN-13 or GTIN-14 codes                                         |
| `keywords`            | empty   | Watch list: words or phrases                                                              |
| `excludeKeywords`     | empty   | Skip recalls with these words                                                             |
| `productTypes`        | all     | `consumer-products`, `food`, `drugs`, `medical-devices`, `cosmetics`, `vehicles`, `other` |
| `fdaApiKey`           | empty   | Optional free openFDA key (only needed for very frequent runs)                            |
| `maxResults`          | 1000    | Maximum recalls per run                                                                   |
| `onlyNewSinceLastRun` | false   | Only recalls you did not get in an earlier run with the same watch list                   |

### Output example

```json
{
    "source": "eu-safety-gate",
    "jurisdiction": "EU",
    "reference": "SR/02881/26",
    "title": "Motorcycle helmet – Tank (Befast)",
    "productType": "consumer-products",
    "productCategory": "protective equipment",
    "brands": ["Befast"],
    "barcodes": ["8052691172643"],
    "batchNumbers": ["BPEH284UCGRY"],
    "hazard": "In the event of an impact, the helmet could easily become detached and slip off the head of the user, leaving it exposed to injuries.",
    "riskTypes": ["injuries"],
    "measures": ["ban marketing of product (compulsory)"],
    "countryOfOrigin": "People's Republic of China",
    "notifyingCountry": "Italy",
    "publishedAt": "2026-10-08T12:42:01.967Z",
    "url": "https://ec.europa.eu/safety-gate-alerts/screen/webReport/alertDetail/10119244?lang=en",
    "matchedBarcodes": ["8052691172643"]
}
```

Every row has the same fields, whatever the source. Fields a source does not publish are empty (`null` or `[]`). The table view shows the date, region, recall, brands, barcodes, hazard, risk and link. Download as JSON, CSV, Excel or use the API.

### What does each source contain?

| Source         | Products                                        | Barcodes / brands               | Update frequency     |
| -------------- | ----------------------------------------------- | ------------------------------- | -------------------- |
| EU Safety Gate | Non-food consumer products, cosmetics, vehicles | Yes / yes                       | Several times a week |
| UK OPSS        | Consumer products                               | Often / sometimes               | Several times a week |
| US CPSC        | Consumer products                               | Sometimes (UPC) / in the title  | Weekly               |
| US FDA         | Food, drugs, medical devices                    | UPC when on the label / in text | Weekly (Wednesday)   |
| Canada         | Everything incl. food, drugs and vehicles       | No / in the title               | Daily                |

### Pricing

**$3 per 1,000 recalls** (pay per result). You only pay for recalls that are saved, never for the ones filtered out by your watch list. A daily check of a whole catalogue typically costs a few cents per month. Apify's free plan: max 100 recalls per run.

### Tips

- Use **barcodes** for exact matches and **brands** for broad coverage. Many US and Canadian recalls only name the brand in the title, which brand matching also searches.
- US FDA publishes once a week, so a period of at least 7 days makes sense for FDA.
- EU Safety Gate keeps the latest alerts in its public feed (about 1 to 2 months). Run the monitor at least monthly so you don't miss any.
- The run summary (key-value store `SUMMARY`) lists warnings, e.g. when a source was temporarily down.

### Data and legal

All data comes from official, public government sources (European Commission, UK Office for Product Safety and Standards, US CPSC, US FDA via openFDA, Government of Canada open data). The Actor does not collect personal data: contact e-mails and phone numbers in recall texts are removed. Always check the official alert (`url`) before taking action.

# Actor input Schema

## `sources` (type: `array`):

Official recall lists to read. EU Safety Gate (dangerous non-food products in 31 European countries), UK OPSS, US CPSC (consumer products), US FDA (food, drugs, medical devices; updated weekly) and Canada (all recalls incl. food and vehicles).

## `publishedWithinDays` (type: `integer`):

Only recalls published or updated in the last X days. EU Safety Gate keeps the latest alerts online (about 1 to 2 months).

## `brands` (type: `array`):

Only recalls of these brands (whole words, not case-sensitive). Brands, barcodes and keywords work together: a recall is returned if it matches ANY of them. Leave all three empty for all recalls.

## `barcodes` (type: `array`):

Only recalls with one of these barcodes. Paste your whole catalogue (up to 50,000). Leading zeros don't matter: UPC 012345678905 = EAN 0012345678905.

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

Only recalls that contain one of these words or phrases (title, product, description, hazard, brand, model, company). Whole words, not case- or accent-sensitive. Example: "power bank", "baby walker", "listeria".

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

Skip recalls that contain one of these words or phrases.

## `productTypes` (type: `array`):

Only these product types. Leave empty for all.

## `fdaApiKey` (type: `string`):

Optional free key from open.fda.gov. Without a key openFDA allows 1,000 requests per day per IP address, which is enough for normal use.

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

Maximum number of recalls this run saves (and you pay for).

## `onlyNewSinceLastRun` (type: `boolean`):

Remember which recalls you already got and only return new ones. Schedule the Actor daily to get recall alerts for your products.

## Actor input object example

```json
{
  "sources": [
    "eu-safety-gate",
    "uk-opss",
    "us-cpsc",
    "us-fda",
    "canada"
  ],
  "publishedWithinDays": 30,
  "brands": [],
  "barcodes": [],
  "keywords": [],
  "excludeKeywords": [],
  "productTypes": [],
  "maxResults": 1000,
  "onlyNewSinceLastRun": 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("henri_dewitte/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("henri_dewitte/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 henri_dewitte/product-recall-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,henri_dewitte/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/LHG4TpHYYjA4l6r7P/builds/FMwO216sbsbcdhRAU/openapi.json
