# French Company Registry Lookup (`thesjostrandproject/fr-company-lookup`) Actor

Look up French companies by name, SIREN, SIRET, activity code or location through the public open company-data API (Sirene and RNE data). Clean, typed records for legal entities only: no officers, no street addresses, no sole traders. No login, no scraping. Pay per record.

- **URL**: https://apify.com/thesjostrandproject/fr-company-lookup.md
- **Developed by:** [The Sjöstrand Project](https://apify.com/thesjostrandproject) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 92.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 company records

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 Registry Lookup

### What this Actor returns

Look up French companies by name, SIREN, SIRET, activity code, department or postal code, and get one clean, typed record per company. Every record has the same 14 fields, and a value the source does not have is `null`, never a missing key.

- `siren`, `head_office_siret`: the company number and the head office's number
- `denomination`, `legal_form_code`, `naf_code`: the registered name, legal form and main activity
- `creation_date`, `administrative_status`: when it was created, and whether it is active (`A`) or ceased (`C`)
- `employee_band`, `company_size_category`: the employee-count band and the size category (`PME`, `ETI` or `GE`)
- `head_office_postcode`, `head_office_city`, `department_code`, `establishments_open`, `source_updated_at`: where it sits, how many establishments are open, and when the source last updated it

The Actor reads France's public open company-data API (Sirene and RNE data) and nothing else. It does not scrape any website, and there is no login.

### Who it helps

- **Analysts and sales teams** who want a tidy list of companies in one activity code, department or postal code, ready for a spreadsheet or a database.
- **Developers** who want to check or enrich a company number inside their own workflow, through the Apify API, without writing their own client for the source.

### Quick start

1. Open the Input tab and leave the defaults as they are. They look up one company by its SIREN, so a first run returns a single record.
2. Press Start. Try it on one record first; it costs a fraction of a cent.
3. Open the Output tab, check the record, then widen the search with a name, an activity code or a location.

### Input

| Field | What it does | Default |
|---|---|---|
| Search text | A company name, a SIREN (9 digits) or a SIRET (14 digits). Leave empty to search by filters alone. | `356000000` |
| Activity code (NAF/APE) | Only companies with this main activity, like `62.01Z`. Separate several codes with commas. | empty |
| Department | Only companies with an establishment in this department, like `75` or `2A`. Separate several with commas. | empty |
| Postal code | Only companies with an establishment at this 5-digit postal code. Separate several with commas. | empty |
| Active companies only | Leave out companies that have ceased trading. | off |
| Maximum records | How many records to return at most, from 1 to 1000. | 10 |

### Output

One record per company. The record below is what the default input returned on 12 October 2026, unchanged.

```json
{
  "siren": "356000000",
  "head_office_siret": "35600000000048",
  "denomination": "LA POSTE",
  "legal_form_code": "5510",
  "naf_code": "53.10Z",
  "creation_date": "1991-01-01",
  "administrative_status": "A",
  "employee_band": "53",
  "company_size_category": "GE",
  "head_office_postcode": "75015",
  "head_office_city": "PARIS",
  "department_code": "75",
  "establishments_open": 8862,
  "source_updated_at": "2026-10-08"
}
```

### What it costs

You pay for one event, **Company record**, at $0.003 per record returned. Apify also adds its standard run-start event, $0.00005 per start for an Actor run with up to 1 GB of memory; it is the platform's own event, not ours. Records the Actor leaves out (see below) are never charged.

For example, a search that returns 200 companies costs $0.60. If your Apify plan includes monthly credit, a small run draws on that credit.

If the source cannot be reached or keeps answering with errors, the run stops with a clear status message, and only the records already returned are charged.

### Limits and honest notes

- **Legal entities only.** Sole traders and other natural-person businesses (legal forms 1000 to 1999) are left out, because their company name is usually the owner's own name. A record whose legal form is unknown is left out too, because nothing shows it is a legal entity. Companies the source does not mark as fully public are left out as well.
- **No officers, street addresses, map coordinates, finances or VAT numbers.** The Actor asks the source for the company and its head office only, and it copies only the 14 fields above.
- **Names can still be personal.** One limit no filter can fix: a company's registered name can itself contain a person's name.
- **Searching by a person's name** can return the companies where that person holds a role, because the source also matches officers' names. The output never includes officer fields, and what you do with such a search is your responsibility under the data-protection rules that apply to you.
- **Coverage and freshness** follow the source. A very new company may not appear yet, and `source_updated_at` tells you when the source last updated each record.
- **Pace.** The source accepts at most 7 requests per second from one address. The Actor sends at most 5 per second and waits as long as the source asks when it is busy, so a large search can take a little while.

### Questions

**Why did my run return fewer records than I asked for?**
Either fewer companies matched, or some matches were left out because they are not legal entities or not fully public. You were not charged for those.

**What does the run say when something is wrong?**
It says what it found and what to try. "Give a search text (name, SIREN or SIRET) or at least one filter" means the input was empty: add a search text or one filter. "Could not be reached" or "kept answering with errors" means the source is busy; wait a few minutes and run again. A rejected search usually means a code is mistyped, so check the digits of the SIREN or the shape of the activity code.

**Can I search for a company that has closed?**
Yes. Leave "Active companies only" off and look at `administrative_status`.

**Does it return the people behind a company?**
No. Officers are not in the output.

**Can I run it on a schedule?**
Yes, with the Apify scheduler or the API. Each run is independent and charged per record returned.

### Data source and AI note

Data source: the French government's "Recherche d'entreprises" open company-search API, run by the interministerial digital directorate (DINUM) over the INSEE Sirene register and the INPI national company register, reused under the Licence Ouverte 2.0 (Etalab Open Licence 2.0); each record's source_updated_at gives the date the source last updated that company.

This tool is not affiliated with, endorsed by or sponsored by the French administration, DINUM, INSEE or INPI.

This tool was built with the help of AI coding assistants.

### Help

Questions, a record that looks wrong, or an idea for a field: please open an issue on the Issues tab. Thank you for the report; every one is read.

# Actor input Schema

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

A company name, a SIREN (9 digits) or a SIRET (14 digits). The default, 356000000, is an example company number (SIREN) that returns one record; replace it with your own. Leave empty to search by the filters below alone.

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

Only companies whose main activity has this code, like 62.01Z. Several codes can be separated by commas. Leave empty for any activity.

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

Only companies with an establishment in this department, like 75 or 2A. Several codes can be separated by commas. Leave empty for anywhere.

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

Only companies with an establishment at this 5-digit postal code. Several codes can be separated by commas. Leave empty for anywhere.

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

Leave out companies that have ceased trading.

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

How many company records to return at most (1 to 1000). You pay only for records returned, so a first run stays cheap.

## Actor input object example

```json
{
  "query": "Atelier Exemple",
  "nafCode": "62.01Z",
  "department": "75,2A",
  "postalCode": "75002,69001",
  "activeOnly": false,
  "maxItems": 10
}
```

# Actor output Schema

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

The company records of this run, one per company, with the 14 fields described in the dataset schema (number, name, legal form, activity, status, head office location).

# 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": "356000000",
    "nafCode": "",
    "department": "",
    "postalCode": "",
    "activeOnly": false,
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("thesjostrandproject/fr-company-lookup").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": "356000000",
    "nafCode": "",
    "department": "",
    "postalCode": "",
    "activeOnly": False,
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("thesjostrandproject/fr-company-lookup").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": "356000000",
  "nafCode": "",
  "department": "",
  "postalCode": "",
  "activeOnly": false,
  "maxItems": 10
}' |
apify call thesjostrandproject/fr-company-lookup --silent --output-dataset

```

## MCP server setup

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

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/RfeC94yz5gqGV3cv3/builds/FsCiJxWavbh63Vf3J/openapi.json
