# Pappers French Company Data Scraper (`crawlerbros/pappers-scraper`) Actor

Search and look up French company registry data from Pappers.fr - SIREN/SIRET, legal form, address, activity (NAF), workforce, share capital, financials, and more. Free, public, no login required.

- **URL**: https://apify.com/crawlerbros/pappers-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

## Pappers French Company Data Scraper

Search and look up French company registry data from [Pappers.fr](https://www.pappers.fr) — legal identity (SIREN/SIRET), legal form, registered address, activity (NAF/APE code), workforce size, share capital, and available financial figures. Data comes from official French registries (RCS, RNE, INSEE) as published by Pappers. No login, no API key, no cookies required.

### What this actor does

- **Two modes:** `search` (find companies by name/keyword with filters) and `companyLookup` (fetch a company profile directly by its SIREN number)
- **Filters:** postal code, department (dropdown — all 101 French departments incl. Corsica's 2A/2B and overseas), region (mainland + overseas), city, activity (NAF/APE code — full 732-code dropdown), legal form, collective bargaining agreement (IDCC code), workforce range, turnover range, share-capital range, creation-date range, active vs. ceased status
- **Rich company data:** legal identity, registered address, activity, workforce, share capital, turnover / net income / net margin (when disclosed), recent official BODACC legal announcements (creation, modification, sale, deregistration, insolvency proceedings, accounts filing), and the company's recent filed legal acts / annual accounts on record at the RCS/RNE
- **Empty fields are omitted** — every record only contains fields Pappers actually publishes for that company

### Output per company

#### `search` mode

- `siren` — 9-digit French company identifier
- `name`, `entityType` (`company` / `individual` — companies & associations vs. sole-trader/entrepreneur individuel registrations), `legalFormCode`, `legalFormName`
- `status` (`active` / `ceased`, derived from the company's actual RCS/RNE registration status and any filed cessation date — omitted for the rare foreign entity with no French registration to check against), `dateOfCreation`, `cessationDate`
- `purpose` — declared business purpose
- `activityCode`, `activityName` — NAF/APE activity classification
- `shareCapital`, `shareCapitalCurrency`
- `workforceMin`, `workforceMax`, `workforceDate` — INSEE workforce bracket
- `addressLine1`, `addressLine2`, `postalCode`, `city`, `country`
- `regionCode`, `region` — French administrative region (INSEE code + name), derived from the postal code
- `registrationStatus`, `registrationLocation`, `registrationDate` — RCS/RNE registration status, registry office, and registration date
- `turnover`, `netIncome`, `netMarginPercent` — when the latest filed financial statement discloses them (net margin computed from the two)
- `recentPublications[]` — up to 5 most recent official BODACC legal announcements for the company (`date`, `category` — Création / Modification / Vente / Radiation / Procédure collective / Dépôt des comptes, and the full official announcement text)
- `recentDocuments[]` — up to 5 most recent legal acts / annual accounts filed and on record at the RCS/RNE (`date`, `type` — Acte / Comptes annuels, and a `description` of the filing when Pappers has classified it, e.g. "Statuts mis à jour", "Procès-verbal d'assemblée générale ordinaire")
- `pappersUrl` — link to the full company profile on pappers.fr
- `recordType: "company"`, `scrapedAt`

#### `companyLookup` mode

- `siren`, `name`, `siretHeadOffice`
- `legalFormName`, `vatNumber`, `rcsNumber`
- `activityCode`, `activityName`, `activityDescription`, `activityDomain` — broader industry domain the declared activity belongs to (e.g. "Publicité et études de marché" for an advertising agency's specific "Activités des agences de publicité" activity)
- `address`, `workforceText`, `dateOfCreation`, `status`
- `shareCapital`, `shareCapitalCurrency`
- `rcsInscriptionStatus`, `rneInscriptionStatus` — registration status with the Trade and Companies Register (RCS) and the National Business Register (RNE), typically `Inscrit`
- `fiscalYearEndDate` — the company's recurring annual accounting-period closing date, `DD/MM` (e.g. `31/12`)
- `executives[]` — named company officers/directors, where publicly listed
- `establishments[]` — every registered location on file (head office + secondary establishments): `siret`, `type` (`headquarters` / `secondary`), `status` (`active` / `closed`), `address`, `dateOfCreation`
- `pappersUrl`
- `recordType: "company"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `companyLookup` |
| `searchQuery` | string | `boulangerie` | Company name or keyword (mode=search) |
| `sirens` | array | – | 9-digit SIREN numbers (mode=companyLookup). A 14-digit SIRET is also accepted and truncated to its SIREN. |
| `postalCode` | string | – | French postal code, e.g. `75001` |
| `departement` | string | – | French department (dropdown): all 101 departments, e.g. `75` Paris, `69` Rhône, `13` Bouches-du-Rhône, `2A`/`2B` Corsica, plus overseas departments |
| `region` | string | – | French region (dropdown): Île-de-France, Auvergne-Rhône-Alpes, PACA, Occitanie, Nouvelle-Aquitaine, Grand Est, Hauts-de-France, Normandie, Bretagne, Pays de la Loire, Bourgogne-Franche-Comté, Centre-Val de Loire, Corse, plus overseas regions (Guadeloupe, Martinique, Guyane, La Réunion, Mayotte) |
| `city` | string | – | City name, e.g. `Paris` |
| `nafCode` | string | – | Activity (NAF/APE) code — dropdown covering all 732 official INSEE NAF Rev. 2 codes, e.g. `10.71C` (bakeries) |
| `legalForm` | string | – | Legal form (dropdown): EI, SNC, SCS, EURL, SARL, SA, SAS, SASU, GIE, SCI, Association, Fondation |
| `conventionCollective` | string | – | Collective bargaining agreement (convention collective) IDCC code, e.g. `1596` (Syntec), `1517` (bâtiment) |
| `workforceMin` | int | – | Minimum employee count |
| `workforceMax` | int | – | Maximum employee count |
| `turnoverMin` | int | – | Minimum latest filed annual turnover, in EUR |
| `turnoverMax` | int | – | Maximum latest filed annual turnover, in EUR |
| `shareCapitalMin` | int | – | Minimum declared share capital, in EUR |
| `shareCapitalMax` | int | – | Maximum declared share capital, in EUR |
| `dateCreationMin` | string | – | Only companies created on/after this date (`YYYY-MM-DD`) |
| `dateCreationMax` | string | – | Only companies created on/before this date (`YYYY-MM-DD`) |
| `includeCeased` | bool | `false` | Include closed/dissolved companies |
| `maxItems` | int | `50` | Hard cap (1–1000) |

#### Example: bakeries in Paris (75)

```json
{
  "mode": "search",
  "searchQuery": "boulangerie",
  "departement": "75",
  "maxItems": 50
}
```

#### Example: active SAS companies founded since 2022

```json
{
  "mode": "search",
  "searchQuery": "consulting",
  "legalForm": "5710",
  "dateCreationMin": "2022-01-01",
  "includeCeased": false
}
```

#### Example: mid-sized restaurants by turnover and share capital

```json
{
  "mode": "search",
  "searchQuery": "restaurant",
  "turnoverMin": 1000000,
  "turnoverMax": 5000000,
  "shareCapitalMin": 50000,
  "maxItems": 50
}
```

#### Example: bakeries across the Auvergne-Rhône-Alpes region

```json
{
  "mode": "search",
  "searchQuery": "boulangerie",
  "region": "84",
  "maxItems": 50
}
```

#### Example: consulting companies under the Syntec collective agreement

```json
{
  "mode": "search",
  "searchQuery": "conseil",
  "conventionCollective": "1596",
  "maxItems": 50
}
```

#### Example: look up specific companies by SIREN

```json
{
  "mode": "companyLookup",
  "sirens": ["322120916", "331517938"]
}
```

### Use cases

- **Sales & lead generation** — find companies in a target city, sector, or size band
- **Due diligence & KYC** — pull legal identity, address, and status before onboarding a French counterparty
- **Market research** — count and profile companies by activity code or legal form
- **Supplier/vendor verification** — confirm a SIREN corresponds to an active, registered company
- **Data enrichment** — attach official registry fields to an existing company list

### FAQ

**What's Pappers?**  A free French platform aggregating official company registry data (RCS, RNE, INSEE, BODACC) for every registered business in France. See [pappers.fr](https://www.pappers.fr).

**What's a SIREN?**  A unique 9-digit identifier assigned by INSEE to every legal entity registered in France. A SIRET extends it with a 5-digit establishment suffix — pasting a 14-digit SIRET into the `sirens` input still works, it's automatically truncated to the SIREN.

**Why are some fields missing on some companies?**  Pappers only publishes what's officially disclosed. Small or recently created companies often don't have a filed workforce bracket, financial statement, or listed executives yet — those fields are simply omitted for that record.

**Does `legalForm` cover every legal form in France?**  It covers the most common ones (EI, SNC, SCS, EURL, SARL, SA, SAS, SASU, GIE, SCI, Association, Fondation). Leave it blank to search across all legal forms.

**What's `conventionCollective`?**  France's collective bargaining agreements (conventions collectives nationales) apply industry-specific labor rules to a company's employees. Each one has a 4-digit IDCC identifier (findable via [travail-emploi.gouv.fr](https://travail-emploi.gouv.fr) or a company's own Pappers profile); pass it to `conventionCollective` to restrict results to companies covered by that agreement.

**What's the difference between `departement` and `region`?**  A department (e.g. `75` Paris) is a smaller administrative unit; a region (e.g. `11` Île-de-France) groups several departments. Use `region` for a broader geographic sweep, or combine both for a precise, narrower area within a region.

**Can I filter to only active companies?**  Yes — `includeCeased` defaults to `false`, returning only currently registered/active companies. Set it to `true` to include closed or dissolved companies too.

**What does `status` actually mean?**  `active` means the company is currently registered with the RCS/RNE and has no filed cessation date; `ceased` means it's been deregistered or has a filed cessation date. For the small number of foreign entities with no French RCS registration to check (e.g. a foreign parent company), `status` is omitted rather than guessed.

**Is this data official?**  Yes — it originates from the French commercial court registries (RCS), the National Business Register (RNE), and INSEE, republished by Pappers.

**What's in `recentPublications`?**  Official legal announcements published in the BODACC (Bulletin officiel des annonces civiles et commerciales) — France's public gazette for company creations, changes of management/capital/address, sales, deregistrations, insolvency proceedings, and annual accounts filings. Up to the 5 most recent are included per company, when Pappers has any on file.

**What's in `recentDocuments`?**  The company's own filed documents on record at the RCS/RNE registry — legal acts (`Acte`, e.g. meeting minutes, updated bylaws) and annual accounts filings (`Comptes annuels`). This is distinct from `recentPublications`: publications are the public BODACC gazette announcement *about* an event, while documents are the underlying filing itself. Up to the 5 most recent are included per company, when Pappers has any on file.

**What's in `establishments` (companyLookup mode)?**  Every physical location registered under the company's SIREN — the head office plus any secondary establishments (branches, stores, warehouses) — each with its own 14-digit SIRET, activity status, address, and registration date. Useful for mapping a company's footprint beyond its headquarters address.

**What are `rcsInscriptionStatus` / `rneInscriptionStatus`?**  Whether the company is currently registered with France's Trade and Companies Register (RCS, for commercial entities) and/or the National Business Register (RNE, which replaced the old RNCS/CMA/Agriculture registries in 2023). Most active companies show `Inscrit` for both.

**What's `fiscalYearEndDate`?**  The company's declared annual accounting-period closing date (e.g. `31/12` for a calendar-year close), as `DD/MM` — this is a recurring date, not tied to a specific year.

**How fresh is the data?**  Pappers re-syncs from RCS, RNE, and INSEE on a rolling basis (often daily), as shown on each company's profile page.

**Why did I get fewer companies than `maxItems`?**  Pappers' free/unauthenticated search only exposes the first ~400 raw matches for any given `searchQuery` + filter combination. If your query is broad, narrow it (add a `postalCode`, `departement`, or `nafCode` filter) to bring more of the results you care about within that window, or split a broad query into several narrower ones.

# Actor input Schema

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

What to fetch.

## `searchQuery` (type: `string`):

Company name or keyword to search for (mode=search).

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

9-digit French SIREN company identifiers, e.g. `322120916`. A 14-digit SIRET (SIREN + establishment suffix) is also accepted and truncated to its SIREN.

## `postalCode` (type: `string`):

Restrict results to a French postal code, e.g. `75001`.

## `departement` (type: `string`):

Restrict results to a French administrative department (includes overseas departments and Corsica's 2A/2B split).

## `city` (type: `string`):

Restrict results to a city name, e.g. `Paris`, `Lyon`, `Marseille`.

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

Restrict results to a French administrative region (includes overseas regions).

## `nafCode` (type: `string`):

Restrict results to a specific French NAF/APE activity code (INSEE nomenclature).

## `legalForm` (type: `string`):

Restrict results to a specific French legal form (INSEE catégorie juridique code).

## `conventionCollective` (type: `string`):

Restrict results to companies covered by a specific French collective bargaining agreement (convention collective nationale), by its IDCC code, e.g. `1596` (bureaux d'études techniques / Syntec), `1979` (particulier employeur), `1517` (bâtiment).

## `workforceMin` (type: `integer`):

Drop companies with fewer employees than this.

## `workforceMax` (type: `integer`):

Drop companies with more employees than this.

## `turnoverMin` (type: `integer`):

Only companies whose latest filed annual turnover is at least this amount (EUR). Companies that haven't disclosed a turnover figure are unaffected by this filter.

## `turnoverMax` (type: `integer`):

Only companies whose latest filed annual turnover is at most this amount (EUR). Companies that haven't disclosed a turnover figure are unaffected by this filter.

## `shareCapitalMin` (type: `integer`):

Only companies with a declared share capital of at least this amount (EUR).

## `shareCapitalMax` (type: `integer`):

Only companies with a declared share capital of at most this amount (EUR).

## `dateCreationMin` (type: `string`):

Only companies created on or after this date (YYYY-MM-DD). Invalid/malformed dates are ignored.

## `dateCreationMax` (type: `string`):

Only companies created on or before this date (YYYY-MM-DD). Invalid/malformed dates are ignored.

## `includeCeased` (type: `boolean`):

When off, only actively-registered companies are returned. When on, closed/dissolved companies are included too.

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

Hard cap on emitted records.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "boulangerie",
  "sirens": [],
  "departement": "",
  "region": "",
  "nafCode": "",
  "legalForm": "",
  "includeCeased": false,
  "maxItems": 50
}
```

# Actor output Schema

## `companies` (type: `string`):

Dataset containing all scraped Pappers company records.

# 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",
    "searchQuery": "boulangerie",
    "sirens": [],
    "departement": "",
    "region": "",
    "nafCode": "",
    "legalForm": "",
    "includeCeased": false,
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/pappers-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 = {
    "mode": "search",
    "searchQuery": "boulangerie",
    "sirens": [],
    "departement": "",
    "region": "",
    "nafCode": "",
    "legalForm": "",
    "includeCeased": False,
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/pappers-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 '{
  "mode": "search",
  "searchQuery": "boulangerie",
  "sirens": [],
  "departement": "",
  "region": "",
  "nafCode": "",
  "legalForm": "",
  "includeCeased": false,
  "maxItems": 50
}' |
apify call crawlerbros/pappers-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/pappers-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/FfPejcmWkAb75bH4h/builds/zto1gMeu5nKZkOtFY/openapi.json
