# France Company Register Scraper — SIREN, SIRET & Executives (`publicdata/france-company-register-scraper`) Actor

Scrape French companies (entreprises) from the official French government open-data API: SIREN, SIRET, legal form, NAF activity, address, employees, executives and financials. French company register and business data by department, activity, size and creation date.

- **URL**: https://apify.com/publicdata/france-company-register-scraper.md
- **Developed by:** [Riccardo](https://apify.com/publicdata) (community)
- **Categories:** Business, Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/platform/actors/running/actors-in-store#pay-per-event

## 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

## France Company Register Scraper — SIREN, SIRET & Executives

**Stop rebuilding French prospect and due-diligence lists by hand: get companies from the France company register — with their directors (dirigeants), their SIREN and SIRET, and the exact date they were registered — as a spreadsheet, or as a feed that refreshes every morning.**

This Actor calls the French government's own open-data API (`recherche-entreprises.api.gouv.fr`, fed by INSEE/SIRENE and INPI/RNE), so what you export is the register itself: no API key, no login, no broken selectors.

Base identity data on french companies is public everywhere. What most sources do not give you is the **named executives**, a **creation-date filter** that surfaces newly registered companies, and the **official labels** that let you segment a list before contacting anyone.

### What you get

Every record is one company, with up to 31 fields:

- **SIREN** (9 digits) and the head-office **SIRET** (14 digits), plus the intra-community **VAT number**
- **Executives (dirigeants)** — role, name and birth year for individuals, or company name and SIREN for corporate officers. INSEE alone does not publish these.
- **Official labels** — certified organic, RGE, Qualiopi, training provider, social economy, mission-driven, public service and more
- **Creation date** and closure date, plus an active flag — the basis for tracking newly registered businesses
- Legal name, trade name, **legal form** (SAS, SARL, SA, auto-entrepreneur…) with its INSEE code
- **NAF/APE activity code** and a readable activity label
- Full postal address, postal code, city, department, region, and latitude/longitude where published
- Employee bracket and its reference year, INSEE size category (SME, mid-cap/ETI, large enterprise), sole-trader flag
- Number of establishments, total and currently open
- **Filed financials** where the company publishes them: revenue and net result, per year
- Last INSEE update timestamp, the `source` attribution string, and a link to the official `annuaire-entreprises.data.gouv.fr` page

### Who uses this

- A **sales team** pulls the companies registered in their department and activity in the last 30 days and calls them before anyone else does.
- A **compliance officer** resolves a SIREN or SIRET to the full legal identity, the officers behind it and the filed accounts, for a KYB file.
- A **market analyst** maps french business data by activity code and region, with coordinates ready for a GIS or a dashboard.
- A **researcher** builds a segmented company database of France — all Qualiopi training providers, or all certified-organic producers — from official labels rather than guesswork.
- A **developer or AI agent** enriches a CRM list of identifiers, or calls the Actor as an MCP tool to answer questions about entreprises France on demand.

### Example output

```json
{
  "siren": "478455793",
  "siret": "47845579305205",
  "name": "BOULANGERIES BG (B B G)",
  "legalForm": "SAS, société par actions simplifiée",
  "legalFormCode": "5710",
  "nafCode": "56.10C",
  "nafLabel": "Food and beverage service",
  "vatNumber": "FR94478455793",
  "isActive": true,
  "creationDate": "2004-08-25",
  "closureDate": null,
  "employeeRange": "10 à 19 salariés",
  "sizeCategory": "Large enterprise",
  "isSoleTrader": false,
  "address": "615 AVENUE DE LA CHAFFINE 13160 CHATEAURENARD",
  "postalCode": "13160",
  "city": "CHATEAURENARD",
  "department": "13",
  "latitude": 43.89036,
  "longitude": 4.82613,
  "establishments": 601,
  "openEstablishments": 579,
  "labels": ["certified organic", "training provider"],
  "executives": [
    { "role": "Président de SAS", "type": "personne physique", "lastName": "…", "firstName": "…", "birthYear": "1956" }
  ],
  "sourceUrl": "https://annuaire-entreprises.data.gouv.fr/entreprise/478455793",
  "source": "recherche-entreprises.api.gouv.fr (INSEE/INPI open data)"
}
```

Officer names come back in full; they are elided in this sample. `financials` carries one entry per published year and is empty for companies that do not file.

### Input

| Field | What it does |
|---|---|
| `query` | Company name, SIREN, SIRET or keywords. Leave empty to browse with the filters below. |
| `sirenList` | Exact identifiers to fetch (9-digit SIREN or 14-digit SIRET). Overrides the search query. |
| `departments` | Department codes to filter by, e.g. `75`, `13`, `2A`. Empty = all France. |
| `nafCodes` | NAF/APE activity codes, e.g. `47.11F` supermarkets, `62.01Z` software. Empty = all activities. |
| `legalStatus` | Restrict to active (default) or ceased companies. |
| `minEmployees` | INSEE employee-bracket floor, e.g. `10`, `50`, `200`. Empty = no minimum. |
| `createdAfter` | Only companies created on or after this date (YYYY-MM-DD). Filtered by the Actor — see the note below. |
| `scanLimit` | How many search results to read through while applying `createdAfter`. Default 5,000. Only matching companies are exported and charged. |
| `onlyWithExecutives` | Keep only companies whose directors are published. |
| `includeExecutives` | Include directors and officers. Default on; turn it off if you only need company-level data. |
| `maxItems` | Safety cap on results. `0` = unlimited. Default 200. |

Software companies registered in Bouches-du-Rhône since the start of the month, with a named director to call:

```json
{ "departments": ["13"], "nafCodes": ["62.01Z"], "createdAfter": "2026-08-01", "onlyWithExecutives": true, "maxItems": 0 }
```

Pair `createdAfter` with a department **and** an activity code: see *How the creation-date filter works* below for why that matters.

Software companies in Paris with at least 10 employees:

```json
{ "nafCodes": ["62.01Z"], "departments": ["75"], "minEmployees": "10", "legalStatus": "active" }
```

Enrich identifiers you already hold, company data only:

```json
{ "sirenList": ["478455793", "50393256800024"], "includeExecutives": false }
```

### Run it on a schedule

Save your filters as a Task, set `createdAfter` to a recent date, and schedule it daily. Each run returns the companies registered since that date, so the dataset becomes a rolling feed of newly registered companies rather than a one-off export.

From the run, Apify integrations push the results straight to **Google Sheets, Slack, e-mail, a webhook, Make or Zapier** — or into your CRM through the webhook. Deduplicate on **`siren`**: it is stable, unique per company and never reused, so a daily run appends only genuinely new records.

### Use it from code or from an AI agent

Start runs and read the dataset through the Apify API or CLI in any language; results come out as JSON, CSV, Excel or XML. The Actor is also exposed as an **MCP tool** through the Apify MCP server, so an AI agent can query the French company register directly — by name, by SIREN, or by department and activity.

### Pricing

Pay per event: a small fee for each company exported, and nothing for a run that returns no matches. Platform usage on top of that is negligible, because the Actor makes plain API calls and never starts a browser. Current rates are on the Actor's Pricing tab.

### How the creation-date filter works

The government's search API has **no creation-date parameter** — that is a limit of the source, not of this Actor, and it silently ignores any parameter it does not know. So `createdAfter` is applied here instead: the Actor reads through the search results and exports only the companies created on or after your date. You are charged for exported companies, not for scanned ones.

Two consequences worth knowing before you rely on it:

- **The source truncates any single search at 10,000 results.** A whole department exceeds that. Narrow the search — a department *plus* an activity code — and the scan covers the entire matching set, which makes the filter exact. The run log tells you when a search hits the cap.
- **`scanLimit` bounds the work.** It defaults to 5,000 records; raise it for a wide search, lower it for short runs. The log reports when the ceiling stops a run early.

If you need every new French registration nationwide rather than a filtered slice, the registration announcements in **BODACC** are the right source for that, and the register search is the wrong tool for it.

### Where the data comes from

One practical ceiling to know about: a single search run can page through about 25,000 companies. For a bigger sweep, split the run by department or by activity code — each slice starts its own paging window.

`recherche-entreprises.api.gouv.fr` is the official search API operated by the French government (DINUM), built on the **SIRENE** database (INSEE) and the **Registre National des Entreprises** (INPI). Both are published as open data and may be reused, including commercially, under the French open licence, with attribution — every record carries the `source` field for exactly that.

Honest limits. The administration refreshes the data rather than streaming it, so treat it as daily, not real-time. A handful of records carry an implausible creation date (occasionally a future one); those come from the register itself and are passed through unchanged rather than silently dropped. There are no e-mail addresses or phone numbers: the register does not publish them. Coordinates, region, employee year, financials and executives appear only where the source publishes them, and are `null` otherwise. Companies that opted out of public distribution (`statut_diffusion`) are excluded by the source API.

Officer names are published by the French register itself for corporate-transparency purposes; set `includeExecutives: false` if you do not need them. This Actor is independent and not affiliated with the French administration.

### Related Actors

Same engine, same official-source approach:

- [**AusTender (Australia)**](https://apify.com/publicdata/austender-australian-government-contracts) — federal contracts, winners and expiry dates
- [**UK Public Tenders**](https://apify.com/publicdata/uk-contracts-finder-find-a-tender) — Contracts Finder and Find a Tender in one run
- [**Swiss Public Tenders (simap.ch)** — tenders and awards with prices, bid counts and weighted criteria](https://apify.com/publicdata/simap-swiss-public-tenders)
- [**Swiss Commercial Register (SHAB)** — new companies, changes, deletions and bankruptcies](https://apify.com/publicdata/shab-swiss-company-gazette)
- [**EU Tenders (TED)** — European procurement notices and contract awards](https://apify.com/publicdata/ted-eu-public-tenders)
- [**GLEIF LEI** — LEI lookup, lapsed-LEI screening, parent companies](https://apify.com/publicdata/gleif-lei-scraper)
- [**Brazil CNPJ** — Receita Federal company data and partners](https://apify.com/publicdata/brazil-cnpj-lookup)

# Actor input Schema

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

Company name, SIREN, SIRET, or keywords. Leave empty to browse using the filters below.

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

Exact identifiers to fetch (9-digit SIREN or 14-digit SIRET). Overrides the search query.

## `departments` (type: `array`):

French department codes to filter by, e.g. 75, 13, 2A. Empty = all France.

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

Activity codes, e.g. 47.11F (supermarkets), 62.01Z (software). Empty = all activities.

## `legalStatus` (type: `string`):

Restrict to active or ceased companies.

## `minEmployees` (type: `string`):

INSEE employee bracket floor, e.g. 10, 50, 200. Empty = no minimum.

## `createdAfter` (type: `string`):

Only companies created on or after this date (YYYY-MM-DD). The source API has no creation-date parameter, so the Actor scans the search results and filters them here — combine it with a department or an activity code so the scan covers the whole set.

## `onlyWithExecutives` (type: `boolean`):

Keep only companies whose directors are published.

## `includeExecutives` (type: `boolean`):

Include directors and officers (names are published by the French register itself). Turn off if you only need company-level data.

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

Safety cap (0 = unlimited).

## `scanLimit` (type: `integer`):

How many search results to read through while looking for companies that match `createdAfter`. Only matching companies are exported and charged. Raise it for a wide search, lower it to keep runs short. Ignored when `createdAfter` is empty.

## Actor input object example

```json
{
  "query": "boulangerie",
  "legalStatus": "active",
  "onlyWithExecutives": false,
  "includeExecutives": true,
  "maxItems": 200,
  "scanLimit": 5000
}
```

# Actor output Schema

## `dataset` (type: `string`):

Companies from the French national register (INSEE/INPI open data). Every exported row is one dataset item.

# 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",
    "scanLimit": 5000
};

// Run the Actor and wait for it to finish
const run = await client.actor("publicdata/france-company-register-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",
    "scanLimit": 5000,
}

# Run the Actor and wait for it to finish
run = client.actor("publicdata/france-company-register-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",
  "scanLimit": 5000
}' |
apify call publicdata/france-company-register-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,publicdata/france-company-register-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/UvamFwQYMSCNJzGYg/builds/ffeYFuUVe0DvUCSTk/openapi.json
