# France Company Data (SIREN/SIRET) — Official Open Data (`sanmarino-tools/france-company-data`) Actor

Look up French companies by name, SIREN or SIRET in the official open API (INSEE Sirene, INPI RNE): legal form, NAF, head office, headcount, revenue, active VAT numbers. Source, licence and update date on every row. No directors' personal data.

- **URL**: https://apify.com/sanmarino-tools/france-company-data.md
- **Developed by:** [San Marino Tools](https://apify.com/sanmarino-tools) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 company results

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 Data (SIREN/SIRET) — Official Open Data

Look up French companies by **name, SIREN or SIRET** in the official open API of the French administration (company directory built on INSEE Sirene and INPI RNE). Get clean, English-named fields ready for your CRM or spreadsheet — with the **source, licence and last-update date on every row**.

### What you get (one row per company)

| Field | Meaning |
|---|---|
| `query` | the query that found this company |
| `status` | `ok`, or for queries without a company: `no_results`, `invalid_query`, `unavailable` |
| `siren`, `headOfficeSiret` | company and head-office identifiers |
| `name`, `legalName`, `acronym` | full name, registered name, acronym |
| `diffusion` | `full`, or `partial` when the person asked the source to hide some data (those fields are empty) |
| `active` | `true` active, `false` ceased; `closureDate` when ceased |
| `creationDate` | date of creation |
| `legalFormCode` | INSEE legal category code (e.g. `5710` = SAS) |
| `nafCode`, `nafSection` | activity code (NAF/APE) and section |
| `companyCategory`, `companyCategoryYear` | `PME`, `ETI` or `GE` |
| `employeeRangeCode`, `employeeRange`, `employeeRangeYear` | INSEE headcount range, with a readable label |
| `soleProprietorship` | `true` for an *entreprise individuelle* |
| `establishments`, `openEstablishments` | number of establishments |
| `headOffice` | `address`, `postalCode`, `city`, `cityCode`, `department`, `region`, `latitude`, `longitude`, `diffusion` |
| `matchingEstablishments` | the establishments that matched (up to 10): the one you asked for with a SIRET, or those in the postal code or department you filtered on — `siret`, `isHeadOffice`, `active`, `address`, `postalCode`, `city`, `nafCode`, `diffusion` |
| `lastFinancials` | latest published year: `year`, `revenue`, `netIncome` (when available) |
| `vatNumber`, `vatNumbers` | active French intra-EU VAT number(s) as listed by the source (DGFiP). Empty when the source lists none: the Actor never computes one |
| `source`, `sourceUrl`, `sourceLicense`, `sourceUpdatedAt` | where the data comes from, its licence and last update |
| `retrievedAt` | when this Actor read it |

A run summary (queries, companies returned, charged events) is saved as `SUMMARY` — **Output** tab, **Run summary**.

### Input

| Field | Default | |
|---|---|---|
| `queries` | — | names, SIREN (9 digits) or SIRET (14 digits), one per line. SIREN/SIRET are exact lookups |
| `maxResultsPerQuery` | 10 | companies per name search (max 100) |
| `postalCode`, `department`, `nafCode`, `activeOnly` | — | filters for name searches; several values separated by commas (e.g. `75009,75010`; NAF as `62.01Z` or `6201Z`). Postal code and department match companies with **at least one establishment** there: see `matchingEstablishments` (the head office may be elsewhere). An invalid filter stops the run before any request: nothing is charged |
| `includeSoleProprietorships` | `true` | turn off to exclude sole proprietorships, whose name is the owner's name |

### Pricing

Pay per event: **$0.005 per company returned** ($5 per 1,000). **Not charged:** queries with no result, invalid queries, source unavailable, and a company already returned earlier in the same run. The Actor respects your spending limit: it never asks for more companies than you can pay for.

### Source and licence

Data: *Annuaire des Entreprises* / API Recherche d'entreprises, operated by the French interministerial digital directorate (DINUM), from INSEE (Sirene) and INPI (RNE). Licence: **Licence Ouverte / Open Licence 2.0 (Etalab)** — commercial reuse allowed with attribution of the source and the date of last update, which every row carries.

**This Actor is not an official service of the French administration** and is not affiliated with DINUM, INSEE or INPI. Non-diffusible companies are not in the source. When a person has opposed public diffusion, the source hides the protected data (such as the name or the address): those fields are empty here and `diffusion` is `partial`.

### Privacy

- **No personal data of directors** (names, birth dates) is requested from the source or returned.
- **Sole proprietorships** are named after their owner, a natural person: their rows are personal data. The Actor reads the source at every run, so each row reflects the person's diffusion choice at `retrievedAt`. If you keep these rows, keep them up to date and use them lawfully (GDPR; French rules on Sirene data, art. R123-232 of the Code de commerce). You can exclude sole proprietorships.
- Nothing you submit is written to the logs — no queries, no names, no numbers: only counts.

### Limits, stated plainly

- The source allows 7 requests per second per IP and 30 per second per network, shared with other users of the same cloud. The Actor stays at 5 per second and waits when asked to; if the source keeps refusing, the query is marked `unavailable` and not charged — run it again later.
- A SIREN/SIRET lookup ignores filters (source behaviour). A SIRET lookup returns the company that owns the establishment; the establishment itself is in `matchingEstablishments`.
- Name search also finds similar names: it can return companies and sole proprietorships whose name only resembles your query. For one exact company, use its SIREN or SIRET.
- Names need at least 3 characters: shorter queries are marked `invalid_query` and not charged.
- Financial data exists only for companies that publish it.

# Actor input Schema

## `queries` (type: `array`):

One per line. A 9-digit SIREN or 14-digit SIRET is an exact lookup (filters are ignored). Names need at least 3 characters.

## `maxResultsPerQuery` (type: `integer`):

For name searches: how many companies to return (and charge) per query. Maximum 100.

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

5 digits, e.g. 75009; several separated by commas. Matches companies with at least one establishment there (the head office may be elsewhere). Name searches only.

## `department` (type: `string`):

e.g. 75, 2A, 974; several separated by commas. Matches companies with at least one establishment there (the head office may be elsewhere). Name searches only.

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

e.g. 62.01Z or 6201Z; several separated by commas. Name searches only.

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

Exclude companies that have ceased activity. Name searches only.

## `includeSoleProprietorships` (type: `boolean`):

Sole proprietorships (entreprises individuelles) carry the owner's name. Turn off to exclude them.

## Actor input object example

```json
{
  "queries": [
    "356000000",
    "855200507"
  ],
  "maxResultsPerQuery": 10,
  "activeOnly": false,
  "includeSoleProprietorships": true
}
```

# Actor output Schema

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

No description

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

No description

# 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 = {
    "queries": [
        "356000000",
        "855200507"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sanmarino-tools/france-company-data").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 = { "queries": [
        "356000000",
        "855200507",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("sanmarino-tools/france-company-data").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 '{
  "queries": [
    "356000000",
    "855200507"
  ]
}' |
apify call sanmarino-tools/france-company-data --silent --output-dataset

```

## MCP server setup

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

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/gDt0vVfmDgrV5ytUN/builds/XEHnSfjn7eFaVlnAa/openapi.json
