# French Company Search (SIREN, Sirene) (`darikami/french-company-search`) Actor

Search French companies in the government's open register API: by name, SIREN/SIRET, NAF activity code, postal code, department, legal form, employee range or around a point. One clean row per company with SIREN, legal form, NAF, headquarters address and coordinates, VAT. No API key.

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

## Pricing

$3.00 / 1,000 company delivereds

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 Search (SIREN, Sirene)

**Search French companies in the French State's open company register API (Sirene, INSEE): by name, SIREN or SIRET, NAF code, postal code, department, legal form, employee range or a radius around a point.**
You get one clean row per company: SIREN, legal form, NAF activity, state, creation date, employee range, headquarters address and coordinates, VAT number.
**USD 0.003 per company (USD 3 per 1,000).** No API key. English field names.

| SIREN | Name | Legal form | NAF | City | VAT number |
|---|---|---|---|---|---|
| 840989800 | PIXELRAISE | SAS | 62.01Z | Fillinges | FR91840989800 |
| 379867997 | SILVERPROD | SA | 62.01Z | Annemasse | - |
| 819706938 | RESPONSIVE IT | SAS | 62.01Z | Azay-le-Rideau | FR09819706938 |
| 878981646 | APPIWEB | SARL | 62.01Z | Loisin | FR47878981646 |
| 819842717 | XTI TECHNOLOGIES | SARL | 62.01Z | Thyez | FR43819842717 |

The rows come from a real cloud run of 04.11.2026 (NAF 62.01Z, computer programming). The full item is under Output.

### Who uses it

- **B2B market maps and prospect lists:** active companies of an activity in a region, with size and address.
- **CRM enrichment:** add the legal form, the NAF code, the headquarters and the VAT number to a list of SIRENs.
- **Supplier checks:** confirm that a French company exists and is active before an order.

### What it does not do

- No managers and no sole traders: their names are personal data (see below).
- At most 10,000 results per search. Narrow the filters to reach more.
- A company with `prospectingOptOut: true` must not be used for direct marketing.

### Input

```json
{ "activityCodes": ["62.01Z"], "postalCodes": ["74100"], "maxPages": 2 }
```

| Field | Meaning |
|---|---|
| `query` | Words of the company name, trade name or address (`boulangerie paris`), or a SIREN (9 digits) or a SIRET (14 digits). |
| `activityCodes` | NAF rev. 2 codes of the main activity, such as `62.01Z`. `6201Z` is also accepted. |
| `postalCodes` | 5-digit postal codes. A company matches when one of its establishments is there. |
| `departments` | Department codes: `01`-`95`, `2A`, `2B`, `971`-`974`, `976`. |
| `legalForms` | INSEE legal category codes, such as `5710` (SAS), `5499` (SARL), `5599` (SA). |
| `employeeRanges` | INSEE employee ranges, such as `11` (10-19 employees). |
| `categories` | `PME` (small and medium-sized), `ETI` (intermediate), `GE` (large). |
| `activeOnly` | Default `true`: ceased companies are left out. |
| `near` | `{ "lat": 48.8566, "lon": 2.3522, "radiusKm": 1 }`: companies with an establishment within the radius (0.001-50 km, default 5). It combines only with `activityCodes` and `activeOnly`. |
| `maxPages` | 25 companies a page. Default 4 (100 companies), at most 400. |

Give a `query`, at least one filter, or `near`. The filters combine: all of them must match.

Examples:

- Software companies in Annemasse: `{ "activityCodes": ["62.01Z"], "postalCodes": ["74100"] }`
- One company: `{ "query": "855200887" }`
- Restaurants within 500 m of a point: `{ "near": { "lat": 48.8566, "lon": 2.3522, "radiusKm": 0.5 }, "activityCodes": ["56.10A"] }`
- Large companies in Lyon's department: `{ "departments": ["69"], "categories": ["GE"], "maxPages": 10 }`

### Output (one item per company)

