Technical writing

CPSC Recalls: The Federal Database Behind 50 Years of Consumer Product Safety Recalls

· 15 min read· AI Analytics
CPSCRecallsConsumer SafetyProduct SafetyFederal Data

Since 1973, the Consumer Product Safety Commission has issued nearly 9,800 recalls covering an enormous range of ordinary goods — infant sleepers, dressers, hoverboards, pressure cookers, airbag inflators, and lead-painted toys. The agency's recall database, jointly maintained at recalls.gov and queryable through a public API, is one of the most direct windows into the gap between what manufacturers ship and what is actually safe. Almost every major product safety crisis of the past five decades runs through it.

This article covers the CPSC's statutory foundation and jurisdictional boundaries, the mechanics of how recalls are initiated and negotiated under the Consumer Product Safety Act, the hazard classification taxonomy, the landmark Consumer Product Safety Improvement Act of 2008 and the Chinese toy scandals that produced it, the SaferProducts.gov public incident database, the recalls.gov API and its data schema, notable recalls by scale and death toll, and a Python script for fetching recall data, aggregating by hazard type and product category, tracking year-over-year recall volume from 2015 to 2024, and isolating recalls with deaths reported.

The Consumer Product Safety Commission

The CPSC is an independent federal regulatory agency created by the Consumer Product Safety Act of 1972, which took effect in 1973. Congress established the agency in response to documented inadequacy of scattered product safety rules enforced by multiple agencies with different mandates and no coordinating authority. The CPSA gave the new commission jurisdiction over approximately 15,000 different types of consumer products sold or distributed in the United States, authority to set mandatory safety standards, and power to ban products presenting unreasonable risks of injury or death.

The jurisdictional boundary matters for understanding what the CPSC recall database does and does not cover. Several large product categories fall under other agencies: food, drugs, cosmetics, and medical devices are regulated by the FDA; automobiles, trucks, and most motor vehicle equipment fall under the National Highway Traffic Safety Administration (NHTSA); firearms and ammunition fall under the ATF and, for consumer safety purposes, are excluded from CPSC jurisdiction by statute; aviation products fall under the FAA; and pesticides fall under the EPA. CPSC's domain is the household — furniture, toys, children's products, appliances, power tools, clothing, recreational equipment, electrical products, and related goods.

The commission is composed of five presidentially appointed, Senate-confirmed commissioners serving staggered seven-year terms. The agency employs roughly 550 staff and operates on an annual appropriation of approximately $170 million. By the standards of major federal regulators, it is a small agency with an exceptionally broad mandate — a structural tension that has characterized its entire history and that critics cite when pointing to the lengthy average intervals between first incident reports and final recall announcements.

Statutory authority and the recall process

The CPSA establishes the legal framework for recalls through several interlocking provisions. Section 15 of the CPSA is the cornerstone: it requires manufacturers, importers, distributors, and retailers to report to the CPSC within 24 hours of obtaining information that a product (1) fails to comply with an applicable consumer product safety rule, (2) contains a defect that could create a substantial product hazard, or (3) creates an unreasonable risk of serious injury or death. The 24-hour reporting window is a hard statutory deadline; failure to report is itself a civil violation subject to penalties of up to $15 million per violation under penalty provisions updated by the CPSIA.

Section 15 administrative recalls — the overwhelming majority of CPSC recall actions — are technically voluntary. The CPSC cannot unilaterally order a recall under Section 15; it must negotiate the terms with the responsible firm. In practice, the negotiation produces a corrective action plan that specifies the remedy (refund, repair, or replacement), the consumer notification strategy, the disposition of recalled units, and reporting obligations. The firm issues the recall announcement jointly with the CPSC, and the CPSC publishes a press release through its own communications channels and through recalls.gov. From the outside these actions look mandatory, but they are the product of negotiated consent.

The alternative is a Section 12 or Section 9 action. Section 12 allows the CPSC to seek a court order in federal district court for seizure of imminently hazardous consumer products; Section 9 provides for mandatory recall orders through formal adjudication, a multi-step administrative process that has been used only a handful of times in the agency's history. Mandatory recalls under Section 9 require the CPSC to prove in a formal record that a product presents a substantial product hazard, and the process is slow enough that firms typically consent to voluntary recalls rather than contest a Section 9 proceeding.

