# Safety Gate Scraper — EU Product Safety Alerts (RAPEX) (`studio-amba/safetygate-scraper`) Actor

Scrape product safety alerts, recalls, and risk assessments from EU Safety Gate (formerly RAPEX) at ec.europa.eu/safety-gate.

- **URL**: https://apify.com/studio-amba/safetygate-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Other
- **Features:** Limited permissions
- **Stats:** 8 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $12.00 / 1,000 result scrapeds

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

## Safety Gate Scraper — Extract EU Product Safety Alerts and RAPEX Recalls

Scrape product recall notifications, safety alerts, and risk assessments from the EU Safety Gate system (formerly RAPEX) at ec.europa.eu/safety-gate-alerts. Monitor dangerous products entering the European market in real time.

### What is Safety Gate Scraper?

The EU Safety Gate (formerly known as RAPEX) is the European rapid alert system for dangerous non-food consumer products. When a product is found to pose a serious risk to consumer health or safety anywhere in the EU, national authorities file an alert here. The database covers everything from electrical appliances and toys to cosmetics and motor vehicles.

Safety Gate Scraper extracts these alerts into structured data, so you do not have to manually browse through hundreds of weekly notifications:

- **Product safety managers** monitor alerts for their product categories to catch emerging risks and competitor recalls early
- **Import/export compliance teams** screen products from specific countries of origin before they clear customs
- **Consumer rights organizations** track recall patterns across brands and product types to inform advocacy campaigns
- **Market surveillance authorities** aggregate alert data for trend analysis and risk prioritization across EU member states
- **Quality assurance engineers** build early-warning dashboards that flag when similar products in their portfolio face safety actions

### What data does Safety Gate Scraper extract?

Each alert record includes:

- 🚨 **title** — Product description from the alert (e.g., "Laser pointer", "Children's costume")
- 🔢 **alertNumber** — Unique Safety Gate reference number (e.g., "A12/01234/26")
- 📦 **category** — Product category (e.g., "Toys", "Electrical appliances", "Cosmetics")
- ⚠️ **riskLevel** — Severity classification ("Serious", "Other")
- 🌍 **notifyingCountry** — EU member state that reported the alert
- 📅 **date** — Date the alert was published
- 🏷️ **brand** — Brand or manufacturer name
- 🛒 **productType** — Specific product type description
- 🗺️ **countryOfOrigin** — Where the product was manufactured
- 🔧 **measures** — Actions taken (withdrawal, recall, import rejection, ban, etc.)
- 📝 **description** — Detailed description of the risk and non-compliance
- 🖼️ **imageUrl** — Product photo URL from the alert
- 🔗 **url** — Direct link to the full alert on Safety Gate
- 🕐 **scrapedAt** — ISO timestamp of extraction

### How to scrape Safety Gate

Configure your scrape with these input parameters:

| Parameter | Type | Description |
|-----------|------|-------------|
| **Start URLs** | Array | Specific Safety Gate pages to scrape. Defaults to the main alert listing. |
| **Search Query** | String | Search by product keyword. Examples: `toy`, `charger`, `cosmetics`, `bicycle`. |
| **Max Results** | Integer | Maximum alerts to return (1-10,000). Default: 100. |
| **Proxy Configuration** | Object | Proxy settings for improved reliability. |

#### Tips for best results

- **Search by product type** — enter `toy` to find all toy-related safety alerts across the EU
- **Use specific terms** for targeted monitoring — `lithium battery` narrows results more than just `battery`
- **Leave Search Query empty** to get the latest alerts across all categories
- **Start with 50-100 results** to preview data format before scaling up
- **Schedule weekly runs** to maintain a continuously updated product safety database

### Output

Each alert is returned as a JSON object. Here is a realistic example:

