# Contrôle fournisseur France : SIREN, TVA, BODACC (`geckostar/controle-fournisseur-france`) Actor

Pour chaque SIREN ou SIRET : identité et état de l'entreprise, validité de la TVA intracommunautaire, annonces légales récentes (procédures collectives, radiations, cessions) et un verdict OK / A_SURVEILLER / RISQUE avec ses raisons.

- **URL**: https://apify.com/geckostar/controle-fournisseur-france.md
- **Developed by:** [Gecko Lab](https://apify.com/geckostar) (community)
- **Categories:** Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 company checkeds

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

## Contrôle fournisseur France

Pour chaque SIREN, SIRET ou numéro de TVA français, l'Actor rassemble trois sources publiques et rend
un verdict **OK / A_SURVEILLER / RISQUE** avec la liste de ses raisons (texte en français + code machine).
Aucun modèle de langage : les règles sont fixes et décrites ci-dessous.

### Sources (publiques, sans clé)

| Source | Usage | Débit utilisé |
|---|---|---|
| API Recherche d'entreprises (`recherche-entreprises.api.gouv.fr`) | identité, état administratif, dates, code NAF, siège, établissement demandé | 5 req/s au plus (limite publiée : 7/s par IP, 30/s par réseau d'hébergeur) |
| VIES REST (Commission européenne) | validité du numéro de TVA (calculé depuis le SIREN s'il n'est pas fourni) | 2 req/s au plus, 6 essais espacés en cas de saturation (jusqu'à ~50 s) |
| BODACC, jeu `annonces-commerciales` (`bodacc-datadila.opendatasoft.com`) | procédures collectives, radiations, ventes et cessions, modifications (direction, dissolution, cessation) | 5 req/s au plus |

Les dirigeants ne sont jamais demandés ni renvoyés. Les textes libres des annonces (noms des
mandataires, personnes) ne sont pas recopiés : seuls la nature, les dates, le tribunal et le lien sont gardés.

### Entrée

| Champ | Défaut | Rôle |
|---|---|---|
| `identifiers` | requis | Liste : SIREN, SIRET, TVA FR, ou « SIREN ; TVA » pour faire vérifier une TVA précise |
| `bodaccMonths` | 36 | Fenêtre des annonces BODACC (1 à 120 mois) |
| `recentCreationMonths` | 12 | Seuil « création récente » (0 = désactivé) |
| `recentManagementChangeMonths` | 6 | Seuil « changement de direction récent » (0 = désactivé) |
| `checkVat` | true | Interroger VIES |
| `maxItems` | 1000 | Garde-fou sur la taille de la liste (≤ 5000) |
| `maxConcurrency` | 3 | Sociétés contrôlées en parallèle (1 à 5) |

Validation : espaces, points et tirets retirés ; clé de Luhn vérifiée (exception La Poste pour les
SIRET : somme des chiffres multiple de 5). Une saisie invalide produit une ligne `entree_invalide`,
**non facturée**. Les doublons (même SIREN/SIRET/TVA, y compris « 552032534 » et « FR27552032534 »)
ne sont contrôlés qu'une fois.

### Règles du verdict

Le verdict est le niveau le plus grave parmi les raisons. Aucune raison : `OK`.

| Code | Niveau | Condition |
|---|---|---|
| `ENTREPRISE_CESSEE` | RISQUE | Unité légale cessée au répertoire |
| `LIQUIDATION_JUDICIAIRE` | RISQUE | La dernière décision de procédure collective de la fenêtre est une liquidation (ouverture, conversion, extension, résolution de plan) |
| `CLOTURE_INSUFFISANCE_ACTIF` | RISQUE | Dernière décision : clôture pour insuffisance d'actif |
| `REDRESSEMENT_EN_COURS` | RISQUE | Dernière décision : ouverture (ou conversion) d'un redressement judiciaire |
| `PLAN_DE_CESSION` | RISQUE | Dernière décision : plan de cession |
| `RADIATION_RCS` | RISQUE | Radiation publiée et entreprise cessée |
| `DISSOLUTION` | RISQUE | Dissolution publiée dans la fenêtre (hors dissolution sans liquidation) |
| `CESSATION_ACTIVITE` | RISQUE | Cessation d'activité publiée dans la fenêtre |
| `PLAN_REDRESSEMENT_EN_COURS` | A_SURVEILLER | Dernière décision : plan de redressement arrêté ou modifié |
| `SAUVEGARDE` | A_SURVEILLER | Dernière décision : sauvegarde ou plan de sauvegarde |
| `PROCEDURE_COLLECTIVE_CLOSE` | A_SURVEILLER | Dernière décision : clôture pour extinction du passif ou fin de procédure |
| `RADIATION_PUBLIEE` | A_SURVEILLER | Radiation publiée mais entreprise encore active au répertoire (décalage, établissement, transfert) |
| `ABSORPTION` | A_SURVEILLER | Dissolution sans liquidation (fusion, transmission universelle) |
| `CESSION_FONDS` | A_SURVEILLER | L'entreprise apparaît comme cédante d'un fonds |
| `CONCILIATION` / `RETABLISSEMENT_PROFESSIONNEL` | A_SURVEILLER | Annonce de ce type dans la fenêtre |
| `SANCTION_DIRIGEANT` | A_SURVEILLER | Faillite personnelle ou interdiction de gérer publiée pour ce numéro |
| `CHANGEMENT_DIRIGEANT_RECENT` | A_SURVEILLER | Modification de la direction publiée depuis moins de `recentManagementChangeMonths` mois |
| `CREATION_RECENTE` | A_SURVEILLER | Créée depuis moins de `recentCreationMonths` mois |
| `ETABLISSEMENT_FERME` / `ETABLISSEMENT_INTROUVABLE` | A_SURVEILLER | Pour un SIRET : établissement fermé ou absent alors que l'entreprise est active |
| `TVA_INVALIDE` | A_SURVEILLER | VIES répond « invalide » (normal pour une entreprise non assujettie) |
| `TVA_INDETERMINEE` | A_SURVEILLER | VIES saturé ou indisponible après 6 essais : la TVA n'est pas jugée invalide ; la cause est dans `tva.explication` |
| `TVA_INCOHERENTE` | A_SURVEILLER | La TVA fournie ne porte pas ce SIREN ou n'a pas la bonne clé |
| `BODACC_INDISPONIBLE` | A_SURVEILLER | BODACC n'a pas répondu |
| `INTROUVABLE` | A_SURVEILLER | Numéro valide mais absent de la base (inexistant ou non diffusible) |

« Dernière décision » : parmi les jugements de procédure collective de la fenêtre, celui dont la date de
jugement est la plus récente fixe l'état (une sauvegarde suivie d'une liquidation donne `LIQUIDATION_JUDICIAIRE`).
Les avis d'annulation retirent l'annonce visée ; un rectificatif remplace l'annonce d'origine. En
Alsace-Moselle, la nature « Autre jugement et ordonnance » est précisée par le début du texte du jugement.

