---
title: "Is this product recalled?"
method: GET
path: "/v1/check"
---

# Is this product recalled?

`GET /v1/check`

## Request

- Base URL: `https://api.recallsapi.com`
- URL: `https://api.recallsapi.com/v1/check`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`
  - API key in header `X-Credit-Token`
  - none

Give any mix of name, brand, barcode, model, NDC and lot. Identifiers are normalized (UPC to GTIN-14, NDC to 11 digits) before matching. `signals` lists up to 10 early-warning signals (NHTSA investigations, CPSC violation notices, SEC filings, Prop 65 notices, SaferProducts.gov incident reports) whose identifiers carry the product's model, vehicle, campaign or brand key; a signal is not a recall and has no confidence level. `adverse_events` (only when both brand and model are given) holds live FDA MAUDE medical device report counts for that brand and model from openFDA: total, last 12 months, by event type, last report date and the openFDA link; null when openFDA holds nothing. A count is not a safety determination. `receipt=1` adds a signed receipt of the check (see the Receipt schema).

## Query parameters

- `name` string
- `brand` string
- `upc` string
- `model` string
- `ndc` string
- `lot` string
- `receipt` '1' | 'true'

## Response `200`

OK

- object
  - `resolved` object
  - `matches` Match[]
    - `confidence` 'exact' | 'strong' | 'possible': exact: barcode or NDC package code; strong: identifier confirmed by brand or a distinctive model; possible: brand and name overlap or a weak identifier
    - `reasons` string[]
    - `recall` Recall
      - `id` string
      - `agency` 'CPSC' | 'FDA' | 'NHTSA' | 'USDA FSIS' | 'US Coast Guard' | 'FAA' | 'HUD' | 'NIOSH' | 'MSHA'
      - `source` 'cpsc' | 'fda_food' | 'fda_drug' | 'fda_device' | 'nhtsa' | 'fsis' | 'uscg' | 'faa' | 'hud' | 'niosh' | 'msha' | 'fda_press' | 'fda_hfcs' | 'fda_ires'
      - `source_id` string: The agency recall number, Federal Register document number, or a stable slug for notices without a number
      - `category` 'consumer_product' | 'food' | 'drug' | 'device' | 'vehicle' | 'vehicle_equipment' | 'tire' | 'child_seat' | 'meat_poultry' | 'boat' | 'aircraft' | 'manufactured_home' | 'respirator' | 'mine_equipment' | 'unclassified' | 'cosmetic' | 'tobacco' | 'biologic' | 'veterinary'
      - `title` string
      - `description` string, nullable
      - `hazard` string, nullable
      - `remedy` string, nullable
      - `classification` string, nullable: FDA and FSIS class (Class I, II, III), NHTSA recall type, Coast Guard recall type (Boat, Engine or equipment), Federal Register document type, or notice type
      - `status` string, nullable
      - `firms` string[]
      - `products` string[]
      - `distribution` string, nullable
      - `units` string, nullable
      - `flags` string[]
      - `recall_date` string, date, nullable
      - `report_date` string, date, nullable
      - `url` string, uri: Agency notice
      - `source_url` string, uri: Machine-readable source record
      - `first_seen` string, date-time: When recallsapi.com first stored this record
      - `as_of` string, date-time: When recallsapi.com last saw this record change
      - `identifiers` object[]
        - `kind` string
        - `value` string
        - `raw` string
  - `signals` SignalHit[]
    - `id` string
    - `source` 'nhtsa_inv' | 'cpsc_nov' | 'globenewswire' | 'sec' | 'prop65' | 'spdb'
    - `kind` 'investigation' | 'violation' | 'press_release' | 'filing' | 'prop65_notice' | 'incident'
    - `title` string
    - `signal_date` string, date, nullable
    - `end_date` string, date, nullable
    - `status` string, nullable
    - `url` string, uri
    - `reasons` string[]: The identifier each match rests on: "model KDB504B", "mmy HONDA|CIVIC|2016", "mm HONDA|CIVIC", "campaign 16V218000" or "brand HONDA"
  - `adverse_events` object, nullable
    - `source` string
    - `brand` string
    - `model` string
    - `reports_total` integer
    - `reports_last_12_months` integer
    - `last_report_date` string, nullable
    - `by_event_type` object
      - `malfunction` integer
      - `injury` integer
      - `death` integer
    - `url` string
    - `note` string
  - `receipt` Receipt: A dated, verifiable record of what recallsapi.com held when a product was checked: the normalized input, match counts, the state of every source and a plain statement, signed with Ed25519. It is not a safety certification and absence of a match does not mean a product is safe. Stored for 400 days.
    - `id` string
    - `issued_at` string, date-time
    - `issuer` 'recallsapi.com (PrimeZen LLC)'
    - `input` object: The normalized input: the resolved block of the check
    - `result` object
      - `matches` object
        - `exact` integer
        - `strong` integer
        - `possible` integer
      - `signals` integer: Early-warning signals in the answer
      - `adverse_events` boolean, nullable: true when FDA MAUDE held reports for the brand and model; false when both were given and the live lookup answered nothing; null when the check did not look
    - `sources` object[]: Every recall source, as /v1/health reported it at issue time
      - `source` string
      - `status` 'ok' | 'stale' | 'pending' | 'coming_soon'
      - `last_success` string, date-time, nullable
      - `records` integer
      - `newest_record` string, nullable
    - `signal_sources` object[]: Every early-warning signal source at issue time
      - `source` string
      - `status` 'ok' | 'stale' | 'pending' | 'coming_soon'
      - `last_success` string, date-time, nullable
      - `records` integer
      - `newest_record` string, nullable
    - `statement` string: What was or was not found, as of issued_at, and what the receipt is not
    - `signature` object, nullable: null while signing is not enabled (then note says so)
      - `alg` 'Ed25519'
      - `kid` string: First 8 hex characters of the SHA-256 of the SPKI public key; look it up in /.well-known/recallsapi-keys.json
      - `value` string: base64url Ed25519 signature over the canonical JSON (object keys sorted recursively, arrays in order, no whitespace) of the receipt without the signature field
    - `note` string: Only when signature is null
    - `verify_url` string, uri: GET returns the stored receipt without a key

## Other responses

- `400`: Invalid input
- `401`: Missing or invalid API key
- `402`: Payment Required: x402 v2 payment requirements (scheme exact, USDC on Base, amount in base units, payTo) in the PAYMENT-REQUIRED header as base64 JSON, and the same object as the body
- `429`: Daily quota reached

---

[API](https://skmtc.dev/recallsapi/apis/recallsapi-com.md) · [All operations](https://skmtc.dev/recallsapi/apis/recallsapi-com/llms.txt) · [OpenAPI document](https://skmtc.dev/recallsapi/apis/recallsapi-com/revisions/2501df40ea54?raw)
