# Fire Safety Recall API: Smoke Alarm, Sprinkler, Extinguisher (`implementable_antler/life-safety-recall-registry`) Actor

Free CPSC recall API for fire sprinkler, smoke alarm, CO alarm, fire extinguisher and fire suppression recalls, plus NHTSA RV/bus/truck extinguisher and detector recalls. One clean JSON/CSV schema with units, hazard, remedy and UPCs.

- **URL**: https://apify.com/implementable_antler/life-safety-recall-registry.md
- **Developed by:** [Blake Runckel](https://apify.com/implementable_antler) (community)
- **Categories:** Business, Real estate, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Fire Safety Recall API: CPSC Smoke Alarm, Fire Sprinkler and Fire Extinguisher Recall Data

**Free.** This Actor returns every US recall of **fire sprinklers, smoke alarms, carbon monoxide (CO) alarms, fire alarm panels, fire extinguishers and fire suppression systems** as one clean dataset. Data comes from the official **CPSC recall API** (SaferProducts.gov) and the **NHTSA recalls database**, which adds fire extinguishers, automatic fire suppression systems and smoke/CO/LP detectors fitted to RVs, buses and trucks.

No API key, no scraping, no login. Export as JSON, CSV, Excel, or call it from the Apify API.

### What you get

| Category | What is in it | Example recalls |
|---|---|---|
| `sprinkler` | Fire sprinkler heads, dry sprinklers, sprinkler-system parts | Central O-ring sprinklers, Star ME-1 dry sprinklers, Globe Model J |
| `alarm` | Smoke alarms, CO alarms, combination smoke/CO, heat detectors, natural-gas/LP alarms, fire alarm control panels, pull stations, sounders/strobes | Kidde TruSense, Apollo 51000-600, Universal Security Instruments, Gamewell-FCI panels |
| `extinguisher` | Portable fire extinguishers and extinguishing sprays | Kidde plastic-handle extinguishers (about 37.8M units), Hero Fire Spray, First Alert |
| `suppression` | Cooktop fire suppressors, automatic fire suppression systems (AFSS) on buses, fire pumps for suppression systems | StoveTop FireStop, Prevost/Volvo AFSS, Goulds fire pumps |
| `other` (opt-in) | Escape smoke hoods, exit signs and emergency lights, fire/smoke damper actuators | EVAC-U8 smoke hoods, Lithonia emergency lights |

Full run, 2000-01-01 to 2026-10-20: **152 life-safety recalls** (72 CPSC + 80 NHTSA). By category: 65 alarm, 57 extinguisher, 24 suppression, 6 sprinkler. CPSC coverage goes back to the 1970s; NHTSA coverage starts in 2010.

### No false positives from "fire hazard"

Thousands of CPSC recalls say "fire hazard" (heaters, chargers, power banks). Those are **not** life-safety equipment, and by default this Actor excludes them. A recall counts only when the **product itself** is life-safety equipment, judged first by CPSC's own product type (e.g. "Sprinklers (Fire)" vs "Sprinklers (Lawn)") and then by the product name. Lawn sprinklers, meat smokers, smoke fireworks and range hoods are filtered out. Turn on **Also include any product with a fire/CO hazard** to get the hazard-only recalls as well. Each of those rows has `match_basis: "hazard"`, so you can tell them apart.

### Input

| Field | Default | Notes |
|---|---|---|
| `since` | 2000-01-01 | Earliest recall date |
| `until` | today | Latest recall date |
| `categories` | sprinkler, alarm, extinguisher, suppression | Add `other` for escape hoods / exit lights / dampers |
| `includeNhtsa` | true | NHTSA vehicle and equipment recalls (2010+) |
| `keyword` | – | e.g. `Kidde`, `combination`, `Vivint` |
| `includeHazardOnlyMatches` | false | Adds any product with a fire/burn/CO hazard |
| `maxItems` | 1000 | Newest first |

```json
{ "since": "2015-01-01", "categories": ["alarm", "extinguisher"], "includeNhtsa": true, "maxItems": 200 }
```

### Example output

```json
{
  "recall_id": "CPSC-10302",
  "recall_number": "25322",
  "recall_date": "2025-06-05",
  "source": "CPSC",
  "product_name": "Apollo America 51000-600 Combination Smoke and Carbon Monoxide Detectors",
  "category": "alarm",
  "manufacturers": ["Apollo America Inc., of Auburn Hills, Michigan"],
  "retailers": ["Online at www.Vivint.com and via door-to-door and telephone sales by Vivint from June 2024 through October 2024 for between $50 and $100."],
  "units": "About 50,000",
  "units_count": 50000,
  "hazard": "The recalled detectors can malfunction and fail to alert consumers of a fire or carbon monoxide (CO) leak, posing a risk of smoke inhalation, carbon monoxide poisoning or death.",
  "remedy": "Vivint is sending a free replacement detector to all known purchasers. ...",
  "injuries": "None reported",
  "url": "https://www.cpsc.gov/Recalls/2025/Apollo-America-Recalls-Combination-Smoke-and-Carbon-Monoxide-Detectors-...",
  "country_of_manufacture": ["United States"],
  "upcs": [],
  "match_basis": "product",
  "matched_terms": ["smoke and carbon monoxide"]
}
```

NHTSA rows use the same schema:

```json
{
  "recall_id": "NHTSA-23V126000",
  "recall_number": "23V126000",
  "recall_date": "2023-02-24",
  "source": "NHTSA",
  "product_name": "Fire suppression system (recalled part: Fire Sensor PM-3M; AFSS Optical Sensor Bracket) in 2018-2023 PREVOST H3-45 VIP, 2018-2023 PREVOST H3-45, 2019 PREVOST H3-41",
  "category": "suppression",
  "manufacturers": ["Prevost Car (US) Inc."],
  "units": "555",
  "affected_products": ["2018-2023 PREVOST H3-45 VIP", "2018-2023 PREVOST H3-45", "2019 PREVOST H3-41"],
  "url": "https://www.nhtsa.gov/recalls?nhtsaId=23V126000"
}
```

#### Fields

`recall_id`, `recall_number`, `recall_date`, `source` (CPSC|NHTSA), `product_name`, `category` (sprinkler|alarm|extinguisher|suppression|other), `manufacturers`, `retailers`, `units` (as published), `units_count` (parsed number), `hazard`, `remedy`, `injuries`, `url`, `country_of_manufacture`, `upcs`, plus `title`, `description`, `importers`, `distributors`, `remedy_options`, `affected_products` (NHTSA year/make/model), `consumer_contact`, `image_url`, `last_publish_date`, `match_basis` (product|hazard) and `matched_terms` (why the row was included).

The run's key-value store also gets a `SUMMARY` record with counts by category and source.

### Use cases

- **Fire protection and alarm contractors / inspectors:** check installed smoke alarms, sprinkler heads and extinguishers against recall lists during inspections (NFPA 25 / NFPA 72 / NFPA 10 work).
- **Property managers, landlords, facility teams and insurers:** run a recurring smoke alarm recall and CO detector recall check across a portfolio.
- **RV dealers, fleet and transit managers:** NHTSA recalls of fire extinguishers and automatic fire suppression systems in motorhomes, buses and trucks.
- **Retailers and marketplaces:** match recalled life-safety products by UPC, brand or model before listing.
- **Journalists, researchers and safety advocates:** fire extinguisher recall data and smoke alarm failure trends since 2000.
- **Product-safety and compliance teams:** monitor competitors' recalls. Schedule the Actor daily with a recent `since` date.

### FAQ

**Is this an official CPSC recall API?** It is a free wrapper around the official CPSC Recalls API (SaferProducts.gov) and NHTSA's public recall files. It classifies the raw data and normalizes it to one schema. All data is US federal government public data.

**How current is it?** Each run fetches live data. CPSC publishes recalls as they are announced; NHTSA refreshes its recall file daily.

**Why are there only a few fire sprinkler recalls?** Fire sprinkler recalls are rare in CPSC data (most were in 1998–2012). Many commercial sprinkler notices are issued by manufacturers or under UL/FM programs, not through CPSC, so they are not in either source.

**Does it include "fire hazard" products like heaters or batteries?** Not by default. See "No false positives from 'fire hazard'" above. Set `includeHazardOnlyMatches` to include them.

**Can I get CSV or Excel?** Yes. Use the dataset export (JSON, CSV, Excel, XML, RSS) or the Apify API.

**What does it cost?** The Actor is free. A full run since 2000 takes under a minute; you pay only for normal Apify platform usage, which typically falls within the free tier.

**Data sources and terms:** see `SOURCES.md` in the source code. Robots and terms were checked; no CAPTCHA bypass, no login, no key.

*Not affiliated with CPSC or NHTSA. Always confirm recall details at the official `url` before acting.*

# Actor input Schema

## `since` (type: `string`):

Earliest recall date (YYYY-MM-DD). CPSC data goes back to the 1970s; NHTSA data starts in 2010. Default 2000-01-01.

## `until` (type: `string`):

Latest recall date (YYYY-MM-DD). Defaults to today.

## `categories` (type: `array`):

Which product categories to return. Leave empty for sprinkler, alarm, extinguisher and suppression.

## `includeNhtsa` (type: `boolean`):

Also return NHTSA recalls of fire extinguishers, automatic fire suppression systems and smoke/CO/LP detectors in RVs, buses and trucks (2010 onward).

## `keyword` (type: `string`):

Only rows whose product name, title, description, manufacturer or importer contains this text, e.g. 'Kidde' or 'combination'.

## `includeHazardOnlyMatches` (type: `boolean`):

Off by default. When on, also returns CPSC recalls of ANY product whose hazard mentions fire, burns or carbon monoxide (heaters, chargers, boilers...), as category 'other' with match_basis 'hazard'. This adds thousands of rows that are not life-safety equipment.

## `maxItems` (type: `integer`):

Maximum rows to return, newest first.

## Actor input object example

```json
{
  "since": "2015-01-01",
  "categories": [
    "sprinkler",
    "alarm",
    "extinguisher",
    "suppression"
  ],
  "includeNhtsa": true,
  "includeHazardOnlyMatches": false,
  "maxItems": 200
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "since": "2015-01-01",
    "categories": [
        "sprinkler",
        "alarm",
        "extinguisher",
        "suppression"
    ],
    "maxItems": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("implementable_antler/life-safety-recall-registry").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "since": "2015-01-01",
    "categories": [
        "sprinkler",
        "alarm",
        "extinguisher",
        "suppression",
    ],
    "maxItems": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("implementable_antler/life-safety-recall-registry").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "since": "2015-01-01",
  "categories": [
    "sprinkler",
    "alarm",
    "extinguisher",
    "suppression"
  ],
  "maxItems": 200
}' |
apify call implementable_antler/life-safety-recall-registry --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,implementable_antler/life-safety-recall-registry"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/jzVW41S6uNr5eQpZ3/builds/coCjuE0TqtKG9d3Q9/openapi.json