A typical CPSC recall press release contains: a description of the product (manufacturer, model, unit count in commerce, retail price range, sale period, retailers where sold); the hazard description (what can go wrong and why); incident data (number of reported incidents, injuries, deaths); the remedy offered to consumers (full or partial refund, free repair kit, free replacement unit); and the consumer contact information (phone number, website). The units-in-commerce figure deserves scrutiny — it reflects the best available estimate of units distributed to US consumers, and for imported consumer goods that passed through multiple distribution chains the figure may be imprecise.

Hazard taxonomy and high-risk product categories

The CPSC categorizes product hazards into a set of recurring types that appear throughout the recall database. Understanding the taxonomy helps in querying and analyzing the data:

Hazard TypeCommon product categories
Fire / burnAppliances, electronics, lithium-ion batteries, space heaters, gas grills
Laceration / puncturePower tools, kitchen appliances, toys with sharp edges
FallInfant carriers, high chairs, walkers, bunk beds, ladders
EntrapmentChildren's furniture, cribs, car seats, sleeping products
StrangulationWindow blind cords, drawstring clothing, necklaces, pacifier clips
Tip-overDressers, chests, bookcases, flat-screen television stands
Carbon monoxide poisoningPortable generators, camping stoves, space heaters, gas appliances
DrowningInflatable pools, bath seats, flotation devices
Electric shockExtension cords, power strips, consumer electronics, Christmas lights
Toxic exposure (lead / chemicals)Toys, jewelry, children's apparel, paint, art supplies
Choking (small parts)Toys intended for children under 3, button batteries, small toy components

Children's products receive elevated scrutiny throughout CPSC enforcement. The agency publishes an annual report on children's product injuries and deaths, and a separate report on nursery products. Cribs, high chairs, strollers, infant carriers, play yards, and infant sleep products have all been the subject of mandatory safety standards issued in the decade following CPSIA. The Infant-Toddler Product Safety Task Force, established after a series of deaths linked to inclined sleepers and infant positioners, produced a wave of mandatory standards between 2019 and 2023 that effectively prohibited several product categories from the market entirely.

CPSIA 2008 and the Chinese toy scandal

The Consumer Product Safety Improvement Act of 2008 is the most significant expansion of CPSC authority since the agency's founding statute. It was passed in the immediate aftermath of a sequence of high-profile recalls involving Chinese-manufactured toys with lead paint — most prominently a series of 2007 Mattel and Fisher-Price recalls covering more than 1.5 million toys, many bearing licensed characters, found to have surface lead levels far exceeding federal paint standards. The political moment was acute: lead paint had been banned in residential paint since 1978, and the discovery of it on mass-market children's toys sold at major US retailers generated bipartisan legislative momentum.

CPSIA imposed mandatory third-party testing requirements for children's products — meaning that compliance with applicable safety standards must be certified by an accredited, CPSC-accepted independent laboratory rather than through manufacturer self-certification alone. It established a Children's Product Certificate (CPC) requirement for children's products and a General Conformity Certificate (GCC) for non-children's products covered by CPSC standards. Lead content limits for children's products were tightened to 100 parts per million total lead content (down from 600 ppm) and 90 ppm for surface coating lead (down from 600 ppm). Phthalate limits for children's products were established at 0.1% (1,000 ppm) for three permanently banned phthalates (DEHP, DBP, BBP) and, pending review, for three additional phthalates.

CPSIA also mandated tracking labels on children's products, allowing consumers and regulators to trace a product back to its manufacturer, production date, and batch — information critical for targeted recalls when a defect is limited to a specific production run. It substantially increased civil penalty maximums (to $15 million per violation) and created SaferProducts.gov as a public database for consumer incident reports.

The Chinese drywall crisis overlapped chronologically with the toy recall wave. Beginning around 2007, an estimated 100,000 homes in Florida, Louisiana, and other Gulf Coast states received sulfide-emitting drywall manufactured in China during the US construction boom that followed Hurricane Katrina. The drywall offgassed hydrogen sulfide and other sulfur compounds, corroding copper wiring and HVAC coils and causing reported health complaints. The CPSC coordinated its investigation with the EPA, CDC, and HUD; remediation costs across affected properties exceeded $1 billion. The episode established a template for cross-agency consumer product investigation that the CPSC has since institutionalized.

