# French Companies Search: SIRENE, SIREN, SIRET and NAF Data (`nightwave-owner/france-company-register`) Actor

Returns French companies from the official INSEE Sirene register: SIREN, head office SIRET, name, legal form, NAF code and label, creation date, employee range, address and status. Search by name, SIREN, NAF code, department, postal code and size. No API key, open licence.

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

## Pricing

$5.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

## French Companies Search: SIRENE, SIREN, SIRET and NAF Data

French companies from the official INSEE Sirene register, one row per company. Each row has the SIREN number, the SIRET of the head office, the registered name, legal form, main activity (NAF code, also called APE code, with its official label), company category (PME, ETI, GE), creation date, employee size band, number of establishments, head office address with postal code, city, department and coordinates, active or closed status, and a link to the company on the government's Annuaire des Entreprises.

Use it to build lists of French companies by sector and region, to check or enrich a list of SIREN numbers, or to follow new companies in a sector every week.

### What is covered

All companies, associations and public bodies that the French state publishes in the API Recherche d'entreprises, the open search API behind [annuaire-entreprises.data.gouv.fr](https://annuaire-entreprises.data.gouv.fr). The data comes from the INSEE Sirene register and is updated daily by the API.

- Search by name or address words, by SIREN or SIRET, by NAF code, department, postal code, employee range and active status.
- Searches without text return the largest companies first (by number of establishments).
- The actor never returns people. Sole proprietors (entreprises individuelles) and partnerships between natural persons are left out, and so are records that are not fully public in Sirene. Directors and other persons in the source are never requested.

### Example from a real run

The input and the first two rows of a run on the Apify platform on 3 October 2026 (run `IhQnEXhzQty1ARKGO`, 10 rows in total).

Input:

```json
{
  "nafCodes": ["10.71C"],
  "departments": ["69"],
  "maxResults": 10
}
```

Output (excerpt):

```json
[
  {
    "siren": "817759558",
    "siret": "81775955800023",
    "name": "FULGUROPAIN",
    "acronym": null,
    "tradeName": null,
    "legalForm": "SAS, société par actions simplifiée",
    "legalFormCode": "5710",
    "nafCode": "10.71C",
    "nafLabel": "Boulangerie et boulangerie-pâtisserie",
    "naf2025Code": "10.71H",
    "companyCategory": "PME",
    "creationDate": "2016-02-01",
    "closureDate": null,
    "employeeRange": "20-49 employees",
    "employeeRangeCode": "12",
    "employeeRangeYear": "2024",
    "establishmentCount": 8,
    "openEstablishmentCount": 6,
    "address": "51 RUE DELEUVRE 69004 LYON",
    "postalCode": "69004",
    "city": "LYON",
    "department": "69",
    "departmentName": "Rhône",
    "region": "84",
    "latitude": 45.780077309,
    "longitude": 4.825272062,
    "status": "active",
    "lastUpdated": "2026-10-03",
    "url": "https://annuaire-entreprises.data.gouv.fr/entreprise/817759558",
    "source": "API Recherche d'entreprises (recherche-entreprises.api.gouv.fr), DINUM, with data from the INSEE Sirene register",
    "license": "Licence Ouverte / Open Licence 2.0 (Etalab). Source: INSEE Sirene via API Recherche d'entreprises, DINUM."
  },
  {
    "siren": "377490289",
    "siret": "37749028900057",
    "name": "LAMBERT TRADITION",
    "legalForm": "Société à responsabilité limitée (sans autre indication)",
    "legalFormCode": "5499",
    "nafCode": "10.71C",
    "nafLabel": "Boulangerie et boulangerie-pâtisserie",
    "companyCategory": "PME",
    "creationDate": "1990-03-20",
    "employeeRange": "50-99 employees",
    "address": "33 RUE AMBROISE PARE 69740 GENAS",
    "city": "GENAS",
    "department": "69",
    "status": "active",
    "url": "https://annuaire-entreprises.data.gouv.fr/entreprise/377490289"
  }
]
```

