# France SIRENE + BODACC Monitor (`keepable_injera/france-sirene-bodacc-monitor`) Actor

Daily French company notices for creations, insolvency, radiations and sales, with optional SIRENE enrichment and privacy masking.

- **URL**: https://apify.com/keepable_injera/france-sirene-bodacc-monitor.md
- **Developed by:** [Chee Chiaw Lim](https://apify.com/keepable_injera) (community)
- **Categories:** Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 notices

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 SIRENE + BODACC Monitor

Daily feed of French company BODACC notices, optionally enriched with SIRENE data through the Recherche d’entreprises API. Schedule the Actor daily and keep the same state store between runs.

### Input

| Field | Default | Meaning |
| --- | --- | --- |
| `lookbackDays` | `2` | Publication date lower bound, calculated in UTC. |
| `families` | `creation`, `collective` | Also accepts `radiation`, `vente`, `modification`. |
| `departments` | `[]` | Department codes. Empty includes all departments. |
| `nafPrefixes` | `[]` | Prefixes of SIRENE `activite_principale`. Requires enrichment. |
| `onlyNew` | `true` | Emit new and changed notices. Skip unchanged snapshots. |
| `maxItems` | `100` | Maximum results pushed, up to 10,000. |
| `enrichWithSirene` | `true` | Fetch an exact SIREN match from Recherche d’entreprises. |
| `stateStoreName` | `france-sirene-bodacc-monitor-state` | Persistent snapshot store. |

The sample input requests at most two results. BODACC requests run at most once per second. SIRENE requests run at most five times per second. BODACC pagination stops at the API's 10,000-record window; narrow the date window or departments for larger feeds.

### Output and state

Each dataset record contains a notice ID, publication date, family, notice type, SIREN, company name, legal form, activity, NAF code, commune, postcode, department, region, court, notice URL and source attribution. Collective notices include judgment nature and date. The `sirene` object contains company attributes and commune, without directors.

`checkedAt` is the collection time. `changeType` is `new`, `changed` or `unchanged`; `changedFields` lists changed output fields. Collection time does not trigger a change. Snapshots are stored under `NOTICES` only after successful dataset pushes. Setting `onlyNew` to `false` also emits unchanged notices. Each emitted result uses the `result` charging event.

Read `RUN_SUMMARY` in the default key-value store for fetched, eligible and pushed counts, errors and stop conditions. Actor output links point to the dataset and summary.

### Personal data

Natural persons are detected from BODACC `typePersonne = pp`, SIRENE legal category `1000`, or a category starting with `2`. Their company name is null and `personalDataMasked` is true. Names, commercial names, enseignes and street addresses are excluded. Commune, postcode, SIREN and activity remain available. BODACC administration and SIRENE directors are never exported. A SIRENE result with a supplied diffusion status other than `O` is dropped.

Without SIRENE enrichment, masking uses BODACC person type and the Actor cannot check the latest SIRENE diffusion status. Unmatched SIRENs have the same limitation. Raw source records and judgment complements are excluded. Activity text is retained.

### Source attribution and licence

Sources are [BODACC commercial notices](https://bodacc-datadila.opendatasoft.com/explore/dataset/annonces-commerciales/) published by DILA and [Recherche d’entreprises](https://recherche-entreprises.api.gouv.fr/) for SIRENE attributes from INSEE. Terms were checked on 2026-10-21; see [TERMS.md](TERMS.md).

Records carry `license: "Licence Ouverte v2.0"` and `attribution: "BODACC (DILA) / SIRENE (INSEE), Licence Ouverte v2.0"`. Reuse requires source attribution and the source update date. Preserve `publishedDate` and `checkedAt` when redistributing. See the [Licence Ouverte v2.0](https://www.etalab.gouv.fr/licence-ouverte-open-licence/).

### Local use

```sh
npm install
npm test
npm start
```

Tests use `node:test` and stub network requests. `test/fixtures/synthetic.json` is a synthetic privacy and pagination fixture. Real response fixture capture is pending API access. Local runs use the real APIs and the input in `storage/key_value_stores/default/INPUT.json`.

### Verification status

On 2026-10-21, 18 dependency-free tests passed. `npm install` failed because DNS could not resolve `registry.npmjs.org`; the local npm cache could not satisfy an offline install. The full `npm test` run failed in four test files that need the missing Apify SDK. The one local Actor run stopped at that missing import and produced no dataset or `RUN_SUMMARY`.

BODACC fixture capture with `curl` also failed DNS resolution. The bundled fixture is synthetic. Capturing real API fixtures and completing the full test suite and live run remain required before deployment.

# Actor input Schema

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

Publication date window ending today (UTC).

## `families` (type: `array`):

Families to include.

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

Department codes, for example 75, 2A or 971. Empty means all departments.

## `nafPrefixes` (type: `array`):

Keep SIRENE activity codes starting with these prefixes. Requires SIRENE enrichment.

## `onlyNew` (type: `boolean`):

Skip unchanged snapshots from previous successful pushes.

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

Maximum records pushed in this run.

## `enrichWithSirene` (type: `boolean`):

Look up each SIREN in the Recherche d’entreprises API.

## `stateStoreName` (type: `string`):

Named key-value store for successfully pushed notice snapshots. Use one store per independent monitor.

## Actor input object example

```json
{
  "lookbackDays": 2,
  "families": [
    "creation",
    "collective"
  ],
  "departments": [],
  "nafPrefixes": [],
  "onlyNew": true,
  "maxItems": 100,
  "enrichWithSirene": true,
  "stateStoreName": "france-sirene-bodacc-monitor-state"
}
```

# Actor output Schema

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

Sanitized BODACC notices with optional SIRENE attributes and change metadata.

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

Fetched, eligible and pushed counts, pagination cap, charge limit and run errors.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("keepable_injera/france-sirene-bodacc-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("keepable_injera/france-sirene-bodacc-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 '{}' |
apify call keepable_injera/france-sirene-bodacc-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,keepable_injera/france-sirene-bodacc-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/glHLuFckvRkeO2nQ0/builds/dyhai8PIOLQ9AEWir/openapi.json