```json
{
  "siren": "855200887",
  "siret": "85520088700039",
  "name": "COMPAGNIE GENERALE DES ETABLISSEMENTS MICHELIN",
  "fullName": "COMPAGNIE GENERALE DES ETABLISSEMENTS MICHELIN (CGEM)",
  "acronym": "CGEM",
  "tradeNames": [],
  "legalFormCode": "5308",
  "legalForm": "Société en commandite par actions",
  "nafCode": "77.40Z",
  "activity": "Location-bail de propriété intellectuelle et de produits similaires, à l’exception des œuvres soumises à copyright",
  "naf2025Code": "77.40G",
  "activitySection": "N",
  "state": "active",
  "creationDate": "1955-01-01",
  "closureDate": null,
  "category": "GE",
  "categoryYear": 2024,
  "employeeRangeCode": "02",
  "employeeRange": "3-5 employees",
  "employeeRangeYear": 2024,
  "employer": null,
  "establishmentCount": 2,
  "openEstablishmentCount": 1,
  "headquarters": {
    "siret": "85520088700039",
    "isHeadquarters": true,
    "state": "active",
    "address": "23 PLACE DES CARMES DECHAUX 63000 CLERMONT-FERRAND",
    "postalCode": "63000",
    "city": "CLERMONT-FERRAND",
    "cityCode": "63113",
    "department": "63",
    "region": "84",
    "country": "FRANCE",
    "latitude": 45.783412445,
    "longitude": 3.0932797959,
    "nafCode": "77.40Z",
    "tradeNames": [],
    "addressPublic": true
  },
  "matchingEstablishments": [],
  "vatNumber": "FR09855200887",
  "prospectingOptOut": true,
  "updatedAt": "2026-11-04T11:44:35",
  "annuaireUrl": "https://annuaire-entreprises.data.gouv.fr/entreprise/855200887",
  "apiUrl": "https://recherche-entreprises.api.gouv.fr/search?q=855200887",
  "error": null,
  "message": null,
  "source": "INSEE Sirene and the other public registers in the French government's API Recherche d'entreprises (DINUM), Licence Ouverte 2.0",
  "sourceUrl": "https://recherche-entreprises.api.gouv.fr/search?q=855200887&...",
  "retrievedAt": "2026-11-04T20:48:03.398Z"
}
```

- `legalForm` and `activity` are INSEE's official labels, in French. `employeeRange` is in English.
- `matchingEstablishments` lists the establishments that matched a postal code, a department or the point (up to 10 per
  company). Each has its SIRET, state, address and coordinates.
- `vatNumber` is the intra-EU VAT number when the register has one. Searches around a point do not give it.
- `prospectingOptOut: true` means the company asked that its register data is not used for prospecting (the French
  commercial code, the opposition to commercial use). **Respect it**: do not use such a company for direct marketing.
- `addressPublic: false` means INSEE masks the street and the coordinates of that establishment. The postal code and the
  city stay.
- A field that the register does not have is `null`.

### Pricing (pay per event)

| Event | Price | When |
|---|---|---|
| `company` | **USD 0.003** | one company delivered |

100 companies cost USD 0.30. 10,000 companies cost USD 30. A search without results gives one free item that says why.

### Personal data

This actor returns public company data. Its filter removes persons by these rules:

- **No managers.** The register lists managers (dirigeants) with their birth month. The actor does not request them and
  does not return them.
- **No sole traders.** The name of a sole trader (entrepreneur individuel) is the name of a person. The actor does not
  return sole traders (legal category 1000). It also does not return groupings of persons without legal personality
  (category 2, such as an "indivision"). A civil company, an association or a co-ownership syndicate whose name carries
  a civil title such as "MME" or "MONSIEUR" is left out too.
- **No search by person.** The API's text search also searches managers and elected officials. The actor returns a
  company only when a word of your query is in the company's own name, trade names or addresses (plural or singular).
  So a person's name as a query finds only companies that carry that name themselves.
- **No masked data.** A company that INSEE does not publish in full is left out. A masked establishment address stays
  masked.

These rules drop results without a charge. The run log counts them.

A company named after a person keeps its name, because it is a legal person.

### Data source and terms

