# Product Recall Aggregator (`gabrielaxy/product-recall-aggregator`) Actor

Aggregates product recall alerts from FDA, CPSC, NHTSA, and other agencies. Tracks recalls across food, drugs, vehicles, and consumer goods, providing structured data with product details, hazards, and recommended remedies.

- **URL**: https://apify.com/gabrielaxy/product-recall-aggregator.md
- **Developed by:** [Gabriel Antony Xaviour](https://apify.com/gabrielaxy) (community)
- **Categories:** Agents, Developer tools, SEO tools
- **Stats:** 6 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Global Product Recall Aggregator

<p align="center">
  <strong>Aggregates product safety recalls from 10+ global regulatory agencies across multiple languages, translates them using Lingo.dev, and provides structured data for safety analysis.</strong>
</p>

<p align="center">
  <a href="#features">Features</a> •
  <a href="#quick-start">Quick Start</a> •
  <a href="#input-configuration">Configuration</a> •
  <a href="#output-schema">Output</a> •
  <a href="#use-cases">Use Cases</a>
</p>

***

### What is Global Product Recall Aggregator?

This Actor scrapes product safety recalls from regulatory agencies worldwide, standardizes the data format, and optionally translates non-English content. Perfect for consumer safety monitoring, product compliance tracking, and global market surveillance.

#### Key Benefits

| Feature | Description |
|---------|-------------|
| **10 Regulatory Sources** | CPSC (USA), Health Canada, EU Safety Gate/RAPEX, ACCC (Australia), UK OPSS, Product Safety NZ, Singapore CPS, NITE (Japan), KATS (South Korea), INMETRO (Brazil) |
| **Multi-Language Translation** | Powered by Lingo.dev SDK for 100+ languages |
| **Standardized Categories** | Consistent product and hazard classification across sources |
| **Structured Output** | Ready for analysis, dashboards, or APIs |

***

### Features

#### Regulatory Sources

| Source | Region | Language | Method |
|--------|--------|----------|--------|
| CPSC | USA | English | REST API |
| Health Canada | Canada | English | JSON Feed |
| EU Safety Gate/RAPEX | EU | English | Web Scraping |
| ACCC | Australia | English | Web Scraping |
| UK OPSS | UK | English | Web Scraping |
| Product Safety NZ | New Zealand | English | Web Scraping |
| Singapore CPS | Singapore | English | Web Scraping |
| NITE | Japan | Japanese | Web Scraping |
| KATS Safety Korea | South Korea | Korean | Web Scraping |
| INMETRO | Brazil | Portuguese | Web Scraping |

#### Product Categories

| Category | Description |
|----------|-------------|
| toys | Toys and games |
| children\_products | Baby and child products |
| electronics | Electronic devices |
| appliances | Home appliances |
| furniture | Furniture items |
| clothing | Apparel and textiles |
| food\_contact | Kitchen/food items |
| sports\_recreation | Sports equipment |
| vehicles | Vehicles and parts |
| tools | Power and hand tools |
| cosmetics | Beauty products |
| household | Household items |
| medical\_devices | Medical equipment |
| other | Uncategorized |

#### Hazard Types

| Type | Description |
|------|-------------|
| choking | Choking hazard |
| fire | Fire hazard |
| burn | Burn/scald hazard |
| electrical | Electrical shock |
| laceration | Cut/laceration |
| chemical | Chemical exposure |
| fall | Fall/tip-over |
| strangulation | Strangulation |
| poisoning | Poisoning risk |
| suffocation | Suffocation |
| entrapment | Entrapment |
| drowning | Drowning hazard |
| impact | Impact injury |
| other | Other hazards |

***

### Quick Start

#### Basic (English sources only)

```json
{
    "sources": ["cpsc", "health_canada", "eu_safety_gate"],
    "maxRecallsPerSource": 50
}
```

#### Multi-Language with Translation

```json
{
    "sources": ["cpsc", "japan_nite", "korea_kats", "brazil_inmetro"],
    "maxRecallsPerSource": 30,
    "lingoDevApiKey": "your-api-key",
    "translateTo": ["en", "es", "fr"]
}
```

#### Filter by Category and Hazard

```json
{
    "sources": ["cpsc", "health_canada"],
    "productCategories": ["toys", "children_products"],
    "hazardTypes": ["choking", "fire"],
    "dateFrom": "2024-01-01"
}
```

***

### Input Configuration

#### Source Selection

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `sources` | array | `["cpsc", "health_canada", "eu_safety_gate"]` | Which regulatory agencies to scrape |
| `maxRecallsPerSource` | integer | 50 | Maximum recalls to fetch per source (1-500) |

#### Translation Settings

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `lingoDevApiKey` | string | — | Lingo.dev API key for translation (stored securely) |
| `translateTo` | array | `[]` | Target language codes (e.g., `["es", "fr", "de"]`) |

#### Filtering

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `dateFrom` | string | — | Only recalls from this date (YYYY-MM-DD) |
| `productCategories` | array | `[]` | Filter by category |
| `hazardTypes` | array | `[]` | Filter by hazard type |

#### Proxy Settings

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `proxyConfig` | object | `{ "useApifyProxy": true }` | Proxy configuration for web scraping |

***

### Output Schema

#### Dataset Items

Each recall is saved as a dataset item:

```json
{
    "id": "cpsc-24-123",
    "sourceAgency": "cpsc",
    "sourceUrl": "https://www.cpsc.gov/Recalls/...",
    "productName": "Children's Toy Building Blocks",
    "productNameTranslated": {
        "es": "Bloques de construcción para niños",
        "fr": "Blocs de construction pour enfants"
    },
    "manufacturer": "ABC Toys Inc.",
    "brand": "PlaySafe",
    "modelNumber": "PB-2024",
    "productCategory": "Toys",
    "productCategoryStandardized": "toys",
    "hazardDescription": "Choking hazard due to small parts",
    "hazardDescriptionTranslated": {
        "es": "Peligro de asfixia por piezas pequeñas"
    },
    "hazardType": "choking",
    "injuriesReported": 2,
    "recallDate": "2024-01-15",
    "recallNumber": "24-123",
    "remedyAction": "Return for full refund",
    "affectedRegions": ["USA"],
    "originalLanguage": "en",
    "scrapedAt": "2024-01-20T12:00:00Z"
}
```

#### Key-Value Store

- **OUTPUT**: Summary statistics and metadata

***

### Regional Coverage

| Region | Sources | Languages |
|--------|---------|-----------|
| North America | CPSC, Health Canada | English |
| Europe | EU Safety Gate, UK OPSS | English |
| Asia-Pacific | ACCC, NZ, Singapore, Japan NITE, Korea KATS | English, Japanese, Korean |
| South America | Brazil INMETRO | Portuguese |

***

### Use Cases

| Use Case | Description |
|----------|-------------|
| **Consumer Safety Monitoring** | Track recalls affecting products you own or sell |
| **Product Compliance** | Monitor global recalls for compliance reporting |
| **Market Surveillance** | Analyze recall trends across regions and categories |
| **Safety Dashboards** | Power real-time safety monitoring dashboards |
| **Research** | Study product safety patterns and hazard types |
| **Import/Export** | Screen products for recalls before import/export |

***

### Integrations

- **Lingo.dev**: AI-powered translation for 100+ languages
- **Apify Webhooks**: Trigger alerts for new recalls
- **Zapier/Make**: Connect to notification services
- **APIs**: Export via Apify API

***

### FAQ

**Q: Do I need a Lingo.dev API key?**

Only if you want to translate recalls from non-English sources (Japan, South Korea, Brazil) or translate English recalls to other languages. English-only sources work without translation.

**Q: How often should I run this Actor?**

Most agencies update weekly. A weekly scheduled run is typically sufficient for monitoring purposes.

**Q: What if a website structure changes?**

Web scraper selectors may need updates when government websites change. File an issue if you notice scraping failures.

***

### Limitations

- Web scraper selectors may need updates as websites change
- Translation requires Lingo.dev API key
- Rate limiting on some government websites
- Some sources may have limited historical data

***

### Cost Estimation

- **Apify**: ~$5/1000 pages scraped
- **Lingo.dev**: See https://lingo.dev/pricing

***

### Support

For issues, open a GitHub issue or contact the author.

***

### License

ISC

# Actor input Schema

## `sources` (type: `array`):

Regulatory agencies to scrape for product recalls

## `maxRecallsPerSource` (type: `integer`):

Maximum number of recalls to fetch per source

## `dateFrom` (type: `string`):

Only fetch recalls from this date (YYYY-MM-DD)

## `productCategories` (type: `array`):

Filter by product categories (leave empty for all)

## `hazardTypes` (type: `array`):

Filter by hazard types (leave empty for all)

## `lingoDevApiKey` (type: `string`):

API key for Lingo.dev translation service (required for translation)

## `translateTo` (type: `array`):

Target language codes for translation (e.g., 'es', 'fr', 'de')

## `proxyConfig` (type: `object`):

Proxy settings for web scraping

## Actor input object example

```json
{
  "sources": [
    "cpsc",
    "health_canada",
    "eu_safety_gate"
  ],
  "maxRecallsPerSource": 50,
  "productCategories": [],
  "hazardTypes": [],
  "translateTo": [],
  "proxyConfig": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Dataset containing product recalls with standardized fields, translations, and hazard classifications

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("gabrielaxy/product-recall-aggregator").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("gabrielaxy/product-recall-aggregator").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 '{}' |
apify call gabrielaxy/product-recall-aggregator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gabrielaxy/product-recall-aggregator"
        }
    }
}

```

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/8NIe61atcU3Uvyaub/builds/cCgWUHfMLc5yGUMhh/openapi.json
