Docs menu

Docs / Look up a barcode

Look up a barcode

Last updated 2026-11-13

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

NameInRequiredDescription
codepathyesA 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.

Response

200 OK
{
  "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.