# France Company Search: SIREN, VAT, Revenue & Directors (`larkmoor/france-company-search`) Actor

Search French companies by name, NAF activity code, department, postal code, size, revenue or label (RGE, Qualiopi...), or look up SIREN/SIRET lists. Official government API: VAT number, address, GPS, headcount, revenue, net income, directors. $2 per 1,000 companies.

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

## Pricing

from $1.70 / 1,000 companies

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

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 Search: SIREN, VAT, Revenue & Directors

Find French companies and get clean, structured company data in seconds: SIREN and SIRET numbers, legal name, legal form, NAF (APE) activity code, VAT number, head-office or local address with GPS coordinates, headcount band, latest revenue and net income, number of establishments, directors' names and roles, and certification labels such as RGE or Qualiopi.

Search by keyword, company name or director, filter by NAF code, department, postal code, region, size, revenue, legal form or label — or paste a list of SIREN/SIRET numbers to enrich a spreadsheet. Everything comes from the French government's official, free "API Recherche d'entreprises" (the API behind annuaire-entreprises.data.gouv.fr), which combines the INSEE Sirene register and the national companies register (RNE). No login, no browser, no proxies, no API key.

### What you can use it for

- **B2B lead lists for France**: every active plumber (NAF 43.22A) in the Rhône, every software company (62.01Z) in Paris with 10–49 employees, every RGE-certified installer in a region
- **Enriching a CRM or spreadsheet**: turn a column of SIREN or SIRET numbers into VAT numbers, addresses, NAF codes, headcount and revenue
- **KYC and supplier checks**: confirm a company exists, is still active, its legal form, its directors and its intra-EU VAT number
- **Market sizing**: count companies by activity, area and size band; compare revenue across a sector
- **Local prospecting**: switch to "one row per establishment" to get each matching shop, restaurant or branch in a postal code, with its trade name (enseigne)

### Why this one

- **$2 per 1,000 companies** — half of the cheapest comparable French company actor, and a quarter of others, with no monthly rental
- **Official source, always current**: the government API is updated daily from INSEE and the RNE
- **Real filters on the server side**: NAF code, section, department, postal code, commune, region, headcount band, SME/mid-size/large, legal form, revenue and net-income ranges, RGE, Qualiopi, organic, ESS, associations, sole traders
- **Company or establishment rows**: one row per company with its head office, or one row per matching establishment in your area
- **Local address even in company mode**: when you filter by area, each company row also carries the address of its first matching local establishment
- **Privacy-minded**: directors are returned as name + role only; birth dates are never output

### Input

| Field | What it does |
|---|---|
| Search text | Name, brand, keyword, address words or director's name |
| SIREN / SIRET numbers | Direct lookups (9 or 14 digits, spaces allowed) |
| NAF / APE activity codes | e.g. `56.10A`, `62.01Z`, `43.22A` (or `5610A`) |
| Activity sections | Broad sections A–U, e.g. `F` construction |
| Departments / postal codes / commune codes / regions | Where the company has an establishment |
| Headcount bands | INSEE bands from 0 to 10,000+ |
| Company category | PME, ETI, GE |
| Legal form codes | e.g. `5710` SAS, `5499` SARL, `1000` sole trader |
| Status | Active (default), closed, or both |
| Min / max revenue, min / max net income | Latest published accounts, in EUR |
| Created on or after | Company creation date filter |
| Director last name | Companies where a director has this name |
| Label filters | Employers only, RGE, Qualiopi, training organisations, organic, ESS, associations, sole traders |
| One row per | Company (head office) or matching establishment |
| Include directors | Names and roles of directors and auditors |
| Biggest first | Sort by number of establishments |
| Max results | Hard cap — you never pay for more |

Example input:

```json
{
  "nafCodes": ["43.22A"],
  "departments": ["69"],
  "employeeRanges": ["11", "12"],
  "onlyRge": true,
  "maxResults": 500
}
```

### Output

One row per company (or establishment):