- **Source:** the API Recherche d'entreprises of the French State (DINUM), `https://recherche-entreprises.api.gouv.fr`.
  It serves INSEE's Sirene register and other public registers. The API's documentation states: "L'API étant totalement
  ouverte d'accès" (the API is fully open to access). No account and no key are necessary.
- **Licence:** the Sirene data is published under the Licence Ouverte 2.0 (Etalab), which allows reuse, also commercial
  reuse, with attribution. Each item names its source and its update date.
- **Rate limit:** the API allows at most 7 requests a second per IP address.
- This actor is not affiliated with or endorsed by INSEE, DINUM or the French State.

### Limits

- The API returns at most 10,000 results for one search. Narrow the filters to reach more companies.
- Companies that are not public in Sirene ("non-diffusibles") are not in the API.
- The text search is a search engine, not an exact lookup. Use a SIREN or SIRET for one company.
- Around a point, the API also counts closed establishments. With `activeOnly`, the actor keeps only companies with an
  open establishment among the listed ones. So such a search can deliver fewer than 25 companies a page.
- Employee ranges and size categories are INSEE's annual values (the year is in `employeeRangeYear` and `categoryYear`).

### Run summary

The run summary is in the default key-value store under `SUMMARY`, the counts under `STATS`.
The data comes as the source publishes it, without warranty.

**More official-data actors by darikami:** [Swiss UID & VAT validator](https://apify.com/darikami/swiss-uid-validator) · [Swiss electricity tariffs](https://apify.com/darikami/swiss-electricity-tariffs) · [Swiss federal law MCP](https://apify.com/darikami/swiss-federal-law-mcp) · [SEC company fundamentals](https://apify.com/darikami/sec-company-fundamentals) · [German public tenders](https://apify.com/darikami/german-public-tenders).
In an AI agent: ask the Apify MCP server (`mcp.apify.com`) for `darikami/french-company-search`.

# Actor input Schema

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

Words of the company name, trade name or address ("boulangerie paris 11"), or a SIREN (9 digits) or SIRET (14 digits). Only the company's own name and address count: a company that matches only through a person (a manager) is not returned. Leave empty to search by filters only.

## `activityCodes` (type: `array`):

NAF/APE codes of the main activity, such as 62.01Z (computer programming) or 56.10A. 6201Z is also accepted. Up to 50.

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

5-digit French postal codes. A company matches when one of its establishments is there. Up to 100.

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

Department codes: 01-95, 2A, 2B, 971-974, 976. A company matches when one of its establishments is there.

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

4-digit INSEE legal category codes, such as 5710 (SAS), 5499 (SARL), 5599 (SA). Sole traders (1000) are never returned.

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

INSEE employee ranges (tranches d'effectifs) of the company.

## `categories` (type: `array`):

INSEE category: PME (small and medium), ETI (intermediate), GE (large).

## `activeOnly` (type: `boolean`):

On: ceased companies are left out. Around a point, a company also needs an open establishment in the radius.

## `near` (type: `object`):

Companies with an establishment near a point: { "lat": 48.8566, "lon": 2.3522, "radiusKm": 1 }. The radius is 0.001-50 km (default 5). Combines only with activity codes and "Active companies only".

## `maxPages` (type: `integer`):

25 companies a page. The API returns at most 10,000 results (400 pages).

## Actor input object example

```json
{
  "query": "michelin",
  "activeOnly": true,
  "maxPages": 4
}
```

# Actor output Schema

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

One item per company: SIREN, name, legal form, NAF activity, state, headquarters address and coordinates, matching establishments.

## `stats` (type: `string`):

STATS record: pagesRead, totalResults, results, delivered, duplicates, and the results dropped by the privacy and activity rules (dropped).

## `summary` (type: `string`):

SUMMARY record: pushed, charged, attempts, errors, stoppedByBudget, ok, message.

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

// Run the Actor and wait for it to finish
const run = await client.actor("darikami/french-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": "michelin" }

# Run the Actor and wait for it to finish
run = client.actor("darikami/french-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": "michelin"
}' |
apify call darikami/french-company-search --silent --output-dataset

```

## MCP server setup

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