# France Company Registry & Legal Notices (`automatic/france-company-registry-scraper`) Actor

Look up French companies by name, SIREN, activity, department or size and export registry details with their latest BODACC legal announcements, insolvency status and officers.

- **URL**: https://apify.com/automatic/france-company-registry-scraper.md
- **Developed by:** [Philip Kirkbride](https://apify.com/automatic) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 companies

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

## France Company Registry & Legal Notices

Look up French companies and get their official registry details together with their newest legal announcements. Search by company name or keyword, by one or many SIRENs, by French activity code, by department or postal code, and by company size. Each row is one company: identity and legal form, activity, size and employee band, creation and closure dates, administrative state, head office address and coordinates, officers, published financial years, and the newest BODACC legal announcements for that company, plus ready-made insolvency and last-announcement flags.

Built for KYB and compliance teams, credit and risk analysts, B2B lead generation and due-diligence work on French businesses.

### What you can do with it

- **Onboard suppliers and customers (KYB).** Check that a SIREN exists, is active, and matches the legal name, legal form and head office you were given, with the officers on record.
- **Screen for insolvency.** `hasInsolvencyProceeding` flags collective proceedings, conciliations and professional recovery notices published for the company, and says when the check could not be completed.
- **Monitor a portfolio.** Re-run a list of SIRENs on a schedule and watch `lastAnnouncementAt`, `bodaccAnnouncementCount`, `etatAdministratif` and the officers for changes.
- **Assess credit risk.** Published turnover and net result per financial year, size band and employee band in one row.
- **Map a market or build lead lists.** Search by activity code, department, postal code and company size, active companies only.

### Quick start

1. Open the Actor in Apify Console. The form is prefilled with the search `boulangerie`, 20 companies and announcements on.
2. Change the search, or add filters such as a department or activity code.
3. Click **Start**, then download the dataset as JSON, CSV or Excel.

```json
{
  "query": "boulangerie",
  "departement": "75",
  "maxItems": 20,
  "includeAnnouncements": true
}
```

Look up known companies by SIREN:

```json
{
  "sirenList": ["403052111"],
  "maxAnnouncementsPerCompany": 10
}
```

An empty input (`{}`) returns a small sample: 10 active French bakeries (`boulangerie`) with announcements, and the status message says it was a sample. Give a `query`, a `sirenList` or filters and only those run. Filters combine: activity codes, department, postal code, company size and active-only. The department and postal-code filters match a company when any of its establishments is in that area, not only its head office, so a returned row's `siege` address can be elsewhere.

| Field | Type | Default | Meaning |
| --- | --- | --- | --- |
| `query` | string | — | Company name, keyword or one SIREN. At least 3 characters. Leave it out when you only want `sirenList` or filters. |
| `sirenList` | array | `[]` | Up to 200 SIRENs to look up directly. |
| `nafCodes` | array | `[]` | Up to 10 French activity codes, for example `10.71A`. |
| `departement` | string | — | Department code, for example `75`, `2A` or `971`. Matches companies with any establishment there, not only the head office. |
| `postalCode` | string | — | Five-digit postal code. Matches companies with any establishment there, not only the head office. |
| `activeOnly` | boolean | `true` | Keep only companies whose administrative state is active. |
| `categorieEntreprise` | array | `[]` | Any of `PME`, `ETI` or `GE`. |
| `maxItems` | integer | `50` | Stop after this many company rows (maximum 1,000). The empty-input sample stops at 10. |
| `includeAnnouncements` | boolean | `true` | Add legal announcements and the derived flags. |
| `maxAnnouncementsPerCompany` | integer | `20` | Newest announcements kept per company (maximum 100). |
| `proxyConfiguration` | object | direct | Optional connection settings. |
| `apifyProxyCountry` | string | `FR` | Country for platform connections. |

### What it returns

One row per company. Missing source values are `null`, never guessed.

| Field | Meaning |
| --- | --- |
| `siren` | Nine-digit company identifier. |
| `name`, `legalName`, `sigle` | Published company name, registered name and acronym. |
| `siretSiege` | Head office establishment identifier. |
| `nafCode`, `nafCode2025`, `nafSection` | Primary activity codes and activity section. |
| `natureJuridique` | Legal form code. |
| `categorieEntreprise`, `anneeCategorieEntreprise` | Company size band and its reference year. |
| `trancheEffectifSalarie`, `anneeTrancheEffectifSalarie` | Employee-count band and its reference year. |
| `dateCreation`, `dateFermeture` | Creation and closure dates. |
| `etatAdministratif` | `A` active or `C` ceased. |
| `nombreEtablissements`, `nombreEtablissementsOuverts` | Establishments on record and open. |
| `statutDiffusion` | Published diffusion status. |
| `commercialProspectingOptOut` | Published opposition to commercial prospecting, verbatim (`true`, `false` or the published value). |
| `caractereEmployeur` | Published employer status of the legal unit, verbatim. |
| `siege` | Head office: full and complement address, municipality, department, region, coordinates, trade name, published shop signs and establishment state. |
| `dirigeants` | Officers and auditors exactly as published: name, given names, role, birth year and month, nationality, or company name and SIREN. |
| `finances` | Published financial years, newest first, with turnover and net result in euros. |
| `bodaccAnnouncements` | Newest legal announcements: publication date, family, notice type, court, city, published company name, summary text and official link. Each announcement also carries `registreSirens` (the registre entries the notice publishes, verbatim) and `isSoleSubject` (`true` when the notice lists exactly one SIREN, `null` when it lists no SIREN, for example an empty registre). |
| `bodaccStatus` | `ok` when the announcement lookup completed, `unavailable` when it failed or was partial (the insolvency flag is then `null`), `not_requested` when announcements are switched off. |
| `hasInsolvencyProceeding` | `true` when a collective proceeding, conciliation or professional recovery notice that lists this SIREN exists; `false` when the full history was checked and none does; `null` when announcements were not requested or the lookup was not complete. |
| `lastAnnouncementAt` | Most recent announcement date returned. |
| `bodaccAnnouncementCount` | All announcements on record for the company, including those beyond the per-company limit. |
| `announcementsError` | Why announcements could not be checked for this company. |
| `sourceUrl` | Link to the company's official public directory page. |
| `sources` | Open data used for the row: INSEE Sirene / RNE (via Annuaire des Entreprises) and, when requested, DILA BODACC, each with its page and licence. |
| `sourceUpdatedAt`, `sourceUpdatedAtInsee`, `sourceUpdatedAtRne` | The source's own last-update timestamps, verbatim; `null` when absent. |
| `observedAt` | UTC time the row was collected. |

The run also writes a `RUN-SUMMARY` key-value record with delivered counts, request counts and any incomplete searches.

### Output example

Illustrative row, with officers and announcements shortened for readability:

```json
{
  "siren": "403052111",
  "name": "BOULANGERIES PAUL",
  "legalName": "BOULANGERIES PAUL",
  "sigle": null,
  "siretSiege": "40305211102616",
  "nafCode": "10.71A",
  "nafCode2025": "10.71G",
  "nafSection": "C",
  "natureJuridique": "5710",
  "categorieEntreprise": "ETI",
  "anneeCategorieEntreprise": "2024",
  "trancheEffectifSalarie": "41",
  "anneeTrancheEffectifSalarie": "2024",
  "dateCreation": "1995-12-07",
  "dateFermeture": null,
  "etatAdministratif": "A",
  "nombreEtablissements": 315,
  "nombreEtablissementsOuverts": 124,
  "statutDiffusion": "O",
  "commercialProspectingOptOut": true,
  "caractereEmployeur": null,
  "siege": {
    "siret": "40305211102616",
    "adresse": "BATIMENT D.E 344 AVENUE DE LA MARNE 59700 MARCQ-EN-BARŒUL",
    "complementAdresse": "BATIMENT D.E",
    "codePostal": "59700",
    "commune": "59378",
    "libelleCommune": "MARCQ-EN-BARŒUL",
    "departement": "59",
    "region": "32",
    "latitude": 50.678029398,
    "longitude": 3.1169136021,
    "activitePrincipale": "70.10Z",
    "nomCommercial": null,
    "listeEnseignes": [],
    "etatAdministratif": "A"
  },
  "dirigeants": [
    {
      "type": "personne physique",
      "nom": "HOLDER (HOLDER)",
      "prenoms": "FRANCIS",
      "qualite": "Président de SAS",
      "anneeNaissance": "1940",
      "dateNaissance": "1940-07",
      "nationalite": null,
      "denomination": null,
      "siren": null
    }
  ],
  "finances": [
    {
      "year": "2024",
      "revenue": 73611839,
      "netResult": -2197350
    }
  ],
  "bodaccAnnouncements": [
    {
      "id": "C2026014311507",
      "date": "2026-07-30",
      "family": "Dépôts des comptes",
      "familyCode": "dpc",
      "noticeType": "Avis initial",
      "court": "Greffe du Tribunal de Commerce de lille métropole",
      "city": "Marcq-en-Baroeul",
      "companyName": "BOULANGERIES PAUL",
      "summary": "Comptes annuels et rapports (closing 2024-12-31)",
      "registreSirens": ["403052111"],
      "isSoleSubject": true,
      "url": "https://www.bodacc.fr/pages/annonces-commerciales-detail/?q.id=id:C2026014311507"
    }
  ],
  "bodaccStatus": "ok",
  "hasInsolvencyProceeding": false,
  "lastAnnouncementAt": "2026-07-30",
  "bodaccAnnouncementCount": 80,
  "announcementsError": null,
  "sourceUrl": "https://annuaire-entreprises.data.gouv.fr/entreprise/403052111",
  "sources": [
    {
      "name": "INSEE Sirene / RNE (via Annuaire des Entreprises)",
      "url": "https://annuaire-entreprises.data.gouv.fr/entreprise/403052111",
      "licence": "Licence Ouverte 2.0"
    },
    {
      "name": "DILA BODACC",
      "url": "https://bodacc-datadila.opendatasoft.com/explore/dataset/annonces-commerciales/",
      "licence": "Licence Ouverte 2.0"
    }
  ],
  "sourceUpdatedAt": "2026-11-04T11:42:11",
  "sourceUpdatedAtInsee": "2026-05-07T14:31:50",
  "sourceUpdatedAtRne": "2026-10-21T19:02:42",
  "observedAt": "2026-11-04T19:28:45.762832+00:00"
}
```

### Announcements and flags

Announcements cover company creations, account filings, changes, sales of businesses, collective proceedings, conciliations, professional recovery and deregistrations. The latest ones are included newest-first, up to `maxAnnouncementsPerCompany`. The count and the insolvency flag always cover the company's full published history, not just the announcements shown.

A court notice can name more than one company: a sale of business lists the seller and the buyer in its registre. `registreSirens` therefore shows every registre entry the notice publishes, exactly as published, and `isSoleSubject` says whether this company is the only one listed. The insolvency flag counts only notices whose registre lists this SIREN, so a notice that merely names another company cannot raise it. The flag is `true` only for a collective proceeding, conciliation or professional recovery notice that lists this company.

`bodaccStatus` says whether the check was complete. When it is `unavailable` the insolvency flag is `null`, never `false`, so a failed lookup is never read as "no insolvency". When `includeAnnouncements` is off, the announcement list is empty, `bodaccStatus` is `not_requested` and the derived values are `null`.

Officers, addresses and announcement text are passed through exactly as published. No names, contact details or officer birth data are masked or removed.

### Data sources and licence

Company identity and head office data come from INSEE Sirene, with registered-company data from the RNE, through the official Annuaire des Entreprises service. Legal announcements come from DILA BODACC, the official bulletin of civil and commercial announcements. Both are published as open data under the Licence Ouverte 2.0, which allows commercial use when the source is credited and its last-update date is kept.

Each row carries this attribution in `sources` (name, page and licence) and the source's own last-update timestamps in `sourceUpdatedAt`, `sourceUpdatedAtInsee` and `sourceUpdatedAtRne`. Keep them when you publish or redistribute the data. The BODACC entry appears only when announcements were requested for the run.

### Dates and limitations

Dates are French publication and register dates, published without a time of day, and are exported as ISO calendar dates. The collection time `observedAt` is UTC. `maxItems` caps a run at 1,000 company rows. The company search also returns at most 10,000 matches: when more companies match the search than were delivered, or the match count reaches that limit, the status message reports the match count and the 10,000 limit. Announcements per company are capped by `maxAnnouncementsPerCompany`.

If a company search fails, already delivered rows stay in the dataset and the status message names the failed search. If every search fails and nothing was delivered, the run fails instead of reporting an empty success. If a company's announcements cannot be read, that company is still delivered with `announcementsError` filled and `bodaccStatus` set to `unavailable`. A search with no matches succeeds with zero rows and a plain status message. A run with partial results also succeeds and reports what was incomplete. Download results as JSON, CSV or Excel.

### Pricing

You pay a $0.005 start fee per run plus $0.002 per company row, so 100 companies cost about $0.205 and 1,000 about $2.005.

### Scheduling and monitoring

There is no built-in "changes only" mode. To monitor companies, save a `sirenList` input as a task and schedule it daily or weekly. Compare each run with the previous one: a new `lastAnnouncementAt`, a higher `bodaccAnnouncementCount`, `hasInsolvencyProceeding` turning `true`, a change in `etatAdministratif` or in `dirigeants` shows what changed.

### FAQ

**How fresh is the data?** Every run reads the official sources live. Each row carries the sources' own last-update timestamps, so you can see how recent the register entry is.

**Is this the official register?** It uses the official open-data publications (INSEE Sirene, RNE through Annuaire des Entreprises, and DILA BODACC). It does not download Kbis extracts, filed accounts or statutes.

**Does `activeOnly` hide ceased companies I look up by SIREN?** No. `activeOnly` filters searches only. A SIREN in `sirenList` is returned whatever its state, with `etatAdministratif` set to `C` when it has ceased, and a SIREN the directory doesn't know is listed in the status message.

**Which export formats are available?** JSON, CSV, Excel, XML and the other dataset formats Apify offers, or read the dataset from your own code with the Apify API.

### Run size

The default memory is 512 MB and the default time limit is 30 minutes. With announcements, each company takes a little over a second, so a full 1,000-company run fits in the default limit. If a run reaches its time limit, the rows already delivered are kept. When a per-event plan applies, the start event is counted per GB of memory, rounded up; the default 512 MB run is one start event. Check the current listing for the applicable price.

# Actor input Schema

## `query` (type: `string`):

Name, keyword or a single SIREN to search for. At least 3 characters. Leave empty when you only use sirenList or the filters. An input with no query, SIREN or filter returns a sample of 10 companies for boulangerie.

## `sirenList` (type: `array`):

Up to 200 nine-digit SIRENs to look up directly. Rows are deduplicated against the search results.

## `nafCodes` (type: `array`):

Up to 10 French activity codes, for example 10.71A for bakery production. Values are combined.

## `departement` (type: `string`):

French department code, for example 75, 2A or 971.

## `postalCode` (type: `string`):

Five-digit French postal code.

## `activeOnly` (type: `boolean`):

Keep only companies whose administrative state is active. Turn off to include ceased companies.

## `categorieEntreprise` (type: `array`):

Any of PME, ETI or GE. Empty keeps every size.

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

Stop after this many company rows across the whole run. Defaults to 50, or 10 for the sample run.

## `includeAnnouncements` (type: `boolean`):

Add the newest BODACC legal announcements for each company plus the insolvency and last-announcement flags. Slower than registry data alone.

## `maxAnnouncementsPerCompany` (type: `integer`):

How many of the newest announcements to include per company. The total count and insolvency check always cover the company's full history.

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

Optional connection settings. Direct connections are used by default.

## `apifyProxyCountry` (type: `string`):

Optional two-letter country for platform connections; defaults to FR.

## Actor input object example

```json
{
  "query": "boulangerie",
  "activeOnly": true,
  "maxItems": 20,
  "includeAnnouncements": true,
  "maxAnnouncementsPerCompany": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "apifyProxyCountry": "FR"
}
```

# Actor output Schema

## `results` (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 = {
    "query": "boulangerie",
    "activeOnly": true,
    "maxItems": 20,
    "includeAnnouncements": true,
    "maxAnnouncementsPerCompany": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automatic/france-company-registry-scraper").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 = {
    "query": "boulangerie",
    "activeOnly": True,
    "maxItems": 20,
    "includeAnnouncements": True,
    "maxAnnouncementsPerCompany": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automatic/france-company-registry-scraper").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 '{
  "query": "boulangerie",
  "activeOnly": true,
  "maxItems": 20,
  "includeAnnouncements": true,
  "maxAnnouncementsPerCompany": 20
}' |
apify call automatic/france-company-registry-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automatic/france-company-registry-scraper"
        }
    }
}
```

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/JYSDugAUE7jBlkyaN/builds/QdLINkhmB8FMUHuZS/openapi.json
