Get Product Safety & Recall Match data with one API
The Product Safety & Recall Match API matches a product to safety recalls as clean JSON.
3 active endpoints, on 2 and 3 credit tiers.
- POST/enrich-recall/v1/product_match
- POST/enrich-recall/v1/brand_check
- POST/enrich-recall/v1/batch
What Product Safety & Recall Match endpoints does ReefAPI ship?
3 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Product Safety & Recall Match API
2 of 3 endpoints, ready to run
Resolve a product (GTIN ‖ title+brand ‖ listing_url) and match it against FDA + EU recalls wi…
// Press "Try it" and this pane shows exactly what the // live site returned this second — including an empty // result, if that is the truth. No key, no account.
How the Product Safety & Recall Match API works
Product Safety & Recall Match is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 185 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
recall vs enrich-recall: same records, different job
These two are the pair people mix up. recall is a search engine over the FDA registries and you do the filtering. enrich-recall starts from a product you are holding, resolves what it is, then scores every candidate recall against it. Field names differ between the two even when the underlying record is identical, which is the usual reason an integration breaks when someone swaps one for the other.
| recall | enrich-recall | |
|---|---|---|
| What you pass | keyword, firm name or a recall_number | gtin, or title plus brand, or a listing_url |
| Recall id field | recall_number | recall_id, same value: H-0854-2026 in both |
| Date field | report_date as 20260610 (YYYYMMDD) | date as 2026-06-03 (ISO) |
| Product text | product_description | product |
| Reason text | reason_for_recall | hazard, plus a separate remedy field |
| Scoring | none, you decide what is relevant | match_confidence 0-1 with components{brand,title,category,exact_id} and matched_on[] |
| Result shape | one recalls[] list | recalls[] for confident hits, possible[] for near misses |
| Coverage statement | a meta.sources string | coverage_gaps[] and no_match_note on every response |
Measured confidence-to-list mapping: brand:exact:1.0 with title_token:1.0 scored 1.00 and went to recalls[]; brand:exact:1.0 with title_token:weak:0.73 scored 0.84 and went to possible[]; brand exact with a 0.265 title scored 0.706 and also went to possible[]. The weakest candidate returned at all scored 0.678.
What people build with Product Safety & Recall Match
The jobs this data is most often used for.
endpoints
credits per call
Marketplaces call product_match to flag or delist products that match an active safety recall.
Retail compliance tools use brand_check to monitor whether a supplier's brand has recalls.
Catalog pipelines use batch to screen an entire product feed against recall data.
What Product Safety & Recall Match data costs
The cheapest call here is 2 credits, so $15/mo (Pro) buys 5,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 185 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/enrich-recall/v1/product_match \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"gtin":"0860007279478"}'import requests
r = requests.post(
"https://api.reefapi.com/enrich-recall/v1/product_match",
headers={"x-api-key": REEF_KEY},
json={
"gtin": "0860007279478"
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Product Safety & Recall Match.
Get a free key →Which one do I call, recall or enrich-recall?▾
If you have a keyword, a firm name or a recall number, call recall. If you have a product, meaning a barcode off a package or a title and brand from a listing, call enrich-recall, because it resolves the identity first and then scores every candidate instead of handing you a keyword result set. A measured GTIN 0860007279478 resolved to Sichuan Chili Crisp by Fly By Jing before any recall lookup ran.
The brand matched exactly, so why is the hit in possible[] and not recalls[]?▾
Brand alone is not enough. A GTIN lookup for Fly By Jing chili crisp found recall H-0854-2026 with components brand 1.0 and category 1.0 but title 0.265, scored it 0.706 and filed it under possible[] — correctly, because that recall was for the same brand's sesame noodles. Passing title Creamy Sesame Noodles with the same brand scored the identical recall 1.0 and moved it into recalls[]. Even brand exact plus a weak title token at 0.73 only reached 0.84 and stayed in possible[].
Why does brand_check for Peloton return zero recalls?▾
Because Peloton's recalls are CPSC recalls, and this engine covers the FDA registries plus EU Safety Gate. The measured call returned an empty recalls[], total 0, and a coverage_gaps[] list naming CPSC, NHTSA and per-country portals such as Health Canada and UK OPSS. An empty result means nothing was found in the sources searched, which is exactly what sources_searched[] and no_match_note exist to tell you.
meta.record_count says 0 but I got matches. Which count is real?▾
Use the counts object in the body. On measured product_match calls meta.record_count and meta.bytes were both 0 while data.counts read {recalls: 0, possible: 1, candidates_scored: 1}, and on another call {recalls: 2, possible: 25, candidates_scored: 80}. counts.candidates_scored also tells you how many recalls were actually compared, which is the number to watch when a result looks thin.
What does identity.source tell me?▾
How the product was resolved before matching started. A GTIN call returned source 'barcode (openfoodfacts, upcitemdb)' with resolved true and a filled-in title, brand and category. A title plus brand call returned source 'user-input', also resolved true, but nothing there was independently verified — the engine trusts what you sent. That matters because brand is the false-match guard, so a wrong brand string quietly costs you every real hit.
Does an empty recalls[] mean the product is safe?▾
No, and the response says so. no_match_note ships on every call and states that absence of a match is not a safety verdict, that coverage is FDA plus EU Safety Gate only, and that this is information rather than a compliance decision. Read coverage_gaps[] next to it before you show anyone a green check mark.
How does max_results interact with the two lists?▾
It caps each list separately, not the total. The same Coca-Cola query returned possible with 25 entries at the default and 50 at max_results 50, while candidates_scored stayed at 80 both times. Raising it does not widen the search, it only stops truncating what had already been scored.
What happens to a bad item inside batch?▾
Nothing sinks the batch. Up to 25 products go in and each result comes back with its own ok flag, an index and an echo of the input you sent, alongside the same identity, recalls, possible and counts payload a single product_match returns. The roll-up adds flagged_count, the number of items with at least one entry in recalls[], which is the field a pre-listing audit should alert on.
What is the Product Safety & Recall Match API?▾
Product Safety & Recall Match API is a ReefAPI endpoint group for product safety & recall match It returns live JSON through POST requests under /enrich-recall/v1.
Is the Product Safety & Recall Match API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Product Safety & Recall Match calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Product Safety & Recall Match login or account?▾
No login to Product Safety & Recall Match is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Product Safety & Recall Match data?▾
The page example is captured from a live product_match call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Product Safety & Recall Match API use?▾
Product Safety & Recall Match actions currently cost 2-3 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Product Safety & Recall Match from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call enrich-recall actions with the same key, credit pool and JSON envelope used by normal REST requests.
37 E-commerce & Marketplaces APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Product Safety & Recall Match, you are one call away from the rest of the category — no second contract, no second integration.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 184 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts.