EU Safety Gate Scraper
Pricing
from $3.00 / 1,000 results
EU Safety Gate Scraper
Scrape the European Commission's Safety Gate (RAPEX) database of dangerous product alerts. Search by keyword or alert number, filter by product category, risk type, notifying country and country of origin, or fetch a full alert report by ID.
Pricing
from $3.00 / 1,000 results
Rating
0.0
(0)
Developer
Crawler Bros
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Scrape the European Commission's Safety Gate (formerly RAPEX) database — the EU's rapid alert system for dangerous non-food products. Search or browse thousands of official product safety alerts covering toys, electronics, cosmetics, childcare articles, chemicals and more, with risk descriptions, measures taken, and country of origin/notification. No login, no API key, no cookies required.
What this actor does
- Two modes:
search(keyword + filters, paginated) andbyAlertId(fetch one or more specific alerts by ID) - Filters: product category (34 official categories), risk type (22 official risk types), notifying country (31 EU/EEA/UK members), country of origin (any of 251 ISO countries), alert type (serious risk / other risk level / other alert type), product user (professional / consumer), publication year range, exact publication date range, sort field (publication date or alert number) with ascending/descending order
- Free-text search across product name, brand, and alert reference number (e.g.
SR/02077/26) - Optional full detail fetch — risk description, legal provision, measures taken (recall, ban, withdrawal, etc.), traceability (country of origin, online sale status), and reacting countries
- 28 output languages — get the product name, description, risk description and legal provision in any of the official Safety Gate languages (all EU/EEA languages plus Norwegian, Icelandic, Ukrainian, Arabic and Irish), not just English
- Product images — direct, hotlink-free URLs to official alert photos
- Empty fields are omitted — every record only contains data that was actually available for that alert
Output per alert
Search mode (default, light record):
alertId,reference,publicationDate,modificationDateproductName,productNameSpecific,brand,brands[]riskTypes[]images[],mainImagewebReportCode,correctionNote— official corrigendum text, when the alert was later correctedalertUrl(official Safety Gate search page carrying this alert's reference number — the site doesn't auto-run searches from a URL, so paste the reference into the on-page search box; usealertApiUrlfor immediately-usable JSON),alertApiUrl
With fetchFullDetail: true or byAlertId mode, additionally:
notificationType,notificationTypeCode,creationDate,isImmediateNotification—truefor an immediate/rapid Article 12 alert,falsefor a regular weekly-report notificationnotifyingCountry,notifyingCountryCodeproductCategory,productCategoryOther— free-text specific category, present only whenproductCategoryis "Other"productDescription,packageDescriptionbarcodes[],batchNumbers[],modelNumbers[]— product identifiers, when disclosedriskDescription,legalProvision,riskTypeOther— free-text specific risk, present only whenriskTypesincludes "Other"measures[]—{ category, categoryOther, type, entryIntoForceDate, responsibleParty }—categoryOtheris the free-text specific measure, present only whencategoryis "Other"hasPublishedRecallOnline,companyRecallLinks[]— link(s) to the manufacturer/retailer's own recall notice, when publishedcountryOfOrigin,countryOfOriginCode,isSoldOnlineonlineMarketplaces[]—{ trader, productIdentifier }, the online marketplace(s) (e.g. Amazon, AliExpress, Temu) the product was reportedly sold on, when disclosedreactingCountries[]professionalProduct,isCounterfeit(only present whentrue)
Every record also includes recordType: "safetyGateAlert" and scrapedAt.
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode | string | search | search or byAlertId |
searchQuery | string | toy | Free-text query (mode=search) |
alertIds | array | – | Numeric alert IDs (mode=byAlertId) |
productCategories | array (enum) | – | Filter by one or more product categories |
riskTypes | array (enum) | – | Filter by one or more risk types |
notifyingCountries | array (enum) | – | Filter by notifying EU/EEA/UK country |
countriesOfOrigin | array (enum) | – | Filter by country of manufacture |
yearFrom | int | 2017 | Earliest case/reference-number year (the YY in A12/02131/23) — NOT the calendar year of publicationDate; see FAQ below |
yearTo | int | 2026 | Latest case/reference-number year — NOT the calendar year of publicationDate; see FAQ below |
publishedSince | date | – | Earliest exact publication date (YYYY-MM-DD) — finer-grained than yearFrom, can be combined with it or used alone |
publishedUntil | date | – | Latest exact publication date (YYYY-MM-DD) — finer-grained than yearTo, can be combined with it or used alone |
alertType | string | – | SERIOUS_RISK, OTHER_RISK_LEVEL, or OTHER_ALERT_TYPE — filter by alert severity/classification. Leave empty for all |
productUser | string | – | PROFESSIONAL or CONSUMER — filter by whether the product is intended for professional/business or general consumer use. Leave empty for all |
sortField | string | PUBLICATION_DATE | PUBLICATION_DATE or ALERT_NUMBER — which field to sort by |
sortOrder | string | DESC | DESC (newest/highest first) or ASC (oldest/lowest first), applied to sortField |
fetchFullDetail | boolean | false | Fetch full detail report for every result (mode=search) |
outputLanguage | string | en | Language for product name/description and risk description/legal provision text (28 languages supported) |
maxItems | int | 50 | Hard cap on emitted records (1–1000) |
Example: recent toy alerts with full risk detail
{"mode": "search","searchQuery": "toy","productCategories": ["TOYS"],"yearFrom": 2024,"yearTo": 2026,"fetchFullDetail": true,"maxItems": 100}
Example: browse all cosmetics alerts from China, newest first
{"mode": "search","productCategories": ["COSMETICS"],"countriesOfOrigin": ["CN"],"sortOrder": "DESC","maxItems": 200}
Example: fetch specific alerts by ID
{"mode": "byAlertId","alertIds": ["10099540", "10118542"]}
Example: alerts published in a specific week
{"mode": "search","publishedSince": "2026-08-01","publishedUntil": "2026-08-07","maxItems": 200}
Example: German-language alert reports
{"mode": "search","productCategories": ["ELECTRICAL_APPLIANCES"],"fetchFullDetail": true,"outputLanguage": "de","maxItems": 50}
FAQs
Do I need an API key or login? No. Safety Gate publishes its alert database publicly with no authentication required.
Why do some alerts have fewer fields than others? Not every alert includes every field (e.g. brand, notifying country, or country of origin may be unknown or undisclosed by the reporting authority). Only fields that Safety Gate actually populated are included in the output — there are no placeholder or "N/A" values.
What's the difference between search and fetchFullDetail: true?
search alone returns a lightweight summary card per alert (fast, good for browsing). Setting fetchFullDetail: true fetches the full official report for each matching alert, including the risk description, legal basis, and measures taken — slower, but the same data shown on the alert's detail page.
How current is the data? Safety Gate is updated by the European Commission on an ongoing basis (multiple new alerts published daily). This actor always queries the live database.
Can I search by alert reference number?
Yes — searchQuery also matches reference numbers like SR/02077/26.
Can I filter by an exact date instead of just a year?
Yes — publishedSince and publishedUntil accept exact YYYY-MM-DD dates and can be used together with (or instead of) yearFrom/yearTo for day-level precision, e.g. to get only alerts from a specific week.
Why does yearFrom/yearTo return alerts published outside that range?
yearFrom/yearTo filter by the case/reference-number year (the YY in a reference like A12/02131/23), not by the calendar year the alert was actually published. Immediate Article 12 notifications are opened under one year's case number but can go through review and only get published 1-2+ years later, so a case from 2023 can have a 2026 publicationDate. If you need the actual calendar publication date, use publishedSince/publishedUntil instead — those filter directly on publicationDate.
Can I get the alert text in a language other than English?
Yes — set outputLanguage to any of the 28 supported language codes (e.g. de, fr, es, pl). This translates the product name, description, risk description, and legal provision. Category, risk-type and country labels are always shown in English regardless of this setting, and searchQuery matching is unaffected by outputLanguage.
What's the difference between riskTypes and alertType?
riskTypes filters by the kind of hazard (e.g. Choking, Fire, Chemical). alertType filters by the alert's severity/classification instead — SERIOUS_RISK for immediate Article 12 notifications, OTHER_RISK_LEVEL for regular weekly-report alerts with a lower risk level, or OTHER_ALERT_TYPE for non-risk-based notifications (e.g. a corrective-measure-only alert). The two filters can be combined.
What does productUser filter on?
It restricts results to products the notifying authority classified as intended for professional/business use (PROFESSIONAL) versus general consumer use (CONSUMER) — e.g. industrial machinery vs. a household toy. Leave it empty to get both. With fetchFullDetail: true or byAlertId mode, the corresponding professionalProduct: true output field is also included on professional-use alerts.