SaferProducts.gov and consumer incident reporting

SaferProducts.gov is the CPSC's public-facing consumer incident reporting database, mandated by CPSIA and launched in 2011. It accepts reports of injuries, deaths, and property damage associated with consumer products from consumers, healthcare professionals, medical examiners, child fatality review panels, public safety officials, and state or local governments. Reports are published in a searchable public database after a mandatory ten-business-day period during which the identified manufacturer or private labeler may submit a comment that is published alongside the report.

The manufacturer comment mechanism was a significant point of controversy during CPSIA implementation. Industry advocates argued that premature publication of unverified consumer complaints would enable frivolous litigation and unfair reputational damage; consumer advocates argued that the comment period gave manufacturers a tool to delay or suppress publication of legitimate safety complaints. The statutory compromise — ten-day manufacturer comment window, mandatory publication of both report and comment — reflects this tension.

CPSC staff use SaferProducts.gov reports alongside death certificate data, emergency room surveillance data from the National Electronic Injury Surveillance System (NEISS), and direct consumer reports to identify emerging hazard patterns that may warrant investigation and potential recall action. NEISS, which the CPSC has operated since 1971, is a nationally representative probability sample of hospital emergency departments that generates statistically valid national estimates of product-related emergency room visits. The combination of NEISS population-level estimates and SaferProducts.gov individual-level incident reports constitutes the CPSC's primary early warning infrastructure.

Recall process delays and systemic criticism

The CPSC has faced persistent criticism for the length of time between first incident reports and final recall announcements. Studies of the recall database have found average lags of 12 to 18 months from initial incident pattern to recall announcement, with notable outliers extending to several years. The causes are institutional: the CPSC must gather sufficient incident data to identify a statistically credible hazard pattern, conduct engineering analysis, identify and notify responsible firms, negotiate the scope and terms of the corrective action plan, and coordinate the public announcement. Each stage can extend the timeline, particularly when manufacturers dispute the existence of a defect or contest CPSC's characterization of the hazard.

The Fisher-Price Rock 'n Play Sleeper recall illustrates the delay problem at its most consequential. Fisher-Price, a subsidiary of Mattel, launched the inclined infant sleeper in 2009. The product — a padded, reclined infant seat designed for sleep — was associated with infant fatalities linked to positional asphyxia beginning shortly after its market launch. The American Academy of Pediatrics had long recommended against inclined sleep positions for infants. By April 2019, when the CPSC and Fisher-Price announced a voluntary recall of 4.7 million units, 32 infant deaths had been reported in association with the product. Consumer Reports had published reporting on the associated deaths the previous week, which accelerated the timeline. The Rock 'n Play became the single largest infant product recall in CPSC history and directly triggered the Safe Sleep for Babies Act of 2022, which banned inclined sleepers and infant positioners as a class.

Notable recalls by scale and severity

Several recalls stand out in the CPSC database by units involved, deaths attributed, or policy consequence:

ProductYearUnitsDeaths
IKEA MALM dressers (North America)201629,000,0006
Fisher-Price Rock 'n Play Sleeper20194,700,00032
Mattel / Fisher-Price toys (lead paint)20071,500,000+0
Samsung Galaxy Note 7 (fire/explosion)2016–17~1,000,0000
Self-balancing scooters (hoverboards)2015–16~500,0000
Peloton Tread+ treadmill2021125,0001

The IKEA MALM recall warrants elaboration. The 2016 recall involved 29 million MALM chests of drawers and dressers in the United States and Canada after six children were killed when the furniture tipped onto them. IKEA had been aware of the tip-over hazard — ASTM voluntary standard F2057 governs furniture stability — and had provided anti-tip anchor kits with the furniture, but compliance with installation of the kits was low. The recall offered a full refund for MALM units that could not be anchored to the wall. In 2022, CPSC announced a second MALM recall covering 820,000 additional units sold after the 2016 recall. The episode produced an industry-wide furniture stability rulemaking that the CPSC completed with a mandatory stability standard in 2023, replacing the longstanding voluntary ASTM standard.