```json
[
  {
    "title": "Wireless Bluetooth earphones",
    "alertNumber": "A12/00487/26",
    "category": "Electrical appliances and equipment",
    "riskLevel": "Serious",
    "notifyingCountry": "Germany",
    "date": "2026-03-28",
    "brand": "Unknown",
    "productType": "Portable electronics",
    "countryOfOrigin": "China",
    "measures": "Withdrawal of the product from the market, Recall of the product from end users",
    "description": "The lithium battery of the earphones may overheat during charging. This poses a risk of burns and fire. The product does not comply with the requirements of the Radio Equipment Directive and the relevant European standard EN 62133.",
    "imageUrl": "https://ec.europa.eu/safety-gate-alerts/api/alerts/A12/00487/26/photo",
    "url": "https://ec.europa.eu/safety-gate-alerts/screen/webReport/alertDetail/A12/00487/26",
    "scrapedAt": "2026-04-03T09:22:10.000Z"
  },
  {
    "title": "Children's magnetic building set",
    "alertNumber": "A12/00512/26",
    "category": "Toys",
    "riskLevel": "Serious",
    "notifyingCountry": "France",
    "date": "2026-03-27",
    "brand": "MagicBlocks",
    "productType": "Construction toy",
    "countryOfOrigin": "China",
    "measures": "Import rejected at border",
    "description": "Small magnets can easily detach from the toy. If a child swallows more than one magnet, they could attract each other through intestinal walls, causing intestinal blockage or perforation. The product does not comply with the requirements of the Toy Safety Directive and EN 71-1.",
    "url": "https://ec.europa.eu/safety-gate-alerts/screen/webReport/alertDetail/A12/00512/26",
    "scrapedAt": "2026-04-03T09:22:12.000Z"
  },
  {
    "title": "Skin lightening cream",
    "alertNumber": "A11/00398/26",
    "category": "Cosmetics",
    "riskLevel": "Serious",
    "notifyingCountry": "Belgium",
    "date": "2026-03-25",
    "brand": "GlowPure",
    "countryOfOrigin": "Cote d'Ivoire",
    "measures": "Withdrawal of the product from the market",
    "description": "The product contains hydroquinone (measured value: 4.2%). Hydroquinone is banned in cosmetic products in the EU. The product poses a chemical risk.",
    "url": "https://ec.europa.eu/safety-gate-alerts/screen/webReport/alertDetail/A11/00398/26",
    "scrapedAt": "2026-04-03T09:22:14.000Z"
  }
]
```

Results can be downloaded as JSON, CSV, Excel, XML, or accessed via the Apify API.

### How much does it cost?

Safety Gate Scraper charges $0.04 per run (start fee, based on its 4 GB memory allocation) plus $0.012 per result. 200 alerts costs about $2.44; 1,000 about $12.04; 5,000 about $60.04. A run's usage cost only settles after it reports SUCCEEDED.

### Can I integrate?

Yes. Route Safety Gate alerts directly to your existing tools:

- **Google Sheets** — Automatically populate a shared recall tracking spreadsheet for your product safety team
- **Slack** — Instant notifications when new alerts appear in your monitored product categories
- **Zapier** — Trigger workflows that cross-reference new alerts against your product inventory
- **Make (Integromat)** — Build multi-step pipelines that sort alerts by risk level and route to appropriate teams
- **Webhooks** — Push every new alert to your internal compliance system in real time

Set up integrations from the Apify console under the "Integrations" tab.

### Can I use it as an API?

Yes. Call Safety Gate Scraper programmatically from any language:

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("studio-amba/safetygate-scraper").call(run_input={
    "searchQuery": "toy",
    "maxResults": 100,
})

