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.
| Parameter | What to send |
|---|---|
upc | UPC, EAN or GTIN barcode, any spacing or dashes. gtin and ean are accepted as aliases. |
model | Model, part or catalog number. |
ndc | National Drug Code in any layout (4-4-2, 5-3-2, 5-4-1, with or without dashes). |
lot | Lot or batch code. |
brand | Brand or manufacturer as printed on the product. |
name | Product 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. |
establishment | USDA establishment number from a meat or poultry label (for example EST. M-1234A). |
How input is normalized
| Input | Normalized to | Notes |
|---|---|---|
| UPC, EAN, GTIN (8, 12, 13 or 14 digits) | GTIN-14 | When 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. |
| NDC | 11-digit package code and 9-digit product code | A 10-digit NDC without dashes is ambiguous, so all three layouts are tried. |
| Model | Uppercase letters and digits only | 3 to 30 characters and must contain a digit; all-digit models need at least 4 digits. |
| Lot | Uppercase letters and digits only | 3 to 24 characters and must contain a digit. |
| Brand | Compact key | Accents, punctuation and words such as Inc, LLC, Co and Corp are dropped ("Char-Broil" becomes CHARBROIL). |
| Name | Words | Lowercased, common words removed, brand words removed. |
Response
resolved:identifiers(kind and normalized value),brand(the compact key) andname_tokens.matches: up to 25, highest confidence first, then newest recall date. Each hasconfidence,reasonsand the full recall object.
Confidence levels
| Level | When |
|---|---|
| exact | A GTIN (from your UPC, EAN or GTIN) or an 11-digit NDC package code appears in the recall's identifiers. |
| strong | A 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. |
| possible | A 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
| Query | Confidence | Reasons | Recall |
|---|---|---|---|
upc=041548000121 | exact | gtin 00041548000121 | fda-H-1268-2026 |
upc=087906010180 | strong | gtin 00087906010180 (the agency printed this barcode with a wrong check digit; corrected) | fda-H-1339-2026 |
upc=099143020044 | exact | gtin 00099143020044 | cpsc-24116 |
ndc=16729-457-15 | exact | ndc 16729045715; ndc9 167290457 | fda-D-0775-2026 and 24 more FDA recalls of that product |
brand=Everything Sproutsname=protein sprout mixlot=222 | strong | lot 222; brand; name: protein sprout mix | fda-H-1339-2026 |
brand=Char-Broilname=digital electric smoker | possible | brand; name: digital electric smoker | cpsc-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"}.
GET /v1/recalls
Search recall records. All parameters are optional.
| Parameter | Meaning |
|---|---|
q | Words 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. |
category | consumer_product, food, drug, device, vehicle, vehicle_equipment, tire, child_seat or meat_poultry. |
source | cpsc, fda_food, fda_drug, fda_device, nhtsa or fsis. |
since, until | Recall date range, YYYY-MM-DD, inclusive. |
limit | 1 to 100, default 20. |
cursor | The 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
| Field | Meaning |
|---|---|
id | Stable id: source prefix plus the agency recall number. |
agency, source, source_id | CPSC, FDA, USDA FSIS or NHTSA; the feed it came from; the agency's own recall number. |
category | One of the nine categories listed under search. |
title, description, hazard, remedy | Text from the agency record. remedy is null when the source has none (FDA enforcement reports and FSIS). |
classification | FDA and FSIS class (Class I, II, III) or the NHTSA recall type. |
status | FDA: ongoing, completed, terminated or pending. FSIS: active or closed. Null for CPSC and NHTSA. |
firms, products | Recalling firm, manufacturers, importers and distributors; product names. |
distribution, units | Where it was sold or shipped, and how many units, as the agency states them. |
flags | do_not_drive, park_outside (NHTSA), public_health_alert, outbreak (FSIS), fda_mandated (FDA). |
recall_date, report_date | When 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_url | Agency notice and machine-readable source record. |
as_of | When recallsapi.com last saw the record change. |
identifiers | Only on /v1/recalls/{id}: kind, normalized value and the raw text it came from. |