### Sortie

Une ligne par saisie : `entree`, `siren`, `siret`, `statut_traitement` (`ok`, `partiel`, `introuvable`,
`erreur`, `entree_invalide`), `facturable`, `verdict`, `raisons[]` (`code`, `niveau`, `message`),
`identite`, `tva` (`numero`, `statut` = `valide`/`invalide`/`indetermine`, `code_vies`, `explication` (cause en clair quand la TVA est indéterminée), `origine`),
`bodacc` (`depuis`, `procedure_collective`, `annonces[]` avec `id`, dates, `categorie`, `libelle`,
`tribunal`, `url`). Quand une information manque (saisie rejetée, société introuvable, erreur), `identite`,
`tva` et `bodacc` restent des objets dont les champs valent `null`. Un bilan chiffré est écrit dans le magasin clé-valeur sous `BILAN`.

### Facturation

Un seul événement : `company-checked`, facturé **seulement** quand `statut_traitement = ok` (identité
trouvée, BODACC consulté, réponse VIES définitive ou VIES désactivé). Non facturés : saisies invalides,
introuvables, résultats partiels (VIES indéterminé, BODACC indisponible), erreurs. L'événement de
démarrage est géré par Apify. Avant chaque lot, l'Actor vérifie la limite de dépense de l'utilisateur ;
quand elle est atteinte, il s'arrête proprement et le message d'état indique combien de numéros n'ont
pas été traités. Dans la console Apify, ne pas activer l'événement synthétique `apify-default-dataset-item`.

### Limites

- Pas de garantie juridique : le verdict résume des données publiques à un instant donné.
- Le répertoire et le BODACC ne sont pas synchrones (une clôture peut paraître avant la cessation au répertoire).
- VIES tombe souvent par État membre : la TVA est alors « indéterminée », jamais « invalide ».
- Limite de l'API Recherche d'entreprises par réseau d'hébergeur : sur un nuage partagé, des 429 sont possibles ; ils sont respectés (`Retry-After`).
- Entreprises non diffusibles : absentes de l'API, donc `introuvable` (non facturé).

