# France Company Search: SIREN, NAF & Revenue (No API Key) (`bircolabots/france-companies`) Actor

Search French companies in the official register by NAF code, department, size, revenue and labels like RGE or Qualiopi, or look up SIREN / SIRET numbers. Revenue, VAT number, address. No API key, no personal data.

- **URL**: https://apify.com/bircolabots/france-companies.md
- **Developed by:** [Cicero Millen](https://apify.com/bircolabots) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

## France Company Search: SIREN, NAF & Revenue (No API Key)

Search the **official French company register** (Sirene / RNE, as published by the French government's
Annuaire des Entreprises) and get the results as a clean table you can download as Excel, CSV or JSON or send to your
own tools.

- 🔑 **No API key, no account:** reads the official public API of the French government directly.
- 🎯 **Lead filters that matter:** activity code (NAF / APE), department, region, postal code, company size,
  number of employees, legal form, and **revenue and net income ranges**.
- 🏅 **Certified companies:** filter by labels such as **RGE** (energy-efficiency contractors), **Qualiopi** (training
  providers), organic, ESS, société à mission.
- 💶 **Financials included:** latest revenue (chiffre d'affaires) and net income, plus the yearly history when
  published.
- 🧾 **Ready to use:** VAT number, head office address with GPS coordinates, and human-readable labels for every code.
- 📋 **Bulk lookup:** paste up to 5,000 SIREN or SIRET numbers.
- 🔒 **No personal data:** company officers (dirigeants) and sole proprietors are never returned.
- 💸 **Pay only for results:** you pay per company saved, and you can cap the cost of every run.

### How it works

1. Pick **filters**: NAF codes, departments, size, revenue, labels... Or switch to **Lookup** and paste SIREN / SIRET
   numbers.
2. Click **Start**. Companies appear in the **Output** tab as a table, ready to export or to send to Google Sheets,
   Make, Zapier, n8n or your own API.

Location filters (department, region, postal code) match **any establishment** of the company, as in the official
register. The `matched...` fields show the establishment that matched, and the `address` fields show the head office.

### What data you get

One row per company:

| Field | What it contains |
|---|---|
| `siren`, `siret` | Company number and head office establishment number |
| `companyName`, `fullName`, `acronym` | Legal name, full name, acronym (sigle) |
| `nafCode`, `nafLabel`, `nafSection`, `nafSectionLabel` | Main activity (NAF / APE code) and its label |
| `legalFormCode`, `legalForm` | INSEE legal form code and label (SAS, SARL, SA...) |
| `companySize` | INSEE category: `PME`, `ETI` or `GE` |
| `employeeRange`, `employeeRangeLabel`, `employeeRangeYear` | Number of employees (INSEE range) and its year |
| `creationDate`, `closingDate`, `status` | Dates and `active` / `closed` |
| `establishments`, `openEstablishments` | Number of establishments, total and open |
| `vatNumber` | Intra-community VAT number |
| `address`, `postalCode`, `city`, `department`, `region`, `latitude`, `longitude` | Head office |
| `matchedSiret`, `matchedAddress`, `matchedPostalCode`, `matchedCity`, `matchedIsHeadOffice` | Establishment that matched your location filters |
| `revenue`, `netIncome`, `financesYear`, `finances` | Latest published revenue and net income, and every published year |
| `isRge`, `isQualiopi`, `isBio`, `isEss`, `isMissionCompany`, `isTrainingOrganisation`, `isAssociation`, `isSiae`, `isLivingHeritage` | Labels and certifications |
| `url` | Link to the company page on annuaire-entreprises.data.gouv.fr |

### Use cases

- **B2B lead generation:** every electrician, IT services company or restaurant in a department, with revenue.
- **Energy renovation:** list RGE-certified contractors by department for partnerships or subcontracting.
- **Training market:** Qualiopi-certified training providers by region.
- **Sales targeting:** companies above €1M revenue and profitable, in your sector and area.
- **KYC and supplier checks:** status, VAT number and legal form for a list of SIREN numbers.
- **Market research:** count companies by activity, size and region.

### Input examples

**Electricians in the Rhône department**

```json
{
    "nafCodes": ["43.21A"],
    "departments": ["69"],
    "maxItems": 1000
}
```

**Profitable software companies in Paris with more than €1M revenue**

```json
{
    "nafCodes": ["62.01Z", "62.02A"],
    "departments": ["75"],
    "revenueMin": 1000000,
    "netIncomeMin": 0,
    "maxItems": 500
}
```

**RGE-certified contractors in Brittany**

```json
{
    "regions": ["53"],
    "labels": ["rge"],
    "maxItems": 2000
}
```

**Mid-sized and large companies in construction (section F)**

```json
{
    "nafSections": ["F"],
    "companySize": ["ETI", "GE"],
    "maxItems": 1000
}
```

**Bulk lookup of SIREN / SIRET numbers**

```json
{
    "mode": "lookup",
    "sirenNumbers": ["356000000", "552032534", "47845579305205"]
}
```

#### All input fields

| Field | Description | Default |
|---|---|---|
| `mode` | `search` (filters) or `lookup` (SIREN / SIRET numbers) | `search` |
| `nafCodes` | NAF / APE codes, e.g. `62.01Z`, `43.21A`, `56.10A` | all |
| `departments` | Department codes, e.g. `75`, `69`, `2A`, `971` | all |
| `postalCodes` | 5-digit postal codes | all |
| `regions` | Region codes, e.g. `11` (Île-de-France), `84` (Auvergne-Rhône-Alpes) | all |
| `query` | Text in the company name or address | empty |
| `nafSections` | Activity sections `A` to `U` | all |
| `companySize` | `PME`, `ETI`, `GE` | all |
| `employeeRanges` | INSEE ranges, e.g. `11` (10–19 employees), `21` (50–99) | all |
| `legalForms` | 4-digit INSEE codes, e.g. `5710` (SAS), `5499` (SARL) | all |
| `status` | `active`, `closed` or `any` | `active` |
| `revenueMin`, `revenueMax` | Revenue range in EUR | no filter |
| `netIncomeMin`, `netIncomeMax` | Net income range in EUR | no filter |
| `labels` | `rge`, `qualiopi`, `bio`, `ess`, `missionCompany`, `trainingOrganisation`, `association`, `siae`, `livingHeritage` | none |
| `sirenNumbers` | Up to 5,000 SIREN (9 digits) or SIRET (14 digits) for Lookup mode | empty |
| `maxItems` | Maximum number of companies to save (1–10,000) | 100 |

### Output example

```json
{
    "siren": "356000000",
    "siret": "35600000000048",
    "companyName": "LA POSTE",
    "acronym": null,
    "nafCode": "53.10Z",
    "nafLabel": "Activités de poste dans le cadre d'une obligation de service universel",
    "nafSection": "H",
    "nafSectionLabel": "Transports et entreposage",
    "legalFormCode": "5510",
    "legalForm": "SA nationale à conseil d'administration",
    "companySize": "GE",
    "employeeRange": "53",
    "employeeRangeLabel": "10 000 salariés et plus",
    "employeeRangeYear": "2024",
    "creationDate": "1991-01-01",
    "status": "active",
    "establishments": 13131,
    "openEstablishments": 8862,
    "vatNumber": "FR39356000000",
    "address": "DIRECTION GENERALE DE LA POSTE 9 RUE DU COLONEL PIERRE AVIA 75015 PARIS",
    "postalCode": "75015",
    "city": "PARIS",
    "departmentCode": "75",
    "department": "Paris",
    "regionCode": "11",
    "region": "Île-de-France",
    "latitude": 48.831515159,
    "longitude": 2.2780898787,
    "revenue": 26700000000,
    "netIncome": 1474000000,
    "financesYear": "2025",
    "finances": {"2025": {"revenue": 26700000000, "netIncome": 1474000000}},
    "isRge": false,
    "isQualiopi": true,
    "isTrainingOrganisation": true,
    "url": "https://annuaire-entreprises.data.gouv.fr/entreprise/356000000",
    "scrapedAt": "2026-10-09T12:00:00+00:00"
}
```

(Some fields are left out above for brevity; every row has all the fields listed in "What data you get".)

### Pricing and cost

Pay per event, you only pay for what you get:

| Event | Price |
|---|---|
| Company saved to the dataset | **$0.002** per company ($2.00 per 1,000 companies) |
| Run start | $0.00005 per run |

Examples: **100 companies ≈ $0.20**, **1,000 companies ≈ $2.00**. Numbers that are not found are **not charged**.
Set **Maximum cost per run** in the run options to cap your spending; the Actor stops when the cap is reached and keeps
the companies already saved.

### Schedule it and connect it

- **Regular lists:** save your filters as a task and add a **Schedule** in Apify Console. Remove duplicates between
  runs with the `siren` field.
- **Integrations:** send results automatically to Google Sheets, Slack, Make, Zapier, n8n or any webhook using Apify
  integrations.
- **API:** run the Actor and download results from your own code with the Apify API or the Python / JavaScript clients.

### Limits

- The register returns at most **10,000 companies per search**. For more, split by department, NAF code or size.
- The public API allows a few requests per second; the Actor stays below it and waits when asked. About 1,500
  companies per minute.
- Revenue and net income exist only for companies that publish their accounts.
- There is no filter by creation date in the official API; the `creationDate` field is in every row, so you can sort
  or filter the results.
- Companies whose data INSEE does not publish ("non-diffusible") are not available in the public API.

### FAQ

**Where does the data come from?**
From the API Recherche d'entreprises of the French government (DINUM, data.gouv.fr), which publishes Sirene (INSEE),
the national business register (RNE, INPI) and other public datasets under the Licence Ouverte / Etalab 2.0. Code
labels come from the same official project (MIT licence). This Actor is an independent tool and is **not affiliated
with, endorsed or provided by the French government**.

**Does it collect personal data?**
No. Company officers (dirigeants) are never returned, and sole proprietors (entrepreneurs individuels), whose company
name is a person's name, are excluded on purpose. The output is a fixed list of company fields.

**Do I need an API key?**
No. The API is public and free.

**Why did I get fewer companies than `maxItems`?**
Your search has fewer results than that. Try fewer filters, more NAF codes or a larger area.

**Why is the head office in another department?**
Location filters match any establishment of the company. Use the `matchedCity` and `matchedPostalCode` fields for the
local establishment.

### Support

Found a bug or need a field or filter? Open an issue in the **Issues** tab. I read all of them.

# Actor input Schema

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

Search the French company register with filters, or fetch specific companies by SIREN or SIRET.

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

NAF codes of the main activity, e.g. 62.01Z (software development), 43.21A (electrical installation), 56.10A (restaurants), 70.22Z (consulting).

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

Department codes of the company's establishments, e.g. 75 (Paris), 69 (Rhône), 13 (Bouches-du-Rhône), 2A (Corse-du-Sud), 971 (Guadeloupe).

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

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

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

Regions of the company's establishments.

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

Free text searched in the company name and address, e.g. "boulangerie" or "rue de Rivoli".

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

Broad activity sections, e.g. F (construction) or J (information and communication).

## `companySize` (type: `array`):

INSEE company category.

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

INSEE employee ranges.

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

4-digit INSEE legal form codes, e.g. 5710 (SAS), 5499 (SARL), 5720 (SASU), 5599 (SA). Sole proprietors are never returned.

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

Active (default), closed (ceased) or any status.

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

Minimum revenue (chiffre d'affaires) of the last published year.

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

Maximum revenue of the last published year.

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

Minimum net income (résultat net). Use 0 for profitable companies only.

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

Maximum net income.

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

Only companies with all the selected labels.

## `sirenNumbers` (type: `array`):

Used in Lookup mode. Up to 5,000 SIREN (9 digits) or SIRET (14 digits) numbers.

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

Stop after this many companies (the register returns at most 10,000 per search). You pay only for companies saved.

## Actor input object example

```json
{
  "mode": "search",
  "nafCodes": [
    "43.21A"
  ],
  "departments": [
    "69"
  ],
  "status": "active",
  "maxItems": 100
}
```

# Actor output Schema

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

No description

## `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": [
        "43.21A"
    ],
    "departments": [
        "69"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("bircolabots/france-companies").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": ["43.21A"],
    "departments": ["69"],
}

# Run the Actor and wait for it to finish
run = client.actor("bircolabots/france-companies").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": [
    "43.21A"
  ],
  "departments": [
    "69"
  ]
}' |
apify call bircolabots/france-companies --silent --output-dataset

```

## MCP server setup

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

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/NWvEfRmB9bdIoXcmM/builds/KmhZ26XyRwbCyB2EA/openapi.json
