# France Company Search: SIRENE Companies by NAF, SIREN (`nexus-scrapers/france-company-search`) Actor

Search French companies in the official SIRENE register (INSEE data via recherche-entreprises.api.gouv.fr). Filter by name, NAF/APE code, region, department, headcount, legal form or revenue, or look up SIREN/SIRET. NAF labels, finances, establishments. JSON, CSV or Excel. No API key.

- **URL**: https://apify.com/nexus-scrapers/france-company-search.md
- **Developed by:** [Nexus Scrapers](https://apify.com/nexus-scrapers) (community)
- **Categories:** Lead generation, Business, AI
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.00 / 1,000 french 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

## France Company Search - SIRENE Companies by NAF Code, Region, Size or SIREN

Search and export **French companies** from the official **SIRENE-based company register** as clean JSON, CSV or Excel. Filter by name, **NAF/APE activity code**, department, region, postal code, **company size** (PME / ETI / GE), workforce band, legal form, revenue and labels (**RGE, organic, ESS, mission company**), or look up lists of **SIREN / SIRET** numbers. Every NAF code comes with its **official INSEE label**, in both NAF rev. 2 and the new **NAF 2025**. No API key, no proxy, no browser and no login.

The Actor reads the official French government API *Recherche d'entreprises* (recherche-entreprises.api.gouv.fr), which serves INSEE SIRENE and other public registers under the Licence Ouverte (Etalab 2.0).

### Privacy by design (GDPR)

Built by an EU-based developer, with these defaults:

- **Natural-person directors are NOT returned by default** (no names, no birth dates). Company-type officers (parent companies, auditors) are kept in `corporateDirectors`.
- An opt-in `includeDirectors` switch adds directors' names, roles, birth month and nationality. If you tick it, **you are the data controller** of that personal data and need your own lawful basis, purpose and information duties.
- **Partial diffusion respected**: when INSEE hides a business's address (typically sole traders who restricted diffusion), the hidden fields come back as `null` and `diffusionStatus` is `partial`. The Actor never reconstructs hidden data, and returns no natural-person directors for such companies even with `includeDirectors`.
- Every record carries `commercialUseOpposition`: INSEE lets businesses object to the use of their data for commercial prospecting. Tick **Exclude companies that opposed commercial use** if you will use the results for marketing.

### Who is it for

- **Sales and marketing teams** building B2B lists of French companies by sector (NAF), region, size and revenue.
- **Market researchers and analysts** counting and profiling companies by activity, territory and size band.
- **Compliance, procurement and KYC teams** checking a list of SIREN/SIRET numbers: status (active/ceased), legal form, head-office address, VAT number, labels.
- **ESG and public-policy teams** finding RGE, organic, ESS, mission-company or SIAE structures.
- **AI agents and MCP users**: the dataset schema describes every field (see [API, MCP and AI agents](#api-mcp-and-ai-agents)).

### What you get

One dataset item per company (legal unit):

- SIREN, name, legal form (code and label), creation and closure dates, active/ceased status
- main activity: **NAF rev. 2 code and official label**, **NAF 2025 code and official label**, activity section
- head office: full address, postal code, commune, department, region, **latitude/longitude**, head-office SIRET
- workforce band and year, size category (PME / ETI / GE), number of establishments (all and open)
- **finances** when public: revenue and net result by year, plus the latest figures
- **labels**: ESS, RGE, organic, mission company, public-service mission, Qualiopi, SIAE, EPV, association and more
- VAT number, collective-agreement codes, company-type directors, link to the **annuaire-entreprises.data.gouv.fr** page
- optional: the list of matching **establishments** (SIRET, address, coordinates, activity, workforce band)

The full field reference is in [SCHEMA.md](./SCHEMA.md) and in the Actor's dataset schema.

### Input

All filters are optional and combined with AND. With **no filter at all** the Actor returns a small demo sample (large active companies in Paris).

| Field | Description |
|---|---|
| `query` | Name, brand or address text (3 characters minimum) |
| `identifiers` | List of SIREN (9 digits) or SIRET (14 digits) to look up. Filters are not applied to lookups |
| `nafCodes` | NAF codes or prefixes: `62` = all IT, `62.0`, `62.01Z`. NAF 2025 codes are accepted too |
| `departments`, `regions`, `postalCodes`, `communeCodes` | Location filters. They match companies with **at least one establishment** there, not only the head office |
| `companyCategories` | `PME`, `ETI`, `GE` |
| `employeeBands` | INSEE workforce bands (`11` = 10-19 employees, `12` = 20-49, ...) |
| `legalForms` | INSEE legal category codes: `5710` SAS, `5499` SARL, `5599` SA, `1000` sole trader |
| `labels` | Only companies with these labels (`ess`, `rge`, `bio`, `societe-mission`, `qualiopi`, ...) |
| `minRevenue`, `maxRevenue`, `minNetResult`, `maxNetResult` | Latest published figures, in EUR |
| `activeOnly` | Default `true`; applies to searches |
| `excludeSoleTraders`, `excludeCommercialOpposition`, `sortBySize` | Filters and sorting |
| `includeEstablishments`, `maxEstablishmentsPerCompany` | Add the establishments that match your filters (up to 100 per company) |
| `includeDirectors` | **Opt-in, off by default.** Adds natural-person directors (you become the data controller) |
| `maxItems` | Maximum companies (default 20, maximum 10,000) |

#### Example: IT-services SMEs in Lyon with their local establishments

```json
{
  "nafCodes": ["62"],
  "departments": ["69"],
  "companyCategories": ["PME"],
  "includeEstablishments": true,
  "excludeCommercialOpposition": true,
  "maxItems": 100
}
```

#### Example: RGE-certified companies in Occitanie

```json
{ "regions": ["76"], "labels": ["rge"], "maxItems": 200 }
```

#### Example: check a list of SIREN / SIRET

```json
{ "identifiers": ["552081317", "44460844215578", "444 608 442"] }
```

#### Example: large companies (revenue above 100 M EUR) in retail

```json
{ "nafCodes": ["47"], "minRevenue": 100000000, "sortBySize": true, "maxItems": 50 }
```

### Output example

Real record (cloud run of 4 November 2026), shortened:

```json
{
  "schemaVersion": "1.0",
  "siren": "479144438",
  "name": "INCOMM",
  "legalFormCode": "5710",
  "legalForm": "SAS, société par actions simplifiée",
  "nafCode": "62.01Z",
  "nafLabel": "Programmation informatique",
  "naf2025Code": "62.10Y",
  "naf2025Label": "Activités de programmation informatique",
  "creationDate": "2004-10-19",
  "status": "active",
  "employeeBand": "50 à 99 salariés",
  "category": "PME",
  "establishmentsCount": 48,
  "openEstablishmentsCount": 15,
  "headOffice": {
    "siret": "47914443800161",
    "address": "PARC AQUILAE IMM CELADON ETAGE 2 2 RUE DE LA BLANCHERIE 33370 ARTIGUES-PRES-BORDEAUX",
    "postalCode": "33370", "city": "ARTIGUES-PRES-BORDEAUX", "department": "33", "departmentName": "Gironde",
    "regionName": "Nouvelle-Aquitaine", "latitude": 44.853342, "longitude": -0.503041406
  },
  "financials": [{ "year": 2025, "revenue": 0, "netIncome": -360004 }],
  "labels": ["EGAPRO"],
  "isSoleTrader": false,
  "vatNumber": "FR26479144438",
  "diffusionStatus": "full",
  "commercialUseOpposition": true,
  "corporateDirectors": [{ "siren": "808804413", "name": "BDM AUDIT", "role": "Commissaire aux comptes titulaire" }],
  "sourceUrl": "https://annuaire-entreprises.data.gouv.fr/entreprise/479144438",
  "scrapedAt": "2026-11-04T22:25:40+00:00"
}
```

### Pricing

Pay only for the results you get. Set **Maximum results** (and the run's maximum cost) to control spending: the Actor stops as soon as either limit is reached. Searches without matches and unknown SIREN numbers return nothing and charge nothing. See the Pricing tab of this Actor for the current price.

### API, MCP and AI agents

**Apify API (Python)**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("nexus-scrapers/france-company-search").call(run_input={
    "nafCodes": ["62"], "departments": ["75"], "companyCategories": ["PME"], "maxItems": 50,
})
for company in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(company["siren"], company["name"], company["nafLabel"], company["latestRevenue"])
```

**Apify API (JavaScript)**

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('nexus-scrapers/france-company-search').call({ identifiers: ['552081317'] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**MCP and AI agents.** Add `https://mcp.apify.com` (with `?actors=nexus-scrapers/france-company-search`) to Claude, Cursor, VS Code or any MCP client, authorize with your Apify account and ask in plain language, for example: "List 50 RGE-certified companies in Occitanie with more than 20 employees" or "Is SIREN 552081317 still active and what is its head-office address?". The input and dataset schemas tell the agent every parameter and field.

### FAQ

**Do I need an API key?** No. The French government API is open and keyless.

**Is the data official?** Yes: INSEE SIRENE and other public registers, served by the Annuaire des Entreprises team (DINUM). Every record links to its official page.

**What is the difference between SIREN and SIRET?** SIREN identifies the company (9 digits), SIRET an establishment (SIREN + 5 digits). A SIRET lookup returns the company that owns it.

**NAF rev. 2 or NAF 2025?** Both are returned. The register filters on NAF rev. 2 codes; you may type NAF 2025 codes too and the Actor translates them with INSEE's correspondence table (a NAF 2025 code can map to several rev. 2 codes).

**Why does a department filter return companies headquartered elsewhere?** Location filters match any establishment of the company. Use `includeEstablishments` to see which ones matched, and compare `headOffice.department`.

**Why are some addresses `null`?** The business restricted the diffusion of its data (partial diffusion). The register hides the address; so does the Actor. Fully non-diffusible businesses are not served at all.

**Why are directors missing?** By default the Actor returns no natural-person directors, for privacy. See [Privacy by design](#privacy-by-design-gdpr). Company-type officers are in `corporateDirectors`.

**Can I find newly created companies?** The register API has no creation-date filter, so this Actor cannot search "created since". `creationDate` is returned for each company.

**How many results can I get?** Up to 10,000 per search (a hard limit of the official API). Split bigger extractions by department or NAF code.

**How fresh is the data?** The API is queried live; `updatedAt` shows when each record was last updated in the register database.

**Are finances always present?** Only when the company's accounts are public. In a test sample of 500 medium and large companies, 90% had figures; many small units and sole traders have none.

### Data source, attribution and terms

Data: INSEE SIRENE, RNE (INPI) and other public registers, via [recherche-entreprises.api.gouv.fr](https://recherche-entreprises.api.gouv.fr), published under the [Licence Ouverte / Open Licence 2.0 (Etalab)](https://www.etalab.gouv.fr/licence-ouverte-open-licence/). Reuse, including commercial, is allowed with attribution of the source, as given here. The NAF, legal-category and workforce-band labels are INSEE nomenclatures bundled unmodified except for whitespace normalisation. The Actor honours INSEE's diffusion restrictions and exposes the commercial-prospecting objection flag. This Actor is an independent tool and is not affiliated with or endorsed by INSEE or the French government. It accesses the API politely (descriptive User-Agent, about 4 requests per second against a documented limit of 7, back-off on HTTP 429). The Actor is not legal advice: you are responsible for your own use of the data under the GDPR, French rules on commercial prospecting and any other law that applies to you.

### Limitations

- At most 10,000 results per search (API limit). Use `maxItems` and split large extractions by department or NAF code.
- The API provides company search data, not the complete SIRENE database: no historical changes, no annual accounts documents, no beneficial owners. For full bulk data, use the INSEE files on data.gouv.fr.
- NAF filtering is by the company's main activity, not by its establishments' activities.
- No filter on creation date; sorting is by relevance (or by number of establishments with `sortBySize`).
- Finances exist only for companies whose accounts are public; revenue figures may be several years old.
- `includeEstablishments` returns at most 100 establishments per company.

# Actor input Schema

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

Company name, brand, address or other text (3 characters minimum). The register also matches director names in free text, so do not use this field to look up private individuals. Leave empty to search by filters only.

## `identifiers` (type: `array`):

Look up specific companies by SIREN (9 digits) or SIRET (14 digits; returns the company that owns the establishment). Filters below are NOT applied to these lookups, so ceased companies are returned too. Can be combined with a search.

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

NAF rev. 2 codes or prefixes ('62' = all IT, '62.0', '62.01Z'). NAF 2025 codes are also accepted and translated to the rev. 2 codes the register filters on. Matches the company's main activity.

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

Department codes ('75', '2A', '971') or names. Matches companies with at least one establishment there (not necessarily the head office).

## `regions` (type: `array`):

Regions. Matches companies with at least one establishment in the region.

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

5-digit postal codes (establishment level).

## `communeCodes` (type: `array`):

5-character INSEE municipality codes (establishment level).

## `companyCategories` (type: `array`):

INSEE category: PME (small and medium), ETI (mid-cap), GE (large). Not all companies have one.

## `employeeBands` (type: `array`):

INSEE workforce bands of the company.

## `legalForms` (type: `array`):

INSEE legal category codes (4 digits), for example 5710 = SAS, 5499 = SARL, 5599 = SA, 1000 = sole trader, 9220 = association.

## `labels` (type: `array`):

Only companies with these labels, for example RGE, organic, ESS, mission company.

## `minRevenue` (type: `integer`):

Latest published revenue, in euros. Only companies that publish accounts have one.

## `maxRevenue` (type: `integer`):

Latest published revenue, in euros.

## `minNetResult` (type: `integer`):

Latest published net result, in euros (can be negative).

## `maxNetResult` (type: `integer`):

Latest published net result, in euros.

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

Exclude ceased companies (applies to searches, not to SIREN/SIRET lookups).

## `excludeSoleTraders` (type: `boolean`):

Leave out entrepreneurs individuels, whose registered business name is the name of a natural person.

## `excludeCommercialOpposition` (type: `boolean`):

INSEE lets businesses object to the use of their data for commercial prospecting (flag commercialUseOpposition). Tick this if you will use the results for marketing or prospecting. The flag is always included in the output.

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

Sort by number of establishments instead of relevance.

## `includeEstablishments` (type: `boolean`):

Add an 'establishments' list to each company with the establishments that match your filters (all establishments, up to the limit below, when no location filter is set).

## `maxEstablishmentsPerCompany` (type: `integer`):

Upper limit of the establishments list (1-100).

## `includeDirectors` (type: `boolean`):

OFF by default. When ticked, each record also gets a 'directors' list with the name, role, birth month/year and nationality of natural-person directors as published in the French register (RNE). Company directors (auditors, parent companies) are always included. By enabling this you act as the data controller for that personal data under the GDPR and must have your own lawful basis, purpose and information duties; this Actor does not provide legal advice. Directors of companies in partial diffusion are never returned.

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

Maximum number of companies to return. You are charged per result, so keep this low while testing. The register serves at most 10,000 results per search: split larger extractions by department or NAF code.

## Actor input object example

```json
{
  "query": "boulangerie",
  "identifiers": [
    "552081317",
    "44460844215578"
  ],
  "nafCodes": [
    "62.01Z",
    "62.02A"
  ],
  "departments": [
    "75",
    "92"
  ],
  "postalCodes": [
    "69001"
  ],
  "communeCodes": [
    "75056"
  ],
  "legalForms": [
    "5710",
    "5499"
  ],
  "activeOnly": true,
  "excludeSoleTraders": false,
  "excludeCommercialOpposition": false,
  "sortBySize": false,
  "includeEstablishments": false,
  "maxEstablishmentsPerCompany": 10,
  "includeDirectors": false,
  "maxItems": 20
}
```

# Actor output Schema

## `overview` (type: `string`):

All companies in the default dataset on the Overview table.

## `finance` (type: `string`):

The same dataset on the Finances view: revenue, net result, labels.

# 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 = {
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexus-scrapers/france-company-search").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 = { "maxItems": 20 }

# Run the Actor and wait for it to finish
run = client.actor("nexus-scrapers/france-company-search").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 '{
  "maxItems": 20
}' |
apify call nexus-scrapers/france-company-search --silent --output-dataset

```

## MCP server setup

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

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/ucTfbt7IhfnoklTJu/builds/fDaus1KfgPSTXOzgs/openapi.json
