EU Safety Gate Scraper (RAPEX Dangerous Product Alerts JS... avatar

EU Safety Gate Scraper (RAPEX Dangerous Product Alerts JS...

Pricing

from $2.40 / 1,000 alert delivereds

Go to Apify Store
EU Safety Gate Scraper (RAPEX Dangerous Product Alerts JS...

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

Steadfetch

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

14 days ago

Last modified

Features

Limited permissions

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 weeksBack weekly reports from https://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 product categories; an empty list means every category. Caps output with maxResults.
  • 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 same categories filter) 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

  1. Install the Apify CLI (npm add -g apify-cli) and log in.

  2. Run the Store test input (latest weekly report, small cap):

    $apify call steadfetch/eu-safety-gate-monitor --input='{"weeksBack":1,"maxResults":10}'
  3. Raise weeksBack (max 52) and maxResults on the first run to seed history; scheduled runs can keep weeksBack at 1 or 2 so you only pay for new alerts.

  4. Narrow the feed with categories (for example ["Jewellery","Toys"]); monitor state is scoped per user and per categories filter, so switching filters may re-deliver alerts you have already seen under a different one.

Input

Input fields

FieldTypeRequiredDefault/PrefillDescriptionExample
weeksBackintegerNodefault 4, min 1, max 52Number of weekly reports to download from the official list, newest first. Each report is roughly 90 alerts.1
sincestringNononeOptional earliest report publication date (YYYY-MM-DD, inclusive); earlier reports are not downloaded.2026-10-01
categoriesarray of stringNonone (empty means every category)Case-insensitive product category filter, for example ["Jewellery","Toys"].["Jewellery"]
maxResultsintegerNodefault 100, min 1, max 5000Maximum 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

FieldTypeDescription
caseNumberstringOfficial Safety Gate alert case number.
referencestring (uri)Public Safety Gate detail page for the alert.
categorystringProduct category.
productstringProduct type.
namestring or nullCommercial product name; null when the source has none.
brandstring or nullBrand; null when the source has none.
type_numberOfModelstring or nullType or model number; null when absent.
barcodestring or nullBarcode; null when absent.
batchNumberstring or nullBatch number; null when absent.
riskTypestringRisk category (chemical, choking, electric shock, and so on).
dangerstringRisk description as published by the notifying authority.
measuresstringMeasures taken, as published by the source.
descriptionstringProduct description as published by the source.
notifyingCountrystringEU country that notified the alert.
countryOfOriginstringCountry of origin as published by the source.
typestringAlert type as published by the source.
levelstringRisk level as published by the source.
onlineTraderstring or nullOnline marketplace reference; null when absent.
urlrecallstring or nullRecall URL; null when absent.
companyRecallCodestring or nullCompany recall code; null when absent.
productionDatesstring or nullProduction dates; null when absent.
picturesarray of string (uri)Official Safety Gate image URLs; empty when absent.
reportobjectWeekly report the alert was published in: reference, publicationDate, week, year.
source_urlstring (uri)Official XML detail endpoint used to retrieve this alert.
urlstring (uri)Steadfetch envelope: public Safety Gate detail page (same as reference).
titlestringSteadfetch envelope: case number, category and product name joined for scanning.
scrapedAtstring (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

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.