### Conditions d'utilisation / Terms

Outil destiné aux professionnels, pour vérifier un fournisseur ou un partenaire commercial. Le verdict résume des données publiques (API Recherche d'entreprises, VIES, BODACC) lues au moment de l'exécution, sans garantie d'exhaustivité ni d'actualité : il ne remplace ni un extrait Kbis ni l'avis d'un professionnel, et ne constitue pas une évaluation de solvabilité. Dans les limites permises par la loi, l'éditeur ne répond pas des décisions prises sur la seule base de ces résultats, ni de l'usage que l'utilisateur en fait. Cette clause n'écarte aucun droit que la loi réserve aux consommateurs, notamment la garantie légale de conformité des contenus et services numériques.

Intended for business use, to check a supplier or business partner. The verdict summarises public data read at run time, with no guarantee of completeness or freshness; it is not a credit rating. To the extent permitted by law, the developer is not liable for decisions based solely on these results or for the user's use of them. Nothing here limits statutory consumer rights.

### Mentions légales / Legal notice

- Éditeur et vendeur / Publisher and seller : Audric Moussaoui, entrepreneur individuel (EI), nom commercial / trade name « geckostar »
- Adresse / Address : 88 rue Oberkampf, 75011 Paris, France
- Téléphone / Phone : +33 6 95 11 28 15
- Courriel / E-mail : audricmm@gmail.com
- SIREN : en cours d'attribution, déclaration d'activité déposée le 24/10/2026 / being assigned, registration filed on 24 October 2026
- Directeur de la publication / Publication director : Audric Moussaoui
- TVA non applicable, art. 293 B du CGI / VAT not applicable (French VAT franchise, art. 293 B CGI)
- Hébergement / Hosting : Apify Technologies s.r.o., Vodičkova 704/36, 110 00 Prague 1, République tchèque / Czech Republic (hello@apify.com)

# Actor input Schema

## `identifiers` (type: `array`):

Un numéro par ligne : SIREN (9 chiffres), SIRET (14 chiffres) ou TVA française (FR + 11 caractères). Pour faire vérifier un numéro de TVA précis, écrivez-le après le SIREN : « 552032534 ; FR27552032534 ». Espaces et points acceptés. Les numéros invalides sont signalés et non facturés ; les doublons sont ignorés.

## `bodaccMonths` (type: `integer`):

Ancienneté maximale des annonces légales examinées.

## `recentCreationMonths` (type: `integer`):

Une entreprise créée depuis moins de ce nombre de mois est « à surveiller ». 0 pour désactiver.

## `recentManagementChangeMonths` (type: `integer`):

Une modification de la direction publiée au BODACC depuis moins de ce nombre de mois rend l'entreprise « à surveiller ». 0 pour désactiver.

## `checkVat` (type: `boolean`):

Interroge le service européen VIES. Désactivé : aucune vérification de TVA, le verdict ne porte que sur l'identité et les annonces.

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

Garde-fou : l'exécution est refusée si la liste est plus longue.

## `maxConcurrency` (type: `integer`):

Nombre de sociétés contrôlées en même temps. Les débits des sources publiques restent bornés quel que soit ce réglage.

## Actor input object example

```json
{
  "identifiers": [
    "552032534",
    "910288372"
  ],
  "bodaccMonths": 36,
  "recentCreationMonths": 12,
  "recentManagementChangeMonths": 6,
  "checkVat": true,
  "maxItems": 1000,
  "maxConcurrency": 3
}
```

# Actor output Schema

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

Une ligne par saisie, dans la vue Synthèse ; les lignes non facturées portent facturable = false.

## `bilan` (type: `string`):

Compteurs de l'exécution : éléments traités, facturés et non facturés.

# 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 = {
    "identifiers": [
        "552032534",
        "910288372"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("geckostar/controle-fournisseur-france").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 = { "identifiers": [
        "552032534",
        "910288372",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("geckostar/controle-fournisseur-france").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 '{
  "identifiers": [
    "552032534",
    "910288372"
  ]
}' |
apify call geckostar/controle-fournisseur-france --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,geckostar/controle-fournisseur-france"
        }
    }
}
```

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/NSHe1UR1BEwq7qFaI/builds/94Cv3LTHPaYaIGr4R/openapi.json
