# French Companies Finder: SIRENE export by activity and area (`futurelife/french-companies-finder`) Actor

Build lists of French companies from the official INSEE register (SIRENE). Filter by activity (NAF), department, city or postal code, headcount, creation date and status. One clean row per company with executives, financials and readable labels. Goes past the 10,000-result cap of the public API.

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

## Pricing

from $3.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 Finder

Get a clean list of French companies for a given activity, area and size, ready for your CRM or spreadsheet, straight from the official INSEE register (SIRENE).

- **One row per company**: SIREN, head-office SIRET, name, VAT number, legal form, activity (code + label), full address, GPS, creation date, headcount band, status, executives, latest revenue, and a link to the official record.
- **Filters that matter**: activity code (NAF/APE), department, city or postal code, headcount band, company category, legal form, creation date, active or closed.
- **No ceiling**: the public API stops at 10,000 results per query; this Actor splits the query for you and removes duplicates, so a 60,000-company list comes out of a single run.

No French needed, no API key, no account on any French site. **$3 per 1,000 companies.**

### What you get

Sample row (a software company, run with `nafCodes: ["62.01Z"]`, `cities: ["Toulouse"]`, `createdAfter: "2020-01-01"`):

```json
{
  "siren": "885167940",
  "siret_head_office": "88516794000059",
  "company_name": "INFINITE ORBITS (INFINITE ORBITS) (IO FR)",
  "vat_number": "FR16885167940",
  "status": "active",
  "created_on": "2020-06-01",
  "legal_form_code": "5710",
  "legal_form": "SAS, société par actions simplifiée",
  "naf_code": "62.01Z",
  "naf_label": "Programmation informatique",
  "naf_section_label": "Information and communication",
  "company_category": "PME",
  "employees_range": "20 to 49 employees",
  "employees_year": 2023,
  "head_office_address": "5EME ETAGE 8 RUE DES TRENTE-SIX PONTS 31400 TOULOUSE",
  "postal_code": "31400",
  "city": "TOULOUSE",
  "department": "31",
  "department_name": "Haute-Garonne",
  "region": "Occitanie",
  "latitude": 43.5927539688696,
  "longitude": 1.44579911175757,
  "executives_text": "HADDOUD ADEL (Président de SAS)",
  "executives": [
    { "type": "person", "name": "HADDOUD ADEL", "last_name": "HADDOUD", "first_names": "ADEL", "role": "Président de SAS", "is_auditor": false, "birth_year": 1977 },
    { "type": "company", "name": "DELOITTE & ASSOCIES", "role": "Commissaire aux comptes titulaire", "is_auditor": true, "siren": "572028041" }
  ],
  "revenue_eur": 0,
  "net_income_eur": 798628,
  "financials_year": 2024,
  "register_url": "https://annuaire-entreprises.data.gouv.fr/entreprise/885167940"
}
```

Every row has the same 47 columns, so the CSV or Excel export opens flat and sorted. Codes always come with a readable label next to them (`naf_code` + `naf_label`, `legal_form_code` + `legal_form`, `department` + `department_name`).

### Who it is for

- **Sales and marketing teams** building a prospect list: "all restaurants in Lyon with 10 to 49 staff", "software companies created since 2022 in the Paris area".
- **Market research and consulting**: count and map every company of a sector by department, with size and age.
- **Compliance, finance, procurement**: check a supplier's legal form, status, executives and VAT number from the official source.
- **Data teams**: a flat, stable schema to feed a warehouse; the raw register record is available on demand (`includeRawRecord`).

### How to use it