```json
{
  "siren": "403052111",
  "name": "BOULANGERIES PAUL",
  "status": "active",
  "legalForm": "SAS",
  "nafCode": "10.71A",
  "sectionLabel": "Manufacturing",
  "companyCategory": "ETI",
  "employeeRange": "500-999",
  "createdAt": "1995-12-07",
  "vatNumber": "FR32403052111",
  "revenue": 73611839,
  "netIncome": -2197350,
  "financialYear": "2024",
  "establishmentsOpen": 124,
  "siret": "40305211102616",
  "address": "344 AVENUE DE LA MARNE 59700 MARCQ-EN-BARŒUL",
  "postalCode": "59700",
  "city": "MARCQ-EN-BARŒUL",
  "latitude": 50.678,
  "longitude": 3.117,
  "matchingAddress": "5 RUE DU HAVRE 75008 PARIS",
  "directors": [{"name": "Maxime HOLDER", "role": "Directeur Général", "type": "person"}],
  "labels": ["bilan_ges"],
  "url": "https://annuaire-entreprises.data.gouv.fr/entreprise/403052111"
}
```

Other fields include legal name, acronym, NAF 2025 code, legal-form code, headcount year, closing date, revenue history by year, trade names, establishment NAF and headcount, head-office flag and collective agreements (IDCC). Download as JSON, CSV, Excel or XML, or read the dataset through the Apify API.

### How much does it cost?

You pay **$0.002 per row** ($2 per 1,000) plus a one-time $0.001 per run. There is no browser, so platform compute is tiny.

Worked examples:

1. **Enrich 1,000 SIREN numbers** from a spreadsheet: 1,000 × $0.002 + $0.001 ≈ **$2.00**
2. **Every RGE plumber in one department** (about 300 companies): **$0.60**
3. **All restaurants in one Paris postal code**, one row per establishment (about 500 rows): **$1.00**

Rows removed by your filters are never charged, and "Max results" caps every run.

### FAQ

**Where does the data come from?** From the official "API Recherche d'entreprises" run by the French administration (DINUM), which publishes INSEE Sirene and RNE data under the Licence Ouverte (open licence). The actor respects the API's published rate limit.

**Is this legal?** Yes, the data is open public data published by the French state for reuse. Companies and people who asked INSEE not to be published (non-diffusible) are not returned by the API. If you use director names for marketing, you are responsible for complying with GDPR and French rules on direct prospecting (for example, offering an opt-out).

**Why is revenue empty for many companies?** Only companies that publish their accounts have revenue and net income; small companies often file confidentially.

**Why is the head-office address outside my department?** In company mode the main address is the head office, and the area filter matches any establishment. Use `matchingAddress`, or switch "One row per" to "Matching establishment".

**How many results can one search return?** The API serves the first 10,000 companies of a search. Split big searches by department or NAF code.

**Can I search by SIRET?** Yes, a 14-digit SIRET returns the company with that exact establishment's address.

### Tips

- NAF codes are the fastest way to build a sector list; combine with departments and headcount bands
- Turn off directors for lighter CSV exports
- Schedule a weekly run with "Created on or after" to catch new companies in your sector

### Integrations

Send results to Google Sheets, HubSpot, Airtable, Slack, a webhook, Zapier or Make with Apify integrations, or call the actor from your own code with the Apify API and client libraries.

### Changelog

- **0.1** (October 2026) — first release: search and SIREN/SIRET lookup, 25+ filters, company or establishment rows, revenue history, directors, labels.

# Actor input Schema

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

Company name, brand, keyword, address words or a director's name (e.g. 'boulangerie', 'Michelin'). Optional when you use filters below.

## `sirenOrSiret` (type: `array`):

Look up these companies directly: 9-digit SIREN or 14-digit SIRET (spaces allowed). Can be combined with a search.

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

Keep companies whose main activity is one of these INSEE NAF codes, e.g. '56.10A' (restaurants), '62.01Z' (software), '43.22A' (plumbing). '5610A' also works.

