# French Company Data API - SIREN, SIRET, NAF & Revenue (`rel8ble/france-company-data`) Actor

French company data for B2B lead lists: search the official SIRENE-based register by name, NAF code, department, size or revenue. One result = one company: SIREN, SIRET, NAF, employees, revenue, VAT, address, GPS, labels. No login. $1.00 per 1,000 results.

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

## Pricing

$1.00 / 1,000 results

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 - SIREN, SIRET, NAF & Revenue

This **French company data** actor turns the official French government company search (API Recherche d'Entreprises, built on the Sirene and RNE registers) into clean **B2B company lists**: search by name, SIREN, **NAF activity code, department, postal code, company size, employee band, revenue or label**, and get one row per company with **SIREN, SIRET, name, NAF code, size, employee band, revenue, net result, VAT number, head office address, GPS coordinates and labels**, as JSON, CSV or Excel.
Use it as a **SIRENE company search**, a **France company database** for **lead generation**, a **French company lookup by SIREN**, or a **KYB and CRM enrichment** source, from your own code, Make, Zapier, n8n or an AI agent.

**What goes in:** search terms, or filters alone (for example NAF `43.21A` in department `13` with revenue above €500,000). **What comes out:** one row per company. **When to use it:** you need a filtered list of French companies with their legal and size data, without writing paging and filter code against the API yourself.

**$1.00 per 1,000 companies, no start fee.** No login, no API key, no browser.

**What it does not have: no e-mail addresses, phone numbers or websites.** The register does not hold them. Pair it with a contact-finding tool if you need those.

**The source is free.** The API this actor reads is open to anyone. You pay here for ready-made filters, paging, deduplication, opt-out handling, clean English field names and an export, not for exclusive data.

### What you get

- **Identity**: SIREN, head office SIRET, full and legal name, acronym, trade names, VAT number(s), legal form code, status, creation and closure dates.
- **Activity and size**: NAF code (and the new NAF 2025 code), NAF section, INSEE size category (PME, ETI, GE), employee band with its year.
- **Finance**: latest revenue and net result with their year, when the company publishes accounts.
- **Place**: head office address, postal code, city, department, region, GPS, number of establishments, and the establishment that matched your search.
- **Labels**: RGE, Qualiopi, Organic, social economy (ESS), training organisation, mission-driven company and more.
- **On request**: directors (name and role, never birth dates), all matching establishments.

Fill rates in a 500-company test (NAF `47.11F`, all France, run on 4 November 2026): SIREN, name, NAF, legal form, employee band and address 100%, postal code 99%, GPS 98%, VAT 98%, size category 99%, revenue and net result 90%. In the 10-company demo (software companies with a site in Rhône), 8 had revenue and 7 a VAT number. Sectors differ: treat these as examples. Missing fields are `null` or an empty list.

### Sample output

Real rows from the prefilled demo (software companies, NAF `62.01Z`, PME, with a site in department 69):

| name | employees | revenue (EUR) | year | head office | matched site |
|---|---|---|---|---|---|
| TRUSTTEAM | 100-199 | 8,904,988 | 2022 | MAXEVILLE | SAINT-PRIEST |
| INLEED (IN-LEED) | 20-49 | 2,107,396 | 2025 | BOURGES | LIMONEST |
| CELERES FRANCE | 20-49 | 5,964,000 | 2024 | LAVELANET | CHASSIEU |
| RSF COM | 10-19 | 3,374,337 | 2022 | LIMONEST | LIMONEST |

### Use cases

- **B2B lead lists**: all electricians with an RGE label and over €500,000 revenue in two departments
- **Market sizing**: how many companies have a given NAF code and employee band in a region
- **CRM enrichment and KYB**: look up SIREN numbers and add legal form, VAT, size, revenue and status
- **Territory planning**: head office and matched-site coordinates for mapping
- **Investment and M\&A sourcing**: filter by sector, size and net result

### Pricing

**$1.00 per 1,000 companies** (pay per result; one result = one company saved to the dataset). No start fee. Directors and establishments are included at the same price, and so is Apify platform usage.

| You fetch | You pay |
|---|---|
| 100 companies | $0.10 |
| 1,000 companies | $1.00 |
| 10,000 companies | $10.00 |

Other French company actors on the Apify Store, free-plan prices per 1,000, from the Store snapshot of 21 October 2026 (check their pages for current prices; their fields and sources differ):

| Actor | Price per 1,000 |
|---|---|
| dltik Pappers + SIRENE | $8.00 ($10.00 with analysis) |
| epicscrapers Pappers | $4.00 + small start fee |
| orizondeveloppement French company data | $5.00 |
| revenuepilot France company finder | $2.00 |
| studio-amba Recherche d'Entreprises | $12.00 + $0.01 start |
| **This actor** | **$1.00, no start fee** |

Duplicates, skipped companies (below), searches that find nothing and failed requests are never charged. If you set a maximum cost per run, the actor stops cleanly when it reaches it.

### Opt-outs and sole traders

By default the actor leaves out two groups, at no charge:

- **Companies that opposed commercial use.** The API marks companies that object to reuse of their data for commercial prospecting (GDPR article 21(2); article R.123-320 of the French Commercial Code). This is a large share: in the 500-company test, 391 companies were skipped this way for 500 kept (44% of those seen). Turn `excludeOptedOut` off only if your use is not prospecting.
- **Sole traders.** Their company name is a person's name. Turn `excludeSoleTraders` off if you need them.

### FAQ

**Why does a company in Lyon's department have its head office in Paris?**
Place filters match any establishment of the company, not only the head office. `matchedEstablishment` shows the site that matched. To keep head offices in an area only, filter on `department` in the output.

**How many results can one search return?**
The API stops at 10,000 per search. Split a big search by department or NAF code to go deeper. `maxResultsPerSearch: 0` takes as many as the API allows.

**Does the list come in a useful order?**
The API decides the default order; `sortBySize` puts the companies with the most establishments first.

**How fresh is the data?**
As fresh as the API: the actor reads it live at each run and stores nothing.

**Where does revenue come from, and why is it sometimes 0 or old?**
From the accounts companies publish, as the API gives them. `financialYear` tells you the year. Many companies do not publish, and a value of 0 is passed on as given.

**What about the API's rate limit?**
The API allows 7 requests per second per IP and 30 per second per network, and asks clients to slow down when busy. The actor stays at 4 requests per second, waits when told to (HTTP 429 with `Retry-After`), and uses no proxy. Busy periods can make a run slower. Each request returns up to 25 companies. In a local test, 500 companies took 17 seconds.

**Is the data licensed for commercial use?**
The datasets behind this API, including the Sirene base, are published on data.gouv.fr under the French Licence Ouverte 2.0, which allows commercial reuse with credit to the source (checked 4 November 2026). The API's own listing on api.gouv.fr says "licence non renseignée", so I am relying on the dataset licence. Credit the source when you republish: "Annuaire des Entreprises / Insee Sirene". This is not legal advice.

**Does it return personal data?**
Only on request. Directors are off by default; when on, they include name and role as registered, and birth dates are never collected. Names are personal data under GDPR: you are responsible for how you use them. Companies that opposed commercial use and sole traders are left out by default.

**Is this an official government product?**
No. It is an independent tool that reads a public government API.

### How to use

1. Type **Search terms** (name, SIREN) and/or set filters: **NAF codes** (`62.01Z`), **departments** (`69`), **company size** (`PME`), **employee bands** (`12` = 20-49), **revenue**, **labels** (`rge`).
2. Set **Max companies per search**.
3. Click **Start**, then download from the **Output** tab or fetch through the Apify API.

A filter with no valid value stops the run with an error rather than widening your search.

### Input

| Field | Default | Description |
|---|---|---|
| `searchTerms` | - | Name, address words or SIREN / SIRET |
| `nafCodes` / `nafSections` | - | `62.01Z` / `F` |
| `companySizes` | - | `PME`, `ETI`, `GE` |
| `employeeBands` | - | INSEE band codes, listed in the field description |
| `legalForms` | - | Four-digit codes, e.g. `5710` (SAS) |
| `minRevenue` / `maxRevenue` / `minNetResult` / `maxNetResult` | - | Euros |
| `labels` | - | `rge`, `bio`, `qualiopi`, `ess`, `training`, `mission`, `heritage`, `association` |
| `departments` / `regions` / `postalCodes` / `communeCodes` | - | Place filters (any establishment) |
| `activeOnly` | true | Leave out ceased companies |
| `excludeSoleTraders` / `excludeOptedOut` | true | See above |
| `includeDirectors` / `includeEstablishments` | false | Add directors / all matching establishments |
| `sortBySize` | false | Most establishments first |
| `maxResultsPerSearch` | 100 | 0 = API limit of 10,000 |

With no input at all, a 10-company demo runs.

### Input example

```json
{
    "nafCodes": ["43.21A"],
    "departments": ["13", "59"],
    "companySizes": ["PME"],
    "minRevenue": 500000,
    "labels": ["rge"],
    "maxResultsPerSearch": 200
}
```

### Output example

Real row from the prefilled demo:

```json
{
    "siren": "519037253",
    "siret": "51903725300043",
    "name": "TRUSTTEAM",
    "legalName": "TRUSTTEAM",
    "acronym": null,
    "tradeNames": ["TRUSTTEAM", "DSOFT"],
    "status": "active",
    "createdDate": "2009-12-23",
    "closedDate": null,
    "nafCode": "62.01Z",
    "nafCode2025": "62.20H",
    "nafSection": "J",
    "legalFormCode": "5710",
    "companySize": "PME",
    "employeeBand": "100-199",
    "employeeBandCode": "22",
    "employeeBandYear": 2024,
    "revenue": 8904988,
    "netResult": 1603916,
    "financialYear": 2022,
    "vatNumbers": ["FR65519037253"],
    "address": "PARC D'ACTIVITES SAINT JACQUES 41 RUE ALBERT EINSTEIN 54320 MAXEVILLE",
    "postalCode": "54320",
    "city": "MAXEVILLE",
    "department": "54",
    "region": "44",
    "latitude": 48.7006371,
    "longitude": 6.1223250588,
    "establishmentsTotal": 14,
    "establishmentsOpen": 12,
    "labels": [],
    "soleTrader": false,
    "commercialUseOptOut": false,
    "matchedEstablishment": {
        "siret": "51903725300118",
        "isHeadOffice": false,
        "name": null,
        "address": "LE PARC TECHNOLOGIQUE DE LYON IMMEUBLE 333 COURS DU TROISIEME MILLENAIRE 69800 SAINT-PRIEST",
        "postalCode": "69800",
        "city": "SAINT-PRIEST",
        "communeCode": "69290",
        "region": "84",
        "nafCode": "46.51Z",
        "employeeBand": "No employees reported",
        "status": "active",
        "openedDate": "2024-07-01",
        "latitude": 45.7153970382947,
        "longitude": 4.9319311582362
    },
    "establishments": [],
    "directors": [],
    "directoryUrl": "https://annuaire-entreprises.data.gouv.fr/entreprise/519037253",
    "searchQuery": null,
    "position": 2,
    "scrapedAt": "2026-11-04T18:34:35.881Z"
}
```

A `RUN_SUMMARY` record in the key-value store lists, per search, how many companies match, how many were saved or skipped and why, the filters sent and any input that was ignored.

### Integrations

Export the dataset as JSON, CSV, Excel, XML or HTML, or pull it with the Apify API and the JavaScript / Python clients. Connect it to Make, Zapier, n8n, Google Sheets, HubSpot or Slack with Apify integrations and webhooks, schedule runs to catch new companies, or call it from an AI agent through the Apify MCP server.

Need a custom scraper or a ready dataset? Hire me on Fiverr: https://www.fiverr.com/rel8ble

# Actor input Schema

## `searchTerms` (type: `array`):

Company name, address words, or a SIREN / SIRET number, one per line, e.g. "boulangerie", "Michelin", "812809234". Each term is one search. Leave empty to search on the filters below alone. At least one term or one filter is needed.

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

INSEE activity codes, e.g. "62.01Z" (software), "43.21A" (electricians), "56.10A" (restaurants). 6201Z also works. Several codes are combined with OR.

## `nafSections` (type: `array`):

One letter per line, A to U, e.g. "F" for construction.

## `companySizes` (type: `array`):

INSEE size category: PME (small and medium), ETI (intermediate), GE (large), one per line.

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

INSEE band codes, one per line: NN no employees reported, 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 = 1,000-1,999, 51 = 2,000-4,999, 52 = 5,000-9,999, 53 = 10,000+.

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

INSEE four-digit legal form codes, e.g. "5710" (SAS), "5499" (SARL).

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

Optional. Only companies with published accounts can match.

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

Optional. Only companies with published accounts can match.

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

Optional. Only companies with published accounts can match.

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

Optional. Only companies with published accounts can match.

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

Keep companies on these registers, one per line: rge, bio, qualiopi, ess, training, mission, heritage, association.

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

Department codes, e.g. "69", "75", "2A", "971". These match any establishment of the company, not only the head office: see matchedEstablishment in the output.

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

Two-digit INSEE region codes, e.g. "84" (Auvergne-Rhone-Alpes). Same matching as departments.

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

Five-digit postal codes. Same matching as departments.

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

Five-character INSEE commune codes (not postal codes). Same matching as departments.

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

true (default) = leave out ceased companies.

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

true (default) = leave out sole traders (entreprises individuelles), whose company name is a person's name. Not charged.

## `excludeOptedOut` (type: `boolean`):

true (default) = leave out companies whose register entry says they oppose commercial use of their data. Not charged. Turn off only if your use is not commercial prospecting.

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

false (default). true = add directors: name and role as registered. Birth dates are never collected. Names of people are personal data: GDPR applies to how you use them.

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

false (default). true = add every establishment that matched the search, up to 100 per company. The first match is always in matchedEstablishment.

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

Sort by number of establishments, biggest first.

## `maxResultsPerSearch` (type: `integer`):

Optional. Companies saved per search term, or in total for a filters-only search, integer >= 0. Default 100; 0 = the API limit of 10,000 per search. Split by department or NAF code to go deeper. You pay per company, so start small.

## Actor input object example

```json
{
  "nafCodes": [
    "62.01Z"
  ],
  "departments": [
    "69"
  ],
  "activeOnly": true,
  "excludeSoleTraders": true,
  "excludeOptedOut": true,
  "includeDirectors": false,
  "includeEstablishments": false,
  "sortBySize": false,
  "maxResultsPerSearch": 10
}
```

# Actor output Schema

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

One row per French company: SIREN, SIRET, name, NAF code, size, employee band, revenue, net result, VAT, head office address, GPS, labels.

## `summary` (type: `string`):

Counts per search, companies skipped and why, and any filter value that was ignored.

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

// Run the Actor and wait for it to finish
const run = await client.actor("rel8ble/france-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 = {
    "nafCodes": ["62.01Z"],
    "departments": ["69"],
    "maxResultsPerSearch": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("rel8ble/france-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 '{
  "nafCodes": [
    "62.01Z"
  ],
  "departments": [
    "69"
  ],
  "maxResultsPerSearch": 10
}' |
apify call rel8ble/france-company-data --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rel8ble/france-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/r2uTjJLTuXAONc2yV/builds/cDSjo1Itr9DMa7Vbq/openapi.json
