# French Company Search — SIRENE, SIREN/SIRET & Directors (`tidydata/french-company-search`) Actor

Search every French company in the official Sirene register: NAF code, department, postal code, size, revenue, legal form, RGE/Qualiopi labels. Or look up SIREN/SIRET in bulk. Directors, finances, VAT number, GPS. Official free API, no proxy.

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

## Pricing

from $1.20 / 1,000 company or establishments

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Search — SIRENE, SIREN/SIRET & Directors

![A NAF code, department and headcount search turned into French companies with SIREN, local site, staff band and creation year from the official Sirene register (real output)](https://raw.githubusercontent.com/tidydata-dev/tidydata-dev/main/assets/apify/french-company-search.png)

Search **every company registered in France** and get clean, ready-to-use rows: SIREN, SIRET, legal name, trade names, NAF activity, headcount, revenue and net income, directors, head office and establishment addresses with GPS, labels (RGE, Qualiopi, Bio…) and the **intra-EU VAT number**. Or paste thousands of **SIREN / SIRET numbers** and enrich them in bulk.

The data comes from the **official French government API** «Recherche d'entreprises» (INSEE Sirene + national business register RNE, the same data as annuaire-entreprises.data.gouv.fr). No scraping of Pappers or societe.com, no proxies, no login.

### Why use it

- **Official and complete** — every diffusible company in INSEE Sirene and the RNE, active and closed, updated daily by the French administration.
- **Prospecting filters** — NAF / APE code (or a whole division like `62`), NAF section, department, region, postal code, INSEE commune, company size (PME / ETI / GE), headcount band, legal form, revenue and net income ranges, director name, creation date, labels (RGE, Qualiopi, Bio, ESS, Société à mission, SIAE, training bodies…).
- **No 10,000 cap** — the government API stops at 10,000 results per search; this actor splits big searches by department and headcount automatically and removes duplicates.
- **One row per company or per establishment** — choose establishment rows (SIRET) to get every shop, office or site with its own address, GPS, activity and headcount: ideal for local prospecting and mapping.
- **Compliant lead lists** — companies that opted out of commercial prospecting (`opposition_diffusion_commerciale`) are skipped by default and free; sole proprietors (registered under a person's name) are left out unless you ask for them; no birth dates.
- **Cheap** — $1.50 per 1,000 rows, directors and finances included. Errors, skipped and not-found numbers are free.

### Use cases

B2B lead generation in France by sector and area, building TAM / market maps, CRM enrichment (SIREN → full record), KYC and supplier checks, finding RGE installers or Qualiopi training bodies, local store mapping with GPS, academic and economic research.

### Input examples

**Software companies with 10-49 employees in the Lyon area (Rhône):**

```json
{ "nafCodes": ["62.01Z"], "departments": ["69"], "employeeRanges": ["11", "12"], "maxResults": 500 }
```

**Every bakery in Paris 11e, one row per shop:**

```json
{ "query": "boulangerie", "postalCodes": ["75011"], "rowPer": "establishment" }
```

**RGE-certified building companies in Brittany created since 2024:**

```json
{ "sections": ["F"], "regions": ["53"], "labels": ["rge"], "createdAfter": "2024-01-01", "maxResults": 2000 }
```

**Bulk enrichment of SIREN / SIRET numbers:**

```json
{ "sirenOrSiret": ["552032534", "403 052 111", "40305211101022"] }
```

### Output (real row, software company in the Rhône search above; director name hidden here)

```json
{
  "siren": "445301039", "siret": "44530103900027", "isHeadOffice": true, "vatNumber": "FR20445301039",
  "name": "INLEED", "tradeNames": "IN-LEED", "status": "active", "createdAt": "2003-01-23",
  "nafCode": "62.01Z", "nafLabel": "Programmation informatique", "legalForm": "SAS, société par actions simplifiée",
  "category": "PME", "employees": "20-49", "employeeRangeYear": 2024, "establishments": 10, "openEstablishments": 6,
  "address": "PARC COMITEC 2 RUE JEAN-FRANCOIS CHAMPOLLION 18000 BOURGES", "postalCode": "18000", "city": "BOURGES",
  "department": "18", "region": "Centre-Val de Loire", "latitude": 47.0972918771529, "longitude": 2.39351787135985,
  "matchedEstablishmentSiret": "44530103900068",
  "matchedEstablishmentAddress": "LES JARDINS D EOLE-IMM LE MELTEM 2 ALLEE DES SEQUOIAS 69760 LIMONEST",
  "revenue": 2107396, "netIncome": 4027, "financialYear": 2025,
  "directors": [{ "type": "person", "name": "«FIRST LAST»", "role": "Président de SAS", "siren": null }],
  "labels": [], "collectiveAgreements": ["1486", "0804"], "isSoleProprietor": false, "optedOutOfProspecting": false,
  "registryUrl": "https://annuaire-entreprises.data.gouv.fr/entreprise/445301039"
}
```

The head office is in Bourges, but the company matched the Rhône search through its Limonest establishment, shown in `matchedEstablishment*`. Use *One row per establishment* to get only the local sites.

Three table views in the Output tab: **Companies**, **Establishments (local)** and **Finance & size**. Export to CSV, Excel, JSON or Google Sheets.

### Pricing

**$1.50 per 1,000 rows** (one company or one establishment = one row). Directors, finances, labels and VAT numbers are included. Invalid or unknown SIREN/SIRET numbers, companies skipped because they opted out of prospecting, and input errors are **free**. Apify store discounts apply on paid plans.

### Tips

- Find NAF codes on insee.fr (e.g. 56.10A traditional restaurant, 43.22A plumbing, 69.20Z accounting, 70.22Z consulting). `62` returns every code of division 62.
- Department filters match companies that have **at least one establishment** there. For "head office in Paris" keep company rows and check `department`.
- Run it on a schedule with *Created on or after* set to a recent date to get newly created companies in your area every week.
- Set a maximum cost per run in Apify: the actor stops cleanly at your limit.

### Sources, licence and privacy

Data: API Recherche d'entreprises by DINUM / annuaire-entreprises.data.gouv.fr, built on INSEE Sirene and the INPI national business register (RNE), published under the **Licence Ouverte / Open Licence 2.0** (commercial reuse allowed with attribution). This actor is not affiliated with or endorsed by the French administration. Non-diffusible companies (those that asked INSEE to hide them) are not in the API. You are responsible for using personal data (directors, sole proprietors) in line with the GDPR and French rules on commercial prospecting; keep *Skip companies that opted out of prospecting* on for marketing lists.

### FAQ

**Is this the complete Sirene database?** It covers every diffusible company in Sirene and the RNE, active and closed. Companies that chose non-diffusion are hidden by law and cannot be returned by any official API.

**Can I get more than 10,000 companies?** Yes. Searches with 10,000 or more matches are split automatically by department and then by headcount band, and duplicates are removed. Only a single department + headcount slice that still has over 10,000 companies is cut at 10,000 (add a NAF code or postal codes to get the rest); the log tells you when that happens.

**Does it give emails and phone numbers?** No. The official register does not publish them. Pair it with a contact finder such as our [Website Contact Extractor](https://apify.com/tidydata/website-contact-extractor) if you have websites.

**What does "opted out of prospecting" mean?** French companies can ask that their register data is not used for commercial prospecting. Those companies are skipped by default (free). For KYC, supplier checks or research, switch *Skip companies that opted out of prospecting* off; SIREN/SIRET lookups always return the company and flag it in `optedOutOfProspecting`.

**How is the VAT number computed?** With the official French formula: `FR` + key + SIREN, where key = (12 + 3 × (SIREN mod 97)) mod 97. Every company has one computed, but only companies registered for VAT actually use it: check it in the EU VIES service before invoicing.

**How fresh is the data?** The government API is updated every day from INSEE and the RNE; `updatedAt` shows the last change of each record. Headcount bands and finances are the latest year published.

**Does it need an API key or proxies?** No. The official API is free and open; the actor calls it politely within its rate limit.

**Can I run it on a schedule or from code?** Yes: schedule it in Apify, call it from the API, Make, Zapier or n8n, or export each run straight to Google Sheets.

### Related Actors

- [Company Registry Lookup](https://apify.com/tidydata/company-registry-lookup) — LEI (GLEIF), Norway and Finland official registries.
- [Merge, Filter, Deduplicate & Transform Datasets](https://apify.com/tidydata/merge-dedupe-datasets) — merge several runs into one clean list and keep only new companies.
- [Public Tenders & Procurement Scraper](https://apify.com/tidydata/public-tenders-scraper) — French and EU public tenders from TED.

# Actor input Schema

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

Free text searched in company names, trade names, addresses and directors, e.g. 'boulangerie', 'agence web lyon', 'Danone'. Leave empty to list every company that matches the filters below.

## `sirenOrSiret` (type: `array`):

Paste SIREN (9 digits) or SIRET (14 digits) numbers, with or without spaces. One row per number found, with the full record. When this list is filled, the search filters are ignored. Invalid or unknown numbers come back as free error rows.

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

INSEE NAF rév. 2 codes like 62.01Z (computer programming), 10.71C (bakery), 56.10A (restaurant) or 6920Z (accounting). A division ('62') or group ('62.0') includes every code inside it.

## `sections` (type: `array`):

Broad sectors (NAF sections A-U). Use NAF codes above for something more precise.

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

Department codes: 75 (Paris), 69 (Rhône), 13 (Bouches-du-Rhône), 2A, 971… Matches companies with at least one establishment there.

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

Matches companies with at least one establishment in the region.

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

5-digit postal codes, e.g. 75011, 69002. Matches companies with an establishment at that postal code.

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

5-character INSEE commune codes (not postal codes), e.g. 75111 for Paris 11e or 69123 for Lyon.

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

INSEE category: PME = SME (< 250 staff), ETI = mid-cap (250-4,999), GE = large company (5,000+).

## `employeeRanges` (type: `array`):

Official INSEE headcount band (salaried staff, latest year available).

## `legalFormCodes` (type: `array`):

INSEE codes, e.g. 5710 (SAS), 5720 (SASU), 5499 (SARL), 5498 (EURL), 5599 (SA), 9220 (association). Full list: insee.fr › catégories juridiques.

## `status` (type: `string`):

Administrative status of the company in the Sirene register.

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

Only companies with ALL the chosen labels.

## `revenueMin` (type: `integer`):

Latest published turnover (chiffre d'affaires). Only companies that publish accounts have it.

## `revenueMax` (type: `integer`):

Latest published turnover.

## `netIncomeMin` (type: `integer`):

Latest published net result (can be negative).

## `netIncomeMax` (type: `integer`):

Latest published net result.

## `director` (type: `string`):

Find companies run by a person: 'first name last name' or just a last name.

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

Keeps companies created on or after this date (YYYY-MM-DD). The official API has no date filter, so this is applied to the results: combine it with a place or NAF filter so the search stays under 10,000 companies.

## `createdBefore` (type: `string`):

Keeps companies created on or before this date (YYYY-MM-DD).

## `rowPer` (type: `string`):

Company: one row per SIREN with the head office. Establishment: one row per matching shop / office / site (SIRET) with its own address, GPS, activity and headcount; each establishment row is one result.

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

Only for 'One row per establishment'. Matching establishments returned for each company (chains can have hundreds).

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

Directors and officers from the official register (RNE): name and role for people, name and SIREN for corporate officers and auditors. No birth dates.

## `excludeOptedOutOfProspecting` (type: `boolean`):

French companies can ask that their register data is not used for commercial prospecting (opposition_diffusion_commerciale). Keep this ON for lead lists; skipped companies are free. Turn it OFF for KYC, supplier checks or research. SIREN/SIRET lookups always return the company and flag it in optedOutOfProspecting.

## `includeSoleProprietors` (type: `boolean`):

Sole proprietorships and micro-entrepreneurs are registered under the owner's own name. Off by default (privacy); turn on if you need them.

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

Sort by number of establishments instead of relevance.

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

Stop after this many rows (companies or establishments). Searches over 10,000 companies are split automatically by department and headcount. Not used for SIREN/SIRET lookups (every number is returned).

## Actor input object example

```json
{
  "query": "boulangerie",
  "nafCodes": [
    "10.71C"
  ],
  "departments": [
    "75"
  ],
  "status": "active",
  "rowPer": "company",
  "maxEstablishmentsPerCompany": 20,
  "includeDirectors": true,
  "excludeOptedOutOfProspecting": true,
  "includeSoleProprietors": false,
  "sortBySize": false,
  "maxResults": 50
}
```

# Actor output Schema

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

One row per company or establishment.

# 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",
    "nafCodes": [
        "10.71C"
    ],
    "departments": [
        "75"
    ],
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidydata/french-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 = {
    "query": "boulangerie",
    "nafCodes": ["10.71C"],
    "departments": ["75"],
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("tidydata/french-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 '{
  "query": "boulangerie",
  "nafCodes": [
    "10.71C"
  ],
  "departments": [
    "75"
  ],
  "maxResults": 50
}' |
apify call tidydata/french-company-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tidydata/french-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/3UWVhJSeGqys6Urkb/builds/Djl11vclMMp6P5hUJ/openapi.json
