# French Company Register (`avorelis/french-company-register`) Actor

Search French companies by NAF code, location, size and labels, or look up SIREN numbers, via the official open API. Legal persons only, no directors.

- **URL**: https://apify.com/avorelis/french-company-register.md
- **Developed by:** [Patrick Karban](https://apify.com/avorelis) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 company delivereds

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

### What does French Company Register do?

**French Company Register** searches the official French company directory (SIRENE, Annuaire des Entreprises) and returns clean, structured company data: SIREN and SIRET, name, legal form, NAF/APE activity code, size category, employee range, head office address, revenue and net income, VAT number and labels such as RGE or Qualiopi. You can search by industry, location, size, revenue and labels, or look up a list of SIREN numbers you already have.

The data comes from the official **API Recherche d'entreprises** of the French state, no scraping of web pages. It is published under the Licence Ouverte 2.0. The Actor returns **legal persons only**: no directors or elected officials, no sole traders, no personal names.

Typical uses:

- **Enrich your customer or supplier list** with official data from a list of SIREN numbers
- **Company verification (KYB)**: check legal form, status, creation date and VAT number before onboarding
- **Market sizing** by activity code, region and company size
- **Find certified suppliers**, e.g. RGE-certified builders or Qualiopi training providers in a département
- **Automations and AI agents** that need reliable French company data

### How to use French Company Register

1. Either paste **Company numbers to look up** (SIREN or SIRET), or choose search filters such as NAF codes, départements and company size.
2. Keep **Only active companies** enabled to skip ceased companies, and add revenue or label filters if you need them.
3. Set **Maximum results** to cap the number of companies and the cost, click **Start**, then export as JSON, CSV or Excel, or schedule the run.

### Input

| Field | Required | Example | Description |
|---|---|---|---|
| `companyNumbers` | no | `["380474494"]` | SIREN (9 digits) or SIRET (14 digits) to look up, up to 1,000. Filters are ignored when set |
| `query` | no | `boulangerie` | Free text searched in name and address |
| `nafCodes` | no | `["62.01Z"]` | NAF/APE activity codes, combined with OR |
| `sections` | no | `["F"]` | NAF sections A to U, e.g. `F` = construction |
| `regions` | no | `["11"]` | Region codes, e.g. `11` = Île-de-France |
| `departements` | no | `["75", "92"]` | Département codes, e.g. `75` = Paris, `2A` = Corse-du-Sud |
| `postalCodes` | no | `["75011"]` | 5-digit postal codes |
| `companyCategories` | no | `["PME"]` | `PME` small and medium, `ETI` mid-sized, `GE` large |
| `employeeRanges` | no | `["11", "12"]` | INSEE employee ranges, e.g. `11` = 10-19 employees |
| `labels` | no | `["rge"]` | Only companies with all selected labels |
| `minRevenue` | no | `1000000` | Minimum revenue in EUR, latest published accounts |
| `maxRevenue` | no | `10000000` | Maximum revenue in EUR, latest published accounts |
| `activeOnly` | no | `true` | Only active companies (default `true`) |
| `maxItems` | no | `100` | Maximum number of companies, caps the cost |

Location filters (`regions`, `departements`, `postalCodes`) match companies with **at least one establishment** in the area. The head office can be elsewhere, so the matching establishment is returned too.

Example input for IT companies with an establishment in Lyon:

```json
{
    "nafCodes": ["62.01Z"],
    "departements": ["69"],
    "maxItems": 200
}
```

### Output example

A real record from a test run. The head office is in Strasbourg, the matching establishment is near Lyon:

```json
{
    "siren": "380474494",
    "headOfficeSiret": "38047449400016",
    "name": "EURO INFORMATION DEVELOPPEMENTS (EID)",
    "legalName": "EURO INFORMATION DEVELOPPEMENTS",
    "acronym": "EID",
    "legalFormCode": "5710",
    "legalForm": "SAS, société par actions simplifiée",
    "nafCode": "62.01Z",
    "nafLabel": "Programmation informatique",
    "nafSection": "J",
    "nafSectionLabel": "Information et communication",
    "companyCategory": "GE",
    "employeeRangeCode": "51",
    "employeeRange": "2,000-4,999 employees",
    "employeeRangeYear": 2024,
    "headOfficeEmployer": true,
    "status": "active",
    "creationDate": "1991-01-01",
    "closureDate": null,
    "establishments": 61,
    "openEstablishments": 33,
    "address": "4 RUE FREDERIC-GUILLAUME RAIFFEISEN, 67000 STRASBOURG",
    "postalCode": "67000",
    "city": "STRASBOURG",
    "departement": "67",
    "departementName": "Bas-Rhin",
    "region": "44",
    "regionName": "Grand Est",
    "latitude": 48.600490458,
    "longitude": 7.7573257675,
    "matchingEstablishmentSiret": "38047449400115",
    "matchingEstablishmentAddress": "63 CHEMIN ANTOINE PARDON 69160 TASSIN-LA-DEMI-LUNE",
    "matchingEstablishmentPostalCode": "69160",
    "matchingEstablishmentCity": "TASSIN-LA-DEMI-LUNE",
    "vatNumber": "FR50380474494",
    "revenue": 558064199,
    "netIncome": 9730844,
    "financialYear": 2024,
    "labels": [],
    "registerUrl": "https://annuaire-entreprises.data.gouv.fr/entreprise/380474494",
    "source": "Annuaire des Entreprises (INSEE Sirene, RNE) via API Recherche d'entreprises, Licence Ouverte 2.0"
}
```

#### Output fields

| Field | Description |
|---|---|
| `siren` | 9-digit French company number |
| `headOfficeSiret` | 14-digit SIRET of the head office |
| `name` | Full name, including acronym |
| `legalName` | Registered legal name |
| `acronym` | Acronym, when registered |
| `legalFormCode` | INSEE legal category code, e.g. `5710` |
| `legalForm` | Legal category in French, e.g. SAS |
| `nafCode` | Main activity code NAF/APE |
| `nafLabel` | Main activity in French |
| `nafSection` | NAF section letter |
| `nafSectionLabel` | NAF section in French |
| `companyCategory` | `PME`, `ETI` or `GE`, empty for small or new companies |
| `employeeRangeCode` | INSEE employee range code |
| `employeeRange` | Employee range in English |
| `employeeRangeYear` | Reference year of the employee range |
| `headOfficeEmployer` | Head office employed staff in the reference year |
| `status` | `active` or `ceased` |
| `creationDate` | Date of creation |
| `closureDate` | Date of closure, empty for active companies |
| `establishments` | Number of establishments, including closed ones |
| `openEstablishments` | Number of open establishments |
| `address` | Head office address, supplements naming a private person removed |
| `postalCode` | Head office postal code |
| `city` | Head office city |
| `departement` | Head office département code |
| `departementName` | Département name |
| `region` | Head office region code |
| `regionName` | Region name |
| `latitude` | Head office latitude |
| `longitude` | Head office longitude |
| `matchingEstablishmentSiret` | With a location filter: SIRET of an establishment in the area |
| `matchingEstablishmentAddress` | Address of that establishment |
| `matchingEstablishmentPostalCode` | Postal code of that establishment |
| `matchingEstablishmentCity` | City of that establishment |
| `vatNumber` | Intra-community VAT number |
| `revenue` | Revenue in EUR, latest published year, about 70 % of companies |
| `netIncome` | Net income in EUR, latest published year |
| `financialYear` | Year of the financial figures |
| `labels` | Labels and certifications, e.g. `rge`, `qualiopi`, `ess` |
| `registerUrl` | Company page in the official Annuaire des Entreprises |
| `source` | Source and licence attribution |

### How much does it cost?

You pay per delivered company. The price per 1,000 companies is shown on the **Pricing** tab. Platform usage is included. Runs that find nothing cost nothing for results, and **Maximum results** plus your own spending limit always cap the cost.

### FAQ

#### Where does the data come from, and may I reuse it?

From the official API Recherche d'entreprises of the French state, which powers the Annuaire des Entreprises and is based on INSEE SIRENE and the national company register. The data is published under the Licence Ouverte 2.0, which allows commercial reuse with attribution. Keep the `source` field when you republish the data.

#### Why are there no directors, sole traders or personal names?

By design. The Actor returns legal persons only. Directors and elected officials are never requested, sole traders and groups of private persons are excluded, and address supplements that may name a private person are removed. Companies that are not fully public in SIRENE are skipped.

#### Why do I get at most 10,000 companies?

The official API returns at most 10,000 companies per search. Narrow your filters, for example by département or employee range, and run several searches to cover more.

#### Why is the head office outside my area?

Location filters match companies with at least one establishment in the area. The fields starting with `matchingEstablishment` show that establishment.

#### Why is revenue empty for some companies?

Only companies that publish their accounts have revenue and net income in the register.

#### Can I use it through the API or with AI agents?

Yes. Every input field is documented for API and MCP use. Call the Actor with a JSON input like `{"companyNumbers": ["380474494"]}` or `{"nafCodes": ["62.01Z"], "departements": ["75"]}`.

#### Do you have data for other countries?

Yes, public tenders: [German Public Tenders](https://apify.com/avorelis/german-public-tenders) for Germany and the EU, [UK Public Tenders](https://apify.com/avorelis/uk-public-tenders) for the United Kingdom.

#### I found a problem or need another field

Please open an issue on the **Issues** tab. Issues are answered in writing.

# Actor input Schema

## `companyNumbers` (type: `array`):

Look up these companies directly, e.g. to enrich a customer or supplier list. 9-digit SIREN or 14-digit SIRET, up to 1,000 per run. When filled, the search filters below are ignored.

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

Free text searched in company name and address, e.g. "boulangerie" or "rue de Rivoli". Leave empty to search by filters only.

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

INSEE activity codes in the format "62.01Z" (computer programming) or "6201Z". Several codes are combined with OR. See the INSEE NAF list for all codes.

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

Broad NAF sections, e.g. F = construction, J = information and communication, M = professional and scientific services.

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

French regions where the company has at least one establishment. The matching establishment is returned next to the head office.

## `departements` (type: `array`):

Département codes where the company has at least one establishment, e.g. "75" (Paris), "69" (Rhône), "2A" (Corse-du-Sud), "971" (Guadeloupe).

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

5-digit postal codes where the company has at least one establishment, e.g. "75011".

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

INSEE size category: PME = small and medium enterprises, ETI = mid-caps, GE = large enterprises.

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

Number of employees as published by INSEE. Several ranges are combined with OR.

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

Only companies with all selected labels: RGE (energy renovation), organic (Agence Bio), Qualiopi (training quality), social economy (ESS), mission company, training provider, association, work integration, living heritage (EPV).

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

Only companies with at least this revenue in the latest published accounts. Companies without published accounts are excluded when set.

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

Only companies with at most this revenue in the latest published accounts. Companies without published accounts are excluded when set.

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

Return only companies that are still active. Switch off to include ceased companies. Has no effect on direct lookups.

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

Stop after this many companies. Each delivered company is charged once, so this also caps the cost. The source returns at most 10,000 per search.

## Actor input object example

```json
{
  "companyNumbers": [
    "380474494"
  ],
  "query": "boulangerie",
  "nafCodes": [
    "62.01Z",
    "62.02A"
  ],
  "sections": [
    "F"
  ],
  "regions": [
    "11"
  ],
  "departements": [
    "75",
    "92"
  ],
  "postalCodes": [
    "75011"
  ],
  "companyCategories": [
    "PME"
  ],
  "employeeRanges": [
    "11",
    "12"
  ],
  "labels": [
    "rge"
  ],
  "minRevenue": 1000000,
  "maxRevenue": 10000000,
  "activeOnly": true,
  "maxItems": 100
}
```

# 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"
    ],
    "departements": [
        "75"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("avorelis/french-company-register").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"],
    "departements": ["75"],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("avorelis/french-company-register").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"
  ],
  "departements": [
    "75"
  ],
  "maxItems": 100
}' |
apify call avorelis/french-company-register --silent --output-dataset

```

## MCP server setup

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

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/fyBzh2MuXm46x2rxn/builds/7ooHBYSemCL35wdPE/openapi.json
