# SIREN/SIRET Bulk Lookup: French Company Data Enricher (`rigel/fr-siren-enricher`) Actor

Paste SIREN or SIRET numbers and get official French company data: name, NAF/APE code, legal form, size, headcount band, active or closed, head office, VAT number. Luhn check first, closed and transferred SIRETs detected, invalid ids free. $0.003 per company found, no personal data.

- **URL**: https://apify.com/rigel/fr-siren-enricher.md
- **Developed by:** [Rigel](https://apify.com/rigel) (community)
- **Categories:** Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

**Turn a list of SIREN or SIRET numbers into clean, official French company data (name, NAF code, size, headcount, status, head office, VAT number) for $0.003 per company found.**

### What is the French SIREN/SIRET Bulk Enricher?

A **bulk SIREN / SIRET lookup** for CRM enrichment, data cleaning and B2B prospect lists. Paste your identifiers and get back data from the official French company register (SIRENE, via the government's API Recherche d'entreprises or your own INSEE Sirene key):

- name and acronym, legal form, **NAF / APE code**, size category (PME, ETI, GE), **headcount band**, creation date;
- **active or closed**, closure date, head office SIRET and address, open / total establishments;
- **intra-EU VAT number** computed from the SIREN;
- with `fields: "full"`: labels (RGE, ESS, Qualiopi…), published financials and collective agreements when the source has them.

Every identifier is **validated with the Luhn checksum** (including La Poste's special rule) before any API call. Invalid ids are returned free.

### Use cases

- **CRM enrichment and cleaning**: add NAF code, size and headcount to the SIRENs in Salesforce, HubSpot or a spreadsheet, and flag companies that have closed.
- **Fix outdated SIRETs**: detect closed or transferred establishments and get the SIRET to use instead (`suggestedSiret`).
- **Invoicing and e-invoicing readiness**: check that customer SIRENs are valid and active before issuing invoices.
- **B2B list building**: segment a list by NAF code, size or department.
- **Data pipelines**: call it from Make, Zapier, n8n or Python through the Apify API.

### How to use it

1. Paste identifiers in `ids` (array) or `idsText` (one per line, or comma / semicolon separated). Spaces inside an id are kept, so `552 032 534` is one SIREN.
2. Choose `standard` or `full` fields.
3. Optional: add your free INSEE Sirene API key for batches of 1,000 ids per request and official succession links.
4. Export as JSON, CSV or Excel.

#### Input example

```json
{
  "ids": ["552032534", "55203253400646", "92380450400010"],
  "fields": "standard"
}
```

### Output example

Real row returned by a public run on 17 October 2026 (input `552032534`):

```json
{
  "input": "552032534",
  "inputKind": "siren",
  "valid": true,
  "found": true,
  "siren": "552032534",
  "name": "DANONE",
  "legalForm": "5599",
  "naf": "70.10Z",
  "nafSection": "M",
  "category": "GE",
  "headcountBand": "42",
  "headcountYear": "2024",
  "createdAt": "1955-01-01",
  "companyActive": true,
  "companyClosedAt": null,
  "establishmentsTotal": 19,
  "establishmentsOpen": 3,
  "vatNumber": "FR27552032534",
  "headOffice": {
    "siret": "55203253400703",
    "isHeadOffice": true,
    "active": true,
    "naf": "70.10Z",
    "address": "59-61 RUE LA FAYETTE 75009 PARIS",
    "postcode": "75009",
    "city": "PARIS",
    "department": "75"
  },
  "status": "active",
  "source": "API Recherche d'entreprises (DINUM, données INSEE/RNE) – Licence Ouverte 2.0",
  "collectedAt": "2026-10-16",
  "charged": true
}
```

Possible `status` values: `active`, `establishment_closed`, `company_closed`, `siret_not_found_in_unit`, `not_found`, `invalid_id`, `error`. A masked row keeps its status and is flagged `"masked": true` with its name removed.

### How much does it cost?

| Event | When | Price |
|---|---|---|
| `company-enriched` | one SIREN/SIRET found and returned | $0.003 |
| `apify-actor-start` (Apify platform event) | once per run, per GB of memory (default 512 MB = 1 event) | $0.00005 |

Example: 1,000 companies found cost $3.00. 10,000 cost $30.00.

**Free:** invalid ids, not found, masked rows, source errors, and duplicates (the same id is charged once per run). The optional cache (`cacheDays`) saves the API call, not the event. When your spending limit is reached the Actor stops and never charges beyond it (minimum limit: $0.05).

### FAQ

#### What is the difference between SIREN and SIRET?

The SIREN (9 digits) identifies the company. The SIRET (14 digits = SIREN + 5-digit NIC) identifies one establishment. The Actor accepts both and tells you which one you sent (`inputKind`).

#### How do I find the new SIRET after a company moved?

When an establishment is closed but the company is active, `suggestedSiret` points to the current head office (`transferHint`). With your INSEE key, the Actor uses the official INSEE succession links instead of this heuristic.

#### Do I need an INSEE API key?

No. By default the Actor uses the free API Recherche d'entreprises. An INSEE Sirene key (free at portail-api.insee.fr) is recommended for large volumes: 1,000 ids per request.

#### Is the VAT number valid?

It is computed from the SIREN with the official key formula. It does not prove the company is registered for VAT: check with VIES before an intra-EU transaction.

#### Does it return personal data?

No. Officers are never collected. Every natural-person legal form (sole traders, *entrepreneurs individuels*, some groupings of natural persons), units with an unknown legal form, and non-diffusible units are masked and free.

#### Can I use the data commercially?

Yes. SIRENE data from the API Recherche d'entreprises and from INSEE is published under Licence Ouverte 2.0 (attribution required). Each record carries its source and `collectedAt` date.

### Limitations

- `vatNumber` is computed, not verified.
- Without an INSEE key, transfer detection is a heuristic based on the current head office.
- The free API allows about 7 requests/s on the service and about 30 requests/s per network (ASN). The Actor uses 6/s by default. For volume, use your INSEE key.
- The free API often omits a non-diffusible unit entirely; that row comes back `not_found`, not `masked`.
- `closedAt` / `companyClosedAt` can be null when the source sends no date.
- `maxItems` defaults to 5,000; ids past the limit are skipped and reported.

### Data sources and licences

| Source | Publisher | Licence |
|---|---|---|
| [API Recherche d'entreprises](https://recherche-entreprises.api.gouv.fr) | DINUM (INSEE and RNE data) | Licence Ouverte / Open Licence 2.0 |
| [API Sirene](https://portail-api.insee.fr) (optional, your key) | INSEE | Licence Ouverte / Open Licence 2.0 |

Code dependencies: Apify SDK (Apache-2.0), httpx (BSD-3-Clause).

### Related Actors

- [French Supplier Check](https://apify.com/rigel/fr-supplier-check): adds BODACC insolvency notices, public contracts and a risk level ($0.01 per company).
- [Factur-X Toolkit](https://apify.com/rigel/facturx-toolkit): validate and generate French e-invoices.

### En français

**Enrichissement en masse de SIREN / SIRET avec les données officielles SIRENE : raison sociale, code NAF/APE, tranche d'effectif, catégorie, statut actif ou fermé, siège, numéro de TVA calculé.**

- Cas d'usage : nettoyage et enrichissement CRM, correction des SIRET d'établissements fermés ou transférés, vérification des SIREN clients avant facturation, segmentation de fichiers B2B.
- Validation Luhn avant tout appel ; identifiants invalides, introuvables, masqués et doublons gratuits.
- Prix : 0,003 $ par entreprise trouvée et renvoyée.
- Limites : TVA calculée et non vérifiée (VIES) ; sans clé INSEE, la détection des transferts est une heuristique.
- Aucune donnée personnelle : dirigeants jamais collectés, entrepreneurs individuels et unités non diffusibles masqués.
- Sources : API Recherche d'entreprises (DINUM, données INSEE/RNE) et API Sirene (INSEE), Licence Ouverte 2.0.

# Actor input Schema

## `ids` (type: `array`):

9-digit SIREN or 14-digit SIRET; spaces/dots are ignored.

## `idsText` (type: `string`):

One id per line, or separated by commas or semicolons. Spaces inside an id are kept (552 032 534 is one SIREN).

## `fields` (type: `string`):

full adds labels (RGE, ESS, Qualiopi...), published financials and collective agreements.

## `inseeApiKey` (type: `string`):

Free key from portail-api.insee.fr. Enables batched Sirene queries (each query stays under 7,000 characters) and official succession links. Recommended for volume: the free Recherche d'entreprises API is limited per network, about 30 requests/s.

## `cacheDays` (type: `integer`):

0 = always fresh. Maximum 7 days, because a cached row is not checked again for non-diffusion. The cache skips the API call, not the charge. The key includes the backend (INSEE or Recherche d'entreprises).

## `requestsPerSecond` (type: `integer`):

Max requests/second (free API).

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

Max ids processed. Identifiers past this limit are skipped; STATS.truncated and the run status say how many.

## Actor input object example

```json
{
  "ids": [
    "356000000",
    "55203253400646"
  ],
  "fields": "standard",
  "cacheDays": 0,
  "requestsPerSecond": 6,
  "maxItems": 5000
}
```

# Actor output Schema

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

Default dataset, overview view selected.

# 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 = {
    "ids": [
        "356000000",
        "55203253400646"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("rigel/fr-siren-enricher").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 = { "ids": [
        "356000000",
        "55203253400646",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("rigel/fr-siren-enricher").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 '{
  "ids": [
    "356000000",
    "55203253400646"
  ]
}' |
apify call rigel/fr-siren-enricher --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rigel/fr-siren-enricher"
        }
    }
}
```

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/U2bxPsd6OgmSjIuWk/builds/OwMbgAMQavwnLosJV/openapi.json
