{"openapi":"3.1.0","info":{"title":"Unsafe Products (Safety Gate) public API","version":"1.0.0","description":"Read-only catalog of non-food products found dangerous in the EU (Safety Gate / RAPEX), with Russian translations where available. No key; 120 requests per minute per IP. Data © European Union, Safety Gate: reuse authorised provided the source is acknowledged."},"servers":[{"url":"https://safety.weblocally.com/api/v1"}],"externalDocs":{"url":"https://safety.weblocally.com/en/api"},"paths":{"/alerts":{"get":{"operationId":"searchAlerts","summary":"Search alerts (newest first)","parameters":[{"name":"q","in":"query","required":false,"description":"Search text","schema":{"type":"string","description":"Free text: product name, brand, model, barcode or alert number (prefix match, all words required)","maxLength":120}},{"name":"category","in":"query","required":false,"description":"Category","schema":{"type":"string","description":"Category key from /taxonomy, e.g. toys"}},{"name":"risk","in":"query","required":false,"description":"Risk type","schema":{"type":"string","description":"Risk key from /taxonomy, e.g. chemical"}},{"name":"origin","in":"query","required":false,"description":"Country of origin","schema":{"type":"string","description":"Country of origin, ISO 3166-1 alpha-2","pattern":"^[A-Z]{2}$"}},{"name":"country","in":"query","required":false,"description":"Notifying country","schema":{"type":"string","description":"Notifying country, ISO 3166-1 alpha-2","pattern":"^[A-Z]{2}$"}},{"name":"year","in":"query","required":false,"description":"Publication year","schema":{"type":"integer","minimum":2005}},{"name":"barcode","in":"query","required":false,"description":"Barcode","schema":{"type":"string","description":"EAN / UPC digits; 12 and 13 digit forms are matched both ways"}},{"name":"sort","in":"query","required":false,"description":"Sort order","schema":{"type":"string","enum":["new","old"],"default":"new"}},{"name":"page","in":"query","required":false,"description":"Page number","schema":{"type":"integer","minimum":1,"default":1}},{"name":"per_page","in":"query","required":false,"description":"Results per page","schema":{"type":"integer","minimum":1,"maximum":50,"default":20}},{"name":"lang","in":"query","required":false,"description":"Language of labels and texts. Russian texts fall back to the English original with translated=false.","schema":{"type":"string","enum":["ru","en"],"default":"ru"}}],"responses":{"200":{"description":"{ total, page, per_page, pages, results: [alert summary] }","content":{"application/json":{"schema":{"type":"object"}}}},"429":{"description":"Rate limit exceeded"}}}},"/alerts/{id}":{"get":{"operationId":"getAlert","summary":"One alert with all texts, measures and photos","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}},{"name":"lang","in":"query","required":false,"description":"Language of labels and texts. Russian texts fall back to the English original with translated=false.","schema":{"type":"string","enum":["ru","en"],"default":"ru"}}],"responses":{"200":{"description":"Alert","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Unknown alert id"},"429":{"description":"Rate limit exceeded"}}}},"/taxonomy":{"get":{"operationId":"taxonomy","summary":"Categories, risk types, countries and years with labels and counts","parameters":[{"name":"lang","in":"query","required":false,"description":"Language of labels and texts. Russian texts fall back to the English original with translated=false.","schema":{"type":"string","enum":["ru","en"],"default":"ru"}}],"responses":{"200":{"description":"Taxonomy","content":{"application/json":{"schema":{"type":"object"}}}},"429":{"description":"Rate limit exceeded"}}}},"/stats":{"get":{"operationId":"stats","summary":"Totals, dates and top categories / risks / countries","parameters":[{"name":"lang","in":"query","required":false,"description":"Language of labels and texts. Russian texts fall back to the English original with translated=false.","schema":{"type":"string","enum":["ru","en"],"default":"ru"}}],"responses":{"200":{"description":"Stats","content":{"application/json":{"schema":{"type":"object"}}}},"429":{"description":"Rate limit exceeded"}}}}}}