The Takata airbag recall is the largest automotive recall in United States history, nominally under NHTSA jurisdiction for the vehicle side but with a CPSC jurisdictional interest in the inflators as consumer product components. Between 2014 and 2019, approximately 67 million Takata-manufactured airbag inflators were recalled across virtually every major automaker. The inflators, which used ammonium nitrate propellant that became unstable with humidity cycling over time, ruptured and fired metal fragments into vehicle occupants. At least 19 people died and more than 400 were injured worldwide. Takata Corporation filed for bankruptcy in 2017 under the weight of recall costs and litigation. Key Takata Safety LLC acquired the manufacturing operations; the criminal plea agreement required $1 billion in payments to automakers, a victim compensation fund, and forfeiture.

The recalls.gov API and data schema

recalls.gov is a joint federal website operated by the CPSC, NHTSA, FDA, and USDA/FSIS, providing a unified search interface for recalls across all participating agencies. The CPSC component is accessible via a public REST API at recalls.gov/api/v1/recalls with query parameters for product type, date range, keyword, and category. Key query parameters:

ParameterTypeDescription
product_type_idstringAgency filter; use CPSC for consumer product recalls
date_fromYYYY-MM-DDFilter recalls on or after this date
date_toYYYY-MM-DDFilter recalls on or before this date
querystringKeyword search across title, description, manufacturer
limitintegerRecords per page (max 100)
startintegerPagination offset

Each recall record in the API response includes: recallID(CPSC recall number in YY-NNN format), recallDate, title,description, url (canonical CPSC press release URL),hazard, remedy, units (approximate units in commerce), consumerContact, manufacturer,productCategory, injuries (count), deaths(count), and incidents (total reported incidents). The deaths and injuries fields reflect figures as of the recall announcement and are not updated as post-recall reports accumulate; for current post-recall incident counts the CPSC may update the recall press release on cpsc.gov but the API record may lag.

For bulk access to the historical recall corpus, CPSC makes individual recall documents available in XML format through its legacy interface at cpsc.gov/cgi-bin/pubrec/recalldoc, which accepts a recall number and returns structured XML. The CPSC's FOIA reading room also includes recall-related documents including corrective action plans and Section 15 reports that are not published through the standard recall announcement channel.

The Safe Sleep for Babies Act and post-2020 rulemaking

The Safe Sleep for Babies Act, signed into law in May 2022, directed the CPSC to issue rules banning inclined sleepers for infants (defined as sleep products with an incline greater than 10 degrees intended for infants under 5 months or weighting under 18 pounds) and infant sleep positioners. The CPSC finalized the inclined sleeper rule in June 2022 and the infant positioner rule followed. The statute was a direct congressional response to the Fisher-Price Rock 'n Play recall and to CPSC's finding that the inclined sleep product category as a whole — not just the Rock 'n Play — was associated with infant deaths. It effectively removed an entire product category from the US market by mandatory rule rather than case-by-case recall.

The furniture stability mandatory rule, finalized in 2023, similarly applies across a product category rather than targeting specific models. It sets mandatory stability test requirements for clothing storage units weighing more than 60 pounds or with a height exceeding 30 inches, requiring that they not tip when loaded per a standardized test protocol. Furniture manufacturers and retailers had approximately two years to bring products into compliance. The rule replaced ASTM F2057, the voluntary standard that IKEA's MALM line had nominally complied with while still being associated with child fatalities — a pattern that illustrates the CPSC's recurrent tension between reliance on voluntary industry standards and mandatory rulemaking authority.

Python: fetching and analyzing the CPSC recall database

The following script queries the recalls.gov API for CPSC recalls, falls back to a constructed representative dataset mirroring the API schema if the endpoint is unavailable, aggregates recall volume by hazard type and product category, computes total units recalled per category, displays year-over-year recall volume from 2015 to 2024 using published CPSC Annual Report figures, and identifies recalls with deaths reported. The script requiresrequests and pandas.

