# SIRENE API: French Company Data by SIREN (Unofficial) (`graylabs/fr-companies`) Actor

Search and filter French companies from INSEE SIRENE data: SIREN, NAF/APE activity code, legal form, size band, department, creation date and published turnover and net income where available. Open data, no API key. Company data only, no personal fields. Not affiliated with INSEE.

- **URL**: https://apify.com/graylabs/fr-companies.md
- **Developed by:** [Gray Labs](https://apify.com/graylabs) (community)
- **Categories:** Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

## SIRENE API: French Company Data by SIREN (Unofficial)

### What does it do?

It returns **French companies** as clean rows you can download as JSON, CSV or Excel or read through the Apify API. The data comes from INSEE's SIRENE register, with turnover and net income published from INPI/BCE filings, through the French government's keyless **API Recherche d'entreprises** (recherche-entreprises.api.gouv.fr, run by DINUM). You need no account or API key.

Search by **activity code (NAF/APE), department, postcode, legal form, size category, employee band, turnover range or name**, or look up companies by **SIREN**. Each row is one company (legal unit, SIREN) with its head office.

**Company data only.** Directors, elected officials and other people are never output. Sole traders (entrepreneurs individuels) and other natural persons are withheld, and companies under INSEE's partial-diffusion status are excluded entirely.

### What data can you extract?

| Field                                                                                                                                                                                               | Meaning                                                                                                  |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
| `siren`, `name`, `acronym`                                                                                                                                                                          | SIREN number, registered name (dénomination) and acronym (sigle)                                         |
| `legalCategoryCode`                                                                                                                                                                                 | INSEE catégorie juridique, e.g. 5710 = SAS, 5499 = SARL, 5599 = SA                                       |
| `activityCode`, `activityCodeNaf2025`, `activitySection`                                                                                                                                            | Main activity (NAF rév. 2 / APE), the NAF 2025 code and the section letter                               |
| `companyCategory`, `companyCategoryYear`                                                                                                                                                            | PME, ETI or GE, and its reference year                                                                   |
| `employeeBand`, `employeeBandYear`, `headOfficeIsEmployer`                                                                                                                                          | INSEE employee band code (e.g. 11 = 10-19 employees) and year                                            |
| `status`, `creationDate`, `closureDate`                                                                                                                                                             | Active or ceased, creation and closure dates                                                             |
| `establishments`, `openEstablishments`                                                                                                                                                              | Number of establishments (SIRET), all and open                                                           |
| `headOfficeSiret`, `headOfficeStreet`, `headOfficePostcode`, `headOfficeCommuneCode`, `headOfficeCommune`, `headOfficeDepartment`, `headOfficeRegion`, `headOfficeCountry`, `latitude`, `longitude` | Head-office SIRET and address                                                                            |
| `headOfficeActivityCode`                                                                                                                                                                            | Activity code of the head office                                                                         |
| `vatNumbers`                                                                                                                                                                                        | Intra-community VAT number                                                                               |
| `collectiveAgreements`                                                                                                                                                                              | IDCC codes of collective agreements                                                                      |
| `labels`                                                                                                                                                                                            | ESS, société à mission, RGE, organic, Qualiopi, training body, association, Egapro published             |
| `financials`                                                                                                                                                                                        | Published turnover (`revenue`) and `netIncome` by year, in euros, newest first                           |
| `nameResemblesIndividual`                                                                                                                                                                           | True when the company name looks like a person's name (street address and coordinates are then left out) |
| `sourceUpdatedAt`, `inseeUpdatedAt`, `annuaireUrl`                                                                                                                                                  | Freshness, and the company's page on annuaire-entreprises.data.gouv.fr                                   |
| `source`, `attribution`, `notice`, `retrievedAt`                                                                                                                                                    | Source, licence and update date, a non-affiliation line, fetch time                                      |

### How to use it

1. Click **Try for free** and keep the prefilled input (software companies, code 62.01Z, in the Rhône department, 20 rows), or set your own filters.
2. Run it. Rows appear in the **Output** tab.
3. Give at least one criterion: SIRENs, a name, activity codes, departments, postcodes, legal categories, size categories, employee bands or a turnover range.

### Input examples

Software and IT consulting SMEs in the Rhône department:

```json
{
    "activityCodes": ["62.01Z", "62.02A"],
    "departments": ["69"],
    "companyCategories": ["PME"],
    "maxResults": 500
}
```

Traditional restaurants created in Paris since January 2026, commune-level address only:

```json
{
    "activityCodes": ["56.10A"],
    "departments": ["75"],
    "createdFrom": "2026-01-01",
    "addressDetail": "commune",
    "maxResults": 1000
}
```

Look up companies by SIREN:

```json
{
    "sirens": ["552081317", "356000000"],
    "includeFinancials": true
}
```

### Output example

```json
{
    "siren": "552081317",
    "name": "ELECTRICITE DE FRANCE",
    "acronym": "EDF",
    "nameResemblesIndividual": false,
    "legalCategoryCode": "5599",
    "activityCode": "35.11Z",
    "activityCodeNaf2025": "35.11Y",
    "activitySection": "D",
    "companyCategory": "GE",
    "companyCategoryYear": "2024",
    "employeeBand": "53",
    "employeeBandYear": "2024",
    "headOfficeIsEmployer": true,
    "status": "active",
    "creationDate": "1955-01-01",
    "closureDate": null,
    "establishments": 9159,
    "openEstablishments": 3549,
    "headOfficeSiret": "55208131766522",
    "headOfficeStreet": "22 AVENUE DE WAGRAM",
    "headOfficePostcode": "75008",
    "headOfficeCommuneCode": "75108",
    "headOfficeCommune": "PARIS",
    "headOfficeDepartment": "75",
    "headOfficeRegion": "11",
    "headOfficeCountry": null,
    "latitude": 48.8762129844649,
    "longitude": 2.29807482400296,
    "headOfficeActivityCode": "35.11Z",
    "vatNumbers": ["FR03552081317"],
    "collectiveAgreements": ["9999", "5001"],
    "labels": {
        "socialEconomy": false,
        "missionCompany": false,
        "rge": true,
        "organicCertified": false,
        "qualiopi": true,
        "trainingBody": true,
        "association": false,
        "egaproPublished": true
    },
    "financials": [
        {
            "year": "2024",
            "revenue": 118690000000,
            "netIncome": 11854000000
        }
    ],
    "sourceUpdatedAt": "2026-10-24T08:04:53",
    "inseeUpdatedAt": "2026-10-23T17:00:52.870",
    "annuaireUrl": "https://annuaire-entreprises.data.gouv.fr/entreprise/552081317",
    "source": "recherche-entreprises.api.gouv.fr",
    "attribution": "Source: INSEE Sirene and INPI/BCE financial ratios, via the API Recherche d’entreprises (DINUM), Licence Ouverte / Etalab 2.0 (https://www.etalab.gouv.fr/licence-ouverte-open-licence/); data last updated 2026-10-24. Normalised by this Actor; not an official reproduction.",
    "notice": "Unofficial. Not affiliated with or endorsed by INSEE, INPI, DINUM or any French administration.",
    "retrievedAt": "2026-10-25T00:55:51.883Z"
}
```

### How much does it cost?

- **$0.01 per run start** plus **$3 per 1,000 companies saved** ($0.003 each, the `company` event). Example: 1,000 companies = $0.01 + $3 = $3.01.
- You pay only for rows that are saved. Withheld, excluded, filtered and duplicate companies are free.
- Set **Maximum cost per run** when you start a run; the Actor stops when it reaches your cap.

### Privacy: company data only

- **No people.** The source also lists directors (dirigeants) and elected officials; the Actor drops those sections from every response before reading it. Trade names (enseignes) and address complements, which often contain a person's name, are not output either.
- **No sole traders or natural persons.** Entrepreneurs individuels (legal category 1000) and groupings without legal personality (2xxx, such as indivisions) are withheld, and the search itself asks the source to leave sole traders out.
- **Non-diffusion respected.** Companies or head offices with INSEE's partial-diffusion status (statut de diffusion partielle) are excluded entirely; non-diffusible units are not in the source at all.
- **Name searches** match the company's own name and address only. The source also matches directors' names; such matches are dropped, so the Actor cannot be used to find a person's companies.
- **Companies named after a person** (e.g. "SCI DUPONT") are flagged and output without street address or coordinates, or left out with `personNamedCompanies` = `exclude`.

### Limits

- **Up to 50,000 companies per run** (`maxResults` maximum). For more, split the work into several runs, for example by department.
- **Legal form, region and department are codes, not names.** `legalCategoryCode` is the INSEE catégorie juridique code (e.g. 5710 = SAS), `headOfficeRegion` is the INSEE region code (e.g. 11 = Île-de-France) and `headOfficeDepartment` is the department code (e.g. 75 = Paris). Look up labels in INSEE's published code lists if you need them.
- The source returns at most **10,000 companies per search**. When you list several departments, each is searched separately, so the limit applies per department. The run summary says when a search hit the limit.
- Activity, postcode and department filters match any establishment of the company, not only the head office.
- Creation-date filters apply to the search results; they do not widen the 10,000 limit.
- Requests are paced at about 3 per second (25 companies each), below the source's limit of 7 per second, so 1,000 companies take about 20 seconds.
- Financials exist only for companies that published accounts (often larger companies).

### FAQ

**Do I need an API key?** No. The API Recherche d'entreprises is open and keyless.

**Can I reuse the data?** The SIRENE database is published by INSEE under the Licence Ouverte / Etalab 2.0, which allows free reuse, including commercial, provided you cite the source and the date of last update. Every row carries that attribution. This is not legal advice.

**How fresh is it?** The source is updated daily from INSEE and the national business register; each row shows its update date.

Unofficial. Not affiliated with or endorsed by INSEE, INPI, DINUM or any French administration.

# Changelog

This Actor's version history is a separate document: https://apify.com/graylabs/fr-companies/changelog.md

# Actor input Schema

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

Optional. Words searched in company names and head-office addresses, e.g. 'boulangerie lyon'. Only companies whose own name, acronym or address contains every word are returned (the source also matches directors' names; those matches are dropped).

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

Optional. NAF rév. 2 codes such as 62.01Z (computer programming) or 56.10A (traditional restaurants). Matches companies with an establishment in that activity.

## `activitySections` (type: `array`):

Optional. NAF section letters A to U, e.g. J (information and communication), F (construction).

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

Optional. Department codes such as 75, 69, 2A or 974. Each department is searched separately (the source returns at most 10,000 companies per search).

## `postcodes` (type: `array`):

Optional. 5-digit postcodes of an establishment, e.g. 75008.

## `legalCategories` (type: `array`):

Optional. INSEE catégorie juridique codes (3000 to 9999), e.g. 5710 (SAS), 5499 (SARL), 5599 (SA), 9220 (association). Sole traders (1000) and groupings without legal personality (2xxx) are never returned.

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

Optional. INSEE category: PME (SMEs), ETI (mid-caps), GE (large companies).

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

Optional. INSEE tranche d'effectif codes, e.g. 11 (10-19 employees), 12 (20-49), 21 (50-99), 22 (100-199), 31 (200-249), 32 (250-499), 41 (500-999), 42 (1,000-1,999), 51 (2,000-4,999), 52 (5,000-9,999), 53 (10,000+), NN (unknown).

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

Optional. Only companies whose latest published turnover (chiffre d'affaires) is at least this.

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

Optional. Only companies whose latest published turnover is at most this.

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

Active companies (default), ceased companies, or both.

## `createdFrom` (type: `string`):

Optional. Keep companies created on or after this date (filters the search results; it does not widen the 10,000 limit).

## `createdTo` (type: `string`):

Optional. Keep companies created on or before this date.

## `sirens` (type: `array`):

Optional. Look up specific companies by 9-digit SIREN (up to 1,000). Other filters except Status and creation dates are ignored in this mode.

## `includeFinancials` (type: `boolean`):

Add published turnover and net income by year (INPI/BCE ratios), when available.

## `addressDetail` (type: `string`):

Full: street address and coordinates of the head office. Commune: postcode, commune, department and region only.

## `personNamedCompanies` (type: `string`):

Some companies are named after a person (e.g. 'SCI DUPONT'). Flag (default): keep them with nameResemblesIndividual = true and without street address or coordinates. Exclude: leave them out.

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

Stop after saving this many companies (each saved company is one charged result).

## `maxRequests` (type: `integer`):

Safety cap on API requests per run (25 companies per request). Default 1,000. Requests are paced at about 3 per second, below the API's limit of 7.

## Actor input object example

```json
{
  "activityCodes": [
    "62.01Z"
  ],
  "activitySections": [],
  "departments": [
    "69"
  ],
  "postcodes": [],
  "legalCategories": [],
  "companyCategories": [],
  "employeeBands": [],
  "status": "active",
  "sirens": [],
  "includeFinancials": true,
  "addressDetail": "full",
  "personNamedCompanies": "flag",
  "maxResults": 20,
  "maxRequests": 1000
}
```

# Actor output Schema

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

No description

## `runSummary` (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 = {
    "activityCodes": [
        "62.01Z"
    ],
    "departments": [
        "69"
    ],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("graylabs/fr-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 = {
    "activityCodes": ["62.01Z"],
    "departments": ["69"],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("graylabs/fr-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 '{
  "activityCodes": [
    "62.01Z"
  ],
  "departments": [
    "69"
  ],
  "maxResults": 20
}' |
apify call graylabs/fr-companies --silent --output-dataset

```

## MCP server setup

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