# French Company Data Scraper (`orizondeveloppement/french-company-data-scraper`) Actor

Export French company data from the official government registry: SIREN, SIRET, EU VAT number, NAF code, staff size, revenue, address and GPS. Filter by sector, region, size and certification.

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

## Pricing

$5.00 / 1,000 company data results

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## French Company Data Scraper — SIREN, SIRET & VAT from the Official Registry

Export **French company data** straight from the French government's official business registry: SIREN, SIRET, EU VAT number, legal name, NAF/APE activity code, staff size, revenue, legal form, full address and GPS coordinates — as a clean CSV, Excel, JSON or API feed.

No account, no API key, no cookies, no scraping of a blocked website. This Actor reads the **open government registry** that consolidates INSEE SIRENE, the national business register (RNE) and published company accounts.

***

### Why this Actor exists

France has 4+ million registered businesses, and the official public API refuses to paginate past **10,000 results per query**. Anyone who has tried to export "all construction companies with 20-99 employees" has hit that wall.

**This Actor breaks the wall.** When a query is too broad, it automatically slices it by department, then by staff bracket, then by activity sector, runs each slice separately and deduplicates by SIREN. You ask for 80,000 companies; you get 80,000 companies.

It also flattens the registry's deeply nested JSON into **one flat row per company** — the part that actually makes the data usable in a spreadsheet or a CRM import.

***

### What you can build with it

| Use case | How |
|---|---|
| **B2B lead lists** | Filter by activity code, region, staff size and revenue. Export to CSV, import into your CRM. |
| **Territory mapping** | Every company within X km of a postcode, with GPS coordinates, ready to plot. |
| **CRM cleanup & enrichment** | Paste your SIREN/SIRET column, get back current legal name, address, VAT number and whether the company still exists. |
| **VAT number lookup** | Bulk-resolve intra-EU VAT numbers for French counterparties. |
| **Market sizing** | Count and profile every company in a sector, region or size band. |
| **Supplier & counterparty checks** | Confirm a French company is active, see its size, revenue and registered address. |
| **Green-renovation prospecting** | `RGE certified` filter — the state certification required for subsidised energy renovation work. |
| **Training-market prospecting** | `Qualiopi certified` filter — mandatory for publicly funded training providers. |

***

### Three modes

#### 1. Search by filters

Build a list from any combination of 20+ filters.

```json
{
  "mode": "search",
  "nafCodes": "62.01Z",
  "departments": "75,92,93,94",
  "staffBrackets": ["11", "12", "21"],
  "excludeSoleTraders": true,
  "maxResults": 5000
}
```

→ Every software company in and around Paris with 10 to 99 employees, sole traders excluded.

#### 2. Search around GPS coordinates

Every business within a radius, returned **per physical location** rather than per head office.

```json
{
  "mode": "nearPoint",
  "latitude": "44.8378",
  "longitude": "-0.5792",
  "radiusKm": 2,
  "nafCodes": "56.10A",
  "maxResults": 500
}
```

→ Every restaurant within 2 km of central Bordeaux, closed locations filtered out.

#### 3. Enrich a list of SIREN / SIRET numbers

Paste identifiers you already have, get complete current records back.

```json
{
  "mode": "enrich",
  "identifiers": ["552100554", "82375264700029"]
}
```

→ Full record per company. Identifiers with no match come back flagged `Not found`, so nothing silently disappears from your file.

***

### Output

One flat row per company, 42 fields. Sample:

```json
{
  "siren": "479144438",
  "siret_headquarters": "47914443800161",
  "company_name": "INCOMM",
  "vat_number": "FR26479144438",
  "status": "Active",
  "creation_date": "2004-10-19",
  "legal_form_code": "5710",
  "legal_form": "SAS - simplified joint-stock company",
  "company_size": "PME",
  "staff_bracket": "50-99 employees",
  "naf_code": "62.01Z",
  "naf_section": "J",
  "establishments_total": 48,
  "establishments_open": 15,
  "address": "PARC AQUILAE IMM CELADON ETAGE 2 2 RUE DE LA BLANCHERIE 33370 ARTIGUES-PRES-BORDEAUX",
  "postal_code": "33370",
  "city": "ARTIGUES-PRES-BORDEAUX",
  "department": "33",
  "latitude": 44.853342,
  "longitude": -0.503041406,
  "revenue_eur": 9617458,
  "net_income_eur": -175093,
  "financials_year": "2021",
  "is_rge_certified": false,
  "is_qualiopi_certified": false,
  "collective_agreement_ids": "1486, 0804, 9999",
  "registry_url": "https://annuaire-entreprises.data.gouv.fr/entreprise/479144438"
}
```

Export as CSV, Excel, JSON, XML or JSONL, or pull it from the Apify API.

***

### Filters available

**Activity** — NAF/APE codes, NAF section (21 sectors)
**Geography** — departments, region, postal codes, INSEE city codes, GPS radius
**Size** — 15 INSEE staff brackets, company category (SME / mid-cap / large)
**Financials** — minimum and maximum annual revenue
**Legal** — legal form codes, exclude sole traders, include or exclude ceased companies
**Certifications** — RGE (green renovation), Qualiopi (training), organic, social economy, registered training provider, association

***

### Notes on the data

- **Source**: the French government's open company registry, published under an open licence that explicitly permits reuse. This is public open data, not a scraped private website.
- **Revenue and net income** are only present for companies that publish their accounts. Many small French companies legally opt out of publication, so these fields are often empty. That is a property of the source, not a bug.
- **Staff brackets** are ranges, not exact headcounts — that is how INSEE publishes them.
- **Non-disclosed companies**: businesses that have exercised their right to opt out of public listing are excluded at source.