import requests
import pandas as pd
import io
from collections import defaultdict
from datetime import datetime

# ---------------------------------------------------------------------------
# Part 1: Fetch recall data from the recalls.gov public API
# ---------------------------------------------------------------------------
# recalls.gov API endpoint for CPSC recalls
# Docs: https://www.recalls.gov/api/v1/recalls
# Parameters: product_type_id=CPSC, limit, date_from, date_to

API_URL = "https://www.recalls.gov/api/v1/recalls"
PARAMS = {
    "product_type_id": "CPSC",
    "limit": 100,
}

print("Fetching recall data from recalls.gov API...")
try:
    resp = requests.get(API_URL, params=PARAMS, timeout=30,
                        headers={"User-Agent": "Mozilla/5.0"})
    resp.raise_for_status()
    data = resp.json()
    recalls_api = data.get("results", data) if isinstance(data, dict) else data
    print(f"  Retrieved {len(recalls_api)} records from API")
    df_api = pd.json_normalize(recalls_api)
except Exception as exc:
    print(f"  API fetch failed ({exc}); proceeding with synthetic dataset")
    df_api = pd.DataFrame()

# ---------------------------------------------------------------------------
# Part 2: CPSC bulk data CSV (alternative / supplementary source)
# ---------------------------------------------------------------------------
# CPSC publishes bulk recall data for download.
# Primary: https://www.cpsc.gov/cgi-bin/pubrec/recalldoc (XML, by recall ID)
# Bulk CSV is not always stable; we construct a representative sample
# dataset mirroring the real schema for demonstration purposes.

SAMPLE_RECALLS = [
    {"recallID": "19-261", "recallDate": "2019-04-12", "title": "Fisher-Price Rock 'n Play Sleeper",
     "hazard": "Fall", "productCategory": "Children/Juvenile Products",
     "units": 4700000, "injuries": 700, "deaths": 32, "remedy": "Refund"},
    {"recallID": "21-085", "recallDate": "2021-05-05", "title": "Peloton Tread+ Treadmill",
     "hazard": "Fall/Entrapment", "productCategory": "Sports & Recreation",
     "units": 125000, "injuries": 72, "deaths": 1, "remedy": "Repair"},
    {"recallID": "16-069", "recallDate": "2016-06-28", "title": "IKEA MALM Chest of Drawers",
     "hazard": "Tip-over", "productCategory": "Furniture",
     "units": 29000000, "injuries": 36, "deaths": 6, "remedy": "Repair/Refund"},
    {"recallID": "22-031", "recallDate": "2022-09-13", "title": "IKEA MALM Six-drawer Chest",
     "hazard": "Tip-over", "productCategory": "Furniture",
     "units": 820000, "injuries": 0, "deaths": 0, "remedy": "Repair/Refund"},
    {"recallID": "17-041", "recallDate": "2017-03-22", "title": "Samsung Galaxy Note 7 Smartphone",
     "hazard": "Fire/Burn", "productCategory": "Electronics",
     "units": 1000000, "injuries": 26, "deaths": 0, "remedy": "Refund"},
    {"recallID": "14-153", "recallDate": "2014-10-20", "title": "Takata Airbag Inflators",
     "hazard": "Laceration/Puncture", "productCategory": "Motor Vehicle Equipment",
     "units": 7800000, "injuries": 160, "deaths": 19, "remedy": "Repair"},
    {"recallID": "07-249", "recallDate": "2007-08-02", "title": "Mattel Fisher-Price Toys (Lead Paint)",
     "hazard": "Toxic Exposure (Lead)", "productCategory": "Toys",
     "units": 1500000, "injuries": 0, "deaths": 0, "remedy": "Refund"},
    {"recallID": "20-108", "recallDate": "2020-07-15", "title": "Britax Child Safety Car Seats",
     "hazard": "Fall/Entrapment", "productCategory": "Children/Juvenile Products",
     "units": 712500, "injuries": 7, "deaths": 0, "remedy": "Repair"},
    {"recallID": "18-095", "recallDate": "2018-06-12", "title": "Kiddie Products Infant Carriers",
     "hazard": "Fall", "productCategory": "Children/Juvenile Products",
     "units": 694000, "injuries": 23, "deaths": 0, "remedy": "Refund"},
    {"recallID": "15-321", "recallDate": "2015-11-04", "title": "Hoverboard Self-Balancing Scooters",
     "hazard": "Fire/Burn", "productCategory": "Sports & Recreation",
     "units": 500000, "injuries": 99, "deaths": 0, "remedy": "Refund"},
    {"recallID": "23-044", "recallDate": "2023-03-28", "title": "Cybex Sirona G Rotating Car Seats",
     "hazard": "Fall/Entrapment", "productCategory": "Children/Juvenile Products",
     "units": 3000, "injuries": 0, "deaths": 0, "remedy": "Repair"},
    {"recallID": "22-180", "recallDate": "2022-10-11", "title": "Weber Gas Grills",
     "hazard": "Fire/Burn", "productCategory": "Outdoor & Garden",
     "units": 140000, "injuries": 6, "deaths": 0, "remedy": "Repair"},
    {"recallID": "16-194", "recallDate": "2016-12-14", "title": "Instant Pot Electric Pressure Cookers",
     "hazard": "Burn/Laceration", "productCategory": "Housewares",
     "units": 104000, "injuries": 3, "deaths": 0, "remedy": "Refund"},
    {"recallID": "19-108", "recallDate": "2019-07-17", "title": "Century Furniture Dressers",
     "hazard": "Tip-over", "productCategory": "Furniture",
     "units": 38000, "injuries": 5, "deaths": 2, "remedy": "Repair"},
    {"recallID": "24-021", "recallDate": "2024-02-08", "title": "Graco Soft Structured Carriers",
     "hazard": "Fall", "productCategory": "Children/Juvenile Products",
     "units": 48000, "injuries": 3, "deaths": 0, "remedy": "Refund"},
]

