EU Safety Gate Scraper (RAPEX Dangerous Product Alerts JS...
Pricing
from $2.40 / 1,000 alert delivereds
EU Safety Gate Scraper (RAPEX Dangerous Product Alerts JS...
Official EU Safety Gate (RAPEX) weekly reports as JSON: one item per dangerous non-food alert - caseNumber, category, product, riskType, danger, measures, country, report week. Filters: weeksBack, since, categories. Dedup is within-run only: overlapping reports can re-deliver alerts, each charged.
Pricing
from $2.40 / 1,000 alert delivereds
Rating
0.0
(0)
Developer
Steadfetch
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
14 days ago
Last modified
Categories
Features
Share
Extract official EU Safety Gate (RAPEX) alerts for dangerous consumer products as validated JSON. Get new alerts for product categories from the official European Commission XML API, with deduplicated, per-user delivery.
Tested daily. Last verified: 2026-10-30
What it does
- Downloads the newest
weeksBackweekly reports fromhttps://ec.europa.eu/safety-gate-alerts/api/download/weeklyReport/list/xml/en(1-52 weeks; each report is roughly 90 alerts) and maps every alert to a stable JSON item. - Optionally filters by report publication date (
since) and by case-insensitive productcategories; an empty list means every category. Caps output withmaxResults. - Deduplicates within the run by
caseNumber+reference, then across runs per Apify user: the Actor remembers the alerts it pushed to your account (for the samecategoriesfilter) in a named key-value store and never re-delivers or re-charges them. There is no backfill switch; every charged alert is new for your account. - Validates every item against the published dataset schema before saving; a schema violation fails the run instead of delivering partial data.
- Uses only the public XML API with an honest User-Agent and requests spaced at least 2 seconds apart: no browser, no login, no CAPTCHA, no proxy.
- Reads no person names and emits no contact fields; alerts describe products, risks, countries and authorities only (GDPR).
The XML distribution is catalogued on data.europa.eu as Safety Gate (the EU rapid alert system - non-food) under CC0 1.0 Universal with access right PUBLIC. Source attribution: European Commission, Safety Gate. The robots.txt of ec.europa.eu does not disallow /safety-gate-alerts/.
How to use
-
Install the Apify CLI (
npm add -g apify-cli) and log in. -
Run the Store test input (latest weekly report, small cap):
$apify call steadfetch/eu-safety-gate-monitor --input='{"weeksBack":1,"maxResults":10}' -
Raise
weeksBack(max 52) andmaxResultson the first run to seed history; scheduled runs can keepweeksBackat 1 or 2 so you only pay for new alerts. -
Narrow the feed with
categories(for example["Jewellery","Toys"]); monitor state is scoped per user and percategoriesfilter, so switching filters may re-deliver alerts you have already seen under a different one.
Input
Input fields
| Field | Type | Required | Default/Prefill | Description | Example |
|---|---|---|---|---|---|
weeksBack | integer | No | default 4, min 1, max 52 | Number of weekly reports to download from the official list, newest first. Each report is roughly 90 alerts. | 1 |
since | string | No | none | Optional earliest report publication date (YYYY-MM-DD, inclusive); earlier reports are not downloaded. | 2026-10-01 |
categories | array of string | No | none (empty means every category) | Case-insensitive product category filter, for example ["Jewellery","Toys"]. | ["Jewellery"] |
maxResults | integer | No | default 100, min 1, max 5000 | Maximum alerts saved to the dataset; duplicates and filtered alerts do not count. | 10 |
No input field is required; running with an empty input uses weeksBack=4 and delivers up to 1,000 new alerts.
Example input
The Store test input:
{"weeksBack":1,"maxResults":10}
A wider example combining categories with a bounded date window:
{"weeksBack":4,"since":"2026-10-01","categories":["Jewellery","Toys"],"maxResults":50}
Output
Example output
{"caseNumber": "SR/02869/26","reference": "https://ec.europa.eu/safety-gate-alerts/screen/webReport/alertDetail/10097467","category": "Jewellery","product": "Necklace","name": "Squid game necklace","type_numberOfModel": "RM-JL-6641","riskType": "Chemical","danger": "The product has an excessive concentration of cadmium (measured value: 6.4% by weight).","measures": "Type of economic operator taking notified measure(s): DistributorCategory of measure(s): Withdrawal of the product from the marketDate of entry into force: 14/11/2025","description": "Necklace with a cross-shaped pendant featuring a hidden compartment.","notifyingCountry": "Sweden","countryOfOrigin": "Unknown","type": "Consumer","level": "Serious risk","onlineTrader": "Other(Fyndiq.se) / ","pictures": ["https://ec.europa.eu/safety-gate-alerts/public/api/notification/image/11238213"],"report": {"reference": "Report-2026-41", "publicationDate": "2026-10-16", "week": 41, "year": 2026},"source_url": "https://ec.europa.eu/safety-gate-alerts/api/download/weeklyReport/detail/xml/10000327?language=en","url": "https://ec.europa.eu/safety-gate-alerts/screen/webReport/alertDetail/10097467","title": "SR/02869/26 \u00b7 Jewellery \u00b7 Squid game necklace","scrapedAt": "2026-10-20T16:05:00.000Z"}
url, title and scrapedAt are the Steadfetch envelope; url mirrors reference. The record omits the null-able fields the source publishes as xsi:nil (brand, barcode, batchNumber, urlrecall, companyRecallCode, productionDates); those come back as null and the Actor never invents values.
Output fields
| Field | Type | Description |
|---|---|---|
caseNumber | string | Official Safety Gate alert case number. |
reference | string (uri) | Public Safety Gate detail page for the alert. |
category | string | Product category. |
product | string | Product type. |
name | string or null | Commercial product name; null when the source has none. |
brand | string or null | Brand; null when the source has none. |
type_numberOfModel | string or null | Type or model number; null when absent. |
barcode | string or null | Barcode; null when absent. |
batchNumber | string or null | Batch number; null when absent. |
riskType | string | Risk category (chemical, choking, electric shock, and so on). |
danger | string | Risk description as published by the notifying authority. |
measures | string | Measures taken, as published by the source. |
description | string | Product description as published by the source. |
notifyingCountry | string | EU country that notified the alert. |
countryOfOrigin | string | Country of origin as published by the source. |
type | string | Alert type as published by the source. |
level | string | Risk level as published by the source. |
onlineTrader | string or null | Online marketplace reference; null when absent. |
urlrecall | string or null | Recall URL; null when absent. |
companyRecallCode | string or null | Company recall code; null when absent. |
productionDates | string or null | Production dates; null when absent. |
pictures | array of string (uri) | Official Safety Gate image URLs; empty when absent. |
report | object | Weekly report the alert was published in: reference, publicationDate, week, year. |
source_url | string (uri) | Official XML detail endpoint used to retrieve this alert. |
url | string (uri) | Steadfetch envelope: public Safety Gate detail page (same as reference). |
title | string | Steadfetch envelope: case number, category and product name joined for scanning. |
scrapedAt | string (date-time) | Steadfetch envelope: ISO 8601 UTC timestamp of the run. |
Pricing
Pay-per-event uses the two Apify synthetic events from .actor/pay_per_event.json:
apify-actor-start: 0.00005 USD per run (the Apify-recommended default; includes the first 5 seconds of compute).apify-default-dataset-item: 3.00 USD per 1,000 alerts (0.003 USD per alert), charged automatically for each new, validated alert saved to the default dataset. Cost per 1,000 alerts (measured locally, no Apify credit spent): under 0.01 USD, leaving a gross margin above 99%.monitor-check: 0.7 USD per 1,000 watchlist checks (0.0007 USD per check), charged once per watched item actually checked in a monitor run; search and backfill runs never charge it.
Alerts are never double billed: the monitor-check event bills the check itself, and already-delivered alerts are removed before the push and are not charged as results; a repeat run with the same input delivers 0 alerts and only incurs the start event plus the checks. Duplicates within a run, filtered alerts, empty results, retries and errors are not billed as dataset items.
Works on the Apify free plan - about 1,666 alerts for the $5 monthly credit ((5.00 USD - 0.0002 USD run-start at the default 4 GB memory) / 0.003 USD per alert).
Other Steadfetch Actors
- cpsc-recall-monitor: the US CPSC equivalent, same workflow, opposite regulator.
- fda-recall-monitor: FDA food, drug and cosmetics recalls that Safety Gate does not cover.
- nyc-restaurant-inspection-scores: US food-safety signals for a compliance reader already monitoring Safety Gate.
- sec-edgar-monitor: SEC filings from listed manufacturers, useful when an alert becomes a disclosure event.
FAQ
Does it need an API key or login? No. The European Commission XML API is public and keyless.
How fresh is the data? Safety Gate publishes a new weekly report every Friday. weeksBack: 1 gives you the latest report; increase it on the first run to seed history. Later runs only add alerts you have not received before.
How are duplicates handled? Within a run, by caseNumber + reference. Across runs, in a named key-value store (eu-safety-gate-monitor-state, one key per Apify user) of the alerts the Actor actually pushed to you, scoped to the same categories filter. There is no backfill switch: no mode re-delivers alerts you already received.
Does it return personal data? No. Product, risk, country and authority fields only; no person names and no contact fields (GDPR).
Can I filter by category? Yes. categories is a case-insensitive exact match on the alert category, for example ["Jewellery","Toys"].
Why fewer alerts than expected? maxResults caps emitted alerts, and since / categories filter the report window; alerts you already received are skipped and reported as alreadyDelivered in the run log, alongside reportsFetched, totalNotifications, pushed and skipped.
Support
Report bugs through the Actor's Apify Store Issues tab or the Steadfetch Actors repository issues. Include the run ID and the exact input JSON (weeksBack, since, categories, maxResults) so the failure can be reproduced against the same weekly report window.
Maintenance
Registered for the Steadfetch daily catalog QA (enablement pending); tests run in CI on every push. Target: tested daily (2026-10-29) - the Actor is registered for the Steadfetch catalog QA schedule (enablement pending as of 2026-10-22). Schema and fixture tests (npm test) last verified locally on 2026-10-22.