# France Company Search (SIRENE) – SIREN, SIRET & NAF Data (`kingly_apple/sirene-company-search`) Actor

Search French companies by name, SIREN/SIRET, NAF code, department or postcode. Get legal form, status, creation date, head office and optional directors as JSON/CSV. No API key needed. Data: Annuaire des Entreprises (DINUM), Licence Ouverte 2.0. Not affiliated with the French government.

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

## Pricing

$3.00 / 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.

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 (SIRENE) – SIREN, SIRET & NAF Data

Search French companies by name, SIREN/SIRET, NAF code, department or postcode. Get legal form, status, creation date, head office, VAT number and optional directors as clean JSON/CSV. Track new companies with `onlyNew`. No API key needed.

Data comes from the public API Recherche d'entreprises (the API behind Annuaire des Entreprises, run by DINUM), reused under Licence Ouverte 2.0. Every record includes the date the source last updated it (`sourceUpdatedAt`).

### Pricing

Pay per event: **$0.003 per company** written to the dataset ($3 per 1,000). Invalid numbers, not-found numbers, duplicates, and companies removed by filters or by `onlyNew` are not charged.

### Input examples

Number lookup:

```json
{"sirenOrSiret": ["552032534", "13002526500013"]}
```

New software companies in Lozère created in 2025:

```json
{"nafCodes": ["62.01Z"], "departments": ["48"], "incorporatedFrom": "2025-01-01", "incorporatedTo": "2025-12-31", "maxItems": 100}
```

At least one of `sirenOrSiret`, `companyNames`, `nafCodes`, `departments`, `postalCodes` is required.

### Example output (one record, shortened)

```json
{
  "siren": "552032534",
  "name": "DANONE",
  "status": "active",
  "creationDate": "1955-01-01",
  "nafCode": "70.10Z",
  "legalFormCode": "5599",
  "companyCategory": "GE",
  "headOffice": {"siret": "55203253400703", "address": "59-61 RUE LA FAYETTE 75009 PARIS", "postalCode": "75009", "city": "PARIS", "department": "75"},
  "vatNumber": "FR27552032534",
  "dirigeants": null,
  "sourceUpdatedAt": "2026-10-14T08:01:59",
  "annuaireUrl": "https://annuaire-entreprises.data.gouv.fr/entreprise/552032534",
  "licence": "Source: API Recherche d'entreprises (DINUM, recherche-entreprises.api.gouv.fr), data from INSEE Sirene and other French public registers. Licence Ouverte / Open Licence 2.0 (https://www.etalab.gouv.fr/licence-ouverte-open-licence/). Last update of each record: see sourceUpdatedAt."
}
```

### Behaviour

- **Number lookups** return the requested company and ignore `status` and date filters.
- **Name search** keeps only companies whose name contains the keyword (case- and accent-insensitive). The API also matches addresses and directors; those hits are dropped.
- **Creation date filters and `onlyNew` are applied by the Actor**, not by the API (the API has no date filter). Each query can scan at most 10,000 results; when a query hits that cap the run log and `RUN-STATS` warn that results may be incomplete. Narrow the query with NAF codes, departments or postcodes. Departments × NAF × postcodes are searched as separate slices.
- Departments and postcodes match any establishment, not only the head office; `matchedEstablishmentSirets` shows which ones matched.
- Rate limit: the Actor sends at most 5 requests per second, backs off on HTTP 429 (honouring `Retry-After`) and on server errors. On shared cloud networks the API may throttle harder; runs then end with partial results and a status message.
- Time budget: the Actor stops starting requests shortly before the run timeout so that data and `RUN-STATS` are always saved. The run still succeeds, and `RUN-STATS.stoppedReason` is `time_budget`. To get more results, narrow the query or raise the run timeout.

### Output

