# UK Product Recalls Scraper: OPSS, FSA & MHRA Safety Alerts (`seaf999ield/uk-product-safety-recalls`) Actor

UK product recalls API: OPSS product recalls, FSA food and allergy alerts and MHRA drug and device alerts in one feed, with new-alert monitoring, by RawTrader | UK Industry & Bills: https://ukindustryandbills.substack.com · X: x.com/ImRawTrader

- **URL**: https://apify.com/seaf999ield/uk-product-safety-recalls.md
- **Developed by:** [RustonRoad](https://apify.com/seaf999ield) (community)
- **Categories:** E-commerce, Business, News
- **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 Recalls Scraper: OPSS, FSA & MHRA Safety Alerts

**Every UK product recall and safety alert (OPSS, FSA, MHRA) in one feed, with new-alert monitoring.**

### Who it's for

- Retailers and marketplace sellers checking products they stock
- Compliance and quality teams in consumer goods, food and pharma
- Journalists and consumer sites covering recalls

### Sample output

| source | date | product | hazard | riskLevel |
|---|---|---|---|---|
| opss | 2026-10-16 | Soft Plastic Alien Mask | asphyxiation | serious |
| opss | 2026-10-13 | Toddler Ghost Costume | strangulation and asphyxiation | serious |
| opss | 2026-10-13 | Baby Electric Soothing Palm Sleep Pillow | asphyxiation | serious |

*Real rows from a test run (shortened; the full output has more fields).*

### Price per 1,000 results

Main event: **`alert-row` at $0.002 each**, so **1,000 results = $2.00**. Other events: `new-alert` $0.008 each (only charged when that row type is output). See the Pricing tab for the current prices.

### Input example

```json
{
  "mode": "search",
  "daysBack": 30,
  "maxResults": 30
}
```

**Every UK product recall and safety alert in one feed.** It combines **OPSS product recalls and product safety reports** (toys, baby products, cosmetics, electricals, e-scooters, chargers), **FSA food and allergy alerts**, and **MHRA medicine recalls and medical device alerts**. All are in one format: source, title, date, category, brand, product, seller, hazard, risk level and URL. Filter by source, category, risk and keyword, or run **new_alerts** on a schedule to get only the alerts published since your last run. Official GOV.UK and FSA open data, no key.

| Mode | What you get |
|---|---|
| 🔎 **search** | All alerts since a date, filtered |
| 🔔 **new_alerts** | Only alerts not seen in previous runs. A daily recall alert for your products, brands or categories |

**Free weekly newsletter**, UK Industry & Bills: https://ukindustryandbills.substack.com

### What you get

- One clean row per alert from **OPSS** (product recalls and safety reports), **FSA** (food and allergy alerts) and **MHRA** (medicine recalls and device alerts)
- Source, alert ID, title, date, category, brand, product, seller, hazard, risk level and the official GOV.UK / FSA link
- Allergens on FSA alerts and the recall class on MHRA medicine recalls
- A **new_alerts** monitor mode that returns only alerts published since your last run
- Export to CSV, Excel or JSON, or push to Slack, Sheets, Make or Zapier

### Who uses it

- **Online sellers and marketplaces (Amazon, eBay, Etsy, TikTok Shop):** check your listings against new recalls and OPSS marketplace reports.
- **Retailers, importers and brand owners:** monitor your category and your competitors.
- **Compliance, QA and insurance teams:** a product-liability and recall-risk feed.
- **Parents' sites, consumer journalists and allergy groups:** toy, baby and allergen alerts.
- **Pharmacies and clinics:** MHRA medicine recalls and device safety notices.

### Input

| Field | Example | Notes |
|---|---|---|
| Mode | `search` | or `new_alerts` |
| Sources | `["opss","fsa","mhra"]` | |
| Categories | `["toys","baby","cosmetics","electrical","food","supplements"]` | Also sports, household, tools_machinery, clothing, ppe, vehicles, chemicals, medicines, medical_devices |
| Keyword | `lithium` | Brand, product or hazard |
| Risk levels | `["serious","high"]` | |
| Days back / From date | `30` | |
| Max results | `30` | |

#### Example output (real sample)

| source | date | category | product | hazard | riskLevel |
|---|---|---|---|---|---|
| opss | 2026-10-16 | toys | Soft Plastic Alien Mask | asphyxiation | serious |
| opss | 2026-10-13 | toys | Toddler Ghost Costume | strangulation and asphyxiation | serious |
| opss | 2026-10-13 | baby | Baby Electric Soothing Palm Sleep Pillow | asphyxiation | serious |

### Output

```json
{
  "source": "opss",
  "alertType": "product-safety-report",
  "alertId": "2610-0040",
  "title": "Product Safety Report: Soft Plastic Alien Mask sold via Amazon (2610-0040)",
  "date": "2026-10-16",
  "category": "toys",
  "product": "Soft Plastic Alien Mask",
  "seller": "Amazon",
  "hazard": "asphyxiation",
  "riskLevel": "serious",
  "url": "https://www.gov.uk/product-safety-alerts-reports-recalls/product-safety-report-soft-plastic-alien-mask-sold-via-amazon-2610-0040"
}
```

FSA alerts add `brand` (the reporting business) and `allergens`. MHRA medicine recalls add the recall class as `riskLevel` (class-1 to class-4).

### Pricing (pay per event)

**In plain words:** **$2 per 1,000 alerts** in search mode, and **$8 per 1,000 new alerts** in monitor mode. A daily monitor usually finds a handful of new alerts, so it costs cents a day.

| Event | Price |
|---|---|
| `alert-row`: each alert in search mode | $0.002 |
| `new-alert`: each new alert in new_alerts mode | $0.008 |

### FAQ

**Which sources are covered?** OPSS product safety alerts, reports and recalls (GOV.UK), FSA food and allergy alerts, and MHRA drug and medical device alerts.

**How fresh is it?** Each run reads the live official feeds, so new alerts appear as soon as the regulator publishes them. Schedule **new_alerts** daily or hourly.

**Can I monitor only my brands or categories?** Yes. Combine `keyword`, `categories` and `sources` with the new_alerts mode and a schedule.

**Why is my first new_alerts run empty or small?** The first run saves a baseline. From the next run you only get new alerts.

**Is it legal to use?** Yes. All the data is official public-sector information published under the Open Government Licence v3.0.

*Contains public sector information from OPSS, the Food Standards Agency and the MHRA, licensed under the Open Government Licence v3.0.*

### Related UK data actors

- [UK Food Hygiene Ratings Scraper: FSA & New Restaurant Leads](https://apify.com/seaf999ield/uk-food-hygiene-ratings)
- [Amazon UK Bestsellers Scraper: Movers & New Releases](https://apify.com/seaf999ield/amazon-uk-bestsellers)
- [eBay UK Scraper: Live Listings & Price Comps (GBP)](https://apify.com/seaf999ield/ebay-uk-listings-prices)

### About RawTrader | UK Industry & Bills

RawTrader | UK Industry & Bills is a UK newsletter and open data project tracking energy bills, fuel prices, public tenders, company closures and FCA short positions, using official data from Ofgem, DESNZ, ONS, Companies House, Find a Tender and the FCA.

- [RawTrader Data: every UK data tool in one place](https://imrawtrader.beehiiv.com/p/data)
- [UK Industry & Bills newsletter](https://imrawtrader.beehiiv.com)
- [Follow @ImRawTrader on X](https://x.com/ImRawTrader)

# Actor input Schema

## `mode` (type: `string`):

new_alerts keeps seen alert IDs in a named key-value store per monitor; the first run saves a baseline.

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

Leave all for a unified feed.

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

Leave empty for all. food/supplements = FSA; medicines/medical_devices = MHRA; the rest = OPSS product categories.

## `keyword` (type: `string`):

e.g. a brand, product or hazard ('lithium', 'Amazon', 'peanut').

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

e.g. serious, high, medium, low (OPSS); allergy, recall, high (FSA); class-1 ... class-4 (MHRA medicines recalls).

## `daysBack` (type: `integer`):

Used when From date is empty.

## `fromDate` (type: `string`):

First alert date.

## `monitorName` (type: `string`):

new_alerts: separate saved state per name.

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

Maximum alerts per run. 0 = no limit.

## Actor input object example

```json
{
  "mode": "search",
  "sources": [
    "opss",
    "fsa",
    "mhra"
  ],
  "daysBack": 30,
  "monitorName": "default",
  "maxResults": 30
}
```

# Actor output Schema

## `alerts` (type: `string`):

Unified alerts.

## `runSummary` (type: `string`):

Counts by source.

# 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 = {
    "mode": "search",
    "daysBack": 30,
    "maxResults": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("seaf999ield/uk-product-safety-recalls").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 = {
    "mode": "search",
    "daysBack": 30,
    "maxResults": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("seaf999ield/uk-product-safety-recalls").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 '{
  "mode": "search",
  "daysBack": 30,
  "maxResults": 30
}' |
apify call seaf999ield/uk-product-safety-recalls --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,seaf999ield/uk-product-safety-recalls"
        }
    }
}
```

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/hX86SwYCCGuW97yM5/builds/IygjjKckgM5Exzao1/openapi.json
