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)

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.

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

Query parameters

source'fda_drug' | 'fda_device' | 'fda_food' | 'nhtsa' | 'cpsc'

Filter to a single agency / category. Omit to see all sources combined.

recall_numberstring

Recall identifier as filed (e.g., FDA 'D-1234-2026', NHTSA '26V652000'). Combine with source for direct doc lookup, fastest path; with source=nhtsa the answer also lists the campaign's vehicles.

recalling_firmstring

The recalling firm's name (e.g., 'Pfizer', 'Abbott', 'Whole Foods'). Case-insensitive. 4+ characters match anywhere in the text; 1-3 characters match a whole word ('3M', 'GE', 'ABC'). A term of 3+ characters searches EVERY recall. A 1-2 character term searches only a window: the newest 5,000 recalls (the oldest, with sort_order=asc) that your other filters select (source, dates, classification, status, a 3+ character term); coverage_warning says so, and since/until move the window.

product_descriptionstring

The product description (e.g., 'lithium', 'romaine', 'insulin pump'). Case-insensitive. 4+ characters match anywhere in the text; 1-3 characters match a whole word ('3M', 'GE', 'ABC'). A term of 3+ characters searches EVERY recall. A 1-2 character term searches only a window: the newest 5,000 recalls (the oldest, with sort_order=asc) that your other filters select (source, dates, classification, status, a 3+ character term); coverage_warning says so, and since/until move the window.

classification'Class I' | 'Class II' | 'Class III'

FDA severity classification. Class I is most severe (death / serious harm). Ignored for CPSC records.

statusstring

Exact match. Common values: 'Ongoing', 'Completed', 'Terminated', 'Recall Initiated'.

vehicle_makestring

NHTSA campaigns that name a vehicle of this make (e.g., 'Ford', 'Toyota'). Exact make, case- and space-insensitive. Matches NHTSA rows only.

vehicle_modelstring

NHTSA campaigns that name a vehicle model containing this text (e.g., 'F-150', 'Camry'). Matches NHTSA rows only. Case-insensitive. 4+ characters match anywhere in the text; 1-3 characters match a whole word ('3M', 'GE', 'ABC'). A term of 3+ characters searches EVERY recall. A 1-2 character term searches only a window: the newest 5,000 recalls (the oldest, with sort_order=asc) that your other filters select (source, dates, classification, status, a 3+ character term); coverage_warning says so, and since/until move the window.

vehicles_cursorstring

With source=nhtsa + recall_number: the vehicles_next_cursor of the previous answer, for the campaign's next 500 vehicles.

sincestring

ISO date (YYYY-MM-DD). Only recalls whose recall_initiation_date is on or after this date.

untilstring

ISO date (YYYY-MM-DD). Only recalls whose recall_initiation_date is on or before this date.

sort_by'recall_initiation_date' | 'posted_date'

Default: recall_initiation_date.

sort_order'desc' | 'asc'

Default: desc (most recent first).

limitinteger

Maximum records to return. Default 50, max 500.

Response

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

Changes

No recorded changes to this operation across all 1 revision of this API.