# France SIRENE Company Search: SIREN, SIRET, NAF Lookup (`itayozer9/france-sirene-companies`) Actor

Look up French companies by SIREN or SIRET, or search by name, NAF/APE code, postcode, department and size, from the official Sirene register (INSEE). Legal name, status, address, NAF, employee band, VAT, revenue. No API key. No sole traders or directors.

- **URL**: https://apify.com/itayozer9/france-sirene-companies.md
- **Developed by:** [Itay Ozer](https://apify.com/itayozer9) (community)
- **Categories:** Business, Lead generation, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 company founds

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 SIRENE Company Search: SIREN, SIRET, NAF Lookup

Look up French companies by SIREN or SIRET, or build company lists by name, NAF/APE activity code, postcode, department and employee count. Each company comes back as one clean JSON row: legal name, status, establishment address, NAF code and label, legal form, employee band, creation date, VAT number and latest published revenue.

The data comes from the French government's open company register API (API Recherche d'entreprises, run by DINUM on top of INSEE Sirene and the RNE). It is free official open data under the Licence Ouverte 2.0: no API key, no scraping of Pappers or Societe.com, no captchas, no proxies.

### What you get

For every company:

- **Identity**: SIREN, SIRET of the establishment in the row, head office SIRET, legal name, acronym
- **Status**: active or closed, closing date, creation date, last update in the register
- **Activity**: NAF rev. 2 (APE) code with its French label, NAF section, and the new NAF 2025 code INSEE publishes ahead of the 2027 switch
- **Legal form**: INSEE legal category code and label (SAS, SARL, SA, SCI, association...)
- **Size**: INSEE category (PME, ETI, GE), employee band in plain words (for example `20-49`) and its year, number of establishments
- **Address**: full address of the establishment, postcode, city, INSEE commune code, department, region, latitude and longitude
- **Money**: intra-EU VAT number, latest published revenue and net income with the year
- **Flags**: register labels such as association, ESS, RGE, Qualiopi, bio, FINESS, and whether the company **opted out of commercial prospecting** (GDPR art. 21), so you can respect it in your outreach
- A link to the company page on annuaire-entreprises.data.gouv.fr

### Input

| Field | Example | Notes |
|---|---|---|
| `queries` | `["552032534", "85520088700039", "michelin"]` | 9 digits = SIREN lookup, 14 digits = SIRET lookup, anything else = name search. Spaces and dots are fine. Up to 5,000 per run |
| `nafCodes` | `["62.01Z", "6202A"]` | Main activity of the company |
| `postcodes` | `["75011", "69003"]` | Companies with an establishment there. The row then shows that local establishment |
| `departments` | `["69", "2A", "974"]` | Same, by department |
| `minEmployees` | `10` | Keeps employee bands that can reach this many salaried staff |
| `activeOnly` | `true` | Default true. Leaves closed companies out of searches |
| `maxResultsPerSearch` | `100` | 1 to 10,000 per name search or filter-only search |

Filters apply to name searches and to a filter-only search (leave `queries` empty). SIREN and SIRET lookups ignore them and always return the company with its status.

Every software company with an office in Lyon 3e:

```json
{
    "nafCodes": ["62.01Z"],
    "postcodes": ["69003"],
    "maxResultsPerSearch": 1000
}
```

Check a supplier list:

```json
{
    "queries": ["552032534", "855 200 887 00039", "356000000"]
}
```

### Output example

```json
{
    "input": "85520088700039",
    "matchType": "siret",
    "result": "found",
    "note": null,
    "siren": "855200887",
    "siret": "85520088700039",
    "isHeadOffice": true,
    "headOfficeSiret": "85520088700039",
    "name": "COMPAGNIE GENERALE DES ETABLISSEMENTS MICHELIN",
    "acronym": "CGEM",
    "legalFormCode": "5308",
    "legalForm": "Société en commandite par actions",
    "status": "active",
    "closedOn": null,
    "creationDate": "1955-01-01",
    "nafCode": "77.40Z",
    "nafLabel": "Location-bail de propriété intellectuelle et de produits similaires, à l’exception des œuvres soumises à ,copyright",
    "nafSection": "N",
    "naf2025Code": "77.40G",
    "companyCategory": "GE",
    "employeeBandCode": "02",
    "employeeBand": "3-5",
    "employeeBandYear": 2024,
    "establishmentCount": 2,
    "openEstablishmentCount": 1,
    "establishmentStatus": "active",
    "establishmentNafCode": "77.40Z",
    "tradeName": null,
    "address": "23 PLACE DES CARMES DECHAUX 63000 CLERMONT-FERRAND",
    "postcode": "63000",
    "city": "CLERMONT-FERRAND",
    "communeCode": "63113",
    "department": "63",
    "region": "84",
    "latitude": 45.783412445,
    "longitude": 3.0932797959,
    "vatNumber": "FR09855200887",
    "revenueEur": 25992000000,
    "netIncomeEur": 1664000000,
    "financialYear": 2025,
    "labels": [],
    "optedOutOfProspecting": true,
    "lastUpdated": "2026-10-31T10:48:07",
    "annuaireUrl": "https://annuaire-entreprises.data.gouv.fr/entreprise/855200887",
    "source": "Annuaire des Entreprises API (INSEE Sirene, RNE), Licence Ouverte 2.0",
    "checkedAt": "2026-10-31T18:49:43.168Z"
}
```

