# 🇫🇷 New Companies France — BODACC watch, directors & scoring (`owoyale/nouvelles-entreprises-france`) Actor

Detect newly registered French companies (nouvelles entreprises immatriculées au RCS) from the official BODACC. Directors, capital, legal form, address and declared activity as clean fields. INSEE enrichment without any API key, configurable lead scoring, and a watch mode for daily runs.

- **URL**: https://apify.com/owoyale/nouvelles-entreprises-france.md
- **Developed by:** [OWOYALE ADISSA](https://apify.com/owoyale) (community)
- **Categories:**
- **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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

**Find French companies the week they are registered — with their directors, share capital and legal form already extracted.**

This Actor reads the official **BODACC** (*Bulletin officiel des annonces civiles et commerciales*), the daily government publication of every registration in the French Trade and Companies Register (RCS). It turns each announcement into a clean, flat, ready-to-use B2B lead.

A newly registered company buys everything within three months: a bank, an accountant, insurance, telecoms, software, office supplies, insurance. After that window it is locked in with its first suppliers for years. This Actor puts you inside that window.

***

### What makes this different

Several Actors already expose French company data. Here is what this one does that they do not.

| | This Actor | Typical alternative |
|---|---|---|
| **Watch mode** | Remembers what it already delivered. A daily schedule returns *only new registrations* — no duplicates, no double billing. | Returns the whole window every run; you deduplicate and pay again. |
| **API key** | None. Both sources are keyless public APIs. | Most require you to register for an INSEE Sirene key. |
| **Nested fields** | `acte` and `listepersonnes` are JSON strings in the raw API. They are **parsed** into directors, capital, legal form and address columns. | Raw JSON strings dumped into your dataset for you to parse. |
| **Directors** | Split into `{fonction, nom}` pairs, with the principal director surfaced. | A single unsplit text blob, when present at all. |
| **Declared activity** | The founder's own description of the business, filed at the registry — available on day one. | Not exposed. At best a NAF code, and only once INSEE has indexed the company weeks later. |
| **Real creations vs. conversions** | Flags the registrations that are **not** new businesses — an existing sole trader moving onto the RCS register, sometimes trading since 2010. Measured: **8 out of 20** on a live batch. | Sold to you as brand-new companies. |
| **Lead scoring** | Configurable 0–100 score with a per-component breakdown you can defend to a sales team. | None, or an opaque single number. |
| **Cost control** | Free `dryRun` estimation before any billing. | Run and find out. |
| **Volume handling** | Counts first, then splits the window into slices to stay under the source API's 10,000-record pagination cap. | Silently stops at 10,000 — you never learn what you missed. |

***

### Example output

```json
{
  "siren": "107706657",
  "denomination": "2L PATRIMOINE",
  "type_personne": "morale",
  "forme_juridique": "Société par actions simplifiée",
  "capital_montant": 1000,
  "capital_devise": "EUR",
  "date_immatriculation": "2026-07-28",
  "date_parution": "2026-08-06",
  "anciennete_jours": 32,
  "adresse": "22 rue des Mésanges",
  "code_postal": "31190",
  "ville": "Auterive",
  "departement": "31",
  "departement_nom": "Haute-Garonne",
  "region": "Occitanie",
  "dirigeants": [
    { "fonction": "Président", "nom": "Lincetto, Patrice Georges" },
    { "fonction": "Directeur général", "nom": "Lincetto, Eric Michel" }
  ],
  "dirigeant_principal": "Lincetto, Patrice Georges",
  "nb_dirigeants": 2,
  "activite_declaree": "La vente et le commerce en ligne de mobilier et accessoires de décoration d'intérieur, meubles, ameublement, literie",
  "origine_fonds": "Création d'un fonds de commerce",
  "qualite_etablissement": "Etablissement principal",
  "naf_code": "68.20B",
  "naf_libelle": "Location de terrains et d'autres biens immobiliers",
  "section_activite_libelle": "Activités immobilières",
  "tranche_effectif": "00",
  "siret_siege": "10770665700018",
  "date_creation_insee": "2026-07-28",
  "entreprise_preexistante": false,
  "anciennete_reelle_jours": 32,
  "donnees_diffusibles": true,
  "latitude": 43.6028,
  "longitude": 1.4474,
  "score": 83,
  "score_detail": { "fraicheur": 100, "forme": 100, "capital": 45, "geographie": 60, "dirigeants": 100 },
  "priorite": "A - prioritaire",
  "url_annuaire_entreprises": "https://annuaire-entreprises.data.gouv.fr/entreprise/107706657",
  "url_bodacc": "https://www.bodacc.fr/pages/annonces-commerciales-detail/?q.id=id:A20260148582"
}
```

***

### What you can use it for

- **B2B prospecting** — reach a new company before your competitors do. Banks, accountants, insurance brokers, telecom resellers, office suppliers, software vendors.
- **Precise targeting from day one** — `activite_declaree` carries the founder's own wording ("online sale of interior decoration furniture…"), so you can filter on what the business actually does weeks before any NAF code exists.
- **Territory monitoring** — watch registrations in specific departments and get a daily digest.
- **Market research** — measure business creation by legal form, capital band, sector and region over time.
- **CRM enrichment** — feed a clean, deduplicated lead pipeline into HubSpot, Pipedrive, Airtable or Notion.
- **AI agents** — the Actor exposes a full output schema, so an agent can chain it without guessing the response shape.

***

### Input

Every field is optional. Run it with no input at all and you get the last 7 days of registrations across France.

| Field | Type | Default | What it does |
|---|---|---|---|
| `lookbackDays` | integer | `7` | How many days back to search. **Do not go below 7** — BODACC publishes 3 to 10 days after the actual registration date. |
| `dateFrom` / `dateTo` | string | — | Explicit `YYYY-MM-DD` window on the publication date. Overrides `lookbackDays`. |
| `departements` | array | all | Department codes to keep: `75`, `69`, `2A`, `971`. Narrowing cuts both volume and cost. |
| `maxResults` | integer | `200` | Hard cap on leads delivered — and therefore billed. |
| `enrich` | boolean | `true` | Add NAF code, workforce band, SIRET, administrative state, coordinates and financials from INSEE. No API key needed. |
| `dryRun` | boolean | `false` | **Count matching registrations and stop. Nothing delivered, nothing billed.** |
| `watchMode` | boolean | `false` | Only return registrations never delivered before. Use with a daily schedule. |
| `watchId` | string | `defaut` | Run several independent watches with one Actor. |
| `minScore` | integer | `0` | Drop leads below this score — they are neither delivered nor billed. |
| `targetDepartements` | array | — | Departments that *raise* the score, without excluding others. |
| `targetFormesJuridiques` | array | — | Legal form fragments you are looking for, e.g. `société par actions`. |
| `targetCapitalMin` / `targetCapitalMax` | integer | — | Share capital band that defines your ideal customer. |
| `excludeSCI` | boolean | `false` | Zero the score of *sociétés civiles immobilières* — usually out of scope for B2B. |
| `excludePreexistantes` | boolean | `false` | Zero the score of registrations that are not real creations — a sole trader already trading for over a year before joining the RCS register. Measured: 8 out of 20 on a live batch. |
| `fraicheurIdealeJours` | integer | `30` | Below this age the freshness score is maximal; it then decays to zero at 180 days. |

#### Getting started in three runs

**1. Estimate for free**

```json
{ "lookbackDays": 14, "departements": ["75"], "dryRun": true }
```

**2. Pull a first batch**

```json
{ "lookbackDays": 14, "departements": ["75"], "maxResults": 50 }
```

**3. Turn it into a daily watch**

```json
{
  "watchMode": true,
  "watchId": "paris-sas",
  "departements": ["75", "92", "93", "94"],
  "targetFormesJuridiques": ["société par actions simplifiée", "société à responsabilité limitée"],
  "excludeSCI": true,
  "minScore": 55,
  "maxResults": 300
}
```

Then schedule it daily. Each run returns only what appeared since the last one.

***

### How the score works

The score is a weighted average of five components, each rated 0–100 and each returned in `score_detail` so a sales team can see *why* a lead ranks where it does.

| Component | Weight | Logic |
|---|---|---|
| Freshness | 30 % | Maximal below `fraicheurIdealeJours`, decaying to zero at 180 days. The buying window is short. |
| Legal form | 25 % | A SAS or SARL almost always needs a bank, an accountant and tools. A family SCI does not. Overridden by `targetFormesJuridiques` when set. |
| Share capital | 20 % | A rough but useful proxy for financial surface. |
| Geography | 15 % | Full marks inside `targetDepartements`, neutral when you set none. |
| Directors | 10 % | A named director is a reachable person. |

Priority bands: **A** ≥ 75 · **B** ≥ 55 · **C** ≥ 35 · **D** below.

***

### Cost

Two billable events:

| Event | Price | When |
|---|---|---|
| `nouvelle-entreprise` | **$0.003** | A registration delivered with BODACC data only. |
| `entreprise-enrichie` | **$0.005** | Same, plus the INSEE enrichment layer. |

So **1,000 enriched leads cost about $5**. Nothing is billed for announcements filtered out by `minScore` or already delivered in watch mode, and `dryRun` is free.

***

### Known limits — read this before you buy

Being straight about scope saves you a refund request.

- **BODACC covers the RCS only.** Traders and companies, yes. Not registered as RCS: many *professions libérales*, some *artisans* (Répertoire des métiers) and associations (published in the JOAFE instead). If you need every SIREN holder without exception, you need the INSEE Sirene register, not BODACC.
- **Publication lags registration by 3 to 10 days.** A company registered on the 28th typically appears around the 6th. This is a property of the source, not of the Actor. Set `lookbackDays` to 7 or more.
- **Enrichment coverage is high but not total.** Measured on a live run of 201 registrations: **94 % enriched**, 5.5 % `non_indexe` — registrations too recent for the INSEE index. Those leads are still delivered, with their BODACC data intact.
- **About two thirds of registrations are sole traders** (*personnes physiques*): measured 64 %. They have no legal form, no share capital and no directors — those columns are empty by nature, not by failure. Filter on `type_personne` if you only want companies.
- **An RCS registration is not always a new business.** A sole trader who has been trading for years must register on the RCS when their activity qualifies as commercial. The BODACC announcement looks identical to a genuine creation. Measured on a live batch of 20: **8 had existed at INSEE since 2010–2023**. The Actor compares the INSEE creation date with the RCS registration date and returns `entreprise_preexistante` plus `anciennete_reelle_jours`, so you can either exclude them or pitch them differently.
- **Some directors opt out of public diffusion.** French law lets a business owner object to the publication of their INSEE record. The source then returns `[NON-DIFFUSIBLE]` instead of the address, coordinates and director names. Measured: **12 of 20**, all sole traders. Those fields come back empty and `donnees_diffusibles` is `false` — the BODACC address, name, activity and SIREN are still delivered.
- **Director functions come from free text.** 90 % are parsed into clean `{fonction, nom}` pairs. In the remaining 10 % the registry simply declared no function; the name is still extracted.
- **Personal data.** Director names are personal data under GDPR. You need a lawful basis to process them, you must minimise what you keep, and you must be able to honour erasure requests. Prospecting on a legitimate-interest basis is generally accepted, but that assessment is yours to document.
- **Volume.** France produces roughly **1,500 registrations per working day** (measured: 45,860 over 30 days). The source API caps pagination at 10,000 records per query, so the Actor **counts first and splits the date window into slices automatically** — you do not have to think about it. A department filter still cuts both runtime and cost significantly.

***

### Data sources

| Source | Role | Licence |
|---|---|---|
| [BODACC](https://bodacc-datadila.opendatasoft.com/) (DILA) | Daily RCS registrations | Licence Ouverte Etalab 2.0 |
| [API Recherche d'entreprises](https://recherche-entreprises.api.gouv.fr/) (DINUM) | NAF code, workforce, SIRET, financials | Licence Ouverte Etalab 2.0 |
| NAF rév. 2 nomenclature (INSEE) | Activity **labels** — the API returns codes only, so the 732 sub-classes are resolved locally, with no extra request | Apache-2.0 via `@socialgouv/codes-naf` |

This Actor is not affiliated with DILA, INSEE, INPI or any French public body. It reuses open public data under the Etalab open licence.

***

### En français

Cet Actor détecte les **entreprises nouvellement immatriculées au RCS** à partir du BODACC officiel, publié chaque jour ouvré par la DILA.

Pour chaque création il livre : dénomination, SIREN, forme juridique, capital social, adresse du siège, **dirigeants séparés avec leur fonction**, **activité déclarée au greffe dans les mots du créateur**, date d'immatriculation et ancienneté en jours — puis, si vous le souhaitez, l'enrichissement INSEE (code NAF, tranche d'effectif, SIRET du siège, éléments financiers), le tout **sans aucune clé d'API à créer**.

Le **mode veille** est ce qui le distingue : il mémorise ce qu'il a déjà livré et ne renvoie, aux exécutions suivantes, que les créations nouvelles. Vous le planifiez une fois par jour et vous ne payez jamais deux fois la même entreprise.

Le **score de pertinence** se paramètre selon votre client idéal : départements prioritaires, formes juridiques recherchées, fourchette de capital, exclusion des SCI. Chaque note est détaillée par composante, pour qu'un commercial puisse la discuter plutôt que la subir.

Le **mode estimation** (`dryRun`) compte les créations correspondant à vos critères sans rien livrer ni facturer : utilisez-le pour calibrer votre fenêtre avant la première exécution réelle.

***

### Support

Found a bug, a parsing edge case, or need another announcement family (radiations, procédures collectives, ventes et cessions)? Open an issue on the Actor's **Issues** tab — every report gets a reply.

# Actor input Schema

## `lookbackDays` (type: `integer`):

Nombre de jours à remonter depuis aujourd'hui. Le BODACC publie avec 3 à 10 jours de décalage sur la date d'immatriculation : en dessous de 7 jours, vous risquez de ne rien voir. Ignoré si vous renseignez une date de début.

## `dateFrom` (type: `string`):

Borne basse sur la date de parution au BODACC. Laissez vide pour utiliser la profondeur de recherche.

## `dateTo` (type: `string`):

Borne haute sur la date de parution. Laissez vide pour aller jusqu'à aujourd'hui.

## `departements` (type: `array`):

Codes de départements à surveiller : 75, 69, 2A, 971… Laissez vide pour couvrir toute la France. Cibler réduit fortement le volume et donc le coût.

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

Plafond de leads livrés — et donc facturés — pour cette exécution.

## `enrich` (type: `boolean`):

Ajoute le code NAF, la tranche d'effectif, l'état administratif, le SIRET du siège, les coordonnées géographiques et, si disponibles, les éléments financiers. Aucune clé d'API n'est requise. Les créations très récentes ne sont pas encore indexées : le lead BODACC est alors livré seul.

## `dryRun` (type: `boolean`):

Compte les créations correspondant à vos critères et s'arrête. Aucune donnée livrée, aucune facturation. À utiliser pour calibrer votre fenêtre avant une exécution réelle.

## `watchMode` (type: `boolean`):

Mémorise ce qui a déjà été livré. Aux exécutions suivantes, seules les créations jamais vues sont renvoyées et facturées. C'est le mode à utiliser avec une planification quotidienne.

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

Permet de mener plusieurs veilles indépendantes avec le même Actor — par exemple « paris-sas » et « lyon-commerce ». Chaque identifiant a sa propre mémoire.

## `minScore` (type: `integer`):

Les créations en dessous de ce score ne sont ni livrées ni facturées. 0 pour tout recevoir, 55 pour ne garder que les cibles sérieuses.

## `targetDepartements` (type: `array`):

Départements qui font monter le score, sans exclure les autres. Différent du filtre « Départements ciblés », qui lui exclut.

## `targetFormesJuridiques` (type: `array`):

Fragments de libellé recherchés, par exemple « société par actions » ou « responsabilité limitée ». Une correspondance porte le score de forme à 100, une absence le ramène à 15.

## `targetCapitalMin` (type: `integer`):

En dessous, le score de capital tombe à zéro. Laissez vide pour appliquer le barème par paliers.

## `targetCapitalMax` (type: `integer`):

Au-dessus, le score de capital est réduit — utile pour écarter les grands groupes si vous ciblez les TPE.

## `excludeSCI` (type: `boolean`):

Les SCI représentent une part notable des immatriculations et sont hors cible pour la plupart des offres B2B. Cochez pour les ramener à un score de zéro.

## `excludePreexistantes` (type: `boolean`):

Certaines immatriculations ne sont pas des créations : un micro-entrepreneur en activité depuis des années bascule au registre du commerce. Mesuré sur un lot réel : 8 sur 20. Cochez pour ramener leur score à zéro — elles ne sont plus en phase d'équipement.

## `fraicheurIdealeJours` (type: `integer`):

En deçà de ce nombre de jours depuis l'immatriculation, le score de fraîcheur est maximal. Au-delà, il décroît jusqu'à zéro à 180 jours.

## Actor input object example

```json
{
  "lookbackDays": 7,
  "dateFrom": "2026-08-01",
  "dateTo": "2026-08-31",
  "departements": [
    "75",
    "92",
    "69"
  ],
  "maxResults": 200,
  "enrich": true,
  "dryRun": false,
  "watchMode": false,
  "watchId": "defaut",
  "minScore": 0,
  "targetDepartements": [],
  "targetFormesJuridiques": [
    "société par actions simplifiée",
    "société à responsabilité limitée"
  ],
  "excludeSCI": false,
  "excludePreexistantes": false,
  "fraicheurIdealeJours": 30
}
```

# Actor output Schema

## `leads` (type: `string`):

Une ligne par entreprise nouvellement immatriculée, avec dirigeants, capital, forme juridique, adresse, enrichissement INSEE et score de pertinence.

## `resume` (type: `string`):

Nombre d'annonces examinées, de leads livrés, de doublons écartés et d'enrichissements réussis.

## `estimation` (type: `string`):

Décompte des créations correspondant aux critères, produit uniquement en mode estimation. Aucune facturation.

# 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 = {
    "lookbackDays": 7,
    "departements": [
        "75",
        "92",
        "69"
    ],
    "maxResults": 200,
    "targetFormesJuridiques": [
        "société par actions simplifiée",
        "société à responsabilité limitée"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("owoyale/nouvelles-entreprises-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 = {
    "lookbackDays": 7,
    "departements": [
        "75",
        "92",
        "69",
    ],
    "maxResults": 200,
    "targetFormesJuridiques": [
        "société par actions simplifiée",
        "société à responsabilité limitée",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("owoyale/nouvelles-entreprises-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 '{
  "lookbackDays": 7,
  "departements": [
    "75",
    "92",
    "69"
  ],
  "maxResults": 200,
  "targetFormesJuridiques": [
    "société par actions simplifiée",
    "société à responsabilité limitée"
  ]
}' |
apify call owoyale/nouvelles-entreprises-france --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,owoyale/nouvelles-entreprises-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/nmf4xSIhp1W0WkKp5/builds/l514397oFaOhd58Z9/openapi.json
