# French Company Search: SIREN, SIRET & NAF Registry Data (`aeriontsai/france-companies`) Actor

Search French companies by name, SIREN/SIRET or address, filtered by postal code, department, NAF code, legal form and status. One row per legal entity: SIREN, NAF, legal form, status, head office, headcount band. Via API Recherche d'entreprises. No director data.

- **URL**: https://apify.com/aeriontsai/france-companies.md
- **Developed by:** [Aerion](https://apify.com/aeriontsai) (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

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

Look up French companies in bulk by name, SIREN/SIRET number or address words, and filter by postal code, department, NAF activity code, legal form and active status. Each dataset row is one legal entity with SIREN, name, NAF code, legal form, status, head office address, employee headcount band, company category and establishment counts, from the public API Recherche d'entreprises (Sirene data). Company data only: no director names, no sole traders.

### What does France Companies do?

It searches the French public company search service (API Recherche d'entreprises) by company
name, SIREN/SIRET or address words, optionally filtered by postal code, department, NAF activity code, legal form
code and active status. One dataset row per company (legal entity): SIREN, name, NAF code, legal form, status,
head office address, employee headcount band, company category, establishment counts and the source update dates.

What is NOT included, by design:

- No director or officer data (names, birth dates). The Actor does not request it and never outputs it.
- No sole traders (entreprises individuelles, which are natural persons) - they are skipped and not charged.
- No records with restricted diffusion (Sirene "partially diffusible" status) - skipped and not charged.
- No associations by default (legal form codes starting with 92), because small associations are often registered at a private address. Turn on **Include associations** (`includeAssociations`) to get them; skipped associations are not charged.
- No street address for very small companies that look named after a person: when a company has 0-2 employees (or none reported) and its name contains a common French given name (for example a single-person company named after its founder), `headOfficeAddress` is `null` and `headOfficeAddressWithheld` is `true`, because the registered office is often the founder's home. Postal code, city and département are still given. The rule uses a list of common given names from Insee; a name made only of a surname is not detected, and some companies named after a saint's name or a place may be withheld too.
- No financial figures (turnover, net income) and no VAT number in this version.

### How much does it cost?

This Actor uses **pay-per-event** pricing: you pay a small fee per run start and per company record saved to the dataset (event `company-record`).
Skipped records (sole traders, restricted records, associations unless included) are never charged.
Set **Maximum results** (`maxItems`) or a run spending limit to cap your cost; the Actor stops cleanly and keeps the results collected so far.

| Event | When | Price (USD) |
|---|---|---|
| `company-record` | one company record saved to the dataset | 0.002 |
| Actor start | charged by the platform when a run starts | 0.00005 |

### Input

| Field | Type | Description |
|---|---|---|
| `query` | string | Company name, SIREN or SIRET, or address words (at least 3 characters unless a filter is set). |
| `postalCode` | string | French postal code (5 digits). |
| `departement` | string | French department code, for example 75, 2A, 971. |
| `nafCode` | string | NAF rev. 2 activity code(s), for example 62.01Z (comma-separated). |
| `legalFormCode` | string | INSEE legal category code(s), for example 5710 (comma-separated). Codes 1xxx are refused. |
| `activeOnly` | boolean | Skip ceased companies (default false). |
| `includeAssociations` | boolean | Also return associations, legal form codes 92xx (default false). |
| `maxItems` | integer | Stop after this many records (default 50). |

### Output

Each result is one company record. Example (from the offline fixture run):

```json
{
  "siren": "306138900",
  "name": "DECATHLON",
  "legalName": "DECATHLON",
  "acronym": null,
  "nafCode": "68.20B",
  "nafCode2025": "68.20H",
  "activitySection": "L",
  "legalFormCode": "5800",
  "legalForm": "Société européenne (SE)",
  "status": "active",
  "creationDate": "1977-01-01",
  "closureDate": null,
  "companyCategory": "GE",
  "headcountBandCode": "52",
  "headcountBand": "5000-9999",
  "headcountYear": "2024",
  "establishmentsCount": 385,
  "openEstablishmentsCount": 46,
  "headOfficeSiret": "30613890001294",
  "headOfficeAddress": "4 BOULEVARD DE MONS 59650 VILLENEUVE-D'ASCQ",
  "headOfficeAddressWithheld": false,
  "headOfficePostalCode": "59650",
  "headOfficeCity": "VILLENEUVE-D'ASCQ",
  "headOfficeCountry": "FRANCE",
  "headOfficeDepartement": "59",
  "dateUpdated": "2026-10-08T09:15:17",
  "dateUpdatedInsee": "2026-09-25T10:03:34",
  "dateUpdatedRne": "2026-09-22T11:03:49",
  "source": "API Recherche d'entreprises (DINUM; data Insee Sirene and INPI RNE)",
  "license": "Licence Ouverte / Open Licence 2.0",
  "attribution": "Insee (Sirene) and INPI (RNE) via API Recherche d'entreprises (DINUM), Licence Ouverte / Open Licence 2.0; update date in dateUpdated fields; no endorsement.",
  "scrapedAt": "2026-10-09T15:52:48.178Z"
}
```

Every run also writes a `RUN_SUMMARY` record (counts, success rate, why the run stopped) and an `errors` dataset with one row per problem (no personal data, no stack traces).

### Data source and license

Source: Insee (Sirene directory) and INPI (Registre national des entreprises), via the API Recherche d'entreprises operated by DINUM. Reused under the Licence Ouverte / Open Licence 2.0 (Etalab). Date of most recent update: given for every record in the fields date_mise_a_jour, date_mise_a_jour_insee and date_mise_a_jour_rne (output as dateUpdated, dateUpdatedInsee and dateUpdatedRne). This Actor is not affiliated with, or endorsed by, Insee, INPI, DINUM or any French public authority. Director details and sole-trader records are not included.

The data is reformatted; some fields are withheld as described above (the street address of very small companies whose name looks like a person's name). It is as current as the source's last update shown on each record.
This Actor makes at most about 1 request per second (the source allows 7 per second).

### Limitations

- Results follow the source's search ranking; at most 25 records per source page; this Actor does not page beyond 10,000 results per search.
- Companies that refused public diffusion are not available from the source at all; partially diffusible records are skipped.
- Legal form labels are given for common codes only (others: code only).
- Company names are the registered names; some legal entities carry a founder's name in their registered name.
- The source's text search also matches the names of company directors. Searching for a person's name can therefore return the companies that person directs. Only company fields are output; no data about the person (name, birth date or role) is included.
- Headcount is a band (for example 10-19 employees), not an exact number, and refers to the year in `headcountYear`.

### Support

Found a problem or need a field? Open an issue in the **Issues** tab of this Actor. We aim to respond within 48 hours.

***

This Actor was developed with AI assistance and is covered by automated tests.

# Actor input Schema

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

Company name, SIREN or SIRET, or words of the address (at least 3 characters unless you set a filter below).

## `postalCode` (type: `string`):

Only companies with an establishment in this French postal code (5 digits).

## `departement` (type: `string`):

Only companies with an establishment in this French department (for example 75, 2A, 971).

## `nafCode` (type: `string`):

NAF rev. 2 activity code of the company, for example 62.01Z. Several codes can be separated by commas.

## `legalFormCode` (type: `string`):

INSEE legal category code (4 digits), for example 5710 for SAS. Several codes can be separated by commas. Codes starting with 1 (sole traders) are not available.

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

Skip companies that have ceased trading.

## `includeAssociations` (type: `boolean`):

Also return associations (legal form codes starting with 92). Off by default: small associations are often registered at a private address.

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

Stop after this many company records. You are charged per record, so this also caps your cost.

## Actor input object example

```json
{
  "query": "decathlon",
  "activeOnly": false,
  "includeAssociations": false,
  "maxItems": 50
}
```

# Actor output Schema

## `results` (type: `string`):

Company records (one per charged company-record event). No directors, no sole traders.

## `runSummary` (type: `string`):

JSON summary: counts, success rate, stop reason, billing summary, error counts.

## `errors` (type: `string`):

One record per error (taxonomy code, message, stage, URL). No stack traces.

# 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 = {
    "query": "decathlon",
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("aeriontsai/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 = {
    "query": "decathlon",
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("aeriontsai/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 '{
  "query": "decathlon",
  "maxItems": 50
}' |
apify call aeriontsai/france-companies --silent --output-dataset

```

## MCP server setup

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