for alert in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{alert['alertNumber']} | {alert['riskLevel']} | {alert['title']} | Origin: {alert.get('countryOfOrigin', 'N/A')}")
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const run = await client.actor('studio-amba/safetygate-scraper').call({
    searchQuery: 'toy',
    maxResults: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach(a => console.log(`${a.alertNumber} | ${a.riskLevel} | ${a.title}`));
```

### FAQ

#### What is EU Safety Gate (RAPEX)?

Safety Gate is the European Union's rapid alert system for dangerous non-food consumer products. It was previously known as RAPEX (Rapid Exchange of Information System). When a product is found to be dangerous in any EU/EEA country, the national authority notifies the European Commission through Safety Gate, and the alert is published publicly. The system has been operational since 2004 and processes thousands of alerts annually.

#### How does Safety Gate Scraper work?

The scraper accesses Safety Gate's web interface and internal API at ec.europa.eu/safety-gate-alerts. It retrieves alert listings, navigates pagination, and extracts structured fields from each alert record including product details, risk assessments, notifying country, and enforcement measures taken.

#### Is it legal to scrape Safety Gate?

Safety Gate is a public transparency tool operated by the European Commission specifically to inform consumers and businesses about dangerous products. All alert data is published openly without authentication requirements. The scraper accesses only this publicly available data.

#### How to get EU product recall data?

Enter a product keyword in the **Search Query** field (e.g., "electric scooter"), set your desired **Max Results**, and run the scraper. Results include the alert reference number, risk level, product details, country of origin, and what enforcement measures were taken. For all recent alerts, leave Search Query empty.

#### Is this a Safety Gate API alternative?

Yes. While Safety Gate has a limited internal API, it is not officially documented or supported for external use. This scraper provides reliable, structured access to the same data with output available in JSON, CSV, Excel, and via the Apify API with full pagination support.

#### What is the difference between Safety Gate and RASFF?

Safety Gate (RAPEX) covers dangerous **non-food** consumer products — toys, electronics, cosmetics, clothing, vehicles, etc. RASFF (Rapid Alert System for Food and Feed) covers **food and feed** safety. They are separate systems. For food safety data, see our EFSA Scraper.

### Limitations

- Safety Gate primarily covers non-food consumer products; food safety alerts are published through RASFF instead
- Historical alerts going back many years are available, but very large scrapes (5,000+) may take over an hour
- Image URLs are provided when available but not all alerts include product photos
- Some older alerts may have incomplete structured data for fields like brand or country of origin
- The scraper does not download attached documents or test reports referenced in alerts

### Other regulatory data scrapers

Building a comprehensive product compliance system? These scrapers cover related regulatory databases:

- **[ECHA Scraper](https://apify.com/studio-amba/echa-scraper)** — EU chemicals database: REACH registrations, CAS numbers, hazard classifications
- **[Staatsblad Scraper](https://apify.com/studio-amba/staatsblad-scraper)** — Belgian Official Gazette: laws, decrees, and official government publications
- **[EFSA Scraper](https://apify.com/studio-amba/efsa-scraper)** — EU food safety: scientific opinions, risk assessments, and food alerts
- **[EUR-Lex Scraper](https://apify.com/studio-amba/eurlex-scraper)** — EU legislation: regulations, directives, and legal acts

### Your feedback

Spotted an issue or need a new feature? Open an issue on the [Issues tab](https://console.apify.com/actors/studio-amba~safetygate-scraper/issues). We actively maintain this scraper and appreciate every report.

# Actor input Schema

## `startUrls` (type: `array`):

Safety Gate pages to scrape. Example: https://ec.europa.eu/safety-gate-alerts/screen/webReport

## `searchQuery` (type: `string`):

Search for product alerts by keyword (e.g., 'toy', 'charger', 'cosmetics').

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

Maximum number of alerts to return.

## `proxyConfiguration` (type: `object`):

Proxy settings for reliability.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://ec.europa.eu/safety-gate-alerts/screen/webReport"
    }
  ],
  "maxResults": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BE"
  }
}
```

# Actor output Schema

## `results` (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 = {
    "startUrls": [
        {
            "url": "https://ec.europa.eu/safety-gate-alerts/screen/webReport"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "BE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/safetygate-scraper").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 = {
    "startUrls": [{ "url": "https://ec.europa.eu/safety-gate-alerts/screen/webReport" }],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "BE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/safetygate-scraper").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 '{
  "startUrls": [
    {
      "url": "https://ec.europa.eu/safety-gate-alerts/screen/webReport"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BE"
  }
}' |
apify call studio-amba/safetygate-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/safetygate-scraper"
        }
    }
}
```

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/GUIahGt2O5XEj6EBS/builds/WYnAqFu0Zm4IxF04Z/openapi.json
