# French Company Enricher — SIREN to Full Legal Dossier (`dr1ms/french-company-enricher`) Actor

Enrichit un SIREN, SIRET, nom ou URL en dossier complet par entreprise française : identité, dirigeants à jour, bilans, actes INPI, annonces BODACC, labels RSE, TVA UE. Agrège DINUM, BODACC, INPI RNE et VIES. Alternative open-data à Pappers/Societe.com, avec mode monitoring.

- **URL**: https://apify.com/dr1ms/french-company-enricher.md
- **Developed by:** [Adrien](https://apify.com/dr1ms) (community)
- **Categories:** SEO tools, Lead generation, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $9.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## French Company Enricher

**SIREN / SIRET / nom → dossier légal complet. Alternative open-data à Pappers.fr / Societe.com pour l'Apify Store.** À partir d'un SIREN, SIRET, nom d'entreprise ou URL (annuaire-entreprises.data.gouv.fr, pappers.fr), cet Actor construit un dossier exhaustif par entreprise française en agrégeant quatre sources officielles : **DINUM** (recherche-entreprises), **BODACC** (annonces légales), **INPI RNE** (dirigeants à jour, bénéficiaires effectifs, actes, bilans) et **VIES** (TVA UE).

Contrairement aux scrapers de masse, cet Actor est orienté **profondeur** : un dossier complet par entreprise, avec la qualité des données explicite et la modularité tier par tier.

### Fonctionnalités

- **4 entrées supportées** : SIREN, SIRET, nom libre, URL annuaire-entreprises ou Pappers
- **4 tiers** : basic (DINUM) → standard (+ BODACC) → premium (+ INPI RNE) → full (+ PDFs actes/bilans)
- **Timeline BODACC complète** avec JSON internes parsés (actes, jugements, dépôts comptes, procédures collectives)
- **Matrice de 20+ labels** (Bio, Qualiopi, RGE, ESS, société à mission, convention collective, etc.)
- **Liste des élus** pour les collectivités territoriales
- **Graphe dirigeants personne morale** : commissaires aux comptes, holdings
- **Validation TVA intracommunautaire** via l'API VIES de l'UE
- **Transparence sur la fraîcheur** : warning explicite si les données RNE via DINUM sont obsolètes (>365 jours)
- **Mode monitoring** : surveille une watchlist de SIREN via `/diff` INPI et remonte uniquement les entreprises modifiées
- **Cache KV store** : évite les re-fetch des mêmes SIREN en runs successifs
- **Persistence d'état** : reprise automatique après migration

### Cas d'utilisation

- **Due diligence légère** : vérifier un fournisseur, un partenaire, un investisseur
- **KYB informel** : conformité B2B, analyse de risque fournisseur
- **Enrichissement CRM** : dossier légal par compte prospect
- **Veille concurrentielle** : surveillance d'un portefeuille d'entreprises via le mode monitoring
- **Compliance B2B** : vérification TVA UE + labels RSE (société à mission, ESS, etc.)

### Input

#### Paramètres principaux

| Paramètre | Type | Défaut | Description |
|---|---|---|---|
| `queries` | array[string] | — | SIREN, SIRET, noms ou URLs à traiter |
| `tier` | enum | `standard` | `basic` \| `standard` \| `premium` \| `full` |
| `maxItems` | int | 1000 | Nombre max de dossiers |
| `mode` | enum | `standard` | `standard` \| `monitor` |

#### Paramètres BODACC

| Paramètre | Type | Défaut |
|---|---|---|
| `includeBodacc` | bool | `true` |
| `maxAnnoncesBodacc` | int | 200 |

#### Paramètres INPI (tier ≥ premium)

| Paramètre | Type | Défaut |
|---|---|---|
| `inpiUsername` | string (secret) | — |
| `inpiPassword` | string (secret) | — |
| `inpiIncludeAttachmentsList` | bool | `true` |
| `inpiDownloadPDFs` | bool | `false` |
| `inpiMaxActesPerCompany` | int | 10 |
| `inpiMaxBilansPerCompany` | int | 5 |

**Comment obtenir des credentials INPI :**
1. Créer un compte sur [data.inpi.fr](https://data.inpi.fr)
2. Aller dans « Mon espace → Mes accès API/SFTP → Accès APIs RNE »
3. Activer les rôles : `COMPANIES_METADATA`, `ACTES_PDF`, `BILANS_PDF`, `BILANS_SAISIES_PDF`
4. Utiliser votre email + mot de passe comme credentials

> ⚠️ **Proxy obligatoire en cloud pour INPI.** Les IPs datacenter d'Apify sont régulièrement bloquées par le firewall INPI (`ConnectError`). Si vous exécutez en tier `premium` ou `full` sur la plateforme Apify, **activez `proxyConfiguration` → Apify Proxy Residential FR**. L'Actor route automatiquement *uniquement* INPI via le proxy (DINUM/BODACC/VIES restent en direct pour économiser les crédits proxy).

#### Paramètres VIES

| Paramètre | Type | Défaut |
|---|---|---|
| `validateTva` | bool | `false` |

#### Paramètres Cache et Résolution

| Paramètre | Type | Défaut |
|---|---|---|
| `cacheMaxAgeDays` | int | 7 |
| `ambiguityThreshold` | int | 25 |
| `emitAllCandidates` | bool | `false` |

#### Exemples d'input

**Tier basic — enrichissement simple :**

```json
{
  "queries": [
    "356000000",
    "47920546000062",
    "https://www.pappers.fr/entreprise/552120222"
  ],
  "tier": "basic",
  "includeBodacc": false
}
````

**Tier standard — dossier + événements :**

```json
{
  "queries": ["356000000", "Michel et Augustin"],
  "tier": "standard",
  "maxAnnoncesBodacc": 100,
  "validateTva": true
}
```

**Tier premium — + données INPI RNE :**

```json
{
  "queries": ["479205460"],
  "tier": "premium",
  "inpiUsername": "<votre email INPI>",
  "inpiPassword": "<votre password INPI>",
  "inpiIncludeAttachmentsList": true
}
```

**Tier full — + PDFs téléchargés :**

```json
{
  "queries": ["479205460"],
  "tier": "full",
  "inpiUsername": "<...>",
  "inpiPassword": "<...>",
  "inpiDownloadPDFs": true,
  "inpiMaxActesPerCompany": 5,
  "inpiMaxBilansPerCompany": 3
}
```

**Mode monitoring :**

```json
{
  "queries": ["placeholder"],
  "mode": "monitor",
  "watchlist": ["356000000", "479205460", "552120222"],
  "since": "2026-04-15",
  "tier": "premium",
  "inpiUsername": "<...>",
  "inpiPassword": "<...>"
}
```

### Output

Chaque item du dataset est un dossier entreprise complet. Les blocs sont omis si la source correspondante n'est pas activée.

#### Structure principale

```json
{
  "siren": "479205460",
  "inputQuery": "Michel et Augustin",
  "resolutionMethod": "name",
  "resolutionScore": 0.94,
  "sourceUrl": "https://annuaire-entreprises.data.gouv.fr/entreprise/479205460",
  "pappersUrl": "https://www.pappers.fr/entreprise/479205460",
  "tierApplied": "premium",
  "sources": ["dinum", "bodacc", "inpi"],

  "identity": {
    "denomination": "MICHEL ET AUGUSTIN",
    "siren": "479205460",
    "siretSiege": "47920546000062",
    "dateCreation": "2009-04-02",
    "etatAdministratif": "A",
    "natureJuridique": "5710",
    "natureJuridiqueLibelle": "SAS (Société par actions simplifiée)",
    "categorieEntreprise": "PME",
    "capitalSocial": 15236956.0,
    "capitalDevise": "EUR",
    "dureeAnnees": 45,
    "dateClotureExerciceSocial": "3108"
  },

  "activity": {
    "codeNaf": "4638B",
    "codeNaf2025": "46.38A",
    "section": "G",
    "sectionLibelle": "Commerce ; réparation d'automobiles et motocycles",
    "objetSocial": "conception, réalisation, fabrication en sous-traitance..."
  },

  "headcount": {
    "trancheEffectifSalarie": "22",
    "trancheEffectifLibelle": "100 à 199 salariés",
    "anneeEffectif": "2023",
    "nombreEtablissements": 7,
    "nombreEtablissementsOuverts": 5
  },

  "headquarters": {
    "adresse": "70 RUE DU GOUVERNEUR GENERAL EBOUE 92130 ISSY-LES-MOULINEAUX",
    "codePostal": "92130",
    "libelleCommune": "ISSY-LES-MOULINEAUX",
    "departement": "92",
    "region": "11",
    "epci": "200054781",
    "latitude": 48.8221,
    "longitude": 2.2713
  },

  "directors": [
    {
      "type": "personne_physique",
      "nom": "NEUMANN",
      "prenoms": ["CHRISTOPHE", "PIERRE", "MANFRED"],
      "qualite": "Directeur général",
      "dateDeNaissance": "1968-08",
      "source": "inpi"
    },
    {
      "type": "personne_morale",
      "sirenDirigeant": "672006483",
      "denomination": "PRICEWATERHOUSECOOPERS AUDIT",
      "qualite": "Commissaire aux comptes titulaire",
      "source": "inpi"
    }
  ],

  "labels": {
    "estBio": false,
    "estQualiopi": false,
    "estSocieteMission": true,
    "estEss": false,
    "conventionCollectiveRenseignee": true,
    "conventionsIdcc": ["1486"]
  },

  "financials": {
    "dinumSummary": {
      "2023": { "ca": 67000000, "resultat_net": -2100000 }
    }
  },

  "bodaccEvents": [
    {
      "id": "C201901585651",
      "dateParution": "2019-08-18",
      "familleAvis": "dpc",
      "familleAvisLibelle": "Dépôts des comptes",
      "tribunal": "GREFFE DU TRIBUNAL DE COMMERCE DE PARIS",
      "parsedContent": {
        "depot": { "dateCloture": "2018-12-31", "typeDepot": "Comptes annuels et rapports" }
      },
      "urlComplete": "https://www.bodacc.fr/..."
    }
  ],

  "inpiAttachments": {
    "actes": [
      {
        "id": "669f1c0b763f26e3b7027e49",
        "dateDepot": "2024-07-15",
        "numChrono": "30709",
        "typesActes": ["Statuts mis à jour", "Extrait de PV d'AG"],
        "downloadUrl": "https://registre-national-entreprises.inpi.fr/api/actes/669f.../download",
        "downloaded": true,
        "apifyKvsKey": "pdf-acte-669f1c0b763f26e3b7027e49"
      }
    ],
    "bilans": [...]
  },

  "tva": {
    "number": "FR86479205460",
    "valid": true,
    "checkedAt": "2026-04-18T14:23:00Z"
  },

  "dataQuality": {
    "inseeUpdatedAt": "2026-04-16T18:33:23",
    "rneUpdatedAtViaDinum": "2024-05-19T17:01:20",
    "rneStalenessDays": 699,
    "inpiFetched": true,
    "inpiUpdatedAt": "2025-07-11T21:30:26+02:00"
  },

  "warnings": [
    "Tier premium utilisé : données RNE rafraîchies via INPI directement."
  ],

  "fromCache": false,
  "fetchDurationSeconds": 11.3,
  "scrapedAt": "2026-04-18T14:23:45Z"
}
```

#### Cas spéciaux

**SIREN invalide / inexistant :**

```json
{
  "inputQuery": "999999999",
  "error": "SIREN_NOT_FOUND",
  "errorMessage": "Aucune entreprise trouvée pour le SIREN 999999999 dans DINUM (non-diffusible ou inexistant)."
}
```

**Input ambigu (nom libre) :**

```json
{
  "inputQuery": "dupont",
  "resolutionMethod": "name",
  "ambiguous": true,
  "candidates": [
    { "siren": "...", "nom": "...", "score": 18.5, "ville": "...", "codePostal": "..." }
  ],
  "errorMessage": "Plusieurs candidats trouvés..."
}
```

### Limitations

#### Spécifiques à DINUM

- **Cap 10 000 résultats** sur un filtre (limite `page × per_page ≤ 10 000`). L'Actor lit le résultat le plus pertinent par SIREN, donc cette limite ne s'applique pas au mode SIREN/SIRET. Pour les noms libres, seuls les 5 premiers candidats sont considérés.
- **Entreprises non-diffusibles totales invisibles** : si un entrepreneur individuel a refusé la diffusion auprès de l'INSEE, DINUM ne renvoie rien. Message d'erreur `SIREN_NOT_FOUND` dans ce cas.
- **Date de mise à jour RNE** parfois stale de 2+ ans. L'Actor remonte explicitement `rneStalenessDays` et un warning si > 365 jours. Solution : passer au tier premium (INPI directement).

#### Spécifiques à BODACC

- Les champs `listepersonnes`, `jugement`, `acte`, `modificationsgenerales` sont des **strings JSON sérialisés** dans l'API source. L'Actor les parse et les expose dans `parsedContent`.

#### Spécifiques à INPI

- **Lent (~10s par appel `/companies/{siren}`)** — sémaphore à 10 concurrents pour rester correct.
- **Credentials requis** pour tier ≥ premium. Création de compte sur [data.inpi.fr](https://data.inpi.fr) + activation des rôles API.
- **Token valide 24h**, refresh automatique pour les runs longs.
- Entreprises non inscrites au RNE (ex: associations loi 1901 sans activité commerciale) → 404 traité en warning non bloquant.
- **PDFs volumineux** (jusqu'à plusieurs MB). Timeout 90s, downloads séquentiels pour éviter la surcharge mémoire.

#### Spécifiques à VIES

- Service UE parfois lent/indisponible (503). Timeout 5s. En cas d'échec, `valid: null` + `error: "VIES_TIMEOUT"` au lieu de bloquer l'item.

#### Mode monitoring

- Le `/diff` INPI est paginé (`pageSize=100`). L'Actor arrête au cap 200 pages pour éviter les runs infinis. Pour des fenêtres > 1 jour, diviser en plusieurs runs.

#### Conformité

- **Licence des données** : les APIs DINUM, BODACC et INPI sont sous licence [Etalab 2.0](https://www.etalab.gouv.fr/licence-ouverte-open-licence). Réutilisation libre, y compris commerciale.
- **RGPD** : les dossiers contiennent des données personnelles (dirigeants : nom, date de naissance, nationalité). L'utilisateur de l'Actor est responsable du traitement au sens RGPD Art. 28 : ne pas revendre les données personnelles sans base légale, ne pas les utiliser à des fins de profilage non autorisées, respecter les droits des personnes concernées.
- **Attribution** : les sources sont citées dans le bloc `sources` de chaque dossier.

### Sources de données

| Source | URL | Documentation |
|---|---|---|
| DINUM recherche-entreprises | [recherche-entreprises.api.gouv.fr](https://recherche-entreprises.api.gouv.fr) | [Doc](https://recherche-entreprises.api.gouv.fr/doc) |
| BODACC v2.1 | [bodacc-datadila.opendatasoft.com](https://bodacc-datadila.opendatasoft.com) | [Doc](https://bodacc-datadila.opendatasoft.com/api/v2/console) |
| INPI RNE | [registre-national-entreprises.inpi.fr](https://registre-national-entreprises.inpi.fr) | [Doc](https://data.inpi.fr/content/editorial/Acces_API_Entreprises) |
| VIES | [ec.europa.eu/taxation\_customs/vies](https://ec.europa.eu/taxation_customs/vies) | [Doc](https://ec.europa.eu/taxation_customs/vies/#/technical-information) |

### Changelog

Voir [CHANGELOG.md](./CHANGELOG.md).

### Licence

MIT — voir [LICENSE](./LICENSE).

# Actor input Schema

## `queries` (type: `array`):

Liste de SIREN (9 chiffres), SIRET (14 chiffres), noms d'entreprise, ou URLs annuaire/pappers. Chaque entrée produit un dossier.

## `tier` (type: `string`):

Niveau de détail : basic = DINUM uniquement (~0.5s/entrée). standard = + BODACC (~1s). premium = + INPI RNE (dirigeants à jour, RBE, capital, objet social — ~10s, credentials INPI requis). full = + liste actes/bilans + PDFs téléchargés (~25s).

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

Nombre maximum de dossiers à produire. 0 = pas de limite.

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

standard : fetch chaque entrée. monitor : fetch /diff INPI puis intersecte avec une watchlist pour produire un diff par rapport à la version cachée.

## `watchlist` (type: `array`):

Liste de SIREN à surveiller en mode monitoring. L'Actor fetch le /diff INPI puis remonte uniquement les entreprises modifiées présentes dans la watchlist.

## `since` (type: `string`):

Date de début au format YYYY-MM-DD pour le /diff INPI. Défaut : 1 jour avant maintenant.

## `includeBodacc` (type: `boolean`):

Récupérer l'historique BODACC (annonces légales). Désactivé par défaut pour le tier basic.

## `maxAnnoncesBodacc` (type: `integer`):

Limite le nombre d'annonces BODACC récupérées par entreprise (les plus récentes d'abord).

## `inpiUsername` (type: `string`):

Email du compte INPI (requis pour tier premium ou full). Créer un compte sur https://data.inpi.fr puis activer l'accès API dans Mon espace → Mes accès API/SFTP.

## `inpiPassword` (type: `string`):

Mot de passe du compte INPI.

## `inpiIncludeAttachmentsList` (type: `boolean`):

Inclut la liste des actes et bilans disponibles (métadonnées uniquement, pas de PDF). Rapide.

## `inpiDownloadPDFs` (type: `boolean`):

Télécharge les PDFs actes/bilans dans le Key-Value store (tier full uniquement). Lent et coûteux.

## `inpiMaxActesPerCompany` (type: `integer`):

Limite le nombre d'actes téléchargés (les plus récents).

## `inpiMaxBilansPerCompany` (type: `integer`):

Limite le nombre de bilans téléchargés (les plus récents).

## `validateTva` (type: `boolean`):

Calcule le numéro TVA intracommunautaire FR depuis le SIREN puis le vérifie via l'API VIES de l'UE.

## `cacheMaxAgeDays` (type: `integer`):

Durée de vie du cache KV store en jours. 0 = désactive le cache (force refresh).

## `ambiguityThreshold` (type: `integer`):

Écart minimum en % entre le score du meilleur candidat et le 2e pour considérer le match comme unique (ex: 25 = top 25% au-dessus du 2e). Sinon l'Actor émet les candidats top 5 avec warning. Plus élevé = plus strict.

## `emitAllCandidates` (type: `boolean`):

Si true, pour chaque nom libre ambigu, émet les 5 candidats comme un seul item avec warning (au lieu du meilleur match).

## `proxyConfiguration` (type: `object`):

Utilisé uniquement pour les appels INPI (DINUM/BODACC/VIES restent en direct). OBLIGATOIRE pour tier premium/full en cloud Apify : les IPs datacenter sont régulièrement bloquées par le firewall INPI. Sélectionner Apify Proxy → Residential → country FR.

## Actor input object example

```json
{
  "queries": [
    "479205460",
    "552120222",
    "Michel et Augustin"
  ],
  "tier": "standard",
  "maxItems": 1000,
  "mode": "standard",
  "watchlist": [],
  "since": "",
  "includeBodacc": true,
  "maxAnnoncesBodacc": 200,
  "inpiIncludeAttachmentsList": true,
  "inpiDownloadPDFs": false,
  "inpiMaxActesPerCompany": 10,
  "inpiMaxBilansPerCompany": 5,
  "validateTva": false,
  "cacheMaxAgeDays": 7,
  "ambiguityThreshold": 25,
  "emitAllCandidates": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "FR"
  }
}
```

# Actor output Schema

## `dossiers` (type: `string`):

Dataset des dossiers produits, un item par entreprise.

# 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 = {
    "queries": [
        "479205460",
        "552120222",
        "Michel et Augustin"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "FR"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("dr1ms/french-company-enricher").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 = {
    "queries": [
        "479205460",
        "552120222",
        "Michel et Augustin",
    ],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "FR",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("dr1ms/french-company-enricher").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "479205460",
    "552120222",
    "Michel et Augustin"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "FR"
  }
}' |
apify call dr1ms/french-company-enricher --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=dr1ms/french-company-enricher",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "French Company Enricher — SIREN to Full Legal Dossier",
        "description": "Enrichit un SIREN, SIRET, nom ou URL en dossier complet par entreprise française : identité, dirigeants à jour, bilans, actes INPI, annonces BODACC, labels RSE, TVA UE. Agrège DINUM, BODACC, INPI RNE et VIES. Alternative open-data à Pappers/Societe.com, avec mode monitoring.",
        "version": "0.3",
        "x-build-id": "WQ4dztMnDiOF5IkHN"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/dr1ms~french-company-enricher/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-dr1ms-french-company-enricher",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/dr1ms~french-company-enricher/runs": {
            "post": {
                "operationId": "runs-sync-dr1ms-french-company-enricher",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/dr1ms~french-company-enricher/run-sync": {
            "post": {
                "operationId": "run-sync-dr1ms-french-company-enricher",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "queries"
                ],
                "properties": {
                    "queries": {
                        "title": "Entrées",
                        "minItems": 1,
                        "type": "array",
                        "description": "Liste de SIREN (9 chiffres), SIRET (14 chiffres), noms d'entreprise, ou URLs annuaire/pappers. Chaque entrée produit un dossier.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "tier": {
                        "title": "Tier (profondeur du dossier)",
                        "enum": [
                            "basic",
                            "standard",
                            "premium",
                            "full"
                        ],
                        "type": "string",
                        "description": "Niveau de détail : basic = DINUM uniquement (~0.5s/entrée). standard = + BODACC (~1s). premium = + INPI RNE (dirigeants à jour, RBE, capital, objet social — ~10s, credentials INPI requis). full = + liste actes/bilans + PDFs téléchargés (~25s).",
                        "default": "standard"
                    },
                    "maxItems": {
                        "title": "Max dossiers",
                        "minimum": 0,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Nombre maximum de dossiers à produire. 0 = pas de limite.",
                        "default": 1000
                    },
                    "mode": {
                        "title": "Mode d'exécution",
                        "enum": [
                            "standard",
                            "monitor"
                        ],
                        "type": "string",
                        "description": "standard : fetch chaque entrée. monitor : fetch /diff INPI puis intersecte avec une watchlist pour produire un diff par rapport à la version cachée.",
                        "default": "standard"
                    },
                    "watchlist": {
                        "title": "Watchlist (mode monitoring)",
                        "type": "array",
                        "description": "Liste de SIREN à surveiller en mode monitoring. L'Actor fetch le /diff INPI puis remonte uniquement les entreprises modifiées présentes dans la watchlist.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "since": {
                        "title": "Depuis (mode monitoring)",
                        "type": "string",
                        "description": "Date de début au format YYYY-MM-DD pour le /diff INPI. Défaut : 1 jour avant maintenant.",
                        "default": ""
                    },
                    "includeBodacc": {
                        "title": "Inclure BODACC",
                        "type": "boolean",
                        "description": "Récupérer l'historique BODACC (annonces légales). Désactivé par défaut pour le tier basic.",
                        "default": true
                    },
                    "maxAnnoncesBodacc": {
                        "title": "Max annonces BODACC par entreprise",
                        "minimum": 1,
                        "maximum": 2000,
                        "type": "integer",
                        "description": "Limite le nombre d'annonces BODACC récupérées par entreprise (les plus récentes d'abord).",
                        "default": 200
                    },
                    "inpiUsername": {
                        "title": "INPI — Email de connexion",
                        "type": "string",
                        "description": "Email du compte INPI (requis pour tier premium ou full). Créer un compte sur https://data.inpi.fr puis activer l'accès API dans Mon espace → Mes accès API/SFTP."
                    },
                    "inpiPassword": {
                        "title": "INPI — Mot de passe",
                        "type": "string",
                        "description": "Mot de passe du compte INPI."
                    },
                    "inpiIncludeAttachmentsList": {
                        "title": "INPI — Lister les actes/bilans",
                        "type": "boolean",
                        "description": "Inclut la liste des actes et bilans disponibles (métadonnées uniquement, pas de PDF). Rapide.",
                        "default": true
                    },
                    "inpiDownloadPDFs": {
                        "title": "INPI — Télécharger les PDFs",
                        "type": "boolean",
                        "description": "Télécharge les PDFs actes/bilans dans le Key-Value store (tier full uniquement). Lent et coûteux.",
                        "default": false
                    },
                    "inpiMaxActesPerCompany": {
                        "title": "INPI — Max actes par entreprise",
                        "minimum": 0,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Limite le nombre d'actes téléchargés (les plus récents).",
                        "default": 10
                    },
                    "inpiMaxBilansPerCompany": {
                        "title": "INPI — Max bilans par entreprise",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Limite le nombre de bilans téléchargés (les plus récents).",
                        "default": 5
                    },
                    "validateTva": {
                        "title": "Valider la TVA via VIES",
                        "type": "boolean",
                        "description": "Calcule le numéro TVA intracommunautaire FR depuis le SIREN puis le vérifie via l'API VIES de l'UE.",
                        "default": false
                    },
                    "cacheMaxAgeDays": {
                        "title": "TTL cache (jours)",
                        "minimum": 0,
                        "maximum": 365,
                        "type": "integer",
                        "description": "Durée de vie du cache KV store en jours. 0 = désactive le cache (force refresh).",
                        "default": 7
                    },
                    "ambiguityThreshold": {
                        "title": "Seuil de désambiguïsation (noms libres, %)",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Écart minimum en % entre le score du meilleur candidat et le 2e pour considérer le match comme unique (ex: 25 = top 25% au-dessus du 2e). Sinon l'Actor émet les candidats top 5 avec warning. Plus élevé = plus strict.",
                        "default": 25
                    },
                    "emitAllCandidates": {
                        "title": "Émettre tous les candidats",
                        "type": "boolean",
                        "description": "Si true, pour chaque nom libre ambigu, émet les 5 candidats comme un seul item avec warning (au lieu du meilleur match).",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Configuration proxy (Apify Proxy Residential FR recommandé pour INPI)",
                        "type": "object",
                        "description": "Utilisé uniquement pour les appels INPI (DINUM/BODACC/VIES restent en direct). OBLIGATOIRE pour tier premium/full en cloud Apify : les IPs datacenter sont régulièrement bloquées par le firewall INPI. Sélectionner Apify Proxy → Residential → country FR."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
