# France Company Event Monitor (BODACC) — No Login, $20/1k (`outstanding_vegetable/france-company-event-monitor`) Actor

Watch French companies on BODACC by SIREN, name, department or event type and get only NEW legal events: insolvency judgments, sales, creations, dissolutions, with tribunal, administrators and dates. No login. MCP-ready. $20 per 1,000 alerts.

- **URL**: https://apify.com/outstanding\_vegetable/france-company-event-monitor.md
- **Developed by:** [Peter Skotte](https://apify.com/outstanding_vegetable) (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 $20.00 / 1,000 company events

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 Event Monitor (BODACC) — daily insolvency & legal-event alerts

Get a **daily feed of only the new BODACC announcements for the French companies you care about**: insolvency
proceedings, company creations, business sales, capital and management changes, dissolutions. Watch a portfolio of
SIREN numbers, company names, or whole departments, and the monitor remembers every announcement it has already
reported, so a scheduled run emits just the new ones, posts a summary to your webhook, and costs you only for what
actually happened. No login, no API key, no French legal vocabulary required.

**BODACC** (*Bulletin officiel des annonces civiles et commerciales*) is the official French gazette where every
commercial court registry (*greffe*) must publish company legal events. If a customer, supplier or borrower enters
insolvency in France, it is announced here first, usually within days of the judgment.

### Use cases

- **Credit risk / accounts receivable**: watch your French debtors' SIRENs and get the *liquidation judiciaire* or
  *redressement judiciaire* opening the day it is published, with the court, the judgment date, the date of cessation
  of payments and the appointed *mandataire* / *liquidateur* to file your claim with (two-month deadline from publication).
- **Supplier & counterparty monitoring**: know when a supplier is sold, dissolved, changes legal form or files accounts.
- **Lead generation**: new company creations by department and legal form; businesses for sale (*ventes et cessions*).
- **Restructuring / insolvency practitioners**: nationwide or per-court feed of new proceedings.

### How it works

1. Queries the official BODACC open-data API for announcements **published in the last `lookbackDays`** that match
   your event families, departments, and (optionally) your SIREN / company-name watchlist.
2. Compares each announcement ID against the monitor's saved state.
3. Emits unseen announcements (`changeType: "new"`) with the announcement JSON parsed into flat English fields
   (French raw values are kept: judgment names, legal forms, activities).
4. Saves the state, then POSTs a run summary to `webhookUrl` if set.

State lives in a named key-value store `bodacc-monitor-<hash of monitorId>` in your Apify account, capped at 50,000
announcements (oldest by publication date are dropped). Delete the store to reset a monitor.

### Input

| Field | Default | Notes |
|---|---|---|
| `sirens` | `[]` | 9-digit SIRENs (spaces allowed; a 14-digit SIRET is reduced to its SIREN). Matched against the announcement's RCS registration |
| `companyNames` | `[]` | Word-prefix match on the announced company name. OR-ed with `sirens` |
| `eventFamilies` | `["Procédures collectives"]` | See the list below. Empty = all families |
| `departments` | `[]` | Department codes, e.g. `["75","92","69","2A","974"]`. Empty = all of France |
| `lookbackDays` | `7` | Publication window. 7 gives a safe overlap for a daily schedule |
| `maxNewEvents` | `10` | Cap per run; anything beyond stays unseen and comes out next run |
| `maxItems` | `10` | Same meaning as `maxNewEvents`; the lower of the two applies. Raise both for a production feed |
| `firstRunMode` | `emitAll` | `emitAll` reports every current match on the first run; `baseline` records them silently |
| `webhookUrl` | `""` | Optional POST target for the run summary |
| `monitorId` | `default` | One state store per ID, so several portfolios can run side by side |

#### Event families (`eventFamilies`)

| Value (French, as on BODACC) | Meaning | API code (also accepted) |
|---|---|---|
| `Procédures collectives` | Insolvency proceedings: *sauvegarde* (safeguard), *redressement judiciaire* (receivership / reorganisation), *liquidation judiciaire* (court-ordered liquidation), plan judgments, closures, creditor lists | `collective` |
| `Créations` | New company registrations | `creation` |
| `Ventes et cessions` | Sales and transfers of businesses (*fonds de commerce*), mergers | `vente` |
| `Modifications diverses` | Changes to the registration: name, capital, management, registered office, activity | `modification` |
| `Radiations` | Removal from the register (dissolution, closure) | `radiation` |
| `Dépôts des comptes` | Annual accounts filings | `dpc` |
| `Immatriculations` | Registrations (older bulletin type) | `immatriculation` |
| `Procédures de conciliation` | Court-approved conciliation agreements | `conciliation` |
| `Procédures de rétablissement professionnel` | Debt discharge for individual entrepreneurs | `retablissement_professionnel` |

English shorthands `insolvency`, `creations`, `sales`, `modifications`, `dissolutions`, `accounts` are accepted too.

### Recommended setup for a daily feed

1. Create a task with your SIRENs (or departments) and set `monitorId` to something meaningful (`debtors-q4`).
2. **First run: set `firstRunMode` to `baseline`** and `lookbackDays` to 30 or 90. This records everything already
   published for your watchlist, emits nothing, and stops your first day from being a backlog.
3. Switch `firstRunMode` back to `emitAll` (it only matters when the state is empty anyway), keep `lookbackDays` at 7,
   and raise `maxNewEvents` and `maxItems` to 500+.
4. **Schedule the task daily at 08:00 Europe/Paris.** BODACC publishes one bulletin per business day (no weekend
   editions), and the open-data feed is refreshed overnight, so a morning run catches the previous day's bulletin.
5. Point `webhookUrl` at Slack (incoming webhook), Zapier, Make, or your own endpoint.

The default settings (`{}`) run in `emitAll` mode on nationwide insolvency announcements from the last 7 days, so you
see real output on the first try.

### Example: watch a debtor portfolio for insolvency and dissolution

```json
{
  "sirens": ["812 800 563", "877695668", "91506084200013"],
  "eventFamilies": ["Procédures collectives", "Radiations", "Ventes et cessions"],
  "lookbackDays": 7,
  "maxNewEvents": 500,
  "maxItems": 500,
  "monitorId": "debtors",
  "webhookUrl": "https://hooks.slack.com/services/XXX/YYY/ZZZ"
}
```

### Example: new company creations in Paris and Hauts-de-Seine

```json
{
  "eventFamilies": ["Créations"],
  "departments": ["75", "92"],
  "maxNewEvents": 1000,
  "maxItems": 1000,
  "monitorId": "idf-creations"
}
```

### Output

One record per new announcement:

```json
{
  "announcementId": "A202601815872",
  "publicationDate": "2026-09-22",
  "bulletin": "A",
  "eventFamily": "Procédures collectives",
  "eventFamilyCode": "collective",
  "noticeType": "Avis initial",
  "eventType": "Jugement d'ouverture de liquidation judiciaire",
  "eventDate": "2026-09-04",
  "eventDetails": "Jugement prononçant la liquidation judiciaire, date de cessation des paiements le 29 juillet 2026, désignant liquidateur Selarl Argos en la personne de Me Véronique Manié 19 rue Lantiez 75017 Paris. Les déclarations des créances sont à adresser au mandataire judiciaire ...",
  "companyName": "HAB France",
  "siren": "812800563",
  "allSirens": ["812800563"],
  "registre": "RCS Paris",
  "personType": "pm",
  "legalForm": "Société par actions simplifiée",
  "activity": "Conception, commercialisation, organisation d'expositions, salon, congrès ...",
  "capital": null,
  "capitalCurrency": null,
  "address": "117 rue de Charenton",
  "postalCode": "75012",
  "city": "Paris",
  "department": "75",
  "departmentName": "Paris",
  "region": "Île-de-France",
  "tribunal": "Greffe du Tribunal des Activités Economiques de Paris",
  "judgmentFamily": "Jugement d'ouverture",
  "judgmentType": "Jugement d'ouverture de liquidation judiciaire",
  "judgmentDate": "2026-09-04",
  "paymentsCessationDate": "2026-07-29",
  "administrators": [
    { "role": "liquidateur", "name": "Selarl Argos en la personne de Me Véronique Manié", "address": "19 rue Lantiez 75017 Paris" }
  ],
  "previousAnnouncement": null,
  "bodaccUrl": "https://www.bodacc.fr/annonce/detail-annonce/A/20260181/5872",
  "matchedOn": ["siren:812800563", "family:collective"],
  "changeType": "new",
  "firstSeenAt": "2026-09-28T07:00:12.345Z",
  "monitorId": "debtors"
}
```

Field notes:

- `noticeType`: *Avis initial* (original), *Avis rectificatif* (correction), *Avis d'annulation* (cancellation).
  Corrections and cancellations reference the original in `previousAnnouncement`.
- `personType`: `pm` = legal entity (*personne morale*), `pp` = individual entrepreneur (*personne physique*).
- `registre`: the registry and court of registration, e.g. `RCS Paris`; `RM <department>` for craft businesses
  registered only at the *Répertoire des Métiers*.
- `judgmentFamily` / `judgmentType` / `judgmentDate` / `paymentsCessationDate` / `administrators` are filled for
  insolvency and conciliation announcements. Administrator roles: *liquidateur*, *mandataire judiciaire* (creditors'
  representative), *administrateur judiciaire*, *commissaire à l'exécution du plan*, *mandataire ad hoc*, *conciliateur*.
- `capital` / `capitalCurrency` appear when the announcement states the share capital (creations, sales, some
  modifications and dissolutions).
- `eventType` / `eventDate` / `eventDetails` summarise non-judgment families: creation category, sale category and
  effective date, modification description, dissolution comment, accounts closing date.
- `matchedOn`: why the announcement was emitted (`siren:…`, `name:…`, `department:…`, `family:…`).

### Webhook payload

```json
{
  "monitorId": "debtors",
  "runAt": "2026-09-28T07:00:12.345Z",
  "newCount": 3,
  "scanned": 3,
  "seenTotal": 412,
  "baseline": false,
  "events": [ "...first 50 records as above..." ]
}
```

### Pricing

$0.005 per run plus $0.02 per new event emitted. Baseline runs and runs with nothing new cost only the start fee.

### Limits

- The open-data feed covers announcements published since 2008; the monitor only looks back `lookbackDays`.
- A run scans at most 2,000 announcements per query. For nationwide feeds of high-volume families
  (`Dépôts des comptes`, `Modifications diverses`) narrow by department or run several monitors.
- Full announcement text and the PDF are available on `bodaccUrl`.

# Actor input Schema

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

French company identifiers (9 digits, spaces allowed; a 14-digit SIRET is reduced to its SIREN). Every BODACC announcement whose RCS registration matches one of these is reported. Empty = do not filter by company.

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

Word-prefix match on the announced company name (commercant), e.g. "Carrefour" or "hosting". Combined with SIRENs as OR: an announcement matches if it hits either list. Empty = do not filter by name.

## `eventFamilies` (type: `array`):

BODACC families to monitor. Accepted: "Procédures collectives" (insolvency: sauvegarde, redressement, liquidation), "Créations", "Ventes et cessions", "Modifications diverses", "Radiations", "Dépôts des comptes", "Immatriculations", "Procédures de conciliation", "Procédures de rétablissement professionnel". API codes (collective, creation, vente, modification, radiation, dpc) work too. Empty = all families.

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

French department codes, e.g. \["75", "92", "69", "2A", "974"]. Empty = whole of France.

## `lookbackDays` (type: `integer`):

Only consider announcements published within this many days. BODACC publishes every business day; 7 gives a safe overlap for a daily schedule and the seen-state prevents duplicates.

## `maxNewEvents` (type: `integer`):

Stop after emitting this many new announcements. Announcements beyond the cap stay unseen and are emitted on the next run. The lower of maxNewEvents and maxItems applies.

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

Hard cap on dataset rows per run (same meaning as maxNewEvents; the lower of the two applies). Raise both for a production feed.

## `firstRunMode` (type: `string`):

What to do when the monitor has no saved state yet. emitAll: treat every current match as new and emit it (good for a one-off pull or a first test). baseline: silently record every current match as seen and emit nothing, so the next scheduled run reports only what is new since.

## `webhookUrl` (type: `string`):

Optional. After each run a JSON summary {monitorId, runAt, newCount, scanned, events\[first 50]} is POSTed here (Slack/Zapier/Make/your API).

## `monitorId` (type: `string`):

Name of this watchlist. Each monitor ID keeps its own seen-state in a key-value store named bodacc-monitor-<hash>, so you can run several portfolios (e.g. "suppliers", "debtors-idf") side by side.

## Actor input object example

```json
{
  "sirens": [],
  "companyNames": [],
  "eventFamilies": [
    "Procédures collectives"
  ],
  "departments": [],
  "lookbackDays": 7,
  "maxNewEvents": 10,
  "maxItems": 10,
  "firstRunMode": "emitAll",
  "webhookUrl": "",
  "monitorId": "default"
}
```

# Actor output Schema

## `records` (type: `string`):

Dataset of new BODACC company events found in this run (JSON).

# 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 = {
    "eventFamilies": [
        "Procédures collectives"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("outstanding_vegetable/france-company-event-monitor").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 = { "eventFamilies": ["Procédures collectives"] }

# Run the Actor and wait for it to finish
run = client.actor("outstanding_vegetable/france-company-event-monitor").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 '{
  "eventFamilies": [
    "Procédures collectives"
  ]
}' |
apify call outstanding_vegetable/france-company-event-monitor --silent --output-dataset

```

## MCP server setup

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

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/lAlrpTRSxen2Ohezo/builds/OWIxIcdB5hwFrUxTh/openapi.json
