Check and search

Ask whether a product is recalled with whatever you know about it, check up to 100 products at once, or search the recall records directly.

GET /v1/check

Give at least one of these query parameters. Values are trimmed and cut at 300 characters.

ParameterWhat to send
upcUPC, EAN or GTIN barcode, any spacing or dashes. gtin and ean are accepted as aliases.
modelModel, part or catalog number.
ndcNational Drug Code in any layout (4-4-2, 5-3-2, 5-4-1, with or without dashes).
lotLot or batch code.
brandBrand or manufacturer as printed on the product.
nameProduct name or description. A bare barcode typed here is read as a barcode, and identifiers written inside it (for example "model AB1234") are picked up.
establishmentUSDA establishment number from a meat or poultry label (for example EST. M-1234A).

How input is normalized

InputNormalized toNotes
UPC, EAN, GTIN (8, 12, 13 or 14 digits)GTIN-14When the check digit is wrong, both the printed and the corrected code are tried. 11 digits (a UPC missing a digit) gives both plausible readings.
NDC11-digit package code and 9-digit product codeA 10-digit NDC without dashes is ambiguous, so all three layouts are tried.
ModelUppercase letters and digits only3 to 30 characters and must contain a digit; all-digit models need at least 4 digits.
LotUppercase letters and digits only3 to 24 characters and must contain a digit.
BrandCompact keyAccents, punctuation and words such as Inc, LLC, Co and Corp are dropped ("Char-Broil" becomes CHARBROIL).
NameWordsLowercased, common words removed, brand words removed.

Response

Confidence levels

LevelWhen
exactA GTIN (from your UPC, EAN or GTIN) or an 11-digit NDC package code appears in the recall's identifiers.
strongA 9-digit NDC product code (labeler and product) or an FSIS establishment number; a model number when your brand also appears in the recall, or when the model is distinctive (letters and digits, at least 5 characters); a lot code when your brand also appears in the recall.
possibleA short (under 5 characters) or all-digit model, or a lot code, without the brand; or no identifier hit, but your brand appears in the recall and either no name was given or at least half of your product name words appear too; or, with no brand given, at least 3 name words that cover at least 75% of your product name.

The highest level found for a recall wins, and its reasons are merged. Reasons read like gtin 00041548000121, ndc 16729045715, lot 222, brand or name: protein sprout mix.

Examples from real recall records

QueryConfidenceReasonsRecall
upc=041548000121exactgtin 00041548000121fda-H-1268-2026
upc=087906010180stronggtin 00087906010180 (the agency printed this barcode with a wrong check digit; corrected)fda-H-1339-2026
upc=099143020044exactgtin 00099143020044cpsc-24116
ndc=16729-457-15exactndc 16729045715; ndc9 167290457fda-D-0775-2026 and 24 more FDA recalls of that product
brand=Everything Sprouts
name=protein sprout mix
lot=222
stronglot 222; brand; name: protein sprout mixfda-H-1339-2026
brand=Char-Broil
name=digital electric smoker
possiblebrand; name: digital electric smokercpsc-24116

The last one in full (long text fields shortened on this page):

Request

curl -s "https://api.recallsapi.com/v1/check?brand=Char-Broil&name=digital%20electric%20smoker" \
  -H "Authorization: Bearer $RECALLSAPI_KEY"

Response (200)

{
  "resolved": {
    "identifiers": [],
    "brand": "CHARBROIL",
    "name_tokens": [
      "digital",
      "electric",
      "smoker"
    ]
  },
  "matches": [
    {
      "confidence": "possible",
      "reasons": [
        "brand",
        "name: digital electric smoker"
      ],
      "recall": {
        "id": "cpsc-24116",
        "agency": "CPSC",
        "source": "cpsc",
        "source_id": "24116",
        "category": "consumer_product",
        "title": "Char-Broil Recalls Digital Electric Smokers Due to Risk of Electric Shock",
        "description": "This recall involves Char-Broil digital electric smokers with the following model descriptions: Digital Electric Smoker;...",
        "hazard": "The smokers can leak electrical current during use, posing an electric shock hazard.",
        "remedy": "Consumers should immediately stop using the recalled electric smokers and contact Char-Broil for a free repair kit. The ...",
        "classification": null,
        "status": null,
        "firms": [
          "Char-Broil LLC, of Columbus, Georgia"
        ],
        "products": [
          "Digital Electric Smokers"
        ],
        "distribution": "Sold at: Lowe's, Menards, Ollie's Bargain Outlet, Target and other stores nationwide, and online at Amazon.com, HSN.com ...",
        "units": "About 211,700 (In addition, 3,440 were sold in Canada)",
        "flags": [],
        "recall_date": "2024-02-15",
        "report_date": "2024-02-15",
        "url": "https://www.cpsc.gov/Recalls/2024/Char-Broil-Recalls-Digital-Electric-Smokers-Due-to-Risk-of-Electric-Shock",
        "source_url": "https://www.saferproducts.gov/RestWebServices/Recall?format=json&RecallNumber=24116",
        "as_of": "2026-10-06T01:16:49.077Z"
      }
    }
  ]
}

When nothing matches, matches is empty. That means no recall in the database carries your identifiers or a close enough brand and name; it does not certify the product as safe.

Response for name=nothing here at all (200)

{
  "resolved": {
    "identifiers": [],
    "brand": null,
    "name_tokens": [
      "nothing",
      "here"
    ]
  },
  "matches": []
}