The second row is shortened here; every row has all fields. The other 8 rows were bakery companies in Lyon, Arnas, Genay and Givors with 0 to 99 employees, created between 1991 and 2020. In the same search, 9 companies were skipped because only a branch, not the head office, was in the Rhône (see `headOfficeInArea`).

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `query` | string | none | Name, brand or address words, for example `"boulangerie lyon"` or `"Danone"`. |
| `sirenNumbers` | array | none | SIREN (9 digits) or SIRET (14 digits) numbers to look up, up to 1 000 per run. When set, `query` and the other filters are ignored except `activeOnly`. |
| `nafCodes` | array | all | NAF rev. 2 codes, for example `62.01Z` (computer programming), `10.71C` (bakeries), `56.10A` (restaurants), `68.20B` (property rental). `6201Z` works too. |
| `departments` | array | all | Department codes, for example `75`, `69`, `13`, `2A`, `971`. |
| `postalCodes` | array | all | Five digit postal codes, for example `69002`. |
| `employeeRange` | array | all | INSEE size bands: `NN` none, `00` 0, `01` 1-2, `02` 3-5, `03` 6-9, `11` 10-19, `12` 20-49, `21` 50-99, `22` 100-199, `31` 200-249, `32` 250-499, `41` 500-999, `42` 1000-1999, `51` 2000-4999, `52` 5000-9999, `53` 10000+. |
| `activeOnly` | boolean | `true` | Only active companies. Set to `false` to include closed ones. |
| `headOfficeInArea` | boolean | `true` | With departments or postal codes, only companies whose head office is there. `false` also returns companies that only have a branch there. |
| `maxResults` | integer | `50` | Maximum number of companies per run, 1 to 10 000. |
| `onlyNew` | boolean | `false` | Only companies that earlier runs with the same input did not deliver. See "Monitoring and scheduling". |

A run with empty input returns the 50 largest active companies in France (La Poste, EDF, Elior, Ville de Paris, Société Générale and so on) in about 6 seconds.

### Output

| Field | Description |
|---|---|
| `siren` | 9 digit company number (SIREN) |
| `siret` | 14 digit number of the head office establishment (SIRET) |
| `name` | Registered name (dénomination) |
| `acronym`, `tradeName` | Acronym (sigle) and trade name of the head office, when registered |
| `legalForm`, `legalFormCode` | INSEE legal form label in French and its 4 digit code, for example `SAS, société par actions simplifiée` and `5710` |
| `nafCode`, `nafLabel` | Main activity as NAF rev. 2 code and the official French label |
| `naf2025Code` | The same activity in the new NAF 2025 classification |
| `companyCategory` | `PME` (small and medium), `ETI` (intermediate) or `GE` (large), as computed by INSEE |
| `creationDate`, `closureDate` | `YYYY-MM-DD` |
| `employeeRange`, `employeeRangeCode`, `employeeRangeYear` | Employee size band, its INSEE code and the year it refers to |
| `establishmentCount`, `openEstablishmentCount` | Number of establishments, all and open |
| `address`, `postalCode`, `city` | Head office address |
| `department`, `departmentName`, `region` | Department code and name, INSEE region code of the head office |
| `latitude`, `longitude` | Head office coordinates, when INSEE has geocoded it |
| `status` | `active` or `closed` |
| `lastUpdated` | Date the API last updated the record |
| `url` | The company on annuaire-entreprises.data.gouv.fr |
| `source`, `license` | Attribution for the data |

### Monitoring and scheduling

Set `onlyNew` to `true` to follow a segment over time, for example new software companies in Paris. The actor remembers which companies it has delivered for the same input, in a named key-value store in your Apify account (`nightwave-state-france-company-register`, one record per input). Each run returns and charges only companies that earlier runs did not deliver. The first run returns everything in the selection. A run without news finishes successfully with 0 rows.

`onlyNew` and `maxResults` are not part of the remembered input, so you can change them without starting over. Changing any other field starts a fresh state. With `onlyNew` the actor reads the whole search window (up to 10 000 hits) to find the new companies, so keep the search narrow: one or a few NAF codes and departments.

Example: every morning at 07:00, new active computer programming and consulting companies with their head office in Paris. In Apify Console, open **Schedules**, create a schedule with the cron expression `0 7 * * *` and add this actor with the input below.

```json
{
  "nafCodes": ["62.01Z", "62.02A"],
  "departments": ["75"],
  "onlyNew": true,
  "maxResults": 500
}
```

The same schedule through the Apify API:

```sh
curl -X POST "https://api.apify.com/v2/schedules?token=<YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"name": "daily-france-companies", "cronExpression": "0 7 * * *", "timezone": "Europe/Paris", "isEnabled": true, "isExclusive": true,
       "actions": [{"type": "RUN_ACTOR", "actorId": "nightwave-owner~france-company-register",
                    "runInput": {"contentType": "application/json; charset=utf-8", "body": "<the input above as a JSON string>"}}]}'
```

For a weekly list instead, use the cron expression `0 7 * * 1` (every Monday at 07:00), for example with the name `weekly-france-companies`. The input stays the same.

A second run straight after the first, with `onlyNew` and the same input, returns 0 rows and is not charged.

Connect a webhook or an integration (Google Sheets, HubSpot, Slack, e-mail) in Apify Console if you want the new rows sent somewhere when the run finishes.

