# French Company Data – SIRENE Search, SIREN Lookup & Enrichment (`yck69/french-company-data`) Actor

Search, look up and enrich French companies from the official SIRENE registry: SIREN/SIRET, directors, revenue, certifications (RGE, Qualiopi…), establishments and BODACC risk signals. No 10,000-result cap, name-to-SIREN matching, address radius search.

- **URL**: https://apify.com/yck69/french-company-data.md
- **Developed by:** [yck](https://apify.com/yck69) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 company or establishments

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 – SIRENE Search, SIREN Lookup & Enrichment

Search, look up and enrich **French companies** from the official **SIRENE** registry (INSEE + RNE, ~29 million companies and associations): SIREN/SIRET, legal form, activity (NAF/APE), headcount, **revenue and net income**, **directors**, VAT number, certifications (RGE, Qualiopi, Bio, ESS…), establishments with GPS coordinates, and an optional **BODACC risk check** (insolvency proceedings, deregistration, last accounts filed).

**$3 per 1,000 companies.** Free count preview. Failed lookups and weak name matches are free.

### What data can you get?

<table>
<tr><td>🆔 SIREN and SIRET</td><td>🏢 Name, trade names, acronym</td><td>⚖️ Legal form</td></tr>
<tr><td>🏭 Activity (NAF/APE)</td><td>👥 Headcount range</td><td>💶 Revenue and net income</td></tr>
<tr><td>🧑‍💼 Directors and auditors</td><td>📍 Address and GPS</td><td>📅 Creation date and age</td></tr>
<tr><td>🏬 Establishments</td><td>🚨 BODACC risk flags</td><td>✅ Active or closed</td></tr>
</table>

### How to use it

1. Click **Try for free** at the top of this page.
2. Choose a mode: **search** (activity, area, size…), **lookup** (SIREN/SIRET) or **match** (company names).
3. Use the free **count preview** to see how many companies match.
4. Click **Start**.
5. Download as JSON, CSV or Excel, or send to your CRM through the API.

### Why this Actor

| | This Actor | Typical SIRENE scrapers |
|---|---|---|
| Results per search | **Unlimited**: searches over 10,000 results are split automatically and merged without duplicates | Stop at the official API's 10,000 cap |
| Match company **names** to SIREN | **Yes**, with a confidence score. You only pay for confident matches | SIREN/SIRET lists only |
| Search around an **address** | **Yes** (radius up to 50 km, with distance) | GPS coordinates only, or not at all |
| One row per **establishment** | Yes (shop, office, branch) | Rarely |
| Insolvency & legal events (BODACC) | Optional add-on with a **risk level** | Rarely |
| Typo detection in SIREN/SIRET | Yes (check digit), no charge | No |
| Price | **$3 / 1,000** | $5–8 / 1,000 |

### What you can do

1. **Search** with keywords and filters: activity code or sector, department, postal code, region, headcount, company category (PME/ETI/GE), legal form (SAS, SARL, SCI…), revenue and net income ranges, creation date (e.g. *created in the last 30 days*), certifications, director name. Exclude sole proprietors and associations in one click.
2. **Look up** a list of SIREN, SIRET or French VAT numbers (spaces and dots are fine).
3. **Match names** from your CRM or spreadsheet to their SIREN: `Danone`, `Michelin, Clermont-Ferrand`, `Boulangerie Martin, 69002`. Each row gets a `matchScore` (0–100), an `isAmbiguous` flag and alternative candidates.
4. **Nearby**: every company with an establishment within a radius of an address, e.g. *restaurants within 500 m of 12 rue de la République, Lyon*.

Use **Count only** first to see how many companies match and what the run will cost. It's free.

### Use cases

- **B2B prospecting**: every software company in Lyon with 10–49 employees; every RGE-certified electrician in Gironde with revenue over €1M.
- **CRM enrichment and cleaning**: add SIREN, VAT number, headcount, revenue and activity to a list of company names.
- **KYC and supplier checks**: verify a company exists, is active, who runs it, and whether it is in insolvency proceedings.
- **New business monitoring**: companies created in the last 30 days in your sector and area (schedule it weekly).
- **Local market research**: every bakery, pharmacy or garage around a point, with distances.
- **Investigations**: all companies where a given person is a director.

### Input examples

**Software companies in Lyon, 10–49 employees, no sole proprietors**

```json
{
    "mode": "search",
    "nafCodes": ["62.01Z", "62.02A"],
    "departments": ["69"],
    "employeeRanges": ["11", "12"],
    "excludeLabels": ["entrepreneur_individuel"],
    "maxResults": 5000
}
```

**New companies in the last 30 days in construction, Île-de-France**

```json
{
    "mode": "search",
    "nafSections": ["F"],
    "regions": ["11"],
    "createdAfter": "30 days",
    "maxResults": 2000
}
```

**Enrich a list of names**

```json
{
    "mode": "match",
    "companyNames": ["Danone", "Michelin, Clermont-Ferrand", "Back Market", "Boulangerie Pralus, 69002"],
    "minMatchScore": 75
}
```

**SIREN / SIRET / VAT lookup with a risk check**

```json
{
    "mode": "lookup",
    "identifiers": ["552 032 534", "35600000038933", "FR27552032534"],
    "checkBodacc": true
}
```

**Restaurants within 300 m of an address**

```json
{
    "mode": "nearby",
    "address": "59 rue La Fayette, Paris",
    "radiusKm": 0.3,
    "nafCodes": ["56.10A", "56.10C"]
}
```

### Output

One row per company (or per establishment for local searches). Labels are decoded, and amounts are numbers, ready for spreadsheets.

```json
{
    "siren": "552032534",
    "siret": "55203253400703",
    "name": "DANONE",
    "status": "active",
    "creationDate": "1955-01-01",
    "ageYears": 71.8,
    "legalForm": "SA à conseil d'administration (s.a.i.)",
    "nafCode": "70.10Z",
    "nafLabel": "Activités des sièges sociaux",
    "companyCategory": "GE",
    "employeeRange": "1,000-1,999 employees",
    "employeesMin": 1000,
    "employeesMax": 1999,
    "vatNumber": "FR27552032534",
    "address": "59-61 RUE LA FAYETTE 75009 PARIS",
    "postalCode": "75009",
    "city": "PARIS",
    "departmentName": "Paris",
    "regionName": "Île-de-France",
    "latitude": 48.8763,
    "longitude": 2.3435,
    "revenue": 27376000000,
    "netIncome": 2100000000,
    "financialYear": 2025,
    "netMarginPct": 7.7,
    "directorsSummary": "ANTOINE BERNARD DE SAINT AFFRIQUE (Directeur Général); …",
    "directors": [{ "type": "person", "firstName": "ANTOINE", "lastName": "BERNARD DE SAINT AFFRIQUE", "role": "Directeur Général", "birthYear": 1964 }],
    "certifications": ["FINESS", "Egapro index published"],
    "establishmentsCount": 19,
    "openEstablishmentsCount": 3,
    "annuaireUrl": "https://annuaire-entreprises.data.gouv.fr/entreprise/552032534",
    "bodacc": {
        "riskLevel": "low",
        "hasInsolvencyProceedings": false,
        "lastAccountsFiledFor": "2025-12-31",
        "announcementsCount": 107
    }
}
```

In Console, the dataset has ready-made tables: **Overview**, **Finances**, **Directors**, **Locations**, **Name matching** and **BODACC risk**. Export to CSV, Excel or JSON, or read it through the API.

#### BODACC risk levels

- **high**: an insolvency proceeding (safeguard, receivership, liquidation) opened or ongoing in the last 3 years, or a deregistration that is the company's latest announcement.
- **medium**: an older insolvency proceeding, an older deregistration, or a conciliation in the last 3 years.
- **low**: none of the above.

The SIRENE status can lag behind court decisions: a company in liquidation is often still "active" in SIRENE. That is exactly what the BODACC check catches.

### Pricing

Pay per result, no subscription:

| Event | Price |
|---|---|
| Company or establishment returned | $0.003 ($3 / 1,000) |
| BODACC risk check (optional) | $0.001 per company |
| Actor start | $0.00005 |

Free: count previews, identifiers that are invalid or not found, and name matches below your minimum score. Rows skipped by the creation-date filter are never charged. Set a spending limit when you start a run, and the Actor stops cleanly when it's reached.

### Good to know

- **Data source**: the French government's [API Recherche d'entreprises](https://recherche-entreprises.api.gouv.fr) (INSEE SIRENE, RNE, and other public registries), updated daily, and the [BODACC](https://www.bodacc.fr) open data. Licence: *Licence Ouverte / Etalab 2.0*, so commercial reuse is allowed.
- **Companies that opted out**: companies that asked INSEE not to publish their data (*non-diffusibles*) are not available, here or in any other legal source.
- **Revenue and net income** exist only for companies that publish their accounts (many small companies don't).
- **Establishment rows** come from the official API's matching, up to 100 sites per company and query, so very large chains may not list every site.
- **Creation-date filters** are applied while reading results, so combine them with sector or location filters for fast runs.
- **Directors** are public registry data (RNE). Use them responsibly: GDPR applies to personal data, including for B2B prospecting.
- **Speed**: about 7,000 companies per minute for searches. The official API limits requests per IP address, and the Actor slows down automatically when needed.

### More Actors from this developer

### FAQ

**Can I get more than 10,000 companies?** Yes. Keep "Go beyond 10,000 results" on. A search like *all active software companies in France* (about 120,000) is split by department and postal code and merged without duplicates.

**How accurate is name matching?** It ignores legal forms, accents and word order, and resolves cities to departments. When several companies share a name, it prefers the larger one, which is what CRM lists usually mean. Rows below your minimum score are returned free with the best candidate, so you can review them.

**Does it give emails or phone numbers?** No. The official registry doesn't contain them. Chain this Actor with a website or contact-finder Actor if you need them.

**Can I use it from my code or an AI agent?** Yes: via the Apify API, the JavaScript/Python clients, Make, Zapier, n8n, or as a tool for AI agents through the Apify MCP server.

##### Can I use it through the API, Make, Zapier or Google Sheets?

Yes. Every run can be started and read through the [Apify API](https://docs.apify.com/api/v2) (JavaScript and Python clients, CLI, MCP), and Apify integrations connect it to Make, Zapier, n8n, Google Sheets, Slack, webhooks and more.

##### Is it legal to use this data?

The Actor only reads public or official open data and doesn't log in anywhere. Check the source's licence and your local rules (for example GDPR when data concerns people) for your use case; if in doubt, ask a lawyer.

##### Something isn't working, or you need another field?

Open an issue on the **Issues** tab: feedback is read and answered.

# Actor input Schema

## `mode` (type: `string`):

<b>Search</b>: find companies with keywords and filters (sector, location, size, revenue, certifications…), with no 10,000-result cap.<br><b>Look up</b>: get full records for a list of SIREN, SIRET or French VAT numbers.<br><b>Match names</b>: turn a list of company names (e.g. from your CRM) into SIREN numbers, with a confidence score.<br><b>Nearby</b>: companies with an establishment within a radius of an address or GPS point.

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

Free text searched in company names, trade names, addresses and director names. Example: <code>boulangerie</code>, <code>agence web Lyon</code>. Leave empty to rely on filters only.

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

One or more NAF codes, e.g. <code>62.01Z</code> (software development), <code>56.10A</code> (restaurants), <code>43.21A</code> (electricians). <code>6201Z</code> is accepted too. Also applies to Nearby mode.

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

Broad sectors. Also applies to Nearby mode.

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

Department codes where the company has at least one establishment, e.g. <code>75</code>, <code>69</code>, <code>2A</code>, <code>971</code>.

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

5-digit postal codes where the company has at least one establishment, e.g. <code>69002</code>.

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

INSEE city codes (not postal codes), e.g. <code>75109</code> for Paris 9th.

## `regions` (type: `array`):

Regions where the company has at least one establishment.

## `employeeRanges` (type: `array`):

Official INSEE headcount ranges.

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

INSEE category: SME, mid-size or large enterprise.

## `legalForms` (type: `array`):

Shortcuts: <code>SAS</code> (includes SASU), <code>SARL</code> (includes EURL), <code>SA</code>, <code>SNC</code>, <code>SCI</code>, <code>EI</code> (sole proprietor), <code>SELARL</code>, <code>SELAS</code>, <code>SCOP</code>, <code>GIE</code>, <code>ASSOCIATION</code>. Or any 4-digit INSEE code, e.g. <code>5710</code>.

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

Active companies only, ceased only, or both.

## `labels` (type: `array`):

Keep only companies that have all the selected labels.

## `excludeLabels` (type: `array`):

Remove companies that have any of these labels. Tip: exclude <b>Sole proprietor</b> and <b>Association</b> for B2B prospecting.

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

Latest published revenue (chiffre d'affaires). Only companies that publish their accounts have this figure.

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

Latest published revenue.

## `minNetIncome` (type: `integer`):

Latest published net income (résultat net). Use 0 to keep profitable companies only.

## `maxNetIncome` (type: `integer`):

Latest published net income.

## `createdAfter` (type: `string`):

Keep companies created on or after this date, e.g. <code>2026-01-01</code> or <code>30 days</code> for the last 30 days. Works best combined with sector or location filters.

## `createdBefore` (type: `string`):

Keep companies created on or before this date, e.g. <code>2015-12-31</code> or <code>10 years</code> for companies at least 10 years old.

## `personLastName` (type: `string`):

Find companies where this person is a director (or elected official). Example: <code>Dupont</code>.

## `personFirstName` (type: `string`):

Optional, combined with the last name.

## `identifiers` (type: `array`):

One per line. SIREN (9 digits), SIRET (14 digits) or French VAT number (FR + 11 characters). Spaces and dots are ignored.

## `companyNames` (type: `array`):

One per line. Add a city, postal code or department after a comma to improve accuracy: <code>Danone, Paris</code>, <code>Boulangerie Martin, 69002</code>.

## `minMatchScore` (type: `integer`):

From 0 to 100. Matches below this score are returned free as <code>low_confidence</code> with the best candidate.

## `address` (type: `string`):

Any French address, e.g. <code>12 rue de la République, Lyon</code>. Leave empty to use the coordinates below.

## `latitude` (type: `number`):

Used when no address is given.

## `longitude` (type: `number`):

Used when no address is given.

## `radiusKm` (type: `number`):

Up to 50 km.

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

Stop after this many companies (or establishments). Large searches are split automatically, so you can go well beyond 10,000.

## `countOnly` (type: `boolean`):

Only count how many companies match and estimate the cost. Nothing is charged.

## `resultLevel` (type: `string`):

<b>Auto</b>: establishments for Nearby, Look up by SIRET and searches filtered by postal code or commune (local searches); companies otherwise.<br><b>Establishment</b>: one row per site (shop, office, agency) that the official API matches to your keywords or location filters, up to 100 per company. Companies without a matching site get one row for their head office.

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

Names, roles and birth year of directors and auditors.

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

Adds the list of the company's establishments that match your location filters (up to 100).

## `checkBodacc` (type: `boolean`):

Look up each company in the official BODACC gazette: insolvency proceedings, deregistration, business sales, last accounts filed, plus a risk level. Charged per company on top of the base price.

## `splitLargeSearches` (type: `boolean`):

The official API stops at 10,000 results per query. When on, large searches are split automatically (by department, postal code, sector…) and merged without duplicates.

## `proxyConfiguration` (type: `object`):

Usually not needed. The official API limits requests per IP address; a proxy can help if you see many rate-limit warnings.

## Actor input object example

```json
{
  "mode": "search",
  "nafCodes": [
    "62.01Z"
  ],
  "departments": [
    "69"
  ],
  "status": "active",
  "identifiers": [
    "552032534",
    "35600000038933"
  ],
  "companyNames": [
    "Danone",
    "Michelin, Clermont-Ferrand",
    "Back Market"
  ],
  "minMatchScore": 75,
  "address": "Place Bellecour, Lyon",
  "radiusKm": 1,
  "maxResults": 50,
  "countOnly": false,
  "resultLevel": "auto",
  "includeDirectors": true,
  "includeEstablishments": false,
  "checkBodacc": false,
  "splitLargeSearches": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

SIREN, name, status, activity, size, revenue, location, VAT number.

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

Every field, including directors, finances history, certifications, establishments and BODACC risk check.

# 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 = {
    "mode": "search",
    "nafCodes": [
        "62.01Z"
    ],
    "departments": [
        "69"
    ],
    "identifiers": [
        "552032534",
        "35600000038933"
    ],
    "companyNames": [
        "Danone",
        "Michelin, Clermont-Ferrand",
        "Back Market"
    ],
    "address": "Place Bellecour, Lyon",
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("yck69/french-company-data").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 = {
    "mode": "search",
    "nafCodes": ["62.01Z"],
    "departments": ["69"],
    "identifiers": [
        "552032534",
        "35600000038933",
    ],
    "companyNames": [
        "Danone",
        "Michelin, Clermont-Ferrand",
        "Back Market",
    ],
    "address": "Place Bellecour, Lyon",
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("yck69/french-company-data").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 '{
  "mode": "search",
  "nafCodes": [
    "62.01Z"
  ],
  "departments": [
    "69"
  ],
  "identifiers": [
    "552032534",
    "35600000038933"
  ],
  "companyNames": [
    "Danone",
    "Michelin, Clermont-Ferrand",
    "Back Market"
  ],
  "address": "Place Bellecour, Lyon",
  "maxResults": 50
}' |
apify call yck69/french-company-data --silent --output-dataset

```

## MCP server setup

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

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/eU7vIBxJlpuRzgO11/builds/m3ndIPtkoE66dzuwx/openapi.json
