# French Company Data: SIREN/SIRET Search & Lookup (Official API) (`terracotta_hauyne/france-company-data-sirene`) Actor

Official French company data (SIRENE) from the government API: look up SIREN/SIRET or search by name, NAF code, département, postcode, size, legal form, revenue. Clean output with NAF labels, HQ address, headcount, revenue & net income. No API key. Sole traders excluded by default.

- **URL**: https://apify.com/terracotta_hauyne/france-company-data-sirene.md
- **Developed by:** [Kevin](https://apify.com/terracotta_hauyne) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.80 / 1,000 company saveds

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

## French Company Data: SIREN/SIRET Search & Lookup (Official API)

Get French company data from the **official government API** (API Recherche d'entreprises, built on the
INSEE **Sirene** register). You can look up companies by **SIREN or SIRET**, search them by name, or list
every company that matches your filters: **NAF/APE code, département, postal code, commune, size
category, headcount band, legal form, revenue range, labels and creation date**.

Each result is a clean, flat row with readable labels. Codes come with their names (for example
`10.71C` → *Boulangerie et boulangerie-pâtisserie* and `22` → *100 à 199 salariés*). Each row also has
the head office address and GPS coordinates, the **latest revenue and net income**, VAT numbers,
labels (RGE, Qualiopi, ESS…), and the number of establishments.

- **No API key, no scraping, no proxies.** The data comes from the same API that powers
  [annuaire-entreprises.data.gouv.fr](https://annuaire-entreprises.data.gouv.fr).
- **Privacy by default.** Sole traders (*entrepreneurs individuels*) are excluded and directors are off
  unless you turn them on. Every row shows whether the company has opted out of commercial prospecting.
- **Fast:** each API request returns 25 companies, so a 1,000-company list takes under a minute.
- **$1.80 per 1,000 companies**, with every field included.

Not affiliated with or endorsed by INSEE, DINUM or data.gouv.fr.

### How to use

1. Click **Start**. The prefilled input looks up Airbus (SIREN 383474814) and lists bakeries
   (NAF 10.71C) in Paris (département 75), capped at 100 companies.
2. Replace it with your own SIREN/SIRET list, search terms or filters. You can combine them.
3. Run the actor. Then export the dataset as CSV, Excel or JSON, or pull it into your CRM or
   spreadsheet through the Apify API.

**Example 1: SIREN / SIRET lookup** (KYB, CRM enrichment, invoice checks). Spaces and Annuaire URLs are fine:

```json
{
  "sirenOrSiret": ["383 474 814", "35600000000048", "https://annuaire-entreprises.data.gouv.fr/entreprise/poilane-324445030"]
}
```

**Example 2: lead list from filters.** This lists software companies (SAS/SASU) in Lyon and Villeurbanne
with 10–49 employees, created since 2015, head office in the area, biggest first:

```json
{
  "nafCodes": ["62.01Z"],
  "postalCodes": ["69001", "69002", "69003", "69006", "69007", "69100"],
  "locationHeadOfficeOnly": true,
  "headcountBands": ["11", "12"],
  "legalFormCodes": ["5710", "5720"],
  "createdFrom": "2015-01-01",
  "sortBySize": true,
  "maxResults": 2000
}
```

**Example 3: name search with establishments and directors.** This finds RGE-certified installers named
"solaire" in Gironde, with their establishments (SIRET) and directors (names and roles only):

```json
{
  "searchQueries": ["solaire"],
  "departements": ["33"],
  "onlyWithLabels": ["est_rge"],
  "includeEstablishments": true,
  "includeDirectors": true,
  "maxResults": 300
}
```

### Official API vs. scraping-based actors

| | This actor | Pappers / website scrapers | Bare API wrappers |
|---|---|---|---|
| Source | Official government API (Sirene + RNE) | Third-party website HTML | Official API |
| Breaks when a website changes | No | Often | No |
| Filters: NAF, département, postal code, headcount, legal form, revenue, labels | ✅ all | Varies | Few or none |
| Creation-date range, head-office-only location | ✅ | Varies | ❌ |
| Labels for NAF, legal form, headcount | ✅ | Partly | ❌ raw codes |
| Revenue + net income with year | ✅ | ✅ | Raw nested JSON |
| Sole traders excluded / opt-out flag | ✅ by default | ❌ | ❌ |
| Price per 1,000 companies | **$1.80** | $3.50–$10 | ~$1 |

### What data do you get?

One dataset item per company (SIREN):

- **Identity:** SIREN, name, registered name, acronym, legal form (code and label), status (active or
  ceased), creation and closure dates, last update.
- **Activity:** NAF/APE code and label, NAF section, NAF 2025 code.
- **Size:** headcount band (code, label and year), INSEE category (PME / ETI / GE), employer flag,
  number of establishments (total and open).
- **Head office (siège):** SIRET, one-line address, postal code, city, commune code, département,
  region, country, latitude and longitude.
- **Finances (when published):** latest revenue (*chiffre d'affaires*) and net income (*résultat net*)
  with their year, plus the full history the API returns.
- **Other:** intra-EU VAT numbers, labels and certifications (RGE, Qualiopi, Bio, ESS, société à mission,
  EPV, SIAE, organisme de formation, Egapro…), collective agreements (IDCC), sole-trader flag,
  commercial-prospecting opt-out flag, and a link to the company page on annuaire-entreprises.data.gouv.fr.
- **Optional:** `establishments` (SIRET, address, activity, headcount, status, coordinates) and
  `directors` (names and roles; companies acting as directors or auditors include their SIREN).
- **Provenance:** `matchedBy`, `retrievedAt`, `source` and `licence` on every row.

The run summary (key-value store record `OUTPUT`) lists the lookups found, not found or excluded, the
total matches for each search, and the number of API requests.

### Input

| Field | What it does |
|---|---|
| `sirenOrSiret` | SIREN (9 digits) or SIRET (14 digits) numbers to look up |
| `searchQueries` | Free-text search on name, address or a director's name; each query is combined with the filters |
| `nafCodes`, `nafSections` | Main activity of the company (NAF rev. 2) |
| `departements`, `postalCodes`, `communeCodes` | Location of **any** establishment; add `locationHeadOfficeOnly` to keep only companies whose head office is there |
| `companyStatus` | `active` (default), `ceased` or `any`; applies to searches |
| `companyCategories`, `headcountBands`, `legalFormCodes` | Size and legal form |
| `minRevenue`, `maxRevenue` | Latest published revenue in EUR |
| `onlyWithLabels` | RGE, Qualiopi, Bio, ESS, … (all selected labels required) |
| `createdFrom`, `createdTo` | Creation-date range (applied to the results of your search/filters) |
| `sortBySize` | Biggest companies first instead of relevance |
| `excludeSoleTraders` | Default **on** |
| `excludeProspectingOptOuts` | Skip companies opposed to commercial prospecting (default off; the flag is always output) |
| `includeEstablishments`, `maxEstablishmentsPerCompany` | Add matching establishments (up to 100 per company) |
| `includeDirectors` | Add directors (names and roles); default **off** |
| `maxResults` | Total companies to save (default 100) |
| `maxRequestsPerSecond` | Default 4 (the API allows 7 per IP) |

### Output example

```json
{
  "siren": "324445030",
  "companyName": "POILANE",
  "status": "active",
  "legalFormCode": "5710",
  "legalForm": "SAS, société par actions simplifiée",
  "nafCode": "10.71C",
  "nafLabel": "Boulangerie et boulangerie-pâtisserie",
  "creationDate": "1982-04-01",
  "headcountBand": "22",
  "headcountBandLabel": "100 à 199 salariés",
  "companyCategory": "PME",
  "hqSiret": "32444503000012",
  "hqAddress": "8 RUE DU CHERCHE-MIDI 75006 PARIS",
  "hqPostalCode": "75006",
  "hqCity": "PARIS",
  "hqDepartement": "75",
  "hqLatitude": 48.851284924,
  "hqLongitude": 2.3289797068,
  "establishmentCount": 6,
  "openEstablishmentCount": 6,
  "vatNumbers": ["FR48324445030"],
  "revenue": 10532253,
  "netIncome": -2158104,
  "financialYear": 2023,
  "labels": ["Alim'Confiance", "Egapro"],
  "isSoleTrader": false,
  "optedOutOfCommercialProspecting": false,
  "annuaireUrl": "https://annuaire-entreprises.data.gouv.fr/entreprise/324445030",
  "containsPersonalData": false,
  "retrievedAt": "2026-10-31T14:34:16+00:00",
  "licence": "Source: Insee, base Sirene des entreprises et de leurs etablissements, and other public sources via the API Recherche d'entreprises (DINUM / annuaire-entreprises.data.gouv.fr). Licence Ouverte / Open Licence version 2.0."
}
```

(Shortened. See the dataset schema for all fields.)

### Pricing

Pay per result: **$1.80 per 1,000 companies saved** ($0.0018 per company). Establishments, directors,
finances and labels are included at no extra cost. Companies dropped by your filters are never charged.
Set **Maximum cost per run** in Apify and the actor stops cleanly when it reaches that amount. The
summary then shows `stoppedByChargeLimit: true`.

### Use cases

- **B2B lead lists:** for example, every active bakery, plumber or software firm in a département,
  filtered by size and revenue.
- **KYB / supplier checks:** confirm that a SIREN/SIRET exists and is active, and get its legal form,
  address and VAT number.
- **CRM enrichment:** add NAF, headcount, revenue and GPS coordinates to your company records.
- **Market research:** count and map companies by activity, size and area.

### Licence and attribution

The data is open data under the **Licence Ouverte / Open Licence version 2.0 (Etalab)**, which allows
commercial reuse provided you **credit the source and show the date of last update**.

- Sirene register, data.gouv.fr dataset page
  ([link](https://www.data.gouv.fr/datasets/base-sirene-des-entreprises-et-de-leurs-etablissements-siren-siret)):
  *"Producteur : Institut national de la statistique et des études économiques (Insee) — Licence :
  Licence Ouverte / Open Licence version 2.0"*.
- Company data used by the Annuaire des Entreprises, the data behind this API
  ([link](https://www.data.gouv.fr/fr/datasets/donnees-des-entreprises-utilisees-dans-lannuaire-des-entreprises/)):
  *"Producteur : data.gouv.fr — Licence : Licence Ouverte / Open Licence version 2.0"*.
- Licence text: https://www.etalab.gouv.fr/licence-ouverte-open-licence/

Every item includes a `licence` attribution statement, `lastUpdated` and `retrievedAt`. Keep them when
you republish the data. The API itself is documented at https://recherche-entreprises.api.gouv.fr/docs/.

### Personal data and GDPR

Company data about legal entities is not personal data. However, **sole traders are natural persons**:
their name is the company name and their address is often their home. **Directors' names are personal
data too.** This actor therefore:

- excludes sole traders by default (`excludeSoleTraders`). When you turn it off, their rows have
  `containsPersonalData: true`;
- outputs directors only when you enable `includeDirectors`, and then **names and roles only**. The
  month and year of birth that the API publishes are never output;
- outputs `optedOutOfCommercialProspecting` for every company. A `true` value means the company has
  objected to reuse of its data for commercial prospecting (Code de commerce art. R.123-320 / GDPR art.
  21\). Respect it, or set `excludeProspectingOptOuts`;
- never returns companies that are *non-diffusibles*: the API does not publish them.

If you process personal data, you are the controller of your copy: you need a lawful basis, must inform
the people concerned, and must honour objections. Do not use this actor to build consumer contact lists.

### FAQ

**Do I need an API key or an account at INSEE?** No. The API is open, and the actor handles its rate
limits for you.

**Is it the full Sirene database?** It covers every public company that the government directory
shows: active and ceased, including associations and public bodies. Companies that have asked not to be
published (*non-diffusibles*) are not included. For bulk exports of millions of rows, use the Sirene
stock files on data.gouv.fr.

**Why do I get at most 10,000 companies per search?** The API caps each search at 10,000 results. Split
large lists by département, NAF code or headcount band (for example, one run per département).

**Why do some companies have a head office outside my département?** The API's location filters match
**any establishment** of a company. Turn on `locationHeadOfficeOnly` to keep only companies whose head
office is in the area.

**How does the creation-date filter work?** The API has no date parameter, so the actor checks
`creationDate` on each result of your search or filters. Combine the date filter with an activity or
location filter. It cannot be the only filter.

**Why is revenue 0 or empty?** Revenue appears only when the company has published its accounts. Many
small companies file confidential accounts, which the source reports as 0 or leaves out.

**Can I get every establishment of a large company?** `includeEstablishments` returns the
establishments that matched your search or filters, up to 100 per company. For a plain SIREN lookup the
API returns no matching establishments, so the actor lists the head office. `establishmentCount` always
shows the total.

**How fresh is the data?** Every run queries the live API, which DINUM refreshes regularly from INSEE
Sirene, the RNE and the other sources. `lastUpdated` shows when each company record last changed.

**Can I get emails or phone numbers?** No. The register does not publish them, and this actor does not
guess or scrape them.

### Changelog

- **1.0** (2026-10): first release.

# Actor input Schema

## `sirenOrSiret` (type: `array`):

SIREN lookup (9 digits) or SIRET lookup (14 digits, one establishment). Spaces are ignored and annuaire-entreprises.data.gouv.fr URLs are accepted. Example: 383474814 (Airbus).

## `searchQueries` (type: `array`):

Free-text company search (name, acronym, address, or a director's name), e.g. 'boulangerie lyon'. Each query is combined with the filters below.

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

NAF rev. 2 codes of the company's main activity, e.g. 10.71C (boulangerie), 62.01Z (software), 56.10A (restaurants). '1071C' also works.

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

Broad activity sections (A-U).

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

Département codes of an establishment, e.g. 75 (Paris), 69 (Rhône), 2A (Corse-du-Sud), 971 (Guadeloupe).

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

5-digit postal codes of an establishment, e.g. 69002.

## `communeCodes` (type: `array`):

5-character INSEE commune codes (not postal codes), e.g. 75056 (Paris), 31555 (Toulouse).

## `locationHeadOfficeOnly` (type: `boolean`):

The API matches département / postal code / commune against any establishment of a company. Turn this on to keep only companies whose head office (siège) is in the selected location.

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

Administrative status of the company (searches only; lookups always return the company).

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

INSEE company category.

## `headcountBands` (type: `array`):

INSEE employee headcount bands (tranche d'effectif salarié).

## `legalFormCodes` (type: `array`):

INSEE legal category codes, e.g. 5710 (SAS), 5720 (SASU), 5499 (SARL), 5599 (SA), 9220 (association).

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

Only companies created on or after this date (YYYY-MM-DD). The API has no date filter, so this is applied to the results of your search/filters: combine it with an activity or location filter.

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

Only companies created on or before this date (YYYY-MM-DD).

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

Only companies whose latest published revenue (chiffre d'affaires) is at least this amount. The API filters on published accounts, so companies without them do not match.

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

Only companies whose latest published revenue is at most this amount.

## `onlyWithLabels` (type: `array`):

Only companies holding all of the selected labels.

## `sortBySize` (type: `boolean`):

Sort search results by size (number of establishments) instead of relevance.

## `excludeSoleTraders` (type: `boolean`):

On by default: sole traders are natural persons, so their name and often home address are personal data under GDPR. Also applies to SIREN/SIRET lookups.

## `excludeProspectingOptOuts` (type: `boolean`):

Skip companies registered as opposed to reuse of their data for commercial prospecting (opposition_diffusion_commerciale, from the RNE). Every item has the field optedOutOfCommercialProspecting either way; respect it for marketing.

## `includeEstablishments` (type: `boolean`):

Add the establishments (SIRET) that matched your search/filters, with address, activity, headcount and status. For a SIREN lookup the API returns no matching establishments, so the head office is listed.

## `maxEstablishmentsPerCompany` (type: `integer`):

Establishments to include per company (API maximum 100).

## `includeDirectors` (type: `boolean`):

Add directors and statutory auditors as published by the API: names and roles only (birth dates are never output). This is personal data: enable it only if you have a lawful basis under GDPR; you are the controller of your copy.

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

Stop after this many companies (each company is one result). The API returns at most 10,000 companies per search.

## `maxRequestsPerSecond` (type: `integer`):

The API allows 7 requests/s per IP and 30/s per cloud network shared with other users. The actor slows down automatically after a 429. Each request returns up to 25 companies.

## Actor input object example

```json
{
  "sirenOrSiret": [
    "383474814",
    "35600000000048"
  ],
  "searchQueries": [
    "boulangerie lyon"
  ],
  "nafCodes": [
    "10.71C"
  ],
  "departements": [
    "75"
  ],
  "postalCodes": [
    "69002"
  ],
  "locationHeadOfficeOnly": false,
  "companyStatus": "active",
  "legalFormCodes": [
    "5710",
    "5499"
  ],
  "sortBySize": false,
  "excludeSoleTraders": true,
  "excludeProspectingOptOuts": false,
  "includeEstablishments": false,
  "maxEstablishmentsPerCompany": 10,
  "includeDirectors": false,
  "maxResults": 100,
  "maxRequestsPerSecond": 4
}
```

# Actor output Schema

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

One item per French company saved (default dataset).

## `summary` (type: `string`):

Run summary: lookups found/not found/excluded, searches with total matches, API request count, charge-limit status.

# 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 = {
    "sirenOrSiret": [
        "383474814"
    ],
    "nafCodes": [
        "10.71C"
    ],
    "departements": [
        "75"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("terracotta_hauyne/france-company-data-sirene").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 = {
    "sirenOrSiret": ["383474814"],
    "nafCodes": ["10.71C"],
    "departements": ["75"],
}

# Run the Actor and wait for it to finish
run = client.actor("terracotta_hauyne/france-company-data-sirene").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 '{
  "sirenOrSiret": [
    "383474814"
  ],
  "nafCodes": [
    "10.71C"
  ],
  "departements": [
    "75"
  ]
}' |
apify call terracotta_hauyne/france-company-data-sirene --silent --output-dataset

```

## MCP server setup

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

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/foUowKm9jqtud9ykT/builds/GTXuDogPB9YbOpb8M/openapi.json
