# French Company Search API (`conserving_celerytop/french-company-search-api`) Actor

Search French companies by name, SIREN, SIRET, activity code, place, size or revenue. Returns one row per company: legal form, NAF activity, size band, head office address, revenue and net income when filed, VAT number. Official open data, no officers or sole traders.

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

## Pricing

from $2.10 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

Use this French company search API to look up French companies by name, SIREN, SIRET, activity code, place, size or revenue, for $3.00 per 1,000 companies.

Type company names or SIREN numbers, or leave the search empty and set filters such as "software companies in Paris with more than 10 employees". Each result is one company with its legal form, activity code, size band, head office address, latest filed revenue and VAT number. The data comes from the French government company search service, which is built on the SIRENE business register of INSEE and the national companies register. It is open and needs no key. You need no login and no proxy.

### Sample output

One row per company. This is a real row from a run on 4 October 2026, shortened to 21 of the 41 fields:

```json
{
  "siren": "794598813",
  "siret": "79459881300077",
  "name": "DOCTOLIB",
  "status": "active",
  "creationDate": "2013-07-15",
  "legalFormCode": "5710",
  "legalFormLabel": "SAS (simplified joint-stock company)",
  "activityCode": "62.01Z",
  "companySize": "ETI",
  "employeeBandLabel": "1,000 to 1,999 employees",
  "headOfficeAddress": "54 QUAI CHARLES PASQUA 92300 LEVALLOIS-PERRET",
  "postalCode": "92300",
  "city": "LEVALLOIS-PERRET",
  "departmentCode": "92",
  "vatNumber": "FR14794598813",
  "revenueEur": 311448000,
  "netIncomeEur": -127499000,
  "financialYear": 2024,
  "source": "recherche-entreprises.api.gouv.fr",
  "licence": "Licence Ouverte 2.0 (Etalab)",
  "resultStatus": "ok"
}
```

The full row has 41 fields. The list is further down.

### How to search French companies with this Actor

1. Click **Try for free**. No API key is needed.
2. In **Searches**, enter one company name, SIREN, SIRET or French VAT number per line. Or leave it empty and use the filters.
3. Set **Max results per search**. The default is 25.
4. Click **Start**, open the **Overview** view, and export as JSON, CSV or Excel.

Typical uses:

- Sales and market research teams build lists of companies in one activity code, department and size band.
- Finance and compliance teams check that a SIREN or VAT number belongs to an active company.
- Data teams enrich a customer or supplier list with legal form, size and revenue.
- AI agents look up a French company and get a flat record instead of a raw API response.

### What you get

| Group | Fields |
|---|---|
| Identity | siren, siret (head office), name, legalName, acronym, vatNumber |
| Status | status (active or ceased), creationDate, closureDate |
| Legal form | legalFormCode, legalFormLabel (common forms such as SAS, SARL, SA, SCI) |
| Activity | activityCode (NAF rev. 2), activityCodeNaf2025, activitySection |
| Size | companySize (PME, ETI, GE), employeeBandCode, employeeBandLabel, isEmployer, with the year of each |
| Head office | headOfficeAddress, postalCode, city, departmentCode, regionCode, latitude, longitude |
| Establishments | establishmentsTotal, establishmentsOpen |
| Finance | revenueEur, netIncomeEur, financialYear (latest year the company filed) |
| Flags | isSocialEconomy, isAssociation |
| Record | updatedAt, source, licence, query, resultStatus, fetchedAt, error |

Revenue and net income are only present for companies that publish accounts. Many small companies do not, and their finance fields are empty.

### What is left out, on purpose

This Actor returns company data only. It never asks the source for officers or directors, so no names, birth dates or nationalities of people appear in the output. Sole proprietors (legal forms starting with 1) are skipped, because their company name is the name of a person. Records that the source marks as not fully public are skipped too. The run summary tells you how many sole proprietor records were left out.

### Filters

| Filter | Example | What it does |
|---|---|---|
| Company status | active | Active, ceased or both. Default is active. |
| Activity codes | 62.01Z | NAF activity codes, one per line. |
| Departments | 75, 92, 2A | Department codes. |
| Postal codes | 75008 | 5-digit postal codes. |
| Head office only | on | Keep companies whose head office is in the place you chose. Turn it off to include companies that only have a branch there. |
| Legal forms | 5710 | 4-digit legal form codes. |
| Company size | PME, ETI, GE | INSEE size category. |
| Employee bands | 21 | INSEE employee band codes. |
| Min and max revenue | 1000000 | Latest filed revenue in euros. |

### Pricing

You pay per company returned, plus a start event of $0.00005 per GB of run memory, which is $0.0000125 at the default 256 MB.

- Free plan: $0.003 per company, which is $3.00 per 1,000.
- Bronze, Silver and Gold plans pay 10, 20 and 30 percent less per company.
- A search that is valid but matches no company returns one row with the status `no_results` and is charged as one company, because the lookup still ran.
- A search that fails because the source is down returns an `error` row and is not charged.
- Set a maximum cost per run in the run options. The Actor stops when it is reached and keeps what it saved.

Worked example: 25 software companies in Paris cost 25 x $0.003 = $0.075, plus $0.0000125 for the start. 1,000 companies cost $3.00.

### Input example