### Limitations

- **At most 10 000 companies per search.** That is a limit of the API. For larger extracts, split the search by department or NAF code and run it once per part.
- **Departments and postal codes match establishments.** The API returns a company when any of its establishments is in the area. With `headOfficeInArea` (the default) the actor keeps only companies whose head office is there; those skipped are not charged.
- **No people.** Sole proprietors, partnerships between natural persons and records that are not fully public in Sirene are never returned, and directors are never requested. The search text is meant for company names and addresses.
- **Labels are in French.** `legalForm` and `nafLabel` are the official INSEE labels. The codes next to them are stable and easy to translate.
- **Polite use.** At most 3 requests per second (the API allows 7), a declared User-Agent, and retries that wait as long as the API asks (`Retry-After`) on rate limits and server errors. A response in an unexpected format stops the run with a clear message.
- The data is the public register, not a credit report. Check the official record before you rely on it in a contract.

### Use cases

- B2B prospect lists by sector, size and region, for example bakeries with 10-49 employees in the Rhône, without scraping company directory websites.
- KYC and supplier checks: confirm that a SIREN exists, is active and has the expected name, activity and address.
- CRM enrichment: add legal form, NAF code, size band and head office to a list of SIREN or SIRET numbers.
- Market sizing: count active companies per NAF code and department.
- Daily or weekly alerts on new companies in a sector and department with `onlyNew`.

### FAQ

**How fresh is the data?**
Live. Each run asks the API Recherche d'entreprises, which is updated daily from Sirene and the national company registry.

**What does 1 000 rows cost?**
5 USD (0.005 USD per company, event `company`), plus Apify platform usage. A test run that returned 1 000 rows used 0.006 USD of platform usage.

**Can I use the data commercially?**
Yes. The data is published under the Licence Ouverte / Open Licence 2.0, which allows commercial reuse when you name the source and the date of the last update. Every row carries the source in `source` and `license`, the date in `lastUpdated` and a link to the official record in `url`. See "Data source and license".

**Why is a company missing?**
It may be a sole proprietor, a record that is not public in Sirene, closed (with `activeOnly`), or outside the 10 000 hit window of the search. Look it up by SIREN to check.

### Data source and license

The data comes from the API Recherche d'entreprises (`GET https://recherche-entreprises.api.gouv.fr/search`), run by DINUM (Direction interministérielle du numérique) for the French government and listed on [api.gouv.fr](https://api.gouv.fr/les-api/api-recherche-entreprises). It is open without an API key. Its sources are the INSEE Sirene register (Base Sirene des entreprises et de leurs établissements) and other public registers.

The license, read on 3 October 2026:

- Both the Sirene base (INSEE) and the dataset "Données des entreprises utilisées dans l'Annuaire des Entreprises" (data.gouv.fr) are published under the **Licence Ouverte / Open Licence 2.0** (Etalab).
- The licence lets you "l'exploiter à titre commercial, par exemple en la combinant avec d'autres informations, ou en l'incluant dans son propre produit ou application" (use it commercially, for example by combining it with other information or including it in your own product or application), on condition that you "mentionner la paternité de l'« Information » : sa source (au moins le nom du « Concédant ») et la date de dernière mise à jour" (name the source, at least the licensor, and the date of the last update).
- The attribution does not suggest any endorsement by the French state, and this actor is not endorsed by INSEE or DINUM.

Usage terms of the API, from its documentation: at most 7 requests per second per IP address and 30 per second per network; over the limit the API answers HTTP 429 with a `Retry-After` header. Non-diffusible companies are not available in the API.

The code lists used for the labels come from INSEE: NAF rev. 2 sub-classes, legal forms (catégories juridiques) and departments.

### Pricing

Pay per result: 0.005 USD per company returned (event `company`), which is 5 USD per 1 000 companies. Apify bills platform usage on top as usual; a 1 000 row run used 0.006 USD. Companies skipped by `onlyNew` or `headOfficeInArea` are not charged. `maxResults` caps how many rows a run returns, so you always know the highest possible cost.

### Contact

Built and maintained by Nightwave AB. Questions, bugs and feature requests: kontakt@nightwave.se

### På svenska

Actorn hämtar franska företag ur INSEE:s officiella register Sirene via det öppna API:t Recherche d'entreprises, en rad per företag: SIREN, huvudkontorets SIRET, namn, bolagsform, huvudverksamhet (NAF-kod och officiell benämning), storleksklass, antal anställda (intervall), registreringsdatum, huvudkontorets adress, departement, koordinater, status och länk till Annuaire des Entreprises.

