# France RGE Date & Expiry Checker (`surefeed/france-rge-date-expiry-checker`) Actor

Vérifiez jusqu’à 100 SIRET à une date choisie et repérez les fins de période RGE proches. Historique officiel ADEME, une réponse par entreprise, exports CSV/JSON. Aucun compte ADEME requis.

- **URL**: https://apify.com/surefeed/france-rge-date-expiry-checker.md
- **Developed by:** [gianluca de dominicis](https://apify.com/surefeed) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 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?

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

## France RGE Date & Expiry Checker

Vérifiez les périodes de qualification RGE publiées pour une liste de SIRET, à une date précise, et repérez les échéances à venir dans les données actuelles.

Cet Actor répond à deux questions : **« Quelles qualifications sont enregistrées pour cet établissement à cette date ? »** et **« Quelles qualifications actuelles arrivent bientôt à échéance ? »** Il interroge directement le jeu de données officiel ADEME, sans abonnement à une base privée. Aucun compte ni clé API ADEME n'est nécessaire.

Il fournit une aide documentaire, **pas une attestation RGE, une décision de conformité ni une garantie d'éligibilité à une aide financière**. Un résultat absent ou incomplet ne signifie pas automatiquement que l'entreprise n'est pas RGE.

### Démarrage en 3 étapes

1. Dans **Input**, collez vos SIRET dans `sirets`, un par ligne. Pour un premier essai, utilisez `48384019500026`.
2. Laissez la date vide pour aujourd'hui, ou choisissez la date à vérifier. Cliquez sur **Start**.
3. Consultez une ligne de résultat par SIRET, ouvrez les éléments de preuve, puis exportez le dataset en **CSV ou JSON**.

Exemple minimal :

```json
{
  "sirets": "48384019500026",
  "alertDays": 90
}
```

Le SIRET d'exemple permet de tester l'entrée ; il ne constitue pas une recommandation commerciale ni une promesse de résultat positif.

### Trois usages concrets

- **Préparation d'un dossier de rénovation :** retrouver les périodes enregistrées pour l'établissement figurant sur un devis ou une facture à la date concernée.
- **Suivi d'un portefeuille de prestataires :** repérer les qualifications actuelles dont la date de fin publiée se rapproche et demander les justificatifs nécessaires.
- **Contrôle documentaire par domaine de travaux :** limiter la lecture à un domaine officiel précis au lieu de considérer toute qualification RGE comme interchangeable.

### Paramètres

| Champ | Description | Valeur par défaut |
| --- | --- | --- |
| `sirets` | Texte multiligne : un SIRET à 14 chiffres par ligne. Maximum 100 entrées uniques. Un SIREN à 9 chiffres ne remplace pas un SIRET. | Obligatoire |
| `referenceDate` | Date à vérifier, au format `YYYY-MM-DD`, du `2014-08-01` à aujourd'hui inclus. Les dates futures ne sont pas acceptées. | Aujourd'hui, fuseau `Europe/Paris` |
| `alertDays` | Horizon des échéances actuelles, de 0 à 365 jours. Ce paramètre est distinct de la date historique à vérifier. | `90` |
| `workDomain` | Choisissez un domaine officiel dans la liste, ou « Tous les domaines ». Par API, transmettez le libellé officiel proposé ; ce champ n'est pas une recherche libre par mot-clé. | Tous les domaines |

Les espaces et tirets dans un SIRET sont retirés avant la recherche et la déduplication. Les doublons ne produisent pas plusieurs lignes. Le contrôle d'entrée porte sur le format à 14 chiffres, pas sur une validation de la clé de contrôle ni sur l'existence administrative de l'établissement. Une entrée mal formée reste visible dans les résultats : elle n'est pas silencieusement supprimée.

La limite de 100 entrées uniques inclut les entrées mal formées. Une date hors limites, un `alertDays` invalide, une liste vide ou trop longue provoque une erreur d'entrée avant le contrôle. La zone `sirets` est limitée à 20 000 caractères et `workDomain` à 200 caractères.

### Comprendre la vérification des dates

L'historique ADEME contient deux familles de dates :

- les dates de qualification, dans les champs source `lien_date_*` ;
- les dates de la version de l'enregistrement, dans `date_debut` et `date_fin`.

L'Actor les examine ensemble pour la date demandée. Une qualification ancienne ne doit pas être présentée comme actuelle simplement parce qu'une ancienne version du dossier existe encore dans l'historique.

Les échéances sont calculées **par rapport à aujourd'hui** (`monitoringDate`), uniquement à partir d'enregistrements courants non clôturés. Pour une même qualification identifiée, les périodes qui se chevauchent ou se suivent sans jour manquant sont réunies, y compris un renouvellement futur déjà publié. Seules les périodes réunies qui comprennent aujourd'hui alimentent le suivi. Aucun renouvellement n'est prédit. Les versions historiques remplacées ne sont pas utilisées comme alertes d'échéance actuelles.

La clôture d'une version de ligne **n'est pas interprétée comme une révocation de la qualification**. Si la date recherchée coïncide avec la clôture d'une version historique et qu'aucune version correspondante ne lève l'ambiguïté, une vérification manuelle est demandée.

Les dates absentes ou ambiguës, les données manquantes et les erreurs de récupération doivent être lues comme des limites du contrôle, pas comme une réponse négative certaine.

### Résultats : quel statut lire ?

Le dataset contient une ligne par entrée unique, y compris lorsque le SIRET est invalide, introuvable ou que la source n'a pas pu être interrogée. Les résultats distinguent la vérification à la date demandée du calcul des échéances actuelles.

| `status` | Signification et suite conseillée |
| --- | --- |
| `period_found` | Au moins une qualification publiée et la version de ligne correspondante couvrent la date demandée. Consultez aussi `needsReview` et `warnings` : ce statut n'est pas une validation juridique. |
| `no_matching_period` | Des données ont été récupérées, mais aucune période correspondante n'a été établie pour la date demandée. Vérifiez les périodes et la source avant de conclure. |
| `no_matching_domain` | Des données existent pour le SIRET, mais aucun domaine ne correspond au filtre. Vérifiez son libellé ou relancez sans filtre. |
| `not_found` | Aucun enregistrement n'a été récupéré pour ce SIRET. Vérifiez l'établissement et l'identifiant ; cela ne prouve pas l'absence de qualification. |
| `review_required` | Des dates, des informations de version, la fraîcheur ou la couverture historique empêchent une conclusion suffisamment étayée. Lisez les avertissements. |
| `incomplete` | Tous les enregistrements annoncés par la source n'ont pas été récupérés. Les informations présentées sont partielles ; relancez et ne tirez pas de conclusion négative. |
| `source_error` | La source n'a pas pu être contrôlée correctement. Relancez plus tard ; ce n'est pas un résultat négatif. |
| `invalid_siret` | L'entrée normalisée n'a pas le format attendu à 14 chiffres. Corrigez-la et relancez. |

`statusLabel` donne le libellé en français. **Vérifiez toujours `needsReview`, `complete` et `warnings`, même avec `period_found`.** Une récupération complète ne certifie ni la situation réelle de l'établissement ni l'exhaustivité administrative de la source.

#### Colonnes utiles

| Champ | Lecture |
| --- | --- |
| `input`, `siret`, `companyName` | Entrée reçue, SIRET normalisé et nom publié, lorsqu'il est disponible. |
| `referenceDate`, `monitoringDate` | Date du contrôle historique et date du calcul des échéances actuelles. |
| `matchingQualificationCount`, `matchingQualifications` | Nombre de qualifications distinctes correspondant à la date et détails associés : organisme, code, domaine, périodes et lien de certificat disponible. |
| `currentPublishedPeriodCount`, `currentPeriods` | Périodes actuelles publiées retenues, avec dates de fin et détail des échéances. |
| `expiringQualificationCount` | Nombre de périodes actuelles qui se terminent dans l'horizon demandé. `0` est un calcul sans échéance repérée ; `null` signifie que le calcul n'est pas suffisamment fiable. |
| `nextPublishedEndDate`, `daysUntilNextEnd` | Prochaine date de fin publiée exploitable et délai depuis `monitoringDate`. Si `expiryAssessment` vaut `unknown`, ces informations éventuellement présentes restent à vérifier. |
| `expiryAssessment` | `calculated_from_current_published_periods` : calcul réalisé ; `no_current_published_period` : aucune période actuelle retenue ; `unknown` : résultat incomplet ou incertain. |
| `complete`, `sourceRecordCount`, `sourceTotal` | Complétude de la récupération, nombre de lignes reçues et total annoncé par la source. |
| `sourceUrl`, `sourceDataUpdatedAt`, `checkedAt` | Provenance, date de mise à jour des données lorsqu'elle est vérifiable, et instant du contrôle. |
| `evidenceKey` | Clé du fichier JSON de preuve dans le stockage du run, ou `null` lorsqu'aucune réponse source exploitable n'a été obtenue. |
| `needsReview`, `warnings` | Indication de revue nécessaire et explications. |

#### Preuves et résumé du run

Le stockage clé-valeur du run contient :

- **`EVIDENCE-<SIRET>`** pour chaque SIRET dont une réponse source a été récupérée : champs source sélectionnés, provenance, dates et informations de complétude. Exemple de clé : `EVIDENCE-48384019500026`.
- **`EVIDENCE-INDEX`** : liste des fichiers de preuve disponibles, avec leurs SIRET.
- **`SUMMARY`** : résumé d'exécution, compte des statuts, doublons retirés, paramètres et attribution.

Ces éléments permettent de comparer le résultat synthétique aux données récupérées ; ce ne sont pas des copies certifiées ni une archive historique indépendante de l'ADEME. Un SIRET mal formé ou une requête source entièrement échouée n'a pas de fichier de preuve ; sa ligne de résultat explique la situation.

Le dataset conserve aussi les structures `matchingQualifications`, `currentPeriods` et `warnings`. Préférez l'export JSON pour les exploiter ; l'export CSV convient à la lecture des colonnes de synthèse.

### Source, fraîcheur et réutilisation

Source : [ADEME — Historique des entreprises RGE depuis 2014](https://data.ademe.fr/datasets/historique-rge), sous [Licence Ouverte / Open Licence](https://www.etalab.gouv.fr/licence-ouverte-open-licence/).

ADEME indique que son API et ses visualisations sont actualisées quotidiennement, tandis que le fichier de téléchargement volumineux est actualisé chaque semaine. Cet Actor utilise la source API, et non une copie du fichier hebdomadaire. Une actualisation quotidienne ne garantit pas que chaque changement de situation d'une entreprise soit déjà reflété.

Si la date de mise à jour des données ne peut pas être vérifiée, paraît incohérente ou remonte à plus de 72 heures, le résultat comporte un avertissement et l'évaluation des échéances passe à `unknown`. Les dates de fin très éloignées, à partir de 2090, sont conservées comme données publiées mais exclues des alertes : elles ne garantissent pas une qualification jusque-là.

L'Actor est indépendant : il n'est ni un service officiel de l'ADEME ni un outil d'un organisme de qualification. Conservez l'attribution à la source et les informations de date lorsque vous réutilisez les données.

### Limites importantes

- Un SIRET identifie un **établissement** : une recherche sans résultat ne décrit pas nécessairement tous les établissements de la même entreprise.
- Une correspondance dans la base ne remplace pas le certificat ni sa vérification auprès de l'organisme qui l'a délivré.
- Le jeu de données ne fournit pas ici de drapeau de suspension fiable permettant d'affirmer à lui seul le statut réel actuel. Les périodes publiées ne permettent donc pas de garantir l'absence de suspension ou de retrait non encore répercuté.
- Le contrôle ne vérifie ni les conditions d'un dispositif d'aide, ni la nature exacte du chantier, ni l'assurance, ni la validité d'un devis.
- La date vérifiée repose sur les données historiques disponibles aujourd'hui, pas sur une photographie indépendante enregistrée à cette date.
- Une recherche filtrée sur un domaine ne permet pas de conclure sur les autres domaines. Vérifiez le libellé exact et recommencez sans filtre si nécessaire.
- Les indisponibilités de l'API et les données incomplètes restent des erreurs ou des incertitudes, jamais des confirmations d'absence de qualification.
- La récupération est limitée à 5 000 enregistrements historiques par SIRET. Une limite atteinte avant récupération complète produit `incomplete`, sans conclusion négative.
- Si toutes les requêtes de SIRET correctement formés échouent, le run se termine en échec après avoir sauvegardé les lignes d'erreur et `SUMMARY`. Consultez-les avant de relancer.
- Un calcul d'échéance est un résultat du run. Il n'envoie pas automatiquement de message et ne crée pas de surveillance récurrente.

### Tarification de la bêta

Cette version bêta n'ajoute pas de tarif Actor propre. Les frais d'infrastructure Apify — notamment le calcul et, selon l'utilisation, le stockage — peuvent néanmoins s'appliquer selon votre offre. Consultez les coûts affichés par Apify avant et après une exécution. **Absence de tarif Actor ne signifie pas absence de coût total.**

### English summary

**Check published French RGE qualification periods by establishment SIRET and identify upcoming end dates in current records.**

Paste up to 100 unique SIRETs, one per line, and run the Actor. Optional inputs are `referenceDate` (`YYYY-MM-DD`, from `2014-08-01` through today), `alertDays` (0–365, default 90), and `workDomain` (an exact official domain label). The default reference date is today in `Europe/Paris`. SIRET validation checks the 14-digit format, not the check digit or administrative existence.

The Actor reads ADEME's official historical RGE API. It considers qualification dates and record-version dates separately. Expiry checks concern current, open records and published periods covering today, not superseded historical versions. Adjacent or overlapping renewals already published for the same qualification can extend the merged period; future renewals are never predicted. Closing a record version is not interpreted as revoking a qualification.

You receive one dataset row per unique input, including invalid identifiers, missing records and retrieval failures. Read `needsReview`, `complete` and `warnings` even when `status` is `period_found`. An expiry count of `null` means unknown, not zero. Dataset freshness older than 72 hours or not verifiable prevents a reliable expiry assessment. Export JSON for nested results or CSV for summary columns; the run's key-value store contains per-SIRET `EVIDENCE-<SIRET>` records, `EVIDENCE-INDEX` and `SUMMARY`.

This is a documentary check, **not a legal certificate, a safety assurance, an aid-eligibility decision or proof that no suspension exists**. No result is not proof of no qualification. The beta has no additional Actor fee; Apify infrastructure costs may still apply.

# Actor input Schema

## `sirets` (type: `string`):

Un SIRET de 14 chiffres par ligne (ou séparés par une virgule). Espaces et tirets acceptés. Maximum 100 entrées uniques. Les doublons sont regroupés. Aucun compte ADEME ni proxy nécessaire.

## `referenceDate` (type: `string`):

Vide = aujourd'hui (Europe/Paris). Sinon YYYY-MM-DD, du 2014-08-01 à aujourd'hui. Pas de prévision future. Cette date concerne la recherche historique; les alertes de fin de période sont toujours calculées à aujourd'hui.

## `alertDays` (type: `integer`):

Fenêtre de surveillance à partir d'aujourd'hui, de 0 à 365 jours (90 par défaut). Ne constitue pas une notification automatique.

## `workDomain` (type: `string`):

Facultatif. Domaine exact ou Tous les domaines. Une période dans un domaine ne prouve pas la qualification pour un autre.

## Actor input object example

```json
{
  "sirets": "48384019500026",
  "referenceDate": "",
  "alertDays": 90,
  "workDomain": ""
}
```

# Actor output Schema

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

No description

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

No description

## `evidence` (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 = {
    "sirets": "48384019500026"
};

// Run the Actor and wait for it to finish
const run = await client.actor("surefeed/france-rge-date-expiry-checker").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 = { "sirets": "48384019500026" }

# Run the Actor and wait for it to finish
run = client.actor("surefeed/france-rge-date-expiry-checker").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 '{
  "sirets": "48384019500026"
}' |
apify call surefeed/france-rge-date-expiry-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,surefeed/france-rge-date-expiry-checker"
        }
    }
}
```

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/pftN0553qpjdGqzes/builds/sLKWV9BfOCqmyiEaQ/openapi.json