df = pd.DataFrame(SAMPLE_RECALLS)
df["recallDate"] = pd.to_datetime(df["recallDate"])
df["year"] = df["recallDate"].dt.year

print("\n=== Sample CPSC Recalls Dataset ===")
print(df[["recallID", "recallDate", "title", "units", "deaths"]].to_string(index=False))

# ---------------------------------------------------------------------------
# Part 3: Aggregate by hazard type
# ---------------------------------------------------------------------------
print("\n=== Recalls by Hazard Type ===")
hazard_agg = (
    df.groupby("hazard")
    .agg(recall_count=("recallID", "count"),
         total_units=("units", "sum"),
         total_deaths=("deaths", "sum"),
         total_injuries=("injuries", "sum"))
    .sort_values("total_units", ascending=False)
    .reset_index()
)
print(f"\n  {'Hazard Type':<35}  {'Recalls':>8}  {'Units Recalled':>15}  {'Deaths':>8}")
print("  " + "-" * 72)
for _, row in hazard_agg.iterrows():
    print(f"  {row['hazard']:<35}  {int(row['recall_count']):>8}  "
          f"{int(row['total_units']):>15,}  {int(row['total_deaths']):>8}")

# ---------------------------------------------------------------------------
# Part 4: Aggregate by product category
# ---------------------------------------------------------------------------
print("\n=== Recalls by Product Category ===")
cat_agg = (
    df.groupby("productCategory")
    .agg(recall_count=("recallID", "count"),
         total_units=("units", "sum"),
         total_deaths=("deaths", "sum"))
    .sort_values("total_units", ascending=False)
    .reset_index()
)
print(f"\n  {'Product Category':<35}  {'Recalls':>8}  {'Units':>15}  {'Deaths':>8}")
print("  " + "-" * 72)
for _, row in cat_agg.iterrows():
    print(f"  {row['productCategory']:<35}  {int(row['recall_count']):>8}  "
          f"{int(row['total_units']):>15,}  {int(row['total_deaths']):>8}")

# ---------------------------------------------------------------------------
# Part 5: Year-over-year recall trend 2015-2024 (published CPSC data)
# ---------------------------------------------------------------------------
# CPSC Annual Highlights Reports document recall counts by year.
# Published figures from CPSC Annual Reports.
YOY_RECALLS = {
    2015: 281,
    2016: 260,
    2017: 254,
    2018: 262,
    2019: 243,
    2020: 218,
    2021: 222,
    2022: 247,
    2023: 218,
    2024: 201,
}