## `sections` (type: `array`):

Broad INSEE sections, e.g. 'F' (construction), 'I' (hotels & restaurants), 'J' (IT & media), 'Q' (health).

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

Department codes where the company has an establishment, e.g. '75' (Paris), '69' (Rhône), '13', '2A', '971'.

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

5-digit postal codes where the company has an establishment, e.g. '75011'.

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

5-character INSEE commune codes (not postal codes), e.g. '69123' for Lyon.

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

2-digit INSEE region codes, e.g. '11' (Île-de-France), '84' (Auvergne-Rhône-Alpes), '93' (Provence-Alpes-Côte d'Azur).

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

Keep companies in these INSEE headcount bands. Empty = any size.

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

INSEE category: PME (SME), ETI (mid-size), GE (large). Empty = all.

## `legalFormCodes` (type: `array`):

INSEE legal-form codes, e.g. '5710' (SAS), '5720' (SASU), '5499' (SARL), '1000' (sole trader), '9220' (association).

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

Active companies only (default), closed only, or both.

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

Keep companies whose latest published revenue (chiffre d'affaires) is at least this. Only companies that publish accounts have revenue.

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

Keep companies whose latest published revenue is at most this.

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

Keep companies whose latest published net income is at least this (can be negative).

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

Keep companies whose latest published net income is at most this.

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

Keep companies created on or after this date (YYYY-MM-DD). Filtered after the search, so very broad searches scan more pages.

## `directorName` (type: `string`):

Keep companies where a director has this last name.

## `onlyEmployers` (type: `boolean`):

Skip companies with 0 or unknown headcount.

## `onlyRge` (type: `boolean`):

Only companies with the RGE (energy renovation) certification - useful for builders and installers.

## `onlyQualiopi` (type: `boolean`):

Only training providers with the Qualiopi certification.

## `onlyTrainingOrganisations` (type: `boolean`):

Only registered training organisations.

## `onlyBio` (type: `boolean`):

Only companies with an establishment certified by Agence Bio.

## `onlyEss` (type: `boolean`):

Only companies in the social and solidarity economy.

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

Only associations.

## `onlySoleTraders` (type: `boolean`):

Only entrepreneurs individuels.

## `rowPer` (type: `string`):

'Company' = one row per company with its head-office address. 'Establishment' = one row per matching establishment (shop, branch) in your area filters, up to 100 per company.

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

Add directors' names and roles (no birth dates are ever output).

## `sortBySize` (type: `boolean`):

Sort by number of establishments instead of relevance.

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

Stop after this many rows. The API serves at most 10,000 companies per search.

## Actor input object example

```json
{
  "query": "boulangerie",
  "sirenOrSiret": [
    "552032534"
  ],
  "departments": [
    "75"
  ],
  "status": "active",
  "onlyEmployers": false,
  "onlyRge": false,
  "onlyQualiopi": false,
  "onlyTrainingOrganisations": false,
  "onlyBio": false,
  "onlyEss": false,
  "onlyAssociations": false,
  "onlySoleTraders": false,
  "rowPer": "company",
  "includeDirectors": true,
  "sortBySize": false,
  "maxResults": 20
}
```

# Actor output Schema

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

All results as JSON items in the run's default dataset (also downloadable as CSV/Excel from the dataset).

# 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": "boulangerie",
    "sirenOrSiret": [
        "552032534"
    ],
    "departments": [
        "75"
    ],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("larkmoor/france-company-search").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": "boulangerie",
    "sirenOrSiret": ["552032534"],
    "departments": ["75"],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("larkmoor/france-company-search").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": "boulangerie",
  "sirenOrSiret": [
    "552032534"
  ],
  "departments": [
    "75"
  ],
  "maxResults": 20
}' |
apify call larkmoor/france-company-search --silent --output-dataset

```

## MCP server setup

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

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/SIaQnQd2pp22ZpUyZ/builds/BsC8ii3Nh5xHNgECx/openapi.json