Fields the register does not have are `null`, never guessed. The `result` field tells you what happened to each query:

| result | Meaning | Charged |
|---|---|---|
| `found` | Company returned | yes |
| `not_found` | SIREN/SIRET not in the public register, or a search with no match | no |
| `invalid` | Wrong length or check digit, or a name under 3 characters | no |
| `excluded` | A sole trader or other natural person (see below) | no |
| `error` | The register did not answer after retries | no |

### Pricing

| Event | Price | When |
|---|---|---|
| Company found | $0.001 | Every `found` row in your dataset |
| Actor start | $0.00005 | Once per run |

1,000 companies cost $1.00. Not-found, invalid, excluded and failed queries are free. A company that two of your searches both match is charged once.

The actor reads your run's maximum charge before it calls the register and stops when it is reached, so a run never costs more than the limit you set.

### Limits

- **Speed**: the register API allows 7 requests per second per IP and 30 per cloud network. To stay a good citizen the actor makes at most 3 requests per second and waits when asked to (HTTP 429). A SIREN or SIRET lookup is one request; a search returns 25 companies per request. Measured: 1,000 search results in about 2.5 minutes, 400 lookups in about 3 minutes.
- **10,000 results per search** is a hard limit of the register API. For bigger lists, split by department or NAF code.
- **Not included**: companies that asked INSEE not to be public (non-diffusible), and establishments' predecessors and successors. When a company asked INSEE to hide its street address (partial diffusion), `address`, `latitude` and `longitude` are `null`, the postcode too when the register hides it, and the city stays.
- **Freshness**: the register API is fed by INSEE Sirene and the RNE. `lastUpdated` shows when the register last updated each company.
- Name search is fuzzy, like the official directory: "danone" also finds "SCI DANON". Add a NAF code or postcode to narrow it.

### FAQ

**Is there personal data in the results?**
No directors, no shareholders, no birth dates, no elected officials: the actor never even downloads them. Sole traders (entrepreneurs individuels) and groups of natural persons are left out completely, because their company name is the owner's name and their address is often a home. A SIREN lookup for one returns a free `excluded` row with no name or address. Company names and registered addresses of legal entities are public register data. If you use the results for marketing, check `optedOutOfProspecting` and your own GDPR duties.

**Where does the data come from?**
From API Recherche d'entreprises (recherche-entreprises.api.gouv.fr), the free public API behind annuaire-entreprises.data.gouv.fr, fed by INSEE Sirene and the national business register (RNE). Reuse is allowed under the Licence Ouverte 2.0, including commercial reuse, with the source and update date cited; each row carries both. This actor is independent and not endorsed by INSEE, DINUM or the French government.

**Why did I get fewer companies than `maxResultsPerSearch`?**
The search had fewer matches, some matches were sole traders (left out), or your run's maximum charge covered fewer companies.

**Can I schedule it or call it from an AI agent?**
Yes. It runs with limited permissions, so it cannot touch your other Apify data, and it works from schedules, the API, integrations and MCP clients. Rows are flat, so they export cleanly to CSV and Excel.

**A field is wrong or missing. What do I do?**
Open an issue on the Issues tab with your run link and the SIREN.

# Actor input Schema

## `queries` (type: `array`):

One per line. A 9-digit SIREN or a 14-digit SIRET is looked up exactly (spaces and dots are fine). Anything else is a name search (3 characters or more). Leave empty to list every company that matches the filters below. Up to 5,000 per run.

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

Only companies whose main activity is one of these NAF rev. 2 codes, for example 62.01Z (software) or 56.10A (restaurants). 6201Z works too. Applies to name searches and filter-only searches, not to SIREN or SIRET lookups.

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

Only companies with an establishment in one of these 5-digit postcodes, for example 75011. The row then shows that local establishment instead of the head office.

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

Only companies with an establishment in one of these departments, for example 69, 2A or 974. The row then shows that local establishment.

## `minEmployees` (type: `integer`):

Only companies whose INSEE employee band can reach this many salaried employees, for example 10. Companies with no declared band are left out when this is set.

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

Leave out closed companies in searches. SIREN and SIRET lookups always return the company with its status.

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

Most companies to return for each name search or filter-only search (1 to 10,000; the register API stops at 10,000). You pay only for companies returned.

## Actor input object example

```json
{
  "queries": [
    "552032534",
    "85520088700039",
    "michelin"
  ],
  "activeOnly": true,
  "maxResultsPerSearch": 10
}
```

# Actor output Schema

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

One item per company found, plus free items for SIREN/SIRET not found, invalid input, sole traders left out and failed queries (see the result field).

# 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 = {
    "queries": [
        "552032534",
        "85520088700039",
        "michelin"
    ],
    "maxResultsPerSearch": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("itayozer9/france-sirene-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 = {
    "queries": [
        "552032534",
        "85520088700039",
        "michelin",
    ],
    "maxResultsPerSearch": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("itayozer9/france-sirene-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 '{
  "queries": [
    "552032534",
    "85520088700039",
    "michelin"
  ],
  "maxResultsPerSearch": 10
}' |
apify call itayozer9/france-sirene-companies --silent --output-dataset

```

## MCP server setup

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