get_product_recalls
Returns safety recalls from federal agencies — drug recalls (FDA), medical device recalls (FDA), food/dietary supplement recalls (FDA), and (coming in v1A.1) vehicle recalls (NHTSA) and consumer-product recalls (CPSC). Use this when the user asks about: recent recalls for a specific company or product, FDA Class I (most severe) recalls, active vehicle recalls by make/model, food contamination recalls, drug shortages and 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 — Vehicle, tire, equipment, child-seat recalls. Deferred to v1A.1 (api.nhtsa.gov bulk endpoint pending investigation). 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. classification filter scope: 'classification' is an FDA-only field. CPSC records always have classification=null (CPSC doesn't use the FDA severity scheme). Filtering by classification excludes ALL CPSC rows by definition. The query response surfaces this with a notice in coverage_warning when the filter is set.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum records to return. Default 50, max 500. | |
| since | No | ISO date (YYYY-MM-DD). Only recalls whose recall_initiation_date is on or after this date. | |
| until | No | ISO date (YYYY-MM-DD). Only recalls whose recall_initiation_date is on or before this date. | |
| source | No | Filter to a single agency / category. Omit to see all sources combined. | |
| status | No | Exact match. Common values: 'Ongoing', 'Completed', 'Terminated', 'Recall Initiated'. | |
| sort_by | No | Default: recall_initiation_date. | |
| sort_order | No | Default: desc (most recent first). | |
| vehicle_make | No | NHTSA-only filter. Vehicle make, uppercase (e.g., 'TOYOTA', 'FORD'). Ignored for other sources. | |
| recall_number | No | Recall identifier as filed (e.g., FDA 'D-1234-2026'). Combine with source for direct doc lookup, fastest path. | |
| vehicle_model | No | NHTSA-only filter. Case-insensitive substring against vehicle model. Ignored for other sources. | |
| classification | No | FDA severity classification. Class I is most severe (death / serious harm). Ignored for NHTSA / CPSC records. | |
| recalling_firm | No | Case-insensitive substring against the recalling firm name (e.g., 'Pfizer', 'Toyota', 'Whole Foods'). | |
| product_description | No | Case-insensitive substring against the product description (e.g., 'lithium', 'romaine', 'airbag'). |