- Källa: API Recherche d'entreprises (recherche-entreprises.api.gouv.fr), som drivs av den franska statens digitaliseringsmyndighet DINUM. Ingen API-nyckel behövs.
- Licens: Licence Ouverte / Open Licence 2.0. Kommersiell vidareanvändning är tillåten om källan och datum för senaste uppdatering anges. Fälten `source`, `license`, `lastUpdated` och `url` finns på varje rad (läst 3 oktober 2026).
- Filter: söktext, SIREN- eller SIRET-nummer, NAF-kod, departement, postnummer, antal anställda och aktiva företag. Med departement eller postnummer tas som standard bara företag med huvudkontoret i området.
- Inga personer: enskilda firmor, bolag mellan fysiska personer och poster som inte är helt offentliga i Sirene lämnas ute, och företrädare hämtas aldrig.
- Högst 10 000 träffar per sökning (API:ts gräns). Dela upp större uttag per departement eller NAF-kod.
- Med `onlyNew: true` levereras bara företag som tidigare körningar med samma input inte har levererat (se "Monitoring and scheduling").
- Pris: 0,005 USD per företag (5 USD per 1 000) plus Apifys plattformsanvändning.
- Kontakt: kontakt@nightwave.se

# Actor input Schema

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

Company name, brand or address words, as in the official Annuaire des Entreprises search. Example: "boulangerie lyon" or "Danone". Leave empty to list companies by the filters below, largest first.

## `sirenNumbers` (type: `array`):

Look up known companies by SIREN (9 digits) or SIRET (14 digits, the first 9 are used), up to 1 000 per run. When this is set, search text and the other filters are ignored except activeOnly. Example: \["552032534"].

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

INSEE NAF rev. 2 codes for the company's main activity, for example 62.01Z (computer programming), 10.71C (bakeries), 56.10A (restaurants), 68.20B (property rental). "6201Z" is accepted too. Example: \["62.01Z"].

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

Department codes, for example 75 (Paris), 69 (Rhône), 13 (Bouches-du-Rhône), 2A (Corse-du-Sud), 971 (Guadeloupe). A company matches when at least one of its establishments is in the department. Example: \["69"].

## `postalCodes` (type: `array`):

Five digit postal codes. A company matches when at least one of its establishments has the postal code. Example: \["69002"].

## `employeeRange` (type: `array`):

INSEE employee size bands of the company. Leave empty for all sizes. Example: \["11", "12"] for 10-49 employees.

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

Return only companies that are active in the register. Set to false to include closed (cessée) companies. Default true.

## `headOfficeInArea` (type: `boolean`):

With departments or postal codes: return only companies whose head office is there. Set to false to also get companies that only have a branch there. Default true.

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

Maximum number of companies, for example 50. 1 to 10 000, defaults to 50. The API returns at most 10 000 per search, so split large searches by department.

## `onlyNew` (type: `boolean`):

Return only companies that earlier runs with the same input did not deliver, for example true for a daily schedule of new registrations in a sector and department. Defaults to false.

## Actor input object example

```json
{
  "query": "boulangerie",
  "sirenNumbers": [
    "552032534",
    "542051180"
  ],
  "nafCodes": [
    "62.01Z",
    "62.02A"
  ],
  "departments": [
    "75",
    "92"
  ],
  "postalCodes": [
    "69002",
    "75011"
  ],
  "employeeRange": [
    "11",
    "12"
  ],
  "activeOnly": true,
  "headOfficeInArea": true,
  "maxResults": 50,
  "onlyNew": true
}
```

# Actor output Schema

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

All rows produced by the run, as JSON. Open in Apify Console or download via the dataset API.

# 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": "",
    "nafCodes": [
        "10.71C"
    ],
    "departments": [
        "69"
    ],
    "activeOnly": true,
    "headOfficeInArea": true,
    "maxResults": 50,
    "onlyNew": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("nightwave-owner/france-company-register").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": "",
    "nafCodes": ["10.71C"],
    "departments": ["69"],
    "activeOnly": True,
    "headOfficeInArea": True,
    "maxResults": 50,
    "onlyNew": False,
}

# Run the Actor and wait for it to finish
run = client.actor("nightwave-owner/france-company-register").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": "",
  "nafCodes": [
    "10.71C"
  ],
  "departments": [
    "69"
  ],
  "activeOnly": true,
  "headOfficeInArea": true,
  "maxResults": 50,
  "onlyNew": false
}' |
apify call nightwave-owner/france-company-register --silent --output-dataset

```

## MCP server setup

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

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/EZo6U7tLCxvUXUeTs/builds/SdqFIKHx36QTsh8FM/openapi.json
