Docs / Look up a barcode
Look up a barcode
Recalls whose official notice lists this barcode.
GET/v1/barcode/{code} · API key required
Send any barcode number: UPC-A (12 digits), EAN-13, GTIN-14, or the short UPC-E and EAN-8, with or without spaces and dashes. We check the last digit (the check digit), turn the number into one standard form, and return the recalls whose official notice lists it. A number whose check digit is wrong is refused, because it is not a real barcode.
A match means the code appears in a notice. Notices often list a barcode for a whole product line while only certain lots or dates are recalled, so each match includes the lot codes, best-by dates and serial numbers written near the barcode, exactly as the notice words them. We never compare them with your item and never say an item is or is not affected.
No match is not an answer about your item: not every recall lists barcodes, so also search by product name with /v1/search.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
code | path | yes | A barcode number, 8, 12, 13 or 14 digits. Spaces and dashes are ignored. Example: 036000291452 |
Request
curl https://recalldb.app/v1/barcode/036000291452 \
-H "Authorization: Bearer $RECALLDB_KEY"const res = await fetch('https://recalldb.app/v1/barcode/036000291452', {
headers: { Authorization: `Bearer ${process.env.RECALLDB_KEY}` },
})
const { data, source } = await res.json()
console.log(data, source.official_url)import os, requests
r = requests.get("https://recalldb.app/v1/barcode/036000291452", headers={"Authorization": f"Bearer {os.environ['RECALLDB_KEY']}"})
r.raise_for_status()
body = r.json()
print(body["data"], body["source"]["official_url"])Try it
Runs a real request with no signup (20 a day per network, read-only). VINs you try are used only for this call and never stored.
Get your own key Free: 1,000 requests a month.
Response
{
"data": [
{
"id": "cpsc-27064",
"title": "Example Widget Recall: CPSC Recall 27064",
"issued_by": "Example Co",
"date": "2026-10-29",
"listed_as": "036000291452",
"official_text": "Example Widget 16 oz, UPC 036000291452, Lot 123A, Best By 06/30/2027.",
"lot_codes": [
"123A"
],
"best_by_dates": [
"06/30/2027"
],
"serial_numbers": [],
"page_url": "https://checkrecalls.org/recall/cpsc-27064",
"source": {
"agency": "CPSC",
"official_id": "27064",
"official_url": "https://www.cpsc.gov/Recalls/2026/example",
"last_updated": "2026-11-13"
}
}
],
"meta": {
"barcode": {
"upcA": "036000291452",
"ean13": "0036000291452",
"gtin14": "00036000291452"
},
"matches": 1,
"note": "This barcode matches a code listed in the notice. Verify against the official notice: often only certain lots, dates or serial numbers are recalled. Check your lot code: compare the lot, date and serial codes on your item with the codes the official notice lists."
},
"attribution": {
"text": "Data from RecallDB",
"url": "https://recalldb.app"
}
}Every response includes source (agency, official ID, official URL, last updated) and attribution. Attribution rules.
Notes
- Counts as one request. A bad check digit returns 400 with code bad_barcode.
- The lot, best-by and serial lists are the notice's own words found near the barcode; they can be empty even when the notice lists lots elsewhere, so always read the official notice.
Errors: error codes. Limits: rate limits.