# French Product Recalls (RappelConso) – Barcode Check & Alerts (`yck69/french-product-recalls`) Actor

Every product recall in France from the official RappelConso feed: barcodes, lots, risks, allergens, sale areas, retailers and what to do. Check your barcodes against all recalls, get alerts on new recalls, and statistics by brand, hazard or retailer.

- **URL**: https://apify.com/yck69/french-product-recalls.md
- **Developed by:** [yck](https://apify.com/yck69) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 recalls

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

## French Product Recalls (RappelConso) – Barcode Check & Alerts

**Every product recall in France** (about 19,000 since 2021, and around 250 new ones each month), from the government's official **RappelConso** feed, **updated every day**. Food, cosmetics, toys, appliances and cars are all covered.

- **Recalls**: search by keyword, category, hazard, allergen, brand, retailer, department or date, with every detail cleaned up and structured.
- **Barcode check**: paste your catalogue, an order or a shopping list of EAN/GTIN barcodes and get every recall that matches, with the affected **lots and dates**.
- **Alerts**: schedule it and get **only new or updated recalls** since the last run, by email, Slack or webhook.
- **Statistics**: recalls by category, hazard, allergen, brand, retailer, department, month or year.

Every recall includes the elements below. Values are in English where the source uses a fixed vocabulary.

- **Barcodes and lots**: lot numbers, use-by or best-before dates.
- **Hazard type**: Listeria, Salmonella, undeclared allergens, foreign bodies, injury, fire…
- **Allergens**, when a recall is for an undeclared allergen.
- **Where it was sold**: departments covered and **retail chains** (Carrefour, E.Leclerc, Lidl…).
- **What to do**: stop eating, return to store. What you get back: refund, exchange.
- Photos, the official recall page and the store poster (PDF).

**$2 per 1,000 recalls · $0.10 per 1,000 barcodes checked.**

### What data can you get?

<table>
<tr><td>📦 Product and brand</td><td>🏷️ Barcodes (EAN/GTIN)</td><td>🔢 Lots and dates</td></tr>
<tr><td>☣️ Hazard type</td><td>🥜 Allergens</td><td>🏪 Retailers and sales areas</td></tr>
<tr><td>📅 Sale dates</td><td>🩺 Health advice</td><td>↩️ What to do and compensation</td></tr>
<tr><td>🖼️ Product photos</td><td>🔗 Official page and poster</td><td>📊 Statistics</td></tr>
</table>

### How to use it

1. Click **Try for free** at the top of this page.
2. Choose **recalls**, **barcodes** or **stats**.
3. Filter by category, hazard, allergen, brand, retailer, department or date, or paste barcodes.
4. Click **Start**, or schedule it daily for alerts.
5. Download as JSON, CSV or Excel.

### Use cases

- **Retailers, marketplaces and wholesalers**: check your whole catalogue every day and pull recalled products from sale.
- **Food service, canteens and nursing homes**: get alerted on recalls for what you buy, by supplier or category.
- **Consumer apps**: scan-to-check, pantry alerts, allergy alerts.
- **Brands and quality teams**: monitor recalls in your category and benchmark hazards.
- **Journalists and analysts**: recall trends by brand, retailer or hazard.

### Input examples

**Food recalls of the last 30 days sold in Ille-et-Vilaine**

```json
{ "mode": "recalls", "categories": ["alimentation"], "departments": ["35"], "lastDays": 30 }
```

**Check barcodes**

```json
{ "mode": "barcodes", "barcodes": ["3523680388727", "8717703617092", "3017620422003"], "includeNotRecalled": true }
```

**Daily alert: undeclared milk or nuts** (schedule daily, add an integration)

```json
{ "mode": "recalls", "allergens": ["milk", "nuts"], "onlyNew": true, "alertName": "allergies" }
```

**Which retailers had the most food recalls this year?**

```json
{ "mode": "stats", "groupBy": "retailer", "categories": ["alimentation"], "publishedAfter": "2026-01-01" }
```

### Output

**Recall**

```json
{
    "recallId": 23923,
    "recallNumber": "2026-10-0250",
    "publishedAt": "2026-10-23T17:19:10+00:00",
    "source": "RappelConso",
    "status": "ongoing",
    "legalBasis": "voluntary",
    "category": "alimentation",
    "categoryEn": "Food",
    "subcategoryEn": "Fish & seafood",
    "productName": "noix de saint-jacques fraîches baie de saint brieuc, sans corail, 200g",
    "brand": "filière qualité carrefour",
    "barcodes": ["3523680388727"],
    "lots": [{ "barcode": "3523680388727", "lot": "conditionné le 16/10/2026", "dateType": "use-by", "date": "2026-10-16", "dateTo": null }],
    "storage": "refrigerated",
    "saleStart": "2026-10-17",
    "saleEnd": "2026-10-22",
    "salesAreas": ["ille-et-vilaine (35)", "hauts-de-seine (92)"],
    "nationwide": false,
    "departmentCodes": ["35", "92"],
    "retailers": ["Carrefour"],
    "reason": "présence de listeria monocytogenes",
    "risks": ["listeria monocytogenes (agent responsable de la listériose)"],
    "hazardTypes": ["listeria"],
    "allergens": [],
    "consumerActions": ["stop eating", "return to store", "contact customer service", "destroy"],
    "compensation": ["refund"],
    "contactPhone": "0805908070",
    "imageUrls": ["https://rappel.conso.gouv.fr/image/99aadbe0-07e5-435d-8e75-534a929f7930.jpg"],
    "recallPageUrl": "https://rappel.conso.gouv.fr/fiche-rappel/23923/interne",
    "posterPdfUrl": "https://rappel.conso.gouv.fr/affichettepdf/23923/interne"
}
```

**Barcode check rows** add `barcode` (as you gave it), `recalled` and `matchedLots`: the lots of that barcode only. **Alert rows** add `alertType`: `new` or `updated`.

**Statistics row**: `group`, `recalls`, `sharePct`, `ongoingRecalls`, `imposedByPrefectoralOrder`, `latestPublishedAt`, `topHazards`, `topBrands`, `topSubcategories`.

### Pricing

| Event | Price |
|---|---|
| Recall (or recalled barcode match) | $0.002 |
| Barcode checked | $0.0001 |
| Statistics row | $0.003 |

Alert runs with no new recall cost almost nothing.

### Good to know

- **Source**: [RappelConso](https://rappel.conso.gouv.fr) open data on [data.economie.gouv.fr](https://data.economie.gouv.fr/explore/dataset/rappelconso-v2-gtin-espaces/), *Licence Ouverte / Etalab 2.0*. It includes EU **Safety Gate** alerts relayed in France (mostly cars), which have fewer details.
- **Texts** (product names, reasons, health advice) are in French, as published. Hazard types, allergens, retailers, categories, actions and storage are derived from them in English.
- **Retailers and allergens** are recognised from free text: about 9 in 10 allergen recalls name the allergen, and the main chains are recognised. "All retailers" means the recall covers every store.
- **Status** is "ended" once the recall's end date has passed. Without an end date, a recall stays "ongoing".
- **Barcodes**: recalls without a barcode (cars, loose products) can't be found by barcode check; use keywords or brands instead.

### More Actors from this developer

### FAQ

##### Can I use it through the API, Make, Zapier or Google Sheets?

Yes. Every run can be started and read through the [Apify API](https://docs.apify.com/api/v2) (JavaScript and Python clients, CLI, MCP), and Apify integrations connect it to Make, Zapier, n8n, Google Sheets, Slack, webhooks and more.

##### Is it legal to use this data?

The Actor only reads public or official open data and doesn't log in anywhere. Check the source's licence and your local rules (for example GDPR when data concerns people) for your use case; if in doubt, ask a lawyer.

##### Something isn't working, or you need another field?

Open an issue on the **Issues** tab: feedback is read and answered.

# Actor input Schema

## `mode` (type: `string`):

<b>Recalls</b>: product recalls with every detail (barcodes, lots, risks, sale areas, retailers, what to do), newest first. Turn on alerts to get only new ones.<br><b>Barcode check</b>: check a list of barcodes (your catalogue, a shopping list) against every recall.<br><b>Statistics</b>: recalls counted by category, hazard, brand, retailer, month…

## `query` (type: `string`):

Words searched in every field: product name, brand, reason… e.g. <code>chocolat</code>, <code>poulet</code>, <code>airbag</code>.

## `barcodes` (type: `array`):

EAN-13, EAN-8, UPC or GTIN-14 codes, one per line. Leading zeros and spaces don't matter.

## `includeNotRecalled` (type: `boolean`):

Adds a row <code>recalled: false</code> for each clean barcode (not charged as a recall).

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

Product categories.

## `subcategories` (type: `array`):

Product subcategories.

## `hazards` (type: `array`):

Type of risk.

## `allergens` (type: `array`):

Recalls for an undeclared allergen.

## `brands` (type: `array`):

Brand names, e.g. <code>Lactalis</code>.

## `retailers` (type: `array`):

Stores that sold the product, e.g. <code>Carrefour</code>, <code>Leclerc</code>, <code>Lidl</code>.

## `departments` (type: `array`):

Department codes, e.g. <code>35</code>, <code>2A</code>, <code>974</code>.

## `includeNationwide` (type: `boolean`):

With departments: also recalls sold all over France.

## `lastDays` (type: `integer`):

e.g. <code>30</code>.

## `publishedAfter` (type: `string`):

Recalls published on or after this date.

## `publishedBefore` (type: `string`):

Recalls published before this date.

## `onlyOngoing` (type: `boolean`):

Excludes recalls whose procedure has ended.

## `onlyImposed` (type: `boolean`):

Recalls ordered by a prefectoral order rather than voluntary.

## `source` (type: `string`):

RappelConso recalls, or Safety Gate (EU) alerts relayed in France (mostly cars).

## `onlyNew` (type: `boolean`):

Schedule the Actor (e.g. every day) with an email, Slack or webhook integration. The first run saves the current recalls.

## `alertName` (type: `string`):

Separate memory per alert. Defaults to one per set of filters.

## `groupBy` (type: `string`):

For Statistics mode.

## `maxResults` (type: `integer`):

Recalls or statistics rows (Barcode check returns every match).

## Actor input object example

```json
{
  "mode": "recalls",
  "includeNotRecalled": false,
  "includeNationwide": true,
  "lastDays": 30,
  "onlyOngoing": false,
  "onlyImposed": false,
  "source": "all",
  "onlyNew": false,
  "groupBy": "category",
  "maxResults": 20
}
```

# Actor output Schema

## `recalls` (type: `string`):

Product recalls.

## `barcodes` (type: `string`):

Recalled barcodes.

## `stats` (type: `string`):

Recalls by group.

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

Every field.

# 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 = {
    "mode": "recalls",
    "lastDays": 30,
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("yck69/french-product-recalls").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 = {
    "mode": "recalls",
    "lastDays": 30,
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("yck69/french-product-recalls").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 '{
  "mode": "recalls",
  "lastDays": 30,
  "maxResults": 20
}' |
apify call yck69/french-product-recalls --silent --output-dataset

```

## MCP server setup

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

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/jTovHvTPvhn3WZGZl/builds/43yWafe3YTLnDMfw0/openapi.json
