---
title: "Returns safety recalls from federal agencies — drug recalls (FDA), medical device recalls (FDA), food/dietary supplement recalls (FDA), consumer-product recalls (CPSC), and vehicle, equipment, tire and child-restraint recall campaigns (NHTSA, since 1966)"
method: GET
path: "/v1/product-recalls"
---

# Returns safety recalls from federal agencies — drug recalls (FDA), medical device recalls (FDA), food/dietary supplement recalls (FDA), consumer-product recalls (CPSC), and vehicle, equipment, tire and child-restraint recall campaigns (NHTSA, since 1966)

`GET /v1/product-recalls`

## Request

- Base URL: `https://api.keyvex.com`
- URL: `https://api.keyvex.com/v1/product-recalls`
- Auth: API key in header `x-api-key`

Returns safety recalls from federal agencies — drug recalls (FDA), medical device recalls (FDA), food/dietary supplement recalls (FDA), consumer-product recalls (CPSC), and vehicle, equipment, tire and child-restraint recall campaigns (NHTSA, since 1966). Use this when the user asks about: recent recalls for a specific company or product, FDA Class I (most severe) recalls, food contamination recalls, drug shortages and recalls, vehicle recalls by make or model (e.g. all Ford F-150 recalls), or to add a 'product-safety event' flag to insider activity / 8-K filings / enforcement actions.  Sources (filter via the `source` enum):   fda_drug   — openFDA /drug/enforcement.json. Drug recalls including                prescription, OTC, biologics. Class I/II/III severity.   fda_device — openFDA /device/enforcement.json. Medical device recalls                (implants, diagnostics, equipment, software). Same                classification scheme.   fda_food   — openFDA /food/enforcement.json. Food + dietary supplements.                Pathogen contamination, allergen mislabeling, etc.   cpsc       — saferproducts.gov RestWebServices/Recall. Consumer-product                recalls (clothing, electronics, toys, batteries, etc.). No                severity classification; classification field is null.   nhtsa      — NHTSA recall campaigns from NHTSA's flat files, updated daily.                One row per campaign (recall_number = NHTSA's campaign number,                e.g. '26V652000'); recalling_firm = the manufacturer that filed                the defect report; product_description = NHTSA's defect summary;                reason_for_recall = its consequence; remedy and notes as NHTSA                writes them. Consumer advisories first: do_not_drive (NHTSA                advises owners not to drive the vehicle until it is repaired)                and park_outside (park outside, away from structures: fire                risk); null on campaigns that predate the advisories.                product_quantity is NHTSA's potential units affected (null when                not stated); vehicle_model_year_count is the number of distinct                make/model/year combinations, not units. makes lists up to 20                makes ('+N more' beyond). A campaign's full vehicle list comes                only with source=nhtsa + recall_number: `vehicles` (500 per                page, by make / model / year), `vehicles_total`, and                `vehicles_next_cursor` (pass it back as vehicles_cursor).                classification and status are null (NHTSA uses neither).                A campaign NHTSA's file stops listing keeps its row: nhtsa_listing                says 'no longer listed by NHTSA' and nhtsa_unlisted_since is the                date KeyVex first observed it missing (NHTSA publishes no removal                date or reason); both are null while NHTSA lists it.                Source: NHTSA Office of Defects Investigation; public domain                (http://www.usa.gov/publicdomain/label/1.0/).  Cross-source pairing pattern:   Recall → 8-K Item 7.01/8.01:  pair with get_material_events   Recall → insider sells:       pair with get_insider_transactions   Recall → SEC/DOJ follow-on:   pair with get_enforcement_actions   Recall → company filings:     pair with get_proxy_filings (DEF 14A risk factors)  Each record is one recall. Identifier format: `{source}-{recall_number}` (e.g., 'fda_drug-D-1234-2026'). FDA classifications:   Class I   — serious adverse health consequence or death   Class II  — temporary or reversible health consequence   Class III — unlikely to cause adverse health consequence  Source freshness (per-source publication cadence, not KeyVex bug):   CPSC publishes within ~1-2 days; recent data flows hourly-fresh.   openFDA's snapshot updates every ~10-14 days, and each snapshot   carries recall_initiation_date values that LAG the snapshot date   by another 30-45 days (the time between FDA classifying a recall   and openFDA exposing it). Net: FDA records in this collection   typically run ~4-6 weeks behind real-world recall dates, while   CPSC is current. A default desc-by-date sort therefore looks   CPSC-heavy at the top even when FDA matters more for the query.   Filter by source='fda_*' to see FDA-only and avoid the skew.  Searching recalling_firm / product_description: case-insensitive; 4+ characters match anywhere, 1-3 characters match a whole word ('3M', 'GE'). A term of 3+ characters searches EVERY recall; a 1-2 character term searches only the newest 5,000 recalls the query's other filters select (the oldest, with sort_order=asc), and coverage_warning says so.  Vehicle filters (vehicle_make, vehicle_model) match NHTSA campaigns only, through their vehicles: vehicle_make is the exact make, case- and space-insensitive ('ford' = 'FORD'); vehicle_model follows the search rule above (3+ characters search every campaign; 1-2 characters the newest 5,000).  classification filter scope: 'classification' is an FDA-only field. CPSC and NHTSA records always have classification=null (neither uses the FDA severity scheme). Filtering by classification excludes ALL CPSC and NHTSA rows by definition. The query response surfaces this with a notice in coverage_warning when the filter is set.

## Query parameters

- `source` 'fda_drug' | 'fda_device' | 'fda_food' | 'nhtsa' | 'cpsc'
- `recall_number` string
- `recalling_firm` string
- `product_description` string
- `classification` 'Class I' | 'Class II' | 'Class III'
- `status` string
- `vehicle_make` string
- `vehicle_model` string
- `vehicles_cursor` string
- `since` string
- `until` string
- `sort_by` 'recall_initiation_date' | 'posted_date'
- `sort_order` 'desc' | 'asc'
- `limit` integer

## Response `200`

JSON envelope: { results: [...], count, has_more }.

## Other responses

- `400`: Invalid parameter.
- `401`: Missing or invalid API key.
- `402`: This tool requires a higher plan (upgrade_required). Retrying will not help.
- `429`: Tier rate/quota limit reached (rate_limited). Retry-After points at the reset.

---

[API](https://skmtc.dev/keyvex/apis/keyvex-api.md) · [All operations](https://skmtc.dev/keyvex/apis/keyvex-api/llms.txt) · [OpenAPI document](https://skmtc.dev/keyvex/apis/keyvex-api/revisions/01c0210c19cd?raw)
