Docs menu

Docs / Search recalls

Search recalls

Last updated 2026-11-13

Full-text search across every category, with filters.

GET/v1/search · API key required

Searches recall records with the same full-text index as checkrecalls.org. It matches product names, brands, model numbers, recall numbers and UPCs across vehicles, motorcycles, RVs, car seats, tires, car equipment, consumer products, food, dietary supplements, drugs and medical devices. Each result has the same id you would use in /v1/recalls/{id}, and a source block with the agency, its own number and a link to the official notice.

A search shows what the official notices mention. A search with no results never means a product has no recall.

Parameters

NameInRequiredDescription
qqueryyesWhat to search for: at least 2 letters or numbers, at most 100 characters. Letters and numbers only are used. Example: bunk bed
categoryquerynovehicle, motorcycle, rv, car_seat, tire, equipment, consumer_product, food, dietary_supplement, drug, medical_device, ca_vehicle, ca_product, ca_food, uk_food, au_product, eu_product, uk_product, uk_medicine, meat_poultry or public_health_alert. Example: consumer_product
agencyquerynonhtsa, cpsc, fda, usda, tc, hc, cfia or fsa. Example: cpsc
fuzzyquerynotrue (default) or false. When nothing matches, names (makes, models, brands, companies, product and food names) are tried with a corrected spelling, for example toyta becomes toyota, and meta.corrected_query says what was searched. Recall numbers, UPCs, model numbers, VINs and anything with a digit are always exact. fuzzy=false turns the correction off. Example: false
statequerynoA U.S. state code such as TX. Keeps recalls sold nationwide, in that state, or with no clear distribution. A recall is only dropped when its notice clearly lists other states and not this one. Example: TX
fromquerynoOnly recalls dated on or after this day (YYYY-MM-DD, as the agency dates them). Example: 2026-01-01
toquerynoOnly recalls dated on or before this day. Example: 2026-06-30
pagequerynoPage number, 1 to 20 (default 1). Example: 1
per_pagequerynoResults per page, 1 to 50 (default 20). Example: 20

Request

curl https://recalldb.app/v1/search?q=bunk+bed&category=consumer_product \
  -H "Authorization: Bearer $RECALLDB_KEY"
const res = await fetch('https://recalldb.app/v1/search?q=bunk+bed&category=consumer_product', {
  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/search?q=bunk+bed&category=consumer_product", 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": "Arlopu Slide Playset Recall: CPSC Recall 27064",
      "category": "consumer_product",
      "issued_by": "Arlopu",
      "date": "2026-10-29",
      "units": "About 4,000",
      "units_affected": 4000,
      "distribution": {
        "type": "nationwide",
        "states": [],
        "as_listed": null
      },
      "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": {
    "query": "bunk bed",
    "total": 1,
    "capped": false,
    "page": 1,
    "per_page": 20,
    "total_pages": 1
  },
  "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

  • Each search counts as one request against your quota and is checked by the same fair-use rules as every other endpoint. Paging is capped at 20 pages of 50 (1,000 matches): narrow the search instead of paging further. meta.total is the real number of matches up to 10,000; when there are more, meta.total is 10000 and meta.capped is true (read it as "10,000 or more"). Only the first 1,000 matches can be paged, whatever the total.
  • Dates in the results are the agencies' own dates (ISO, no time zone). Other dates in the API are ISO dates in UTC; the checkrecalls.org pages show "last updated" in U.S. Eastern time.
  • Only published records are searched. Bulk collection by searching term after term is not allowed (see acceptable use).

Errors: error codes. Limits: rate limits.