1. Type an activity code in **Activity codes** (e.g. `62.01Z` for software, `56.10A` for restaurants, `43.21A` for electricians). A single letter selects a whole sector (`J` = information and communication, `F` = construction). The official list is on [insee.fr](https://www.insee.fr/fr/information/2406147).
2. Pick an area: **Departments** (`75`, `69`, `31`…), **Cities** typed as you know them (`Toulouse`, `Lyon`, `Saint-Denis (93)`), or **Postal codes**. Leave all three empty for the whole country.
3. Optionally narrow by **Company size**, **Company category** (PME / ETI / GE), **Legal form**, **Created on or after / before**, and **Administrative status**.
4. Set **Maximum number of companies** and run. Download the dataset as CSV, Excel, JSON or connect it to Zapier, Make, Google Sheets or your own code through the Apify API.

Tip: the register lists a company as soon as one of its branches is in the area. Switch on **Head office in the area only** to keep companies headquartered there; otherwise the branch that matched is given in `matched_branch_siret` / `matched_branch_address`.

### Input summary

| Field | Example | What it does |
|---|---|---|
| `searchText` | `"boulangerie"` | Free text on name, address or executive name. A SIREN or SIRET returns that exact company. |
| `nafCodes` | `["62.01Z", "62.02A"]` | Activity codes, or a section letter `A`–`U`. |
| `departments` | `["75", "92"]` | Department codes. |
| `cities` | `["Toulouse"]` | City names or INSEE commune codes. |
| `postalCodes` | `["31000"]` | 5-digit postal codes. |
| `employeeRanges` | `["12", "21"]` | Headcount bands (drop-down). |
| `companyCategories` | `["PME"]` | PME, ETI, GE. |
| `legalFormCodes` | `["5710"]` | INSEE legal form codes. |
| `createdAfter` / `createdBefore` | `"2020-01-01"` | Creation date window. |
| `status` | `"active"` | `active` (default), `closed`, `all`. |
| `headOfficeOnly` | `true` | Keep only companies headquartered in the area. |
| `maxResults` | `500` | Stop after this many companies (duplicates never counted). |
| `includeExecutives` / `includeFinancials` / `includeRawRecord` | `true` | What each row carries. |
| `requestsPerSecond` | `3` | Speed, 1 to 6. |

### Pricing

**$3 per 1,000 companies** (one paid event per row written to the dataset) plus the standard Actor start event ($0.05 per 1,000 runs). You only pay for rows you get: duplicates are removed before writing, and a run that stops early is charged for what it produced. A 50-company test costs $0.15.

Set **Maximum number of companies** and, if you like, the run's spending limit in the Apify Console; the Actor stops cleanly at whichever comes first.

### Speed and limits

- About 1,000 companies every 20 seconds at the default speed (3 requests per second, 25 companies per request). 10,000 companies take roughly 3 minutes.
- The public API allows 7 requests per second per IP address and 30 per network; the Actor obeys its `Retry-After` header when asked to slow down, and retries on network errors.
- The register never returns more than 10,000 companies for one combination of filters. The Actor splits large queries by department, then by headcount band, status, activity code and category. If a single slice is still above 10,000 (for instance "every company in Paris, no activity code"), the run tells you so in the log and exports the first 10,000 of that slice: add postal codes or activity codes to reach the rest.
- The creation-date filter is applied after download (the register has no such filter), so a tight date window reads more rows than it exports; you are charged for exported rows only.
- Financials (`revenue_eur`, `net_income_eur`) exist only for companies that file accounts and whose figures the register publishes. In a test on software companies, 92 of 100 companies with 10 or more employees had figures, against 13 of 50 in a mixed sample dominated by sole traders.
- Executives come from the national register (RNE). Statutory auditors are flagged `is_auditor: true` and left out of the one-line `executives_text`.
- Activity and legal-form labels are the official INSEE wordings, in French. Section labels, headcount bands and department names are in English.
- Not included (by design of the public register): companies that opted out of publication ("non-diffusible"), and companies refused registration. Sole traders may have their address masked as `[NON-DIFFUSIBLE]`, a right they have under French law; the row is still exported with everything else.

### Data source and legal notice

All data comes from the public register of French companies published by the French government: the "Recherche d'entreprises" API (`recherche-entreprises.api.gouv.fr`), which serves the SIRENE database maintained by INSEE together with the national company register (RNE) maintained by INPI. Both datasets are published on data.gouv.fr under the French open licence "Licence Ouverte 2.0" (Etalab): they can be reused, including commercially, provided the source is mentioned ("Source: INSEE, SIRENE / INPI, RNE, via recherche-entreprises.api.gouv.fr").

Executives' names are published by law in the national register. If you build prospect lists with them, you remain responsible for complying with the GDPR and the French rules on business-to-business prospecting.

### Support

Something wrong with a row? Open the `register_url` of that row: it shows the official record the row was built from. For anything else, use the **Issues** tab of this Actor.

# Changelog

This Actor's version history is a separate document: https://apify.com/futurelife/french-companies-finder/changelog.md

# Actor input Schema

## `searchText` (type: `string`):

A company name, a brand, a street, or the name of an executive. Leave it empty to build a list from the filters below only. A 9-digit SIREN or 14-digit SIRET returns that exact company and ignores the other filters (this is how the register behaves).

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

One or more French activity codes, e.g. 62.01Z (software development), 56.10A (restaurants), 43.21A (electrical installation). A single letter (A to U) selects a whole section, e.g. J = information and communication. Codes without the dot (6201Z) are accepted. Full list: https://www.insee.fr/fr/information/2406147

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

French department codes: 75 (Paris), 69 (Lyon area), 13 (Marseille area), 31 (Toulouse area), 2A / 2B (Corsica), 971 to 976 (overseas). Leave empty for the whole country.

## `cities` (type: `array`):

City names typed as you know them (Toulouse, Lyon, Saint-Denis) or INSEE commune codes (31555). Names are resolved to official codes automatically; when several cities share a name the most populated one is used.

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

5-digit French postal codes, e.g. 75008, 31000.

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

Official INSEE headcount bands. Leave empty for all sizes.

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

INSEE size category: PME (small and medium, under 250 staff), ETI (mid-sized, 250 to 4,999), GE (large, 5,000 and more).

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

INSEE legal category codes, e.g. 5710 (SAS), 5499 (SARL), 5599 (SA), 1000 (sole trader), 9220 (association). Full list: https://www.insee.fr/fr/information/2028129

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

Keep only companies created on or after this date (YYYY-MM-DD). Applied after download, so the run reads more rows than it exports when this filter is tight.

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

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

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

Active companies only (default), closed ones only, or both.

## `headOfficeOnly` (type: `boolean`):

The register matches a company as soon as one of its branches is in the selected department, city or postal code. Turn this on to keep only companies whose head office is there.

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

The run stops once this many companies have been exported. Duplicates are removed before counting, so you never pay twice for the same SIREN.

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

Add the officers listed in the register (name, role, birth year) to each row.

## `includeFinancials` (type: `boolean`):

Add the latest published revenue and net income when the register has them (mostly companies that file accounts).

## `includeRawRecord` (type: `boolean`):

Attach the untouched JSON returned by the register to each row (field 'raw'). Useful for developers, heavier to export.

## `requestsPerSecond` (type: `integer`):

How fast to call the public register. The register allows 7 per IP address and 30 per network; the default of 3 is safe. Lower it if you see many 'slowing down' messages in the log.

## Actor input object example

```json
{
  "nafCodes": [
    "62.01Z"
  ],
  "departments": [
    "31"
  ],
  "status": "active",
  "headOfficeOnly": false,
  "maxResults": 500,
  "includeExecutives": true,
  "includeFinancials": true,
  "includeRawRecord": false,
  "requestsPerSecond": 3
}
```

# Actor output Schema

## `companies` (type: `string`):

One row per company: identifiers, activity, address, headcount, creation date, executives, financials, readable labels. Download as JSON, CSV or Excel.

## `run` (type: `string`):

Log, statistics and the same dataset in a table view.

# 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 = {
    "searchText": "",
    "nafCodes": [
        "62.01Z"
    ],
    "departments": [
        "31"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("futurelife/french-companies-finder").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 = {
    "searchText": "",
    "nafCodes": ["62.01Z"],
    "departments": ["31"],
}

# Run the Actor and wait for it to finish
run = client.actor("futurelife/french-companies-finder").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 '{
  "searchText": "",
  "nafCodes": [
    "62.01Z"
  ],
  "departments": [
    "31"
  ]
}' |
apify call futurelife/french-companies-finder --silent --output-dataset

```

## MCP server setup

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

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/296hGtom6iMRKepHf/builds/eYvQa2MuDhpTubxwH/openapi.json
