# Oredrift > Niche data APIs. Oredrift takes one public data source at a time, reconciles what it actually contains, and serves it as an API you can query with the information you really have. Live now, both public on RapidAPI with a free tier: EU product recalls from the European Commission Safety Gate, and international postal address normalisation in 249 countries. Oredrift is operated by CGDev, a French SASU. APIs are distributed through API marketplaces, with a free tier. There is no sales process. ## EU Product Recalls API Answers the question: **has this product been recalled anywhere in the European Union?** - Base URL: `https://recalls.oredrift.com` - Subscribe: https://rapidapi.com/oredrift-catalogue/api/eu-product-recall-safety-gate-api - Contract: https://recalls.oredrift.com/openapi.yaml (OpenAPI 3.0.3) - Status: https://recalls.oredrift.com/health - Access: through the RapidAPI marketplace only. Direct calls to the origin are refused with HTTP 403. ### What it covers 47,000+ alerts published by the European Commission Safety Gate since 2005, from 31 notifying countries. Refreshed weekly, following the Commission's own publication schedule. ### What makes it different from a lookup table Safety Gate data is entered by hand by national authorities and is inconsistent. - Only **25%** of alerts carry a barcode in the barcode field. Some of those hold an internal supplier reference; others hold several GTINs concatenated without a separator. A plain GTIN lookup misses three recalls out of four. - Recovering barcodes the source records inconsistently, and validating every check digit, brings **44%** of alerts within exact barcode reach. - Brand is present on 80% of alerts and a model reference on 77%, but model fields list several references in one string, and the most common brand value in the whole archive is the literal word "Unknown". Reconciling these brings **84%** within reach of at least one strong key. - The same product recalled across several countries produces several alerts. They are grouped, so one product gives one result. ### Measured quality Measured on the full archive, rerun on every change. The second column asks the question a seller actually asks, from a marketplace-style product title rather than the official wording of the alert. | Metric | Queried with alert text | Queried with a seller title | |---|---|---| | Exact alert returned | 84% | 93% | | Useful to the subscriber | 97% | 98% | | Correct alert in first position | - | 81% | | Noise on off-topic queries | 0 of 12 | 0 of 12 | | Median latency | 3.9 ms | 3.9 ms | ### How to call it Send any combination of `title`, `brand` and `gtin` (also accepted as `barcode`). A title is enough to get an answer; a barcode gets a certain one. Any other field is rejected with HTTP 422 naming it, rather than silently ignored. ``` POST /v1/match { "title": "MICA LED christmas tree", "barcode": "8720362191049" } ``` Endpoints: - `POST /v1/match` - one product - `POST /v1/match/batch` - up to 50 products in one call, each with a free reference returned verbatim - `GET /v1/alerts` - browse by category, risk, country, or everything collected since a given timestamp - `GET /v1/alerts/{case_number}` - one alert by official case number - `GET /health` - public service status ### What comes back Each match carries the alert itself, so no second call is needed: product, brand, model, risk type, official severity, batch numbers, country of origin, official photo, publication date. Plus: - `confidence` and `rationale` - how sure, and why, in plain words - `lead_only` - true means a lead for human review, not a conclusion - `measure` - what the authority ordered, with `concerns_sold_units` distinguishing stock still held from units already with customers - `related_alerts` - how many countries notified the same product ### Errors Every error has the same shape, including malformed JSON, a missing Content-Type, an unknown route and a wrong method. Test `error.code`; codes are stable, messages are written for humans. ``` { "error": { "code": "bad_request", "message": "..." } } ``` ### For AI agents The same engine speaks the Model Context Protocol, with four tools: `check_product`, `check_catalogue`, `get_alert`, `list_alerts`. It is the same code over the same data, not a second implementation. The endpoint is key-protected; ask for access. ### Who uses it - Marketplaces screening seller listings at submission - Retailers checking a catalogue before import - Compliance teams watching the weekly feed Under Regulation (EU) 2023/988 on general product safety, applicable since 13 December 2024, online sellers and marketplaces addressing the EU must operate a process to detect unsafe products. Safety Gate is the reference public source. ## International Postal Address Normalisation API Answers the question: **what is this address, written by a human, in its official reference form?** - Base URL: `https://addresses.oredrift.com` - Subscribe: https://rapidapi.com/oredrift-catalogue/api/international-postal-address-normalisation-api - Product page: https://oredrift.com/addresses - Contract: https://addresses.oredrift.com/openapi.yaml (OpenAPI 3.0.3) - Status: https://addresses.oredrift.com/health - Access: through the RapidAPI marketplace only. Direct calls to the origin are refused with HTTP 403. ### Plans The marketplace meters requests, not addresses, so the included volume is stated in requests and each plan also sets how many addresses one request may carry. | Plan | Per month | Requests included | Beyond that | Addresses per call | |---|---|---|---|---| | BASIC | free | 100, then it stops | no overage | 1 | | PRO | $29 | 10,000 | $0.004 each | 25 | | ULTRA | $99 | 100,000 | $0.002 each | 50 | | MEGA | $399 | 1,000,000 | $0.001 each | 100 | A batch over your plan's limit is refused with a message naming both the limit and the plan. Nothing is silently truncated. ### What it covers 249 countries and territories, 12,008,278 postcode and locality pairs, 11,029,643 streets, from GeoNames (CC BY 4.0), La Poste (Licence Ouverte 2.0) and national address files, each checked for commercial reuse. ### How to call it `country` is **required**, as an ISO 3166-1 alpha-2 code. It is never guessed: guessing it would silently pick a whole address grammar and return a normal-looking answer computed against the wrong country. ``` POST /v1/normalize { "address": "12 Av. Lucien Lioret Le Dorat 87210", "country": "FR" } ``` Endpoints: - `POST /v1/normalize` - one address - `POST /v1/normalize/batch` - up to 100 addresses depending on your plan (BASIC 1, PRO 25, ULTRA 50, MEGA 100), each line carrying its own result or its own error, with its index in the array you sent - `GET /health` - public service status and reference freshness ### What comes back Postcode, official locality, normalised street, house number and its extension, the verdict of checking that number against the street itself, print-ready lines in the NF Z 10-011 layout, the INSEE code where it exists, the former name where a commune has merged, coordinates with the scale they are valid at, a confidence score, a coverage level and a plain-English explanation. `coverage` is `authoritative` when the house number was found in the street's own number list, `postcode_verified` when the postcode and locality pair exists but the street or number was not confirmed, and `unverified` when the locality is named in your input and exists in the country. ### Four invariants, tested on every change 1. A special-delivery code is never rewritten into a geographic address. `CEDEX`, `Postboks`, `Postfach`, `Postbus`, `casella postale`, `apartado postal`, `caixa postal`. 2. A geographic address is never invented for a non-geographic form: those carry `geocodable: false` and no coordinates. 3. No result is returned without its confidence and its coverage level. 4. Nothing in the input is lost: it is echoed back verbatim, and a special-delivery mention keeps the form it was written in. ### Measured quality Measured against MESSY STREETS (arXiv:2609.01612), an external benchmark of addresses as written on the web, whose ground truth comes from OpenAddresses and OpenStreetMap rather than from our own reference. 127 countries have a measured grade; **102 reach grade B or better**. | Country | Cases | Postcode | Locality exact | House number valid | Grade | |---|---|---|---|---|---| | Austria | 1,083 | 99.5% | 94.7% | 97.4% | AA | | Switzerland | 131 | 96.8% | 96.2% | 95.8% | A | | Norway | 129 | 99.0% | 94.4% | 93.3% | A | | Netherlands | 623 | 97.7% | 94.8% | 91.9% | A | | Belgium | 313 | 99.2% | 96.4% | 90.2% | A | | France | 2,290 | 99.2% | 96.2% | 90.1% | A | | Denmark | 168 | 97.6% | 93.9% | 88.1% | A | | Germany | 1,162 | 99.6% | 92.2% | 87.4% | A | | United States | 9,040 | 99.1% | 97.4% | - | B | | United Kingdom | 1,046 | 99.5% | 93.4% | - | B | A dash means the country has no open street-and-number layer we are entitled to redistribute, so no house number can be checked there. ### What it does not promise Open reference data does not match a commercial geocoder on recall; the benchmark's own authors measure a gap of up to 49 percentage points. This API does not certify deliverability, and does not make anyone eligible for a postal operator's bulk tariff, which is an accreditation rather than a calculation. ### Licence of the data returned Attribution travels in `meta` of every response rather than in a terms page. Where a country's licence restricts what may be done with the result, that restriction comes back in `licence_notice`, on the answer itself. Reference fields are reproduced unchanged; confidence, coverage and the explanation are derived by Oredrift and labelled as such. ## Source, licence and limits (EU Product Recalls API) Data originates from the European Commission Safety Gate portal and is reused under Commission Decision 2011/833/EU. Reuse is authorised provided the original meaning of the alerts is not distorted and the source is acknowledged. Every response carries the required acknowledgement: > Alerts from the Rapid Alert System for dangerous non-food products, published free of charge on the Safety Gate website (https://ec.europa.eu/safety-gate-alerts) (c) European Union, 2005 - 2026 Official fields are returned verbatim under `source`; anything Oredrift derives is returned separately under `enriched`, never in place of the original. The official severity is the Commission's, never a score of ours. Safety Gate publishes in English and machine-translates into 24 other languages; the English version prevails in case of conflict. This API serves English only. **On accuracy.** Alerts are written by national authorities in 31 countries. Under point 3.6 of Annex I to Commission Delegated Regulation (EU) 2024/3173, the Commission itself accepts no liability for their correctness, and neither does Oredrift. This API returns what the source says, reconciled and labelled, and does not warrant that the source is right. It is not legal advice, and matches flagged `lead_only` require human review. Oredrift is not affiliated with, endorsed by, or acting on behalf of the European Commission. ## Contact Published by CGDev, SASU, France. The contact address is shown on https://oredrift.com behind a click.