# French Company Registry Scraper (`deriverge/french-company-check`) Actor

\[$2.00 / 1K] Bulk French company lookup by SIREN, SIRET or VAT number. Queries Sirene and the RNE, the BODACC gazette and EU VIES. Returns legal name, head office, activity code, status, collective proceedings with the latest judgment, turnover and net result. Unmatched rows are free.

- **URL**: https://apify.com/deriverge/french-company-check.md
- **Developed by:** [deriverge s.r.o.](https://apify.com/deriverge) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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.
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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## French Company Checker

### What does French Company Checker do?

**French Company Checker** verifies French companies in bulk against three official sources at once: the Sirene register with the national business register (RNE), the BODACC official gazette, and EU VIES. Give it a list of SIREN, SIRET or VAT numbers and for each one you get back the name, legal form, status, head office, VAT number with an independent VIES confirmation, the company category and employee band, the latest turnover and net result, and every collective-proceedings notice the gazette has ever published for it.

### Why the gazette matters

Sirene can list a company as active for months after a court has opened receivership or judicial liquidation, because the administrative status only changes once the company is struck off. The court decisions themselves are published in BODACC. This actor reads them for every company and turns the timeline into one plain answer: an open proceeding becomes the first risk flag on the row, with the nature of the judgment, the date and the court; a closed file is reported as past proceedings with its closing judgment.

| Source | The question only it answers |
|---|---|
| **Sirene + RNE** | Does the entity exist, is it active, where is its head office, what are its latest financials? |
| **BODACC** | Has a court opened safeguard, receivership or liquidation proceedings, and is the file still open? |
| **EU VIES** | Does the EU confirm the VAT number is valid for cross-border trade? |

### Fair billing

You pay only for companies that resolve. SIREN and SIRET numbers that fail the Luhn checksum, and VAT numbers whose key does not match, are caught locally and never generate a request. Sources that return no answer are not billed. A run that resolves nothing costs nothing.

### Sole traders are people

The register also lists entrepreneurs individuels under their personal names. When the entity is a natural person, **the name and address are withheld by design**. You still learn the SIREN exists, whether it is active and whether VIES confirms its VAT number. Companies that opted for partial diffusion of their data are respected the same way. The list of directors is never read.

### Input

```json
{
  "companies": [
    "380129866",
    "38012986648625",
    { "vatNumber": "FR89380129866", "reference": "invoice-1187" }
  ],
  "includeBodacc": true,
  "includeVies": true
}
```

Strings and objects can be mixed freely. A SIRET is reduced to its SIREN and returned alongside it.

### Output

One row per submitted company:

```json
{
  "input": "380129866",
  "matched": true,
  "entityType": "legal_entity",
  "siren": "380129866",
  "name": "ORANGE",
  "legalFormCode": "5599",
  "address": "111 QUAI DU PRESIDENT ROOSEVELT 92130 ISSY-LES-MOULINEAUX",
  "companyActive": true,
  "vatNumber": "FR89380129866",
  "vatValidVies": true,
  "companyCategory": "GE",
  "employeeBand": "10,000 and more",
  "financials": [{ "year": 2024, "turnoverEur": 40260000000, "netResultEur": 2902000000 }],
  "bodaccChecked": true,
  "collectiveProceedings": [],
  "riskFlags": []
}
```

Every value carries provenance: which source said it, at which URL, and when. If a source was down, the affected fields are `null` and the provenance row says why, never silently guessed.

### Watch a list for changes

Checking a supplier once is useful. Checking the same list every morning and reading only what changed is what keeps you out of trouble. Give the run a watch name (or save it as a task and schedule it) and every later run compares its results with the previous one: a company that turned inactive, a new risk flag, a VAT registration cancelled, a published account that disappeared. The differences are stored in the `CHANGES` record of the run, ready for an integration or an email. The comparison itself is free.

### Pricing

| Event | Price |
|---|---|
| Run fee, a tenth of a cent per run that resolves at least one company | $0.001 |
| Company resolved | $0.004 |
| Each additional source that returned an answer (BODACC, VIES) | $0.001 |
| Company not found | **free** |

### Frequently asked questions

**What does an unmatched row cost?** Nothing. Rows that fail the checksum or that the register does not know are returned with an explanation and are never charged.

**How do you decide whether proceedings are open?** By the most recent judgment in BODACC, not the most recent notice. Creditors' claims are still filed after a closing judgment, so the actor looks for the last judgment of opening, conversion, closing or plan adoption and reports the state that follows from it.

**Where do the financials come from?** From the annual accounts filed with the RNE, as republished by the Annuaire des Entreprises. The most recent filed year comes first. Companies that file confidentially have no financials, which is not a risk flag by itself.

**Where does the data come from?** The Annuaire des Entreprises API (INSEE Sirene and RNE), the BODACC open data portal run by DILA, and EU VIES. All official, all free of charge, every value with its source and timestamp.

This is the French sibling of our Czech and Slovak, Polish, Romanian, Estonian, Lithuanian, Latvian and Bulgarian company checkers. They share the same validation engine and the same billing rule: unmatched rows are free.

# Actor input Schema

## `companies` (type: `array`):

One entry per company: a SIREN (380129866), a SIRET (38012986648625), a VAT number (FR89380129866), or an object with siren, siret or vatNumber and an optional reference returned unchanged. Typos that fail the Luhn checksum are reported and never charged.

## `includeBodacc` (type: `boolean`):

Look up every company in the official gazette for safeguard, receivership and judicial liquidation notices. An open proceeding becomes the first risk flag on the row.

## `includeVies` (type: `boolean`):

Cross-check every company against the EU VIES system as an independent source. An active company whose VAT number VIES does not confirm is reported as a risk flag.

## `watchKey` (type: `string`):

Give the run a name such as "suppliers" and schedule it. Every later run with the same name compares its results with the previous one and stores the differences (status changes, new risk flags, removed accounts) in the CHANGES record. Comparison is free. Runs from a saved task are compared automatically even without a name.

## Actor input object example

```json
{
  "companies": [
    "380129866",
    {
      "siren": "552032534",
      "reference": "supplier-42"
    }
  ],
  "includeBodacc": true,
  "includeVies": true
}
```

# Actor output Schema

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

One row per submitted company, with Sirene status, BODACC collective proceedings, financials and risk flags.

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

How many entities were resolved, how many were not found and therefore not charged, and how many carry a risk flag.

# 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 = {
    "companies": [
        "380129866",
        {
            "siren": "552032534",
            "reference": "supplier-42"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("deriverge/french-company-check").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 = { "companies": [
        "380129866",
        {
            "siren": "552032534",
            "reference": "supplier-42",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("deriverge/french-company-check").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 '{
  "companies": [
    "380129866",
    {
      "siren": "552032534",
      "reference": "supplier-42"
    }
  ]
}' |
apify call deriverge/french-company-check --silent --output-dataset

```

## MCP server setup

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

```

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/zt6Qa5VFKYKqcZ7DP/builds/gdqDEBOtJKlow1Cci/openapi.json