### GDPR

Company records are not personal data. **Director names are.** The `Include company directors` option is **off by default**, and sole-trader records are tied to a named individual — the `Exclude sole traders` option removes them in one click. If you enable director data or keep sole traders, you are the data controller for that processing and need your own lawful basis under GDPR.

***

### Pricing

Pay per result. You are charged for the companies you actually receive — no monthly subscription, no minimum commitment.

### Support

Found a bug, or need a filter that is not exposed yet? Open an issue on the Actor's Issues tab. Feature requests that make sense for everyone get built.

# Actor input Schema

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

Search = build a list from filters. Near point = every company within a radius of GPS coordinates. Enrich = paste SIREN/SIRET numbers you already have and get full records back.

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

Company name, trade name, or keyword. Leave empty to rely on filters only.

## `nafCodes` (type: `string`):

Comma-separated NAF codes, e.g. 62.01Z,62.02A. Each code is fetched in a separate pass.

## `nafSection` (type: `string`):

Broad activity sector. F = construction, G = retail and trade, I = hospitality, J = information and communication, M = professional and scientific, Q = health and social work.

## `departments` (type: `string`):

Comma-separated French department codes, e.g. 75,92,2A,974. Each department is fetched in a separate pass.

## `region` (type: `string`):

INSEE region code, e.g. 11 for Ile-de-France, 84 for Auvergne-Rhone-Alpes, 93 for Provence-Alpes-Cote d Azur.

## `postalCodes` (type: `string`):

Comma-separated postal codes, e.g. 75001,69003.

## `cityCodes` (type: `string`):

Comma-separated INSEE commune codes (not postal codes), e.g. 75056,69123.

## `staffBrackets` (type: `array`):

INSEE employee brackets. Leave empty for any size.

## `companySizes` (type: `array`):

Official INSEE company category.

## `legalForms` (type: `string`):

Comma-separated INSEE legal category codes, e.g. 5710 for SAS, 5499 for SARL, 6540 for SCI, 9220 for association.

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

Only companies that publish their accounts have revenue on file.

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

Upper bound on annual revenue. Only companies that publish their accounts have revenue on file.

## `onlyRgeCertified` (type: `boolean`):

RGE is the French certification required to carry out state-subsidised energy renovation work.

## `onlyQualiopiCertified` (type: `boolean`):

Qualiopi is mandatory for training providers that want access to public funding.

## `onlyOrganicCertified` (type: `boolean`):

Companies with at least one establishment certified by the French organic agency (Agence Bio).

## `onlySocialEconomy` (type: `boolean`):

Companies that belong to the French social and solidarity economy (ESS) sector.

## `onlyTrainingProviders` (type: `boolean`):

Companies with at least one establishment registered as a training organisation (organisme de formation).

## `onlyAssociations` (type: `boolean`):

Non-profit associations only (identified by their RNA number or legal form).

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

Recommended for B2B prospecting: keeps incorporated companies only, and avoids records tied to a named individual.

## `includeInactive` (type: `boolean`):

Off by default, so you only get companies that are currently active.

## `latitude` (type: `string`):

Decimal degrees, e.g. 44.8378 for Bordeaux. Used in near-point mode only.

## `longitude` (type: `string`):

Decimal degrees, e.g. -0.5792 for Bordeaux.

## `radiusKm` (type: `integer`):

Search radius around the GPS point, in kilometres (maximum 50). Used in near-point mode only.

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

Used in enrich mode only. Paste 9-digit SIREN or 14-digit SIRET numbers, one per line.

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

Hard stop on the number of unique companies. Set it deliberately: broad filters can match millions.

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

Adds names and roles of registered directors. These are personal data under GDPR: only enable this if you have a lawful basis for processing them.

## Actor input object example

```json
{
  "mode": "search",
  "onlyRgeCertified": false,
  "onlyQualiopiCertified": false,
  "onlyOrganicCertified": false,
  "onlySocialEconomy": false,
  "onlyTrainingProviders": false,
  "onlyAssociations": false,
  "excludeSoleTraders": false,
  "includeInactive": false,
  "radiusKm": 5,
  "maxResults": 1000,
  "includeDirectors": false
}
```

# Actor output Schema

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

One row per French company, with SIREN, SIRET, EU VAT number, NAF activity code, staff bracket, revenue, address and GPS coordinates.

# 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 = {
    "query": "",
    "nafCodes": "",
    "departments": "",
    "region": "",
    "postalCodes": "",
    "cityCodes": "",
    "legalForms": "",
    "latitude": "",
    "longitude": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("orizondeveloppement/french-company-data-scraper").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 = {
    "query": "",
    "nafCodes": "",
    "departments": "",
    "region": "",
    "postalCodes": "",
    "cityCodes": "",
    "legalForms": "",
    "latitude": "",
    "longitude": "",
}

# Run the Actor and wait for it to finish
run = client.actor("orizondeveloppement/french-company-data-scraper").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 '{
  "query": "",
  "nafCodes": "",
  "departments": "",
  "region": "",
  "postalCodes": "",
  "cityCodes": "",
  "legalForms": "",
  "latitude": "",
  "longitude": ""
}' |
apify call orizondeveloppement/french-company-data-scraper --silent --output-dataset

```

## MCP server setup

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

```

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/wM6g1d2dR12JcMlH0/builds/WUjrg62QriE2PUBiD/openapi.json
