# French Company Data API: SIRENE & SIRET Register (`smoked_drift/french-company-data`) Actor

26M+ French companies from the official Annuaire des Entreprises API. Filter by NAF code, postcode, department, legal form, headcount, revenue or net result. Returns SIREN, SIRET, address, directors, finances and labels. Licence Ouverte 2.0.

- **URL**: https://apify.com/smoked\_drift/french-company-data.md
- **Developed by:** [Titouan MARTY](https://apify.com/smoked_drift) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 company records

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 Company Data API: SIRENE & SIRET Register

Search over 26 million French companies from the official **Annuaire des Entreprises** service published by DINUM, which aggregates the INSEE SIRENE register and the RNE. Filter by NAF activity code, postcode, department, legal form, headcount bracket, revenue or net result — and get SIREN, SIRET, registered address, directors, published accounts and official labels as clean JSON.

**No scraping, no API key.** The source is a documented public API under the Etalab Open Licence 2.0, which permits commercial reuse.

***

### What you get

One dataset item per company:

| Group | Fields |
| --- | --- |
| **Identity** | SIREN, SIREN pivot, full name, registered name, acronym, VAT numbers |
| **Status** | administrative state, creation date, closure date, diffusion status |
| **Activity** | main NAF/APE code, NAF 2025 code, activity section |
| **Size** | company category (PME/ETI/GE), headcount bracket, employer flag, establishment counts |
| **Registered office** | full address, postcode, INSEE commune, department, region, EPCI, GPS coordinates |
| **Directors** | name, first names, birth year, role, nationality |
| **Finances** | turnover and net result per financial year, where the accounts were filed |
| **Labels** | 20+ official flags: association, ESS, société à mission, RGE, training organisation, bio, avocat, and more |
| **Establishments** | matched SIRET establishments, optional |
| **Provenance** | source, licence, attribution and last update date on every row |

***

### Sample output

Real row, trimmed. A French IT services company:

```json
{
  "siren": "394026934",
  "nomComplet": "EXPERIS FRANCE (EXPERIS)",
  "etatAdministratif": "A",
  "dateCreation": "1994-02-14",
  "dateFermeture": null,
  "activitePrincipale": "62.01Z",
  "categorieEntreprise": "GE",
  "trancheEffectifSalarie": "51",
  "nombreEtablissements": 63,
  "nombreEtablissementsOuverts": 51,
  "tva": ["FR45394026934"],
  "siege": {
    "adresse": "1 RUE HENRI LEGRAND 33000 BORDEAUX",
    "codePostal": "33000",
    "commune": "33063",
    "departement": "33",
    "coordonnees": "44.857673,-0.556404"
  },
  "dirigeants": [
    { "nom": "…", "prenoms": "…", "annee_de_naissance": "…", "qualite": "Président", "type_dirigeant": "personne physique" }
  ],
  "finances": { "2025": { "ca": 23738356, "resultat_net": 316383 } },
  "complements": { "est_societe_mission": false, "est_rge": false, "convention_collective_renseignee": true },
  "source": {
    "provider": "Annuaire des Entreprises (DINUM) — INSEE SIRENE & RNE",
    "licence": "Licence Ouverte 2.0 (Etalab)",
    "updatedAt": "2025-12-05T23:02:07"
  }
}
```

***

### Usage

#### IT companies in Gironde

```json
{
  "activitePrincipale": ["62.01Z", "62.02A", "62.02B"],
  "departement": "33",
  "etatAdministratif": "A",
  "maxItems": 2000
}
```

#### Companies with published revenue above 1M EUR

```json
{
  "sectionActivitePrincipale": "G",
  "caMin": 1000000,
  "etatAdministratif": "A",
  "sortBySize": true,
  "maxItems": 1000
}
```

Only companies that filed accounts carry a turnover figure, so this narrows the result set sharply — which is usually the point.

#### Everyone who has run a given company

```json
{
  "nomPersonne": "DUPONT",
  "prenomsPersonne": "MARIE",
  "maxItems": 500
}
```

Useful for mapping a person's mandates across corporate structures.

#### RGE-certified installers in a department

```json
{
  "estRge": true,
  "departement": "33",
  "etatAdministratif": "A",
  "maxItems": 3000
}
```

RGE is the certification required to do subsidised energy-renovation work in France, which makes this a concrete B2B prospecting list.

***

### Filters

| Field | Maps to | Notes |
| --- | --- | --- |
| `query` | free text | Name, trade name, acronym, director, address |
| `activitePrincipale` | NAF/APE codes | Main activity only |
| `sectionActivitePrincipale` | section letter | `J` information, `F` construction, `G` trade… |
| `codePostal`, `departement`, `region`, `codeCommune`, `epci` | geography | Any combination |
| `etatAdministratif` | `A` or `C` | Active or ceased |
| `natureJuridique` | INSEE codes | `5710` SAS, `5499` SARL, `6540` SCI… |
| `categorieEntreprise` | PME, ETI, GE | INSEE size class |
| `trancheEffectifSalarie` | headcount bracket | INSEE bracket code |
| `caMin`, `caMax` | turnover | Requires filed accounts |
| `resultatNetMin`, `resultatNetMax` | net result | Requires filed accounts |
| `nomPersonne`, `prenomsPersonne` | directors | Mandate mapping |
| `estOrganismeFormation`, `estRge`, `estSocieteMission`, `estAssociation`, `estEntrepreneurIndividuel`, `estEss`, `conventionCollectiveRenseignee` | official labels | Boolean |
| `includeEtablissements` | secondary SIRET establishments | Larger rows |
| `sortBySize` | order by headcount | Instead of relevance |
| `maxItems` | cap | API caps a query at 10,000 rows |

***

### Pricing

| Event | Charged | Covers |
| --- | --- | --- |
| `company-record` | once per company returned | the normalised company record |

There is no scan surcharge: the upstream API is free and fast, so you pay only for the rows you keep. `maxItems` is the only lever you need.

***

### Reliability

- The source is a **documented public API**, not a web page. No browser, no proxy, no selectors.
- Requests are made with a declared user agent and capped at four in flight, to stay a polite client of a public service.
- Failures are retried, and a page that cannot be read is logged rather than silently dropped.
- Duplicate SIREN across pages are removed before pushing.
- Every row carries the attribution string and the last update date the licence requires.

***

### Notes and limits

- **10,000 rows per query.** The upstream API caps any single query there. To go deeper, slice by postcode, department or NAF code and run several times — that is a property of the source, not of this Actor.
- **25 results per page** is the upstream maximum, so a 10,000-row run means 400 requests. Expect a few minutes.
- **Financial figures are sparse.** Only companies that actually filed accounts have turnover and net result. Absence means "not filed", not zero.
- **Ceased companies are included by default** unless you set `etatAdministratif` to `A`. That is deliberate: company history matters for due diligence.
- **Directors are personal data.** The source publishes them, and reuse is permitted, but if you store or republish them you are responsible for your own GDPR compliance.
- **Attribution is required**: source DINUM/INSEE and the last update date. It is included on every row.

***

### Data source

The [Annuaire des Entreprises](https://annuaire-entreprises.data.gouv.fr/) is published by the Direction Interministérielle du Numérique (DINUM). The API is free, requires no key, and is covered by the [Licence Ouverte 2.0](https://github.com/etalab/licence-ouverte/blob/master/LO.md), which grants the right to reuse the information, including commercially and inside your own product, provided the source and last update date are acknowledged.

***

### Related Actors

From the same publisher:

- [Companies House Data API](https://apify.com/smoked_drift/uk-companies-house-data) — the UK equivalent: 5M+ British companies from the official register, Open Government Licence v3.0
- [Football Data API](https://apify.com/smoked_drift/european-football-results-odds) — European football results, statistics, closing odds and line movement across 22 leagues
- [Football Stats & Elo Ratings](https://apify.com/smoked_drift/football-team-stats-elo) — one row per club with Elo, record, splits and form

***

### Support

Missing a filter, or a field the API exposes that this Actor does not surface? Open an issue on the **Issues** tab.

# Actor input Schema

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

Free text: company name, trade name, acronym, or a director's name. Also matches on address. Leave empty to filter only by the structured fields below.

## `activitePrincipale` (type: `array`):

French NAF/APE codes, e.g. 56.10A for restaurants, 62.01Z for programming, 43.21A for electrical installation. A company matches if its main activity is one of these.

## `sectionActivitePrincipale` (type: `string`):

Broad NAF section letter, e.g. 'J' for information and communication, 'F' for construction, 'G' for trade.

## `codePostal` (type: `string`):

Exact French postcode of the registered office, e.g. 33000.

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

Department code, e.g. 33 for Gironde, 75 for Paris, 2A for Corse-du-Sud.

## `region` (type: `string`):

Region code, e.g. 75 for Nouvelle-Aquitaine, 11 for Île-de-France.

## `codeCommune` (type: `string`):

INSEE commune code, e.g. 33063 for Bordeaux.

## `etatAdministratif` (type: `string`):

A for an active company, C for a ceased one. Leave empty for both.

## `natureJuridique` (type: `array`):

INSEE legal category codes, e.g. 5710 for SAS, 5499 for SARL, 6540 for SCI. Filtering here is much more reliable than matching on the label.

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

PME, ETI, GE or startup labels as INSEE assigns them.

## `trancheEffectifSalarie` (type: `array`):

INSEE headcount bracket code, e.g. 00 for none, 11 for 10-19, 53 for 1000-1999.

## `caMin` (type: `integer`):

Filter on the last declared turnover. Only companies with published accounts have this, so it narrows the result sharply.

## `caMax` (type: `integer`):

Upper bound on the last declared turnover.

## `nomPersonne` (type: `string`):

Find companies by a director's last name. Useful for mapping someone's mandates.

## `prenomsPersonne` (type: `string`):

Used together with the surname.

## `estOrganismeFormation` (type: `boolean`):

Only companies registered as training organisations.

## `estRge` (type: `boolean`):

Only companies holding an RGE certification, the energy-renovation qualification required for most French subsidy work.

## `estSocieteMission` (type: `boolean`):

Only companies with the société à mission status.

## `estAssociation` (type: `boolean`):

Only registered associations.

## `estEntrepreneurIndividuel` (type: `boolean`):

Only sole traders (entrepreneurs individuels).

## `estEss` (type: `boolean`):

Only companies with the ESS label.

## `includeEtablissements` (type: `boolean`):

Adds matched SIRET establishments to each company. Makes rows considerably larger.

## `sortBySize` (type: `boolean`):

Order results by headcount rather than by relevance. Useful when you want the biggest players in a sector.

## `minimal` (type: `boolean`):

Ask the API for a lighter response. Ignored when secondary establishments are requested.

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

Hard cap on returned companies. The API caps any single query at 10,000 rows, so slice by postcode or NAF code to go deeper.

## Actor input object example

```json
{
  "activitePrincipale": [
    "62.01Z"
  ],
  "categorieEntreprise": [
    "PME"
  ],
  "includeEtablissements": false,
  "sortBySize": false,
  "minimal": false,
  "maxItems": 1000
}
```

# Actor output Schema

## `companies` (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 = {
    "activitePrincipale": [
        "62.01Z"
    ],
    "categorieEntreprise": [
        "PME"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("smoked_drift/french-company-data").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 = {
    "activitePrincipale": ["62.01Z"],
    "categorieEntreprise": ["PME"],
}

# Run the Actor and wait for it to finish
run = client.actor("smoked_drift/french-company-data").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 '{
  "activitePrincipale": [
    "62.01Z"
  ],
  "categorieEntreprise": [
    "PME"
  ]
}' |
apify call smoked_drift/french-company-data --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,smoked_drift/french-company-data"
        }
    }
}
```

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/3sF3L9Db8luXRXxxn/builds/ivwDEGzcF3tKalR1a/openapi.json