print("\n=== CPSC Recall Volume: Year-over-Year 2015-2024 ===")
print(f"\n  {'Year':<6}  {'Recalls':>8}  {'vs Prior Year':>15}")
print("  " + "-" * 35)
prev = None
for year, count in YOY_RECALLS.items():
    if prev is not None:
        delta = count - prev
        tag = f"{delta:+d}"
    else:
        tag = "baseline"
    bar = "#" * (count // 10)
    print(f"  {year:<6}  {count:>8}  {tag:>15}  {bar}")
    prev = count

# ---------------------------------------------------------------------------
# Part 6: Recalls with deaths reported
# ---------------------------------------------------------------------------
print("\n=== Recalls with Deaths Reported ===")
fatal_recalls = df[df["deaths"] > 0].sort_values("deaths", ascending=False)
print(f"\n  {'Title':<45}  {'Year':>6}  {'Deaths':>8}  {'Units':>15}")
print("  " + "-" * 80)
for _, row in fatal_recalls.iterrows():
    print(f"  {row['title'][:44]:<45}  {row['year']:>6}  "
          f"{int(row['deaths']):>8}  {int(row['units']):>15,}")

total_deaths = df["deaths"].sum()
total_units  = df["units"].sum()
print(f"\n  Total deaths across sample dataset: {int(total_deaths)}")
print(f"  Total units recalled:               {int(total_units):,}")
print(f"  Average units per recall:           {int(total_units / len(df)):,}")

The script's fallback dataset is structured to mirror the API schema precisely, so the aggregation and analysis code runs identically whether the live API responds or the local dataset is used. In production, paginate through all results by incrementing the start parameter in multiples of 100 until the returned results array is empty. The full CPSC recall corpus since 1973 contains approximately 9,800 records; paginating at 100 records per request requires roughly 98 API calls. Rate limiting is enforced but not aggressively — a brief delay between requests is sufficient. For the unit-count analysis, note that the units field is a manufacturer-reported estimate and may include both US and international units depending on the report; for strictly domestic figures cross-reference the CPSC press release text.

Data limitations and research notes

The CPSC recall database captures recalls that were publicly announced; it does not include corrective actions that were limited to retailer notifications, unpublicized stock withdrawals, or recalls of products not widely distributed in the US market. The deaths and injuries fields in the API reflect counts as of the recall announcement; actual death tolls may be higher when post-recall investigation identifies additional associated fatalities. The Rock 'n Play recall was announced with 32 associated deaths; investigative reporting subsequently identified higher counts from CPSC's internal database.

Unit counts in the recall database are manufacturer-reported estimates and vary in quality. For mass-produced consumer goods sold through major retailers, the estimates are generally reliable because point-of-sale and distribution records support them. For products sold through informal channels, imported in small lots, or distributed over long periods through secondary markets, the unit estimates are rougher. The IKEA MALM 29 million figure for the 2016 recall covered all units sold in North America since the product launched in 1985 — a 31-year production run — and reflects IKEA's global sales tracking capabilities.

For research joining CPSC recall data to other federal datasets, the recall number (YY-NNN format) is the primary identifier. CPSC enforcement actions involving civil penalties are published separately at cpsc.gov and tracked in the Federal Data Hub's regulatory enforcement catalog. NEISS data — the emergency room surveillance series — is available for download at cpsc.gov/Research--Statistics/NEISS-Injury-Data and provides product-associated injury estimates by product code, patient demographics, and diagnosis, enabling analysis of injury burden that is independent of the voluntary reporting infrastructure underlying SaferProducts.gov.

Related writing

ClinicalTrials.gov: The Federal Database Behind 500,000 Clinical Trials and Drug Approval Research — NIH/NLM clinical trial registry, FDAAA 801 reporting requirements, phase distribution, and querying the API.

DEA ARCOS: The Federal Opioid Distribution Database Behind 380 Million Pill Shipment Transactions — DEA mandatory opioid shipment reporting, litigation release, Big Three distributors, and pills-per-capita analysis.