```json
{
  "activityCodes": ["62.01Z"],
  "departments": ["75"],
  "companySize": "PME",
  "maxResultsPerSearch": 100
}
```

To look up specific companies, use:

```json
{
  "searches": ["Doctolib", "652014051", "FR14652014051"],
  "maxResultsPerSearch": 5
}
```

### FAQ

#### Is it legal to use this data?

The data comes from the French government company search service. It is published under the Licence Ouverte 2.0, which allows reuse, including commercial reuse, if you name the source and the date of the last update. Every row carries `source`, `licence` and `updatedAt` for that purpose. The Actor does not request or return data about people: no officers, directors or sole proprietors. Searching by a person's name is not supported (see the FAQ). Check that your own use follows the laws and terms that apply to you.

#### Can I search by a person's name?

No. Search company names, SIREN or SIRET numbers. The source also matches the names of people listed as officers, so a person's name can return the companies they are listed in. This Actor does not support or promote that use. The rows contain company fields only, and the search text you typed is repeated in the `query` field, so do not enter personal names.

#### Is this a SIRENE API?

It reads the SIRENE data through the government company search service and returns it as one flat row per company, with filters on activity, place, size and revenue. It does not download the full SIRENE files.

#### How many companies can one search return?

The source returns at most 10,000 results for one search, 25 per request. For a bigger list, split it with filters, for example one run per department.

#### Why does a name search return other companies?

The source ranks by relevance and also matches trade names and other text. A search for a brand can return the company that owns it, under its legal name, and related entities. Use a SIREN when you need one exact company.

#### Why are some companies missing?

Companies that asked not to be listed are not in the source. Sole proprietors are skipped by this Actor. Companies closed long ago may have few fields.

#### Can I filter by creation date?

Not in this version. Every row has `creationDate`, so you can filter the exported data.

#### Why do department filters return companies from other departments?

The source applies place filters to every establishment of a company. With **Head office only** on, this Actor keeps the companies whose head office is in your department or postal code, so it may read more pages to fill your count.

#### How fast is it?

A run of 25 companies takes about 2 seconds. A run of 1,000 companies took about 23 seconds in our test. The Actor sends one request at a time and stays well under the source limit of 7 requests per second.

#### What if the source is busy?

The Actor retries with a pause. If the source keeps failing, the run stops with a clear status message and keeps the rows it already saved.

### Related Actors

- Open Company Registries returns company records from the GLEIF, Norwegian and Finnish registers.
- SEC Company Financials API returns reported figures of US public companies.

### About this Actor

I built this Actor as an independent developer. It is not affiliated with, endorsed by or approved by the French government, INSEE or DINUM. Data comes from the open French company search service under the Licence Ouverte 2.0.

# Actor input Schema

## `searches` (type: `array`):

Search company names or SIREN numbers; person-name searches are not supported. Enter one search per line: a company name or keyword (at least 3 characters), a SIREN (9 digits), a SIRET (14 digits) or a French VAT number such as FR14652014051. Leave empty to list companies by the filters below.

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

Return at most this many companies for each search. The official source never returns more than 10,000 results for one search, so narrow big lists with filters. Each company returned is one charged result.

## `companyStatus` (type: `string`):

Choose which companies to return. Active means still registered as operating.

## `activityCodes` (type: `array`):

Enter NAF activity codes (NAF rev. 2), one per line, for example 62.01Z for computer programming or 56.10A for restaurants.

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

Enter department codes, one per line, for example 75 for Paris, 69 for Rhone, 2A for Corse-du-Sud or 971 for Guadeloupe.

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

Enter 5-digit postal codes, one per line, for example 75008.

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

Keep only companies whose head office is in the departments or postal codes you entered. Turn off to also get companies that only have a branch there. Has no effect without a department or postal code.

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

Enter 4-digit legal form codes, one per line, for example 5710 for SAS, 5499 for SARL or 9220 for associations.

## `companySize` (type: `string`):

Keep only companies in this INSEE size category.

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

Enter INSEE employee band codes, one per line: 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, 52, 53 (10,000+).

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

Keep only companies whose latest filed revenue is at least this many euros. Companies that do not publish accounts are left out.

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

Keep only companies whose latest filed revenue is at most this many euros. Companies that do not publish accounts are left out.

## Actor input object example

```json
{
  "searches": [
    "Doctolib",
    "BlaBlaCar"
  ],
  "maxResultsPerSearch": 5,
  "companyStatus": "active",
  "headOfficeOnly": true,
  "companySize": "any"
}
```

# Actor output Schema

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

No description

## `stats` (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 = {
    "searches": [
        "Doctolib",
        "BlaBlaCar"
    ],
    "maxResultsPerSearch": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("conserving_celerytop/french-company-search-api").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 = {
    "searches": [
        "Doctolib",
        "BlaBlaCar",
    ],
    "maxResultsPerSearch": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("conserving_celerytop/french-company-search-api").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 '{
  "searches": [
    "Doctolib",
    "BlaBlaCar"
  ],
  "maxResultsPerSearch": 5
}' |
apify call conserving_celerytop/french-company-search-api --silent --output-dataset

```

## MCP server setup

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

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/gi0wukK4YV3wxJC11/builds/MInbyYlMTCtcZCASd/openapi.json
