# EU RECALL MATCH MONITOR — is anything you sell recalled? (`egeusta/eu-recall-monitor`) Actor

Screen your catalog against recent EU Safety Gate alerts by GTIN, brand, model, and product name. Every candidate includes a confidence level, matching evidence, and the official alert URL for human verification.

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

## Pricing

from $0.50 / 1,000 product checkeds

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

Screen your product catalog against recent EU Safety Gate alerts and receive evidence-backed candidates for human review. The Actor compares GTINs, brands, models, and product names, labels every match with a confidence level, and links directly to the official alert.

Built for marketplaces, retailers, importers, distributors, product-safety teams, insurers, and compliance operations that need repeatable recall monitoring without manually searching weekly publications.

### What it does

- Reads recent non-food product alerts from the EU Safety Gate dataset.
- Accepts pasted catalog products or a public Google Merchant product feed.
- Matches exact GTINs, brand plus model, or broader brand plus product-name evidence.
- Keeps match confidence and matching evidence visible in every row.
- Links every candidate to the official Safety Gate alert for verification.
- Produces a run summary with products checked, alerts read, matches by confidence, and products lacking usable identifiers.
- Charges per product screened, never per match found.

### Quick start

Provide catalog records with as many identifiers as possible.

```json
{
  "products": [
    {
      "id": "SKU-1",
      "brand": "Scheppach",
      "model": "HM90SL",
      "name": "Sliding compound mitre saw"
    }
  ],
  "weeksBack": 4,
  "minConfidence": "probable",
  "maxProducts": 5000
}
```

Add a GTIN whenever available. An exact GTIN creates the strongest candidate and avoids the ambiguity of free-text model and product names.

### Match confidence

| Confidence | Rule | Recommended use |
|---|---|---|
| **certain** | Exact normalized GTIN match | Highest-priority review |
| **probable** | Brand and model both match | Review against the official alert |
| **possible** | Brand matches and product names strongly overlap | Broad monitoring and manual triage |

A brand alone is never considered a match. The Actor does not choose a business action, remove a listing, or claim legal certainty. Even exact identifier matches should be verified against the official alert, the physical product, supplier records, and your internal procedures.

### Input

| Field | Description |
|---|---|
| **products** | Catalog objects containing id, brand, name, model, and GTIN where available. |
| **feedUrl** | Public Google Merchant feed URL used when products is empty. |
| **weeksBack** | Number of weeks of Safety Gate alerts to read. Default: 4. |
| **minConfidence** | Lowest confidence included: certain, probable, or possible. |
| **maxProducts** | Maximum catalog products screened in the run. |

A product with neither a GTIN nor a brand cannot be matched. The Actor counts such products in **productsWithoutIdentifiers** rather than presenting them as cleared.

### Output

The dataset contains two row types:

- **match** — a free candidate containing your product identifiers, confidence, matching evidence, official alert number, date, risk information, notifying country, and source URL.
- **summary** — a free run-level record with products checked, alerts read, the date window, match counts, and unmatchable-product count.

Matches are intentionally free. Billing per match would create the wrong incentive for a safety-monitoring product; the billable unit is the catalog product that was screened.

Use the dataset view selector to switch between **Matches** and **Run summary**, then export JSON, CSV, Excel, XML, or HTML.

### Pricing

This Actor uses pay-per-event pricing with platform usage included:

- **$0.01 per run start** at the default 512 MB memory.
- **$0.0005 per product checked** — $0.50 per 1,000 catalog products.
- **Matches, summaries, unmatchable products, and filtered alerts are free.**

Example totals at default memory: 100 products cost about $0.06, 1,000 cost $0.51, and 10,000 cost $5.01. Users can set a maximum charge per run; the Actor honors that limit and stops early.

### Data source and reliability

Safety Gate is the European Union rapid alert system for dangerous non-food products. The Actor reads a published data feed and attaches the official alert page to each candidate. If the feed stops answering partway through, the run log states how many alerts were actually read instead of silently presenting a partial window as complete.

The alert window is capped at 6,000 records per run. Use a narrower **weeksBack** value for routine schedules and a wider one for occasional historical checks.

### Important limitations

This Actor is an automated screening and decision-support tool. False positives and false negatives are possible. It is not legal, regulatory, product-safety, medical, or compliance advice, and it does not certify that a catalog is recall-free. Safety Gate does not cover food, medicines, or medical devices. Public records may be incomplete, revised, or delayed.

Always verify candidates on the official alert page and follow qualified legal, regulatory, and product-safety guidance before taking action. Use the data responsibly and comply with applicable laws, contracts, and source terms.

### Automation

Schedule weekly or daily runs in Apify Console, trigger the Actor by API, or connect results to Slack, email, Google Sheets, Make, Zapier, webhooks, or an internal case-management system. Store the alert number and product ID to deduplicate repeated candidates across runs.

### FAQ

#### Why did a product produce no match?

No relevant alert may exist in the selected window, the product may lack identifiers, or the source text may not align strongly enough with your selected confidence level. A missing match is not proof that the product is safe or recall-free.

#### Why are match rows free?

You pay for each product screened. Matches and summaries are free so pricing cannot reward or discourage a positive result.

#### Where can I get help?

Open the Actor's Issues tab with the run ID, alert number, confidence level, and a redacted example product. Do not include private feeds, credentials, or personal data.

# Actor input Schema

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

Catalog products to screen. Add id, brand, name, model, and GTIN where available. GTIN supports the strongest match; brand plus model supports a probable match.

## `feedUrl` (type: `string`):

Public Google Merchant product feed URL. Used only when Your products is empty.

## `weeksBack` (type: `integer`):

How far back to read EU Safety Gate alerts. Four weeks covers roughly the last month; increase it for a first full catalog review.

## `minConfidence` (type: `string`):

Certain reports GTIN matches only. Probable also includes brand-and-model matches. Possible adds broader brand-and-name overlap for manual review.

## `maxProducts` (type: `integer`):

Hard cap on catalog products screened in this run.

## Actor input object example

```json
{
  "products": [
    {
      "id": "SKU-1",
      "brand": "Scheppach",
      "model": "HM90SL",
      "name": "Sliding compound mitre saw"
    }
  ],
  "weeksBack": 4,
  "minConfidence": "probable",
  "maxProducts": 5000
}
```

# Actor output Schema

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

The default dataset contains free match rows and a summary. Use the dataset view selector to switch between Matches and Run summary.

# 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 = {
    "products": [
        {
            "id": "SKU-1",
            "brand": "Scheppach",
            "model": "HM90SL",
            "name": "Sliding compound mitre saw"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("egeusta/eu-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 = { "products": [{
            "id": "SKU-1",
            "brand": "Scheppach",
            "model": "HM90SL",
            "name": "Sliding compound mitre saw",
        }] }

# Run the Actor and wait for it to finish
run = client.actor("egeusta/eu-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 '{
  "products": [
    {
      "id": "SKU-1",
      "brand": "Scheppach",
      "model": "HM90SL",
      "name": "Sliding compound mitre saw"
    }
  ]
}' |
apify call egeusta/eu-recall-monitor --silent --output-dataset

```

## MCP server setup

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