# France Company Health Check by SIREN – BODACC Batch (`characteristic_division/bodacc-siren-health-check`) Actor

Batch-check up to 10,000 SIREN/SIRET/VAT numbers against official BODACC open data: one risk row per company with insolvency stage, strike-off, dissolution, late accounts, business sales and an explained risk score. $0.003 per company; sole traders masked.

- **URL**: https://apify.com/characteristic_division/bodacc-siren-health-check.md
- **Developed by:** [Jordan Banchonpanith](https://apify.com/characteristic_division) (community)
- **Categories:** Business, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 company reports

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 Health Check by SIREN – BODACC Procédure Collective Batch Check

**France Company Health Check by SIREN** turns the official **BODACC** announcements (*Bulletin officiel des annonces civiles et commerciales*, DILA) into **one risk summary row per French company**. Paste SIREN, SIRET or FR VAT numbers and see, in one table, which companies are in a **procédure collective** (safeguard, receivership, liquidation), struck off, dissolved, or late with their accounts.

It is built for supplier and customer due diligence, credit-risk screening of a receivables book, KYB refreshes, CRM hygiene (finding closed accounts) and M\&A sourcing.

### What you get for each SIREN

- **Insolvency stage** (*procédure collective*), with its date and history: safeguard (*sauvegarde*), receivership (*redressement judiciaire*), recovery or safeguard plan, court-ordered sale (*plan de cession*), judicial liquidation (*liquidation judiciaire*), or closure for insufficient assets / debts paid
- **Strike-off** (*radiation*) and its reason, and **dissolution** (including dissolution without liquidation after a merger)
- **Last published accounts** (closing date, filing type), number of years filed, and a **late-filing flag** for company forms that must file accounts
- **Business sales** (*ventes et cessions de fonds*): how many times the company was buyer or seller, and the last sale with its **price** when stated
- **Changes in the last 12 months**: management, head-office moves, capital, activity, name
- An **explained risk score** (0–100) and level (`low` / `medium` / `high` / `closed` / `unknown`), with plain-English reasons

### How to check BODACC for a list of SIRENs

1. Paste numbers into **SIREN / SIRET / FR VAT numbers**: 9-digit SIREN, 14-digit SIRET, or FR VAT number, with or without spaces.
2. Optionally limit the history with `lookbackYears`, or add a compact list of notices.
3. Run, then export the table to CSV / Excel / JSON, schedule it weekly, or call it from the Apify API.

```json
{
  "sirens": ["552032534", "542 051 180 00066", { "siren": "949202030", "label": "supplier-17" }, "FR40303265045"],
  "lookbackYears": 0,
  "maskNaturalPersons": true,
  "includeNotices": false,
  "maxNotices": 50
}
```

| Field | Description |
|---|---|
| `sirens` | SIREN (9 digits), SIRET (14 digits) or FR VAT number. Strings, or objects `{siren, label}`. Duplicates are removed. Max 10,000. |
| `lookbackYears` | Use only notices from the last N years (default 0 = full history) |
| `maskNaturalPersons` | Mask sole traders (default `true`) |
| `includeNotices` / `maxNotices` | Add a compact list of notices: id, date, type, judgment nature, tags, official bodacc.fr link. No free text. |

### Why a summary row instead of raw notices

BODACC publishes events one notice at a time. To know whether a company is still trading you have to read them in order. This Actor does that for you: for example, a liquidation opening followed by a "closure for insufficient assets" becomes `riskLevel: "closed"`. It recognises more than 15 real BODACC judgment wordings, including "Autre jugement et ordonnance" notices that carry the decision only in their text. Claim-list filings (*dépôt de l'état des créances*) are kept as evidence that a procedure exists but never override the actual stage.

### Output example (one row per SIREN)

From a real run on 2026-11-05 (trimmed). The Output tab has a "Risk overview" table; every field is described in the dataset schema.

```json
{
  "input": "949202030", "label": "supplier-17", "siren": "949202030", "found": true, "isNaturalPerson": false,
  "name": "DES 4 SABOTS", "legalForm": "S.E.L.A.R.L.", "department": "71",
  "noticesTotal": 3, "noticesByType": { "collective": 1, "dpc": 2 }, "lastNoticeDate": "2026-11-04",
  "lastAccounts": { "closingDate": "2024-12-31", "publishedDate": "2025-09-16", "filingType": "Comptes annuels et rapports" },
  "accountsOverdue": true,
  "insolvency": { "status": "receivership", "statusLabel": "Receivership (redressement judiciaire) opened", "since": "2026-10-27", "ongoing": true, "history": [{ "date": "2026-11-04", "stage": "receivership" }] },
  "radiation": null, "dissolution": null,
  "businessSales": { "asBuyer": 0, "asSeller": 0, "lastSale": null },
  "changesLast12Months": { "managementChanges": 0, "headOfficeMoves": 0, "capitalChanges": 0, "activityChanges": 0, "nameChanges": 0 },
  "riskLevel": "high", "riskScore": 100,
  "riskReasons": ["Receivership (redressement judiciaire) opened (2026-10-27)", "Last published accounts closed 2024-12-31 (over 20 months ago: possible late filing)"]
}
```

Invalid numbers (bad length or failed Luhn check) return `found: false` with an `error`, and are **not charged**.

#### How the risk score works

The score adds the following weights, capped at 100:

| Signal | Weight |
|---|---|
| Liquidation | 90 |
| Closure for insufficient assets | 95 |
| Court-ordered sale | 80 |
| Receivership | 70 |
| Recovery plan | 45 |
| Safeguard | 40 |
| Safeguard plan | 30 |
| Debts paid (only if less than 3 years ago) | 15 |
| Procedure notices with no stated stage (for example only a claim-list filing in the window) | 50 (20 if the first one is over 3 years old) |
| Strike-off | 100 |
| Dissolution | 60 (40 without liquidation) |
| Conciliation or professional recovery (less than 3 years ago) | 30 |
| Late accounts | 30 |
| Sold a business in the last 12 months | 20 |
| 2 or more head-office moves in 12 months | 10 |
| 2 or more management changes in 12 months | 10 |
| Registered less than 12 months ago | 10 |

Levels: `closed` = struck off or closed for insufficient assets; `high` ≥ 70; `medium` ≥ 30; otherwise `low`. `unknown` means no notices were found.

### Pricing (pay per event)

| Event | Price | When |
|---|---|---|
| `siren-report` | **$0.003** | One summary row for a SIREN with at least 1 BODACC notice |
| `empty-check` | $0.0005 | A valid SIREN for which BODACC has no notice |
| Actor start | $0.001 | Once per run |

Invalid numbers and API errors are free. 1,000 companies cost at most about $3. Set a **maximum charge per run**: the Actor stops cleanly when the limit is reached. SIRENs are queried 20 per official API request, up to 10,000 per run.

### Personal data (GDPR)

BODACC also publishes notices about **sole traders** (*entrepreneurs individuels*, natural persons). By default (`maskNaturalPersons: true`), when the company is a natural person or its type is unknown:

- the name and trade name are replaced by `[natural person – masked]`
- the city and the activity text are removed

Only the SIREN, department, legal form, dates and status remain. For **all** companies, the Actor never copies free-text fields (judgment details, sale descriptions, change descriptions), which can contain names of directors, liquidators or private addresses. They become controlled tags (for example `management-change`, `receivership`), and each notice keeps its official bodacc.fr link.

Turn masking off only if you have a lawful basis to process this personal data. You are the controller of what you do with the output.

### Data source and limits

- **Official source only:** the BODACC open-data API by DILA (Opendatasoft Explore v2.1, `bodacc-datadila.opendatasoft.com/api`), allowed by the site's robots.txt, no login or key. Data under *Licence Ouverte / Etalab 2.0*.
- BODACC covers companies registered with commercial courts (RCS) and, since 2023, the RNE. Associations, most public bodies and some liberal professions or micro-entrepreneurs never appear: they return `found: false` (charged $0.0005).
- Accounts filed under confidentiality still produce a *dépôt des comptes* notice, so the late-filing flag still works, but publication can lag a few weeks behind the filing.
- For the most accurate insolvency stage, keep `lookbackYears: 0` (full history). A short lookback can leave out the opening judgment or plan, and the row then shows `procedure-published` (stage not stated).
- This is a signal tool based on official publications, **not a credit rating**.

### FAQ

**How do I know if a French company is in liquidation?** Paste its SIREN: `insolvency.status` shows the current stage (for example `liquidation`) with its date, and `riskLevel` becomes `high` or `closed`.

**Can I monitor my customers every week?** Yes: save the input as a task and add an Apify schedule. Each run costs $0.003 per company with notices.

**Does it use Infogreffe or paid data?** No. Only the free official BODACC API.

### En français : BODACC procédure collective par SIREN

Collez une liste de **SIREN, SIRET ou numéros de TVA FR** : l'Actor lit toutes les annonces **BODACC** officielles (DILA) et renvoie **une ligne de synthèse par entreprise** : **procédure collective** en cours (sauvegarde, redressement judiciaire, plan, plan de cession, liquidation judiciaire, clôture pour insuffisance d'actif), **radiation**, **dissolution**, **dernier dépôt des comptes** et retard éventuel, **ventes de fonds**, changements récents (dirigeants, siège, capital), avec un **score de risque expliqué**. Les entrepreneurs individuels sont masqués par défaut (RGPD). Prix : 0,003 $ par SIREN avec annonces, 0,0005 $ sans annonce. Ce n'est pas une notation de crédit.

### Support

This Actor is **maintained by an AI agent on behalf of its owner**. Report problems in the Issues tab; **issues are fixed within 14 days**.

Data source: BODACC, Direction de l'information légale et administrative (DILA), *Licence Ouverte 2.0*. Not affiliated with DILA.

### Ready-to-run example tasks

- [BODACC procédure collective check by SIREN](https://apify.com/characteristic_division/bodacc-siren-health-check/examples/bodacc-procedure-collective-siren-check)
- [Find closed or struck-off French companies in a list](https://apify.com/characteristic_division/bodacc-siren-health-check/examples/find-closed-companies-in-crm-list)
- [Monitor customers in BODACC (with official notice links)](https://apify.com/characteristic_division/bodacc-siren-health-check/examples/monitor-customers-in-bodacc)

### More Actors from the same maintainer

- [France Price per m² by Address – Batch DVF Comps](https://apify.com/characteristic_division/dvf-price-per-m2-batch): median €/m² of real recorded sales around French addresses
- [Swiss VAT (MWST/TVA) & UID Validator](https://apify.com/characteristic_division/swiss-uid-vat-validator): bulk check of Swiss VAT / UID numbers in the official register
- [Google Sheets Import/Export – Service Account](https://apify.com/characteristic_division/sheets-sync-service-account): send these results to a Google Sheet without OAuth expiry

# Actor input Schema

## `sirens` (type: `array`):

Companies to check: 9-digit SIREN, 14-digit SIRET or French VAT number (FRxx + SIREN), spaces allowed. Objects {"siren": "...", "label": "..."} keep your own reference. Duplicates are removed. Max 10,000 per run.

## `lookbackYears` (type: `integer`):

Only use notices published in the last N years. 0 = full BODACC history (since 2008 for most notice types).

## `maskNaturalPersons` (type: `boolean`):

Default on (GDPR). For sole traders (entrepreneurs individuels) the name, trade name, city and activity text are replaced or removed. Turn off only if you have a lawful basis to process this personal data.

## `includeNotices` (type: `boolean`):

Add a compact list of the underlying notices (date, type, judgment nature, tags, official bodacc.fr link). No free text is copied.

## `maxNotices` (type: `integer`):

Maximum notices listed per company when 'Include notice list' is on (newest first).

## `batchSize` (type: `integer`):

Advanced: how many SIRENs are queried together in one BODACC API request.

## `concurrency` (type: `integer`):

Advanced: parallel BODACC API requests (requests are also rate-paced).

## Actor input object example

```json
{
  "sirens": [
    "552032534",
    "542051180",
    "949202030"
  ],
  "lookbackYears": 0,
  "maskNaturalPersons": true,
  "includeNotices": false,
  "maxNotices": 50,
  "batchSize": 20,
  "concurrency": 3
}
```

# Actor output Schema

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

One row per input item; field definitions in the dataset schema (overview view).

## `runSummary` (type: `string`):

Counts of charged, free and failed items and API requests for this run.

# 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 = {
    "sirens": [
        "552032534",
        "542051180",
        "949202030"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("characteristic_division/bodacc-siren-health-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 = { "sirens": [
        "552032534",
        "542051180",
        "949202030",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("characteristic_division/bodacc-siren-health-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 '{
  "sirens": [
    "552032534",
    "542051180",
    "949202030"
  ]
}' |
apify call characteristic_division/bodacc-siren-health-check --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,characteristic_division/bodacc-siren-health-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/tnxVIKFhXv2zuDrFp/builds/egHYEnXkApXmuyYSh/openapi.json
