# RappelConso Recall Changes: Lots, GTINs & Risks (`thatmike1/rappelconso-revisions`) Actor

Monitor French RappelConso recall notices. Get current lots, raw GTIN identification, risks and recall deadlines, plus field-by-field changes from your saved baseline. Successful unchanged checks are billed too.

- **URL**: https://apify.com/thatmike1/rappelconso-revisions.md
- **Developed by:** [Michal Pšenčík](https://apify.com/thatmike1) (community)
- **Categories:** Business, Automation
- **Stats:** 2 total users, 1 monthly users, 50.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.00005 / actor start

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

## RappelConso Recall Changes: Lots, GTINs & Risks

Monitor French recall notices through the public RappelConso API. Each successful check returns 25 current fields covering raw product identification, lots, sale scope, risks, consumer instructions, compensation and recall deadlines. A named watch retains the last **delivered** projection so later runs can return exact previous/current values and field changes. Successful unchanged checks are billed too.

This independent Actor covers the French RappelConso API, including imported Safety Gate/RAPEX rows present there. It does not enumerate the EU-wide Safety Gate feed. It reports source values, not safety certification or an assessment of risk significance.

### Input

```json
{
    "watchId": "retail-qa-auchan",
    "selection": {
        "mode": "recent",
        "lookbackDays": 7,
        "brand": "auchan",
        "category": "alimentation",
        "ficheNumbers": ["2026-10-0112", "2026-03-0268"]
    },
    "maxRows": 200
}
```

- `watchId` is required: 1–64 ASCII letters, digits, underscores or hyphens. Reuse it for the same selection and serialize its schedules. A different selection requires a different watch ID. Watches intentionally have separate baselines and costs.
- `selection.mode` defaults to `recent`. `lookbackDays` defaults to 7 (1–31). The window spans UTC calendar days, including today. Optional `brand` and `category` are exact API equality filters, normalized to NFC, trimmed and lowercased. They constrain discovery only.
- `ficheNumbers` accepts up to 100 unique `YYYY-MM-NNNN` numbers with valid months, or imported RAPEX `a12/NNNNN/YY` and `sr/NNNNN/YY` identifiers. Nominated fiches are queried first, independently of discovery filters and publication dates. Duplicates are removed.
- `mode: "fiches"` requires at least one fiche number and forbids `lookbackDays`, `brand` and `category`.
- `maxRows` defaults to 200 (1–500). It counts confirmed delivered checks. Unknown input properties are rejected before source requests.

The Console default uses watch `default`, a seven-day unfiltered window and up to 200 checks. A seven-day window may still be empty during a quiet period or upstream outage. An absent nomination produces a free diagnostic.

### Output and comparisons

One default-dataset row represents one useful check of a fiche, ordered by fiche number. Export the dataset as JSON, CSV or Excel; JSON preserves the nested before/after projections and raw identification array most clearly.

Each row includes `recordId`, `recallId`, `ficheNumber`, source version/id/GUID/URL, publication and observation timestamps, `current`, `previous`, `changedFields`, material hashes, previous timestamps/version, query URL and attribution. The exact 25-field projection appears in the dataset schema. For example, the captured real fiche `2026-10-0112` was already version 2 at first observation, with brand `auchan`, raw identification tokens beginning `3596710527519`, `26205pc`, and a null recall deadline. A first check has no invented version-1 baseline.

| Event           | Meaning                                                                                     |
| --------------- | ------------------------------------------------------------------------------------------- |
| `first_seen`    | No delivered baseline for this watch; previous values are null and changedFields is empty.  |
| `revised`       | At least one projected field changed and the version increased.                             |
| `corrected`     | Projected fields changed at the same or a lower version.                                    |
| `metadata_only` | Projection unchanged; source version, publication timestamp, id, GUID or fiche URL changed. |
| `unchanged`     | Projection and comparison metadata match the baseline.                                      |

`versionRegressed` flags a lower source version, including metadata-only changes; a stale cache is one possible explanation. Changed fields are sorted by source field name and carry exact `before` and `after` values. Whitespace, Unicode representation, array order, repeats, pipe markers, empty strings and nulls are preserved. Date-only values stay date-only. Identification tokens are not inferred GTIN/lot tuples. Null is a published missing value, never a declaration of no risk.

Free `SUMMARY` and `OUTPUT` records are in the default key-value store. A hard platform kill or the 180-second run deadline can leave the last running SUMMARY checkpoint. SUMMARY includes query exhaustion, non-atomic coverage, bounds, HTTP attempts and body bytes, rate headers, missing nominations, delivery counts, event counts, state failures and upstream errors. A capped or partial run is not complete coverage. Errors and missing notices never generate billable rows.

### Pricing

Proposed Console prices are **$0.00005 per built-in Actor start unit** and **$0.002 per useful delivered check**. First-seen, revised, corrected, metadata-only and unchanged rows all have the same item fee. At one start unit, five checks cost $0.01005 and 100 cost $0.20005 in Actor events. Empty or failed runs can incur the start fee. Applicable platform charges depend on your plan and configured monetization; confirm the displayed price before running.

There is no changes-only billing mode. Comparison receipts and current full fields are delivered even when unchanged. Platform billing and spending-cap behavior must be verified before publication; local tests are not invoices.

### Coverage, state and limits

This is prospective monitoring from your delivered baseline. The API does not provide a demonstrated historical version archive. Intermediate edits between scans, linked-document contents and same-URL PDF changes are invisible. No disappearance-based deletion, withdrawal, resolution or clearance events are inferred. A retained notice leaving the publication window is rechecked only if nominated or selected again.

The API includes imported `/rapex` records with `a12/NNNNN/YY` and `sr/NNNNN/YY` identifiers and version 0, despite metadata saying RAPEX is excluded. These records are checked using the same 25-field projection. Version zero is accepted only for these imported identities; ordinary RappelConso versions remain positive. Missing or malformed material fields still produce free schema-drift errors.

A run is bounded to 1,000 raw source rows, 30 HTTP attempts, 16 MiB decoded traffic, 500 delivered checks and 180 seconds including a 15-second shutdown reserve. Pages contain at most 100 rows. Responses are limited to 2 MiB wire / 4 MiB decoded; projections over 32 KiB are refused without truncation. Each watch retains at most 1,000 identities and 32 MiB, with no silent eviction. Use a new watch when full.

Requests run sequentially with at least two seconds idle after completion. Connection failures/timeouts and 5xx have at most two retries with 2/5-second minimum backoff. Longer Retry-After is honored only within the remaining deadline. 403, 429 and challenge responses defer all further source requests. No browser, proxy, login, cookies, CAPTCHA workaround or alternate-source fallback is used.

Only complete contiguous fiche groups can update state. The highest version wins; conflicting highest-version payloads are free errors. Offset pagination is not an atomic snapshot; metadata/count drift is reported. No durable pagination cursor is exposed.

State follows confirmed dataset storage. A no-op or uncertain push cannot advance the baseline. Same-run restart uses stable receipt IDs and a private KV delivery-order journal to recover stored transitions. Older receipts cannot replace a later delivered baseline, even when source versions regress or observation times tie. An unresolved push blocks later runs until its owning run restarts with its original dataset and default KV store. Pre-journal receipts with an ambiguous order fail while preserving the current baseline and original receipt. A crash between storage and state persistence may repeat a change in a future run: cross-run delivery is at least once. A best-effort lease detects some overlaps; KV writes are not atomic distributed locking. Callers must serialize runs for each watch.

### Source, attribution and support

Source: [official RappelConso public dataset and API](https://data.economie.gouv.fr/explore/dataset/rappelconso-v2-gtin-espaces/). Publisher: DGCCRF, with DGAL, DGEC and DGPR. Data is under [Licence Ouverte v2.0 (Etalab)](https://www.etalab.gouv.fr/licence-ouverte-open-licence/). Rows contain attribution; preserve it when reusing the data. This Actor is independent of those authorities and offers no refresh SLA.

The operator controls the selected watch, retained baseline, schedules and exports in their Apify account. Public source text can contain business or contact information; this Actor omits the telephone-contact, image and poster fields. Apply appropriate retention/access rules to your stored data. Deleting a watch's named KV store removes its baseline; run datasets and exports have separate retention. No email or webhook sender is included.

For support, use this Actor's Apify Issues tab and include the run ID, SUMMARY error and a fiche number. Do not include credentials or confidential customer data.

# Actor input Schema

## `watchId` (type: `string`):

Persistent baseline name. Use a new watch ID when changing selection. Serialize schedules for each watch.

## `selection` (type: `object`):

Recent discovery with optional exact brand/category equality; nominated fiches are always checked independently. Fiches mode forbids lookbackDays/brand/category.

## `maxRows` (type: `integer`):

Includes successful unchanged checks. Bounded source coverage is described in SUMMARY.

## Actor input object example

```json
{
  "watchId": "default",
  "selection": {
    "mode": "recent",
    "lookbackDays": 7,
    "ficheNumbers": []
  },
  "maxRows": 200
}
```

# Actor output Schema

## `rows` (type: `string`):

No description

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

No description

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

// Run the Actor and wait for it to finish
const run = await client.actor("thatmike1/rappelconso-revisions").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("thatmike1/rappelconso-revisions").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 thatmike1/rappelconso-revisions --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,thatmike1/rappelconso-revisions"
        }
    }
}
```

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/yCJlZxiK6KfulgSMA/builds/4D25E8Rzz5i76bzs0/openapi.json
