# UK Product Recall Matcher: OPSS Alerts vs Your ASINs (`dafei-data/uk-product-recall-matcher`) Actor

Match your ASINs, EAN barcodes, marketplace item IDs, brands and models against official UK OPSS product safety reports and recalls on GOV.UK. Confidence and match reason per hit, English/Chinese output, Excel report, only-new mode. Not legal advice.

- **URL**: https://apify.com/dafei-data/uk-product-recall-matcher.md
- **Developed by:** [dafei-data](https://apify.com/dafei-data) (community)
- **Categories:** E-commerce, Business, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## UK Product Recall Matcher: OPSS Alerts vs Your ASINs

> **Disclaimer / 免责声明:** This Actor is an unofficial tool, not affiliated with or endorsed by OPSS, the Department for Business and Trade or GOV.UK. Results are for information only and are **not legal or compliance advice**; always check the original notice on GOV.UK. 本工具为非官方工具，与英国 OPSS / GOV.UK 无关联、未获其认可；结果仅供参考，**不构成法律或合规意见**，请以 GOV.UK 原文为准。

**Data attribution (OGL v3.0):** Contains public sector information licensed under the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/). Source: Office for Product Safety and Standards (OPSS), [GOV.UK Product safety alerts, reports and recalls](https://www.gov.uk/product-safety-alerts-reports-recalls).
**Translation notice / 译文说明:** Chinese texts (categories, risk levels, measures, key hazard terms, match reasons) are an unofficial, deterministic glossary translation produced by this Actor, not by OPSS. Only the English original is authoritative. 中文为本 Actor 基于固定词表生成的非官方译文，以英文原文为准。

### What it does

Upload your product list (Amazon **ASIN**, **EAN/GTIN barcode**, eBay/AliExpress/Temu/Etsy item numbers, brand, model) and the Actor checks it against official UK product safety reports and recalls published by OPSS on GOV.UK.

| Match | Confidence |
|---|---|
| ASIN identical (case/space-insensitive, whole ID only) | 1.0 |
| EAN/GTIN identical (leading zeros & concatenated codes handled) | 1.0 |
| Marketplace item ID identical | 1.0 |
| Brand + model | 0.85 |
| Model / code (incl. Amazon FNSKU X00…) | 0.6 |
| Brand + similar product words | 0.5 |
| Brand only | 0.4 |
| Similar product words | 0.3 |

Every result has `confidence`, `matchBasis` (English) and `matchBasisZh` (Chinese), the GOV.UK link, product, brand, ASINs, barcodes, models, risk level, hazard (English original + Chinese key terms), measures, origin — and `attribution`, `licenseUrl`, `translationNotice`, `disclaimer` fields.

Leave `products` empty to simply **list notices** (monitor mode).

### Sample output (real run)

![Bilingual sample output: ASIN and EAN matches against GOV.UK OPSS notices](https://api.apify.com/v2/key-value-stores/rZAPAMH2laMhiHfpr/records/uk-recall-sample-output.png)

*Real run on notices published since 2026-10-07 (category Toys). Your product IDs are test inputs.*

### Use cases

#### 1. Amazon UK seller: weekly ASIN self-check

You sell on Amazon.co.uk and want to know whether any of your ASINs appears in a UK OPSS product safety report or recall (some OPSS notices list the ASIN: 5 of the 15 most recent notices with "Amazon" in the title, checked on 2026-10-28).

**Input** (paste into the Input tab, replace the ASINs with yours — the ones below are taken from real notices so the run returns hits):

```json
{
  "days": 20,
  "categories": [
    "toys"
  ],
  "products": [
    {
      "sku": "S1",
      "name": "toy",
      "asin": "B0HBBWM2B8"
    },
    {
      "sku": "S2",
      "asins": [
        "B000000000",
        "B0HJ1GH2H8"
      ]
    },
    {
      "sku": "S3",
      "asin": "B0ZZZZZZZZ"
    },
    {
      "sku": "S4",
      "barcode": "6991200636677"
    },
    {
      "sku": "S5",
      "model": "X002N3A0U1"
    }
  ],
  "minConfidence": 0.6,
  "incremental": true,
  "stateStoreName": "my-amazon-uk-weekly"
}
```

**Output** — excerpt of one dataset item from a real run on 2026-10-28 (same products, `days: 20`, without `incremental`; notices since 2026-10-07: S1, S2, S4 matched with confidence 1.0, S5 matched the Amazon FNSKU as a model with 0.6, S3 had no match):

```json
{
  "type": "match",
  "confidence": 1,
  "confidenceLabelZh": "高",
  "matchBasis": [
    "ASIN B0HBBWM2B8 is identical"
  ],
  "matchBasisZh": [
    "ASIN B0HBBWM2B8 完全一致"
  ],
  "yourProduct": {
    "sku": "S1",
    "name": "toy",
    "brand": null,
    "model": null,
    "asin": "B0HBBWM2B8",
    "barcode": null,
    "barcodeValid": null
  },
  "noticeRef": "2609-0106",
  "url": "https://www.gov.uk/product-safety-alerts-reports-recalls/product-safety-report-toddler-ghost-costume-sold-via-amazon-2609-0106",
  "alertDate": "2026-10-13",
  "alertType": "Product Safety Report",
  "product": "Toddler Ghost Costume sold via Amazon",
  "asins": [
    "B0HBBWM2B8"
  ],
  "category": "Toys",
  "categoryZh": "玩具",
  "riskLevel": "Serious",
  "riskLevelZh": "严重",
  "measures": [
    "Removal of the listing by the online marketplace"
  ],
  "measuresZh": [
    "在线市场下架该商品链接"
  ],
  "attribution": "Contains public sector information licensed under the Open Government Licence v3.0. …"
}
```

Plus `REPORT.xlsx` (bilingual Excel) in the run's key-value store.

**Schedule it:** Save the input as a Task → Console → **Schedules** → *Create* → e.g. `0 9 * * 1` (Mondays 09:00, your timezone) → add the Task. With `incremental: true` each weekly run only looks at notices published since the previous run; add an e-mail or Slack integration on *Run succeeded* to get the result. First run: set `days` to cover the history you want to check (up to 3650).

### Example input

```json
{
  "products": [
    { "sku": "S1", "name": "Magnetic toy", "asin": "B0HBBWM2B8" },
    { "sku": "S2", "asins": ["B000000000", "B0HJ1GH2H8"] },
    { "sku": "S4", "barcode": "6991200636677" }
  ],
  "categories": ["toys"],
  "days": 30,
  "minConfidence": 0.6
}
```

Categories accept slugs (`toys`, `electrical-appliances-equipment`, `cosmetics`…), English names or Chinese names (玩具). Filters: `countriesOfOrigin` (China / 中国), `alertTypes`, `riskLevels`.

### Excel report (bilingual)

Each run saves **REPORT.xlsx** (free) in the run's key-value store: English + Chinese header rows, a clickable GOV.UK link per row, and an **About** sheet with the OGL attribution, licence link, translation notice, disclaimer and privacy note.
Download: Console → run → **Storage → Key-value store → REPORT.xlsx**, or the "Bilingual Excel report" link on the Output tab.

### Subscription: only new notices

1. Set `incremental: true` and a unique `stateStoreName` (e.g. `my-shop-uk`).
2. Create a **Schedule** in Apify Console (e.g. weekly, Monday 09:00) for a saved task with this input.
3. Each run only processes notices not seen before (state is kept in the named key-value store). Add a webhook or Apify integration (email, Slack) to get notified.

### Privacy & data use

- Uses only the public GOV.UK Search and Content APIs (no login, ≤ 2 requests/second, well under the 10 req/s GOV.UK limit; robots.txt does not disallow `/api/`).
- **No seller, retailer, manufacturer, importer, address or contact fields are extracted**; e-mail addresses and phone numbers in free text are replaced with `[email removed]` / `[phone removed]`.
- Attachments (photos/PDFs) are given as **links only** — never downloaded or copied.

### Related

- EU equivalent: [EU Safety Gate Product Matcher](https://apify.com/dafei-data/eu-safety-gate-product-matcher) — match your catalog against EU Safety Gate (RAPEX) alerts.
- Canada equivalent: [Canada Recalls & Safety Alerts Product Matcher](https://apify.com/dafei-data/canada-recalls-product-matcher) — match your products (brand, model, UPC/EAN, ASIN) against Health Canada, CFIA and Transport Canada recalls (Government of Canada open data).
- Developer news: [Hacker News Monitor: Keywords, Domains, Show HN + Chinese](https://apify.com/dafei-data/hacker-news-monitor-chinese) — only-new Hacker News alerts for your keywords, domains and Show HN launches, with Chinese machine-translated titles and a bilingual Excel report.

# Actor input Schema

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

Your catalog. Each item may have: sku, name, brand, model, asin, asins (array), barcode (EAN/GTIN), barcodes, marketplaceId (eBay/AliExpress/Temu/Etsy… item number), keywords. Leave empty to list notices (monitor mode).

## `categories` (type: `array`):

OPSS product categories (slug, English or Chinese), e.g. toys / Toys / 玩具, electrical-appliances-equipment, cosmetics. Empty = all categories.

## `days` (type: `integer`):

Notices published in the last N days.

## `countriesOfOrigin` (type: `array`):

Optional. Substring of the English name (e.g. China) or Chinese name (中国).

## `alertTypes` (type: `array`):

Optional: Product Recall, Product Safety Report, Product Safety Alert.

## `riskLevels` (type: `array`):

Optional: Serious, High, Medium, Low, Not provided.

## `minConfidence` (type: `number`):

1.0 ASIN / barcode / marketplace ID identical; 0.85 brand+model; 0.6 model; 0.5 brand+similar; 0.4 brand; 0.3 similar product words.

## `incremental` (type: `boolean`):

Remember processed notices in a named key-value store; later runs only look at new notices.

## `stateStoreName` (type: `string`):

One name per subscription.

## `excelReport` (type: `boolean`):

Save REPORT.xlsx (English + Chinese headers, About sheet with OGL attribution, licence link and translation notice). Free.

## `maxNotices` (type: `integer`):

Upper bound of notices fetched per run (each costs one GOV.UK API request, rate-limited to 2/s).

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

Maximum dataset items.

## Actor input object example

```json
{
  "products": [
    {
      "sku": "DEMO-1",
      "name": "Magnetic educational toy",
      "asin": "B08XVR3VJ7"
    },
    {
      "sku": "DEMO-2",
      "name": "Hair dryer",
      "brand": "MyBrand",
      "model": "HD-200",
      "barcode": "5012345678900"
    }
  ],
  "days": 30,
  "minConfidence": 0.3,
  "incremental": false,
  "stateStoreName": "uk-recall-seen",
  "excelReport": true,
  "maxNotices": 500,
  "maxItems": 1000
}
```

# Actor output Schema

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

No description

## `overview` (type: `string`):

No description

## `report` (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 = {
    "products": [
        {
            "sku": "DEMO-1",
            "name": "Magnetic educational toy",
            "asin": "B08XVR3VJ7"
        },
        {
            "sku": "DEMO-2",
            "name": "Hair dryer",
            "brand": "MyBrand",
            "model": "HD-200",
            "barcode": "5012345678900"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("dafei-data/uk-product-recall-matcher").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": [
        {
            "sku": "DEMO-1",
            "name": "Magnetic educational toy",
            "asin": "B08XVR3VJ7",
        },
        {
            "sku": "DEMO-2",
            "name": "Hair dryer",
            "brand": "MyBrand",
            "model": "HD-200",
            "barcode": "5012345678900",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("dafei-data/uk-product-recall-matcher").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": [
    {
      "sku": "DEMO-1",
      "name": "Magnetic educational toy",
      "asin": "B08XVR3VJ7"
    },
    {
      "sku": "DEMO-2",
      "name": "Hair dryer",
      "brand": "MyBrand",
      "model": "HD-200",
      "barcode": "5012345678900"
    }
  ]
}' |
apify call dafei-data/uk-product-recall-matcher --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dafei-data/uk-product-recall-matcher"
        }
    }
}
```

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/DguaMnqFg0hnswgGV/builds/tFuyU9LgIlBSyXW3D/openapi.json
