# France Company Leads & SIREN Lookup (SIRENE) (`eurodata-tools/france-company-leads`) Actor

Build French B2B company lists from the official SIRENE/RNE registry: filter by NAF code, region, department, headcount, revenue and legal form, or look up SIREN/SIRET/VAT numbers. Returns VAT number, address, revenue, certifications. GDPR opt-outs respected.

- **URL**: https://apify.com/eurodata-tools/france-company-leads.md
- **Developed by:** [EuroData Tools](https://apify.com/eurodata-tools) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

## France Company Leads & SIREN Lookup (SIRENE)

Build **lists of French companies** from the official French business registry (SIRENE + RNE), or **look up** SIREN, SIRET and VAT numbers in bulk. Filter by **activity code (NAF/APE)**, **region, department or postal code**, **headcount**, **revenue**, **legal form** and **certifications** such as RGE or Qualiopi. Every row comes with the company's **intra-EU VAT number**, head office address, headcount band, latest published revenue and a link to the official registry page.

**$3 per 1,000 companies.** Only the companies you get are charged. Rows for numbers that were not found are free.

The data comes from the French government's open **API Recherche d'entreprises** (Annuaire des Entreprises, data.gouv.fr), not from scraping a private website. Runs are fast, results are stable and nothing breaks when a website changes its layout.

### What can you use it for?

- **B2B lead lists for France.** For example "IT services companies in Lyon with 10-49 employees", "restaurants in Provence with 10+ staff" or "RGE-certified installers in Brittany with more than €1M revenue".
- **Market sizing.** Count and map the companies of a sector by region, size or legal form.
- **KYB and supplier checks.** Paste SIREN, SIRET or VAT numbers and get the legal name, status (active / closed), legal form, address, activity and VAT number from the official registry.
- **Clean your CRM.** Normalize French accounts with their SIREN, VAT number, NAF code and head office.
- **Chain it with other Actors.** Feed it the `siren` or `vatIds` field of another Actor's dataset, for example the output of **EU Company Contacts & VAT Extractor**, which finds SIREN and VAT numbers on company websites.

### GDPR-friendly by default

French law lets companies **object to the use of their registry data for commercial prospecting** (GDPR art. 21 and article R.123-320 of the Code de commerce). A large share of French companies have done so, and most generic scrapers ignore it. This Actor does not:

- **Purpose `prospecting` (default):** companies that objected are **left out and not charged**. What you get can be used for B2B prospecting.
- **Purpose `verification`:** for KYB, compliance, supplier checks or research where you will not prospect. Every company is returned, with the `prospectingOptOut` flag.
- **Sole traders are excluded by default.** A sole trader (entrepreneur individuel, micro-entrepreneur) is a private person, and the company name is the person's own name.
- **Directors are off by default.** When you turn them on you get name and role only, never the date of birth.

### Example output

One row per company (real result, shortened):

```json
{
  "siren": "356000000",
  "siret": "35600000000048",
  "vatNumber": "FR39356000000",
  "companyName": "LA POSTE",
  "status": "active",
  "creationDate": "1991-01-01",
  "nafCode": "53.10Z",
  "nafLabel": "Activités de poste dans le cadre d'une obligation de service universel",
  "sectorName": "Transportation and storage",
  "legalForm": "SA (board of directors)",
  "companyCategory": "GE",
  "employees": "10000+",
  "address": "DIRECTION GENERALE DE LA POSTE 9 RUE DU COLONEL PIERRE AVIA 75015 PARIS",
  "postalCode": "75015",
  "city": "PARIS",
  "department": "75",
  "regionName": "Île-de-France",
  "latitude": 48.831515159,
  "longitude": 2.2780898787,
  "establishments": 13133,
  "revenue": 26700000000,
  "netIncome": 1474000000,
  "financialYear": "2025",
  "certifications": ["Qualiopi (training quality)", "Registered training organisation"],
  "prospectingOptOut": false,
  "registryUrl": "https://annuaire-entreprises.data.gouv.fr/entreprise/356000000"
}
```

Real test runs:

| Search | Companies in the registry | Returned for prospecting |
|---|---|---|
| NAF `62.01Z` (software), department 69 (Rhône), head office in the area | 2,614 | 60 of 60 requested in 9 seconds |
| NAF `56.10` (restaurants), region Provence-Alpes-Côte d'Azur, 10+ employees | 1,924 | 120 of 120 requested |
| NAF `43.2` (electrical and plumbing works), Bretagne, SAS/SARL, RGE label, revenue ≥ €1M | 85 | 40 of 40 requested |
| Sector F (construction), all of France | 10,000+ (split automatically) | 150 of 150 requested |

### How to use it

#### Build a company list

1. Keep **What do you want to do?** on *Build a company list from filters*.
2. Add one or more filters: activity codes (`62.01Z`, or `62.01`, or a whole division such as `62`), broad sectors, regions, departments, postal codes, headcount, revenue, legal forms, certifications or keywords.
3. Set **Max companies** and click **Start**. Download the results as Excel, CSV or JSON, or get them through the API.

Searches with more than 10,000 matches (the limit of the official API for one query) are **split automatically** by department and then by headcount band, so you can export large lists.

#### Look up numbers or names

1. Choose *Look up SIREN / SIRET / VAT numbers or names*.
2. Paste your list, one per line: `552032534` (SIREN), `55203253400703` (SIRET), `FR27552032534` (VAT number) or a company name. Spaces and dots are ignored, and VAT numbers are checked with their key.
3. Or enter the ID of a dataset and the field to read (`siren`, `vatIds`, ...). VAT numbers from other countries are skipped.

Each input gets a `lookupStatus`: `found`, `not-found`, `invalid`, `duplicate`, `prospecting-opt-out` or `sole-trader-excluded`. Only `found` rows are charged. Name lookups pick the most likely company and tell you how close the match is in `nameMatch` (`exact`, `partial`, `fuzzy`).

### Input

| Field | Default | What it does |
|---|---|---|
| `mode` | `search` | `search` = build a list, `lookup` = look up numbers or names |
| `purpose` | `prospecting` | `prospecting` leaves out companies that objected to prospecting; `verification` returns them with a flag |
| `nafCodes` | — | NAF / APE codes: exact, class, group or division |
| `sectors` | — | NACE sections A–U |
| `keywords` | — | Text search on name, trade name and address |
| `regions` / `departments` / `postalCodes` / `communeCodes` | — | Location filters |
| `headOfficeInArea` | `true` | Head office must be in the area (off = also companies with only a branch there) |
| `minEmployees` / `maxEmployees` | — | Headcount, using the official bands |
| `companyCategories` | — | PME, ETI, GE |
| `legalForms` | — | SAS, SARL, SA, SNC, SCI, association, foreign company ... |
| `minRevenue` / `maxRevenue` | — | Latest published turnover in EUR |
| `certifications` | — | RGE, Qualiopi, Bio, ESS, Société à mission, EPV ... |
| `maxResults` | 1000 | Stop after this many companies |
| `identifiers` / `sourceDatasetId` / `sourceDatasetField` | — / — / `siren` | Lookup mode input |
| `includeNotFound` | `true` | Free rows explaining what was not returned |
| `includeClosed` | `false` | Also closed companies |
| `excludeSoleTraders` | `true` | Leave out sole traders (private persons) |
| `includeDirectors` | `false` | Officers' name and role, never the birth date |

### Output fields

`siren`, `siret`, `vatNumber`, `companyName`, `legalName`, `acronym`, `tradeNames`, `status`, `closedOn`, `creationDate`, `nafCode`, `nafLabel`, `naf2025Code`, `sector`, `sectorName`, `legalFormCode`, `legalForm`, `companyCategory`, `employees`, `employeeBandCode`, `employeesYear`, `isEmployer`, `address`, `postalCode`, `city`, `country`, `department`, `region`, `regionName`, `latitude`, `longitude`, `establishments`, `openEstablishments`, `revenue`, `netIncome`, `financialYear`, `certifications`, `collectiveAgreements`, `isSoleTrader`, `prospectingOptOut`, `directors` (optional), `registryUrl`, `scrapedAt`. Lookup mode adds `input`, `lookupStatus`, `matchedBy`, `nameMatch` and `error`.

### Pricing

**$3 per 1,000 companies** (`company-record` event, $0.003 each). Rows for numbers not found, invalid inputs, duplicates and left-out companies are free. Set **Max cost per run** in the run options and the Actor stops there: you never pay more.

Example: a list of 2,500 companies costs **$7.50**.

### Good to know

- **Emails, phones and websites are not in the French registry.** To find them, put the company websites into a contact-extraction Actor.
- **Revenue** is available only for companies that publish their accounts. Many small companies do not publish them or keep them confidential, so a revenue filter leaves those companies out.
- **Headcount** is an official band (e.g. `20-49`), not an exact number. `No employees` means the company had no employees in the reference year.
- **Companies that are not public.** Some companies asked INSEE not to be listed publicly, and the official API does not return them.
- **NAF 2025.** France is moving to a new activity nomenclature. Filters use the current NAF rev. 2 codes, and each row also contains the new `naf2025Code`.
- **Legal.** The data is official open data (Licence Ouverte / Etalab). You remain responsible for how you use it, for example under GDPR and anti-spam rules when you contact companies.

### FAQ

**Can I get 50,000 companies?** Yes. Set **Max companies** to 50000. Large searches are split automatically into queries of fewer than 10,000 results.

**Why do I get fewer companies than the registry count?** With purpose `prospecting`, companies that objected to prospecting are left out. With location filters and *Head office must be in the area* on, companies that only have a branch in the area are left out too. The log tells you how many were left out for each reason.

**Something is missing or wrong?** Open an issue on the Actor page with your input. Issues are usually answered within a day.

# Actor input Schema

## `mode` (type: `string`):

`search` builds a list of companies from the filters below. `lookup` returns registry data for a list of SIREN / SIRET / VAT numbers or company names.

## `purpose` (type: `string`):

French law lets companies object to the use of their registry data for commercial prospecting (GDPR art. 21, Code de commerce R.123-320). With `prospecting` those companies are left out (and not charged). Choose `verification` only for KYB, supplier checks, compliance or research where you will not use the data to prospect: then every company is returned, with the `prospectingOptOut` flag.

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

Official French activity codes. Exact (`62.01Z`), class (`62.01`), group (`62.0`) or whole division (`62`) are accepted. Examples: `43.21A` electricians, `56.10A` restaurants, `71.12B` engineering firms, `47` retail. Full list: https://www.insee.fr/fr/information/2406147

## `sectors` (type: `array`):

Broad sectors (NACE sections). Use this or the activity codes above.

## `keywords` (type: `string`):

Optional text search on company name, trade name and address (e.g. `boulangerie`, `solaire`).

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

French regions.

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

Department numbers, e.g. `75` (Paris), `69` (Rhône), `13` (Bouches-du-Rhône), `2A`, `974`.

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

5-digit postal codes, e.g. `75008`, `69002`.

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

INSEE commune codes (not postal codes), e.g. `69123` for Lyon, `13055` for Marseille.

## `headOfficeInArea` (type: `boolean`):

On: only companies whose head office is in the selected area. Off: also companies based elsewhere that have a branch in the area.

## `minEmployees` (type: `integer`):

Based on the official headcount band (e.g. 10 = companies in the 10-19 band or larger).

## `maxEmployees` (type: `integer`):

Based on the official headcount band.

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

Official INSEE category.

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

Legal form of the company.

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

Only companies that published accounts with at least this turnover. Many small companies do not publish accounts and are then left out.

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

Only companies that published accounts with at most this turnover.

## `certifications` (type: `array`):

Only companies that hold all the selected labels, e.g. RGE for energy-renovation installers.

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

Stop after this many companies. Queries with more than 10,000 matches are split automatically (by department, then by headcount).

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

One per line: `552032534` (SIREN), `55203253400703` (SIRET), `FR27552032534` (VAT) or a company name. Used only in lookup mode.

## `sourceDatasetId` (type: `string`):

ID of an Apify dataset with SIREN / VAT numbers, e.g. the output of EU Company Contacts & VAT Extractor. Combined with the list above.

## `sourceDatasetField` (type: `string`):

Field holding the SIREN, SIRET or VAT number. A list such as `vatIds` also works: non-French VAT IDs are skipped.

## `includeNotFound` (type: `boolean`):

Adds a free row with the reason for each identifier that was not found or not returned.

## `includeClosed` (type: `boolean`):

By default only active companies are returned.

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

Sole traders (entrepreneurs individuels, micro-entrepreneurs) are private persons: their company name is their own name. Excluded by default for GDPR reasons.

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

Adds the officers registered in the RNE (name and role; birth dates are never returned). Only turn on if you have a lawful basis to process this data.

## `proxyConfiguration` (type: `object`):

Not needed: the registry API is public. Turn on only if the log shows many rate-limit warnings.

## Actor input object example

```json
{
  "mode": "search",
  "purpose": "prospecting",
  "nafCodes": [
    "62.01Z"
  ],
  "departments": [
    "69"
  ],
  "headOfficeInArea": true,
  "maxResults": 100,
  "sourceDatasetField": "siren",
  "includeNotFound": true,
  "includeClosed": false,
  "excludeSoleTraders": true,
  "includeDirectors": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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 = {
    "nafCodes": [
        "62.01Z"
    ],
    "departments": [
        "69"
    ],
    "maxResults": 100,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("eurodata-tools/france-company-leads").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"],
    "maxResults": 100,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("eurodata-tools/france-company-leads").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"
  ],
  "maxResults": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call eurodata-tools/france-company-leads --silent --output-dataset

```

## MCP server setup

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

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/pEgLk0wuTLMebrRwY/builds/aX1wCUwv9tO5an4Va/openapi.json
