# France Company Registry Scraper — SIREN, Officers & Revenue (`s-r/france-company-registry`) Actor

Search the France company registry by name, SIREN or SIRET. Export legal form, NAF code, address, VAT number, officers and published revenue for B2B prospecting, KYC checks and market analysis, with industry, location and size filters.

- **URL**: https://apify.com/s-r/france-company-registry.md
- **Developed by:** [SR](https://apify.com/s-r) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.00 / 1,000 company records

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 Company Registry Scraper

Search the France company registry by business name, SIREN or SIRET and export company records with officers, VAT numbers and published revenue, ready for B2B prospecting, KYC checks and market analysis. The source combines public Sirene and RNE information from the official Recherche d’entreprises service. Results include readable legal forms and NAF descriptions alongside the original codes, so a spreadsheet of French companies needs no manual lookup tables.

One run can check a single SIREN, enrich a list of thousands of identifiers, or build a prospect list such as every active company with a given NAF code in one department. Each company arrives as one structured JSON row: identity, status, headquarters, industry, employee band, VAT number and the latest revenue and net income the register publishes.

### What the France company registry provides

Each company record identifies a French legal entity through its nine-digit SIREN. The record includes its published name, administrative status, incorporation date, headquarters, industry classifications and available VAT numbers. When the register publishes financial information, revenue and net income appear together with their reference year. Figures are integer euro amounts rather than formatted currency strings.

Officers are included when requested and when their name and role are available. Both individual officers and corporate officers can appear. Individual officers may have a birth year and birth month. Corporate officers may have their own SIREN, distinct from the company they represent. These records are linked to company results through `registry_id` and are available in the run’s **OFFICERS** key-value record.

### Input

Provide `query` for a company name, address, officer name or exact identifier. A SIREN contains nine digits and identifies a company; a SIRET contains fourteen digits and identifies an establishment. For several identifiers, use the `sirens` array. The array accepts SIREN and SIRET values, removes spaces and dots and ignores repeated identifiers. Supply either a query or an identifier list.

This input retrieves the company behind Decathlon’s published SIREN:

```json
{"query":"306138900","max_results":1,"include_officers":true}
```

You can also search without a text query by providing a filter. `naf_codes` accepts official NAF rev.2 activity codes, as an array or comma-separated text. `postal_codes`, `departments` and `regions` narrow the search by establishment location. `legal_forms` accepts INSEE legal-form codes. `employee_ranges` selects published employee bands, while `company_category` accepts PME, ETI or GE.

Set `status` to `active`, `closed` or `any`; the default is `any`. Officer name filters use `officer_last_name` and `officer_first_name`. Financial filters use `revenue_min`, `revenue_max`, `net_income_min` and `net_income_max`, expressed in euros. Negative net income is allowed. A published employee band describes a range and does not imply an exact staff count.

`max_results` defaults to 100 and limits unique companies rather than officer records. The maximum is 10,000 accessible company results. `include_officers` defaults to true. Setting it to false produces no officer records. `page_size` controls source page size, up to 25; its ordinary default is 25. Large requests continue automatically within the actor’s available run time. For direct API use, submit the returned `next_cursor` with the original search and options to continue collection.

### Output

The default dataset contains **one row per company**. Core fields include `source`, `fetched_at`, `jurisdiction`, `registry_id`, `name`, `status`, `legal_form`, `incorporation_date`, `dissolution_date`, `address`, `industry_codes` and `vat_number`. French identifiers and codes remain available through `siren`, `head_office_siret`, `legal_form_code` and `naf_code`. Every record identifies its jurisdiction as FR. VAT numbers are returned the same way for name searches, filter searches and SIREN or SIRET lookups: `vat_number` holds the published number and `vat_numbers` lists every published number.

Financial fields include `revenue`, `net_income`, `financial_year` and the complete available `finances` list. The newest published year determines the convenience fields. Missing financial information is null, and a published zero amount remains zero. Address coordinates are numbers when available. `matched_establishment` identifies the exact matching establishment for a SIRET search, while `address` continues to describe the company headquarters.

The OFFICERS record is a JSON array with `registry_id`, `company_name`, `name`, `role`, `officer_type` and available birth information. `officers_count` on each company counts its delivered officers. Officers without a published role are excluded because a role cannot be inferred. They are not replaced with an invented title. The MISSING-SIRENS record lists identifiers that returned no company. The OUTPUT record contains delivery counts, collection warnings and charging information.

#### France company registry output example

This is the Decathlon row for SIREN 306138900, taken from the stored example output and shortened to the most-used fields. The full row also carries `naf25_code`, `naf_section`, employee and category years, trade names, register labels and update timestamps.

```json
{
  "source": "france-company-registry",
  "jurisdiction": "FR",
  "fetched_at": "2026-10-05T03:14:56.859Z",
  "registry_id": "306138900",
  "name": "DECATHLON",
  "siren": "306138900",
  "status": "active",
  "legal_form": "Société européenne",
  "legal_form_code": "5800",
  "incorporation_date": "1977-01-01",
  "dissolution_date": null,
  "address": {
    "street": "4 BOULEVARD DE MONS",
    "postal_code": "59650",
    "city": "VILLENEUVE-D'ASCQ",
    "country": "FR",
    "department": "59",
    "latitude": 50.645137179,
    "longitude": 3.1417124642
  },
  "industry_codes": [
    {
      "scheme": "naf",
      "code": "68.20B",
      "description": "Location de terrains et d’autres biens immobiliers"
    },
    {
      "scheme": "nace",
      "code": "68.20"
    }
  ],
  "vat_number": "FR51306138900",
  "vat_numbers": [
    "FR51306138900"
  ],
  "naf_code": "68.20B",
  "naf_label": "Location de terrains et d’autres biens immobiliers",
  "company_category": "GE",
  "employee_range": "5 000 à 9 999 salariés",
  "finances": [
    {
      "year": 2025,
      "revenue": 16868995000,
      "net_income": 845133000
    }
  ],
  "financial_year": 2025,
  "revenue": 16868995000,
  "net_income": 845133000,
  "head_office_siret": "30613890001294",
  "establishments_count": 385,
  "open_establishments_count": 46,
  "officers_count": 16,
  "register_url": "https://annuaire-entreprises.data.gouv.fr/entreprise/306138900"
}
```

Decathlon has 16 published officers in this example. Each one is a separate entry in the OFFICERS record with the same `registry_id`, the company name, the officer's name, a role such as `Administrateur` or `Directeur général délégué`, `officer_type` (`person` or `company`) and, for individuals, the published birth year and month.

### Pricing

The prepared billing configuration counts one company event per delivered company. Officers and available financial figures are included in that company result. Officer records do not create additional company events, and a search returning no companies creates no company events. Consult the actor’s current Pricing tab for its published event price; the code does not set a marketplace price.

Users without a paid Apify plan receive at most ten companies in a run. The cap counts company dataset rows, and the associated officers remain available for those delivered companies. Missing identifiers do not consume a company result. Users with a paid plan can request the larger configured volume, subject to the source’s accessible result limit and the actor’s run time.

### Use cases for French company data

- **B2B lead generation in France.** Filter by NAF code, department or postal code, keep only active companies, and add revenue thresholds to target firms of the right size. The employee band and PME/ETI/GE category help separate small businesses from large groups.
- **KYC and supplier checks.** Look up a SIREN or SIRET from an invoice or contract and confirm the legal name, legal form, active or dissolved status, registered address, VAT number and current officers in one row.
- **CRM enrichment.** Feed a column of SIREN numbers through `sirens` and receive one company row per identifier. Identifiers that do not exist land in MISSING-SIRENS instead of producing empty rows, so the merge back into your CRM stays clean.
- **Market analysis.** Count companies per activity, region or size band, compare published revenue across competitors, or follow new incorporations in a sector by sorting on `incorporation_date`.
- **Officer research.** Search by officer last name and first name to find the companies a person directs, with their role in each.

### Comparison with other French company data sources

| | This actor | Official register website | Paid French company databases | Other Apify actors |
|---|---|---|---|---|
| Source | Public Sirene and RNE data | Same public data | Public data plus own additions | Varies: public API or third-party sites |
| Bulk export | Up to 10,000 companies per search, JSON, CSV or Excel | One company per page | Usually by subscription | Varies |
| Officers | Included in the same run | Shown per company | Usually included | Usually included |
| Revenue and net income | Included when published | Shown per company | Included, sometimes with more years | Not always |
| Filters | NAF, postal code, department, region, legal form, employee band, category, status, officer name, revenue, net income | Similar filters, interactive only | Extensive | Varies per actor |
| Account needed | Apify account only | None | Yes, with a paid plan | Apify account |

The official website is the best choice for checking one company by hand. Paid databases add data that is not in the public register, such as contact details or credit scores. This actor fills the gap between them: the public register in bulk, with officers and financials in the same run and one predictable price per company.

### Source coverage and interpretation

The register serves publicly diffusible company data. It does not supply every French business or every possible due-diligence field. This actor does not add websites, contact details, ultimate beneficial owners, capital or an LEI when the source does not publish them. Closure dates can remain empty even for dissolved companies. Revenue describes the latest year available in the source and should always be interpreted together with `financial_year`.

Original administrative status A becomes `active`; C becomes `dissolved`. Published legal forms and NAF codes receive descriptions from the source’s official label tables. Unknown codes retain their original value without an invented description. NACE classifications are derived from the corresponding NAF rev.2 class. The NAF 2025 code is preserved separately when available.

### FAQ

#### Can I look up a SIRET instead of a SIREN?

Yes. Enter the fourteen-digit SIRET as `query` or as an entry in `sirens`. The result remains a company record, with the matching establishment identified separately when the source provides it. Multiple establishments of the same company produce one company result.

#### Are officers charged separately?

No. The configured company event counts delivered companies. Officers are linked records in OFFICERS and do not increase the number of charged company results. They are available only where the public register supplies a name and a role.

#### Does every company have revenue and a VAT number?

No. Coverage depends on the available public records. Missing finance values remain null, and missing VAT numbers are omitted from the single-number field. The full `vat_numbers` list is empty when the source supplies none. VAT numbers come only from the published records; they are never calculated from a SIREN.

#### What happens when the source limits requests?

Temporary source limits are retried within the collection budget. If collection stops after some companies were found, available results are retained and the run reports the interruption. Direct API users can resume with the returned cursor and the original options. Unknown identifiers are reported as missing instead of creating empty company rows.

#### Is this the same data as the official French company register?

Yes. The data comes from the official Recherche d’entreprises service, which publishes the Sirene register of INSEE and the national company register (RNE). Companies whose owners opted out of public diffusion are not served by the source and therefore cannot appear.

#### Can I use it as a Pappers or Societe.com alternative?

For the public register data, yes: SIREN, SIRET, legal form, NAF code, address, officers, VAT number and published revenue are all in the output, in bulk and as structured JSON. Documents such as Kbis extracts, full annual accounts, beneficial owners and credit scores are not part of the public source and are not included.

#### How do I build a list of companies in one sector and region?

Leave `query` empty and combine filters, for example `naf_codes` set to `["56.10A"]`, `departments` set to `["75"]` and `status` set to `active`. Raise `max_results` to the number of companies you need. Add `revenue_min` to keep only companies above a published revenue threshold.

#### Can I export the results to Excel or CSV?

Yes. The company dataset can be downloaded from the Apify console or API as JSON, CSV, Excel, XML or HTML. The OFFICERS record is a JSON array that you can join to the companies on `registry_id`.

# Actor input Schema

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

Company name, address, officer name, 9-digit SIREN or 14-digit SIRET. Use either query or sirens.

## `sirens` (type: `array`):

Identifiers to look up individually, retaining input order and removing duplicates.

## `naf_codes` (type: `array`):

NAF rev.2 codes as a string array or comma-separated string.

## `postal_codes` (type: `array`):

Filter by establishment postal codes.

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

Filter by establishment departments.

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

Filter by establishment regions.

## `legal_forms` (type: `array`):

Filter by legal forms, using the official code table.

## `employee_ranges` (type: `array`):

Filter by employee bands, using the official code table.

## `company_category` (type: `string`):

Official company size category.

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

Administrative company status. any applies no status filter.

## `officer_last_name` (type: `string`):

Filter by an officer surname.

## `officer_first_name` (type: `string`):

Filter by officer given names.

## `revenue_min` (type: `integer`):

Minimum available revenue in euros.

## `revenue_max` (type: `integer`):

Maximum available revenue in euros.

## `net_income_min` (type: `integer`):

Minimum available net income in euros; negative values are allowed.

## `net_income_max` (type: `integer`):

Maximum available net income in euros; negative values are allowed.

## `max_results` (type: `integer`):

Maximum unique companies across the entire cursor sequence, excluding officers.

## `include_officers` (type: `boolean`):

Include available officers with a published role in the separate officers output. Officers are included without an extra company charge.

## `page_size` (type: `integer`):

Companies requested per source page. Keep this unchanged when resuming a cursor.

## `cursor` (type: `string`):

Opaque continuation token returned as next_cursor. Keep the original search and options.

## Actor input object example

```json
{
  "query": "306138900",
  "status": "any",
  "max_results": 100,
  "include_officers": true,
  "page_size": 25
}
```

# Actor output Schema

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

One row per delivered company.

## `officers` (type: `string`):

Published officers of delivered companies, linked by registry_id.

## `missingSirens` (type: `string`):

Identifiers that returned no company.

## `output` (type: `string`):

Delivery counts, charges and warnings.

# 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": "306138900"
};

// Run the Actor and wait for it to finish
const run = await client.actor("s-r/france-company-registry").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": "306138900" }

# Run the Actor and wait for it to finish
run = client.actor("s-r/france-company-registry").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": "306138900"
}' |
apify call s-r/france-company-registry --silent --output-dataset

```

## MCP server setup

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

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/quYMIiL3ZT6Nl92QZ/builds/5Zk5rhwZ8YJwIwSbE/openapi.json