One record per legal unit (`siren`, `name`, `legalName`, `acronym`, `status`, `creationDate`, `closureDate`, `nafCode`, `nafCode2025`, `nafSection`, `legalFormCode`, `companyCategory`, `employeeRange`, `establishmentsCount`, `openEstablishmentsCount`, `headOffice{…}`, `matchedEstablishmentSirets`, `vatNumber`, `isIndividualEntrepreneur`, `diffusionStatus`, `dirigeants`, `sourceUpdatedAt`, `sourceUpdatedAtInsee`, `sourceUpdatedAtRne`, `annuaireUrl`, `source`, `licence`, `fetchedAt`). Missing values are `null`. Request and filter counters are in the key-value store record `RUN-STATS`; invalid/not-found inputs in `ERRORS`.

### Data limitations

This is not the complete Sirene database: non-diffusible units and units that refused RCS registration are absent, and establishment predecessor/successor links are not included.

### Personal data (GDPR)

Directors are off by default. When enabled, only name, role, birth year/month and nationality are output, never addresses or full birth dates. Sole traders' company names are personal names. Units with `diffusionStatus = "P"` (partial diffusion) are output as the API provides them and must not be used for marketing or prospecting. You are the data controller and need your own lawful basis; B2B marketing must follow GDPR and CNIL rules. This is not legal advice.

### Data source and licence

Data source: API Recherche d'entreprises (DINUM) — INSEE Sirene and other French public registers, reused under Licence Ouverte / Open Licence 2.0. Each record carries its last update date (`sourceUpdatedAt`). This Actor is independent: it is not affiliated with or endorsed by INSEE, DINUM or the French government, and is not a government service.

« Source : API Recherche d'entreprises (DINUM) — base Sirene de l'Insee et autres registres publics, réutilisées sous Licence Ouverte 2.0. Service indépendant, sans lien avec l'Insee ni la DINUM. »

# Actor input Schema

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

9-digit SIREN or 14-digit SIRET. Spaces, dots and dashes are removed. Number lookups ignore status and date filters.

## `companyNames` (type: `array`):

One search per keyword. Only companies whose name contains the keyword (case- and accent-insensitive) are kept.

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

NAF rev.2 codes such as 62.01Z (6201Z is accepted). Applies to the legal unit's main activity. NAF 2025 codes (ending in Y, e.g. 62.10Y) are not supported for filtering yet; each result includes nafCode2025.

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

Department codes such as 75, 2A, 971. Matches any establishment, not only the head office.

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

5-digit postcodes. Matches any establishment, not only the head office.

## `incorporatedFrom` (type: `string`):

Legal unit creation date, inclusive. Filtered by the Actor (the API has no date filter); each query scans at most 10,000 results.

## `incorporatedTo` (type: `string`):

Legal unit creation date, inclusive. Filtered by the Actor.

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

Applies to searches only, not to number lookups.

## `includeDirigeants` (type: `boolean`):

Directors are personal data under GDPR. You are the data controller and need a lawful basis. Only name, role, birth year/month and nationality are output; never addresses or full birth dates.

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

Maximum companies output and charged.

## `onlyNew` (type: `boolean`):

Skip companies already output by a previous run (tracked by SIREN in the SIRENE-SEEN-COMPANIES store).

## Actor input object example

```json
{
  "sirenOrSiret": [
    "552032534",
    "542051180",
    "552120222"
  ],
  "status": "any",
  "includeDirigeants": false,
  "maxItems": 10,
  "onlyNew": false
}
```

# Actor output Schema

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

One record per French legal unit (overview view).

## `runStats` (type: `string`):

Request counts, filters, charges.

## `errors` (type: `string`):

Invalid, not found and upstream errors.

# 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 = {
    "sirenOrSiret": [
        "552032534",
        "542051180",
        "552120222"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("kingly_apple/sirene-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 = {
    "sirenOrSiret": [
        "552032534",
        "542051180",
        "552120222",
    ],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("kingly_apple/sirene-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 '{
  "sirenOrSiret": [
    "552032534",
    "542051180",
    "552120222"
  ],
  "maxItems": 10
}' |
apify call kingly_apple/sirene-company-search --silent --output-dataset

```

## MCP server setup

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