POST /v1/check/batch

Check 1 to 100 products in one request. Each item takes the same fields as /v1/check. Each product counts as one call against your daily quota, and each result carries up to 10 matches.

Request

curl -s -X POST https://api.recallsapi.com/v1/check/batch \
  -H "Authorization: Bearer $RECALLSAPI_KEY" \
  -H "content-type: application/json" \
  -d '{"items": [{"upc": "041548000121"}, {"ndc": "16729-457-15"}]}'

The response is {"results": [...]} in the order you sent, each result being {"input", "resolved", "matches"}.

Search recall records. All parameters are optional.

ParameterMeaning
qWords to find in the title, firms, products and description. Every word must appear; the last word also matches as a prefix. Up to 8 words; common words such as "recall" and "product" are ignored.
categoryconsumer_product, food, drug, device, vehicle, vehicle_equipment, tire, child_seat or meat_poultry.
sourcecpsc, fda_food, fda_drug, fda_device, nhtsa or fsis.
since, untilRecall date range, YYYY-MM-DD, inclusive.
limit1 to 100, default 20.
cursorThe next_cursor value from the previous page.

With q, results are ranked by text relevance (title weighs most, then firms and products). Without it, newest recall date first.

Request

curl -s "https://api.recallsapi.com/v1/recalls?q=sprouts&category=food&limit=2" \
  -H "Authorization: Bearer $RECALLSAPI_KEY"

The response is {"results": [recall, ...], "next_cursor": "MjA=" | null}.

GET /v1/recalls/{id}

One recall with every identifier extracted from it. Ids are the agency recall number with a source prefix: cpsc-24116, fda-H-1339-2026, nhtsa-26V631000, fsis-025-2026. An unknown id answers 404 not_found.

Request

curl -s https://api.recallsapi.com/v1/recalls/fda-H-1339-2026 -H "Authorization: Bearer $RECALLSAPI_KEY"

Response (200)

{
  "id": "fda-H-1339-2026",
  "agency": "FDA",
  "source": "fda_food",
  "source_id": "H-1339-2026",
  "category": "food",
  "title": "Everything Sprouts, LLC: Everything Sprouts Crunchy Protein Sprout Mix, containing Alfalfa Fenugreek, Cabbage, Mung, Adzuki, Lentils, Green Pea, Net Wt",
  "description": "Everything Sprouts Crunchy Protein Sprout Mix, containing Alfalfa Fenugreek, Cabbage, Mung, Adzuki, Lentils, Green Pea, Net Wt. 5.0 oz (142 g) UPC 0 87906-01018 7.  everythingsprouts.com",
  "hazard": "Sprouts may be contaminated with STEC E. coli and/or Salmonella.",
  "remedy": null,
  "classification": "Class I",
  "status": "ongoing",
  "firms": [
    "Everything Sprouts, LLC"
  ],
  "products": [
    "Everything Sprouts Crunchy Protein Sprout Mix, containing Alfalfa Fenugreek, Cabbage, Mung, Adzuki, Lentils, Green Pea, Net Wt. 5.0 oz (142 g) UPC 0 87906-01018 7.  everythingsprouts.com"
  ],
  "distribution": "MN, WI",
  "units": "201.56 pounds",
  "flags": [],
  "recall_date": "2026-08-22",
  "report_date": "2026-09-23",
  "url": "https://api.fda.gov/food/enforcement.json?search=recall_number:%22H-1339-2026%22",
  "source_url": "https://api.fda.gov/food/enforcement.json?search=recall_number:%22H-1339-2026%22",
  "as_of": "2026-10-06T01:18:39.595Z",
  "identifiers": [
    {
      "kind": "gtin",
      "value": "00087906010187",
      "raw": "0 87906-01018 7"
    },
    {
      "kind": "gtin_cd",
      "value": "00087906010180",
      "raw": "0 87906-01018 7"
    },
    {
      "kind": "lot",
      "value": "222",
      "raw": "222"
    },
    {
      "kind": "lot",
      "value": "223",
      "raw": "223"
    },
    {
      "kind": "lot",
      "value": "226",
      "raw": "226"
    },
    {
      "kind": "lot",
      "value": "230",
      "raw": "230"
    }
  ]
}

The printed UPC 0 87906-01018 7 has a check digit that does not validate, so both the printed form and the corrected GTIN are stored.

The recall object

FieldMeaning
idStable id: source prefix plus the agency recall number.
agency, source, source_idCPSC, FDA, USDA FSIS or NHTSA; the feed it came from; the agency's own recall number.
categoryOne of the nine categories listed under search.
title, description, hazard, remedyText from the agency record. remedy is null when the source has none (FDA enforcement reports and FSIS).
classificationFDA and FSIS class (Class I, II, III) or the NHTSA recall type.
statusFDA: ongoing, completed, terminated or pending. FSIS: active or closed. Null for CPSC and NHTSA.
firms, productsRecalling firm, manufacturers, importers and distributors; product names.
distribution, unitsWhere it was sold or shipped, and how many units, as the agency states them.
flagsdo_not_drive, park_outside (NHTSA), public_health_alert, outbreak (FSIS), fda_mandated (FDA).
recall_date, report_dateWhen the recall started or was announced, and when the agency last published or reported it. See data sources for each agency's dates.
url, source_urlAgency notice and machine-readable source record.
as_ofWhen recallsapi.com last saw the record change.
identifiersOnly on /v1/recalls/{id}: kind, normalized value and the raw text it came from.