# France Bodacc Legal Notices Scraper (`kawsar/france-bodacc-legal-notices-scraper`) Actor

Extract French BODACC legal notices, company creations, and bankruptcy filings with ease. Search by query, notice family, or department, then download structured results directly in JSON, CSV, or Excel format

- **URL**: https://apify.com/kawsar/france-bodacc-legal-notices-scraper.md
- **Developed by:** [Kawsar](https://apify.com/kawsar) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.99 / 1,000 results

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?

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 BODACC Legal Notices Scraper

<p align="center">
  <img src="https://imgur.com/LInNsdB.png" alt="France BODACC Legal Notices" style="max-width:100%; border-radius:14px; width:680px;" />
</p>

This scraper collects French commercial announcements, including company creations, sales, and bankruptcy notices. You can search by keyword, filter by notice family, or perform bulk exports, set your item caps, and download your dataset as JSON, CSV, or Excel.

Keywords: france, bodacc, legal, notices, scraper, export csv, apify.

### Use cases

- **Insolvency watch**: Track insolvency notices for specific departments and date ranges.
- **Lead generation**: Filter for new company creations and export clean CSV lead lists.
- **Business search**: Look up specific business names or terms like "boulangerie" instantly.
- **Sales and transfers**: Stay updated on business sales and ownership transfers without manual browsing.
- **Scheduled export**: Automatically grab up to 1,000 notices per run for spreadsheets or webhooks.

### What this actor extracts

Choose from three flexible extraction modes:

- `search`: Runs full-text searches across official listings.
- `by_family`: Filters by specific categories such as insolvency proceedings, new creations, or business transfers.
- `bulk_export`: Retrieves comprehensive structured records without standard search limits.

#### Optional filters

You can narrow down results using department numbers (e.g., 75 for Paris) along with start (`dateFrom`) and end (`dateTo`) publication dates.

Results automatically handle duplicates and retry temporary connection issues. If a record encounters an issue, it is safely logged as an error row rather than interrupting your entire run.

### Input

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `mode` | string | `search` | Choose between full-text search, family filtering, or bulk export. |
| `query` | string | empty | Keywords to search for in notices. |
| `familleavis_lib` | string | empty | The specific notice category (required for `by_family`). |
| `departement` | string | empty | Department code (for example, 75). |
| `dateFrom` | string | empty | Earliest publication date (YYYY-MM-DD). |
| `dateTo` | string | empty | Latest publication date (YYYY-MM-DD). |
| `maxItems` | integer | 100 | Maximum notice rows to save (1 to 1000). |
| `requestDelaySecs` | number | 1 | Delay between page fetches in seconds. |
| `timeoutSecs` | integer | 300 | Maximum total run time in seconds. |
| `requestTimeoutSecs` | integer | 30 | Timeout limit per request. |
| `proxyConfiguration` | object | Custom/Off | Proxy settings if required. |

#### Example input

```json
{
  "mode": "by_family",
  "query": "",
  "familleavis_lib": "Procédures collectives",
  "departement": "31",
  "dateFrom": "2026-10-01",
  "dateTo": "2026-10-11",
  "maxItems": 100,
  "requestDelaySecs": 1,
  "timeoutSecs": 300,
  "requestTimeoutSecs": 30,
  "proxyConfiguration": { "useApifyProxy": false }
}

```

### Output

Data is delivered straight to your default dataset. Here is an example row format:

```json
{
  "id": "C202500182618",
  "dateparution": "2025-01-26",
  "familleavis_lib": "Dépôts des comptes",
  "typeavis_lib": "Avis initial",
  "commercant": "Le Fournil des Bocages",
  "registre": ["752461681", "752 461 681"],
  "tribunal": "Greffe du Tribunal de Commerce de compiègne",
  "ville": "Thiescourt",
  "cp": "60310",
  "departement_nom_officiel": "Oise",
  "jugement": null,
  "acte": null,
  "url": "[https://www.bodacc.fr/pages/annonces-commerciales-detail/?q.id=id:C202500182618](https://www.bodacc.fr/pages/annonces-commerciales-detail/?q.id=id:C202500182618)",
  "scraped_at": "2026-10-12T00:00:00+00:00"
}

```

| Field | Type | Description |
| --- | --- | --- |
| `id` | string | Unique notice identifier. |
| `dateparution` | string | Publication date. |
| `familleavis_lib` | string | Category or notice family. |
| `typeavis_lib` | string | Specific notice type label. |
| `commercant` | string | Business or individual trader name. |
| `registre` | array | SIREN numbers associated with the record. |
| `tribunal` | string | Commercial court registry or judicial authority. |
| `ville` | string | City or municipality. |
| `cp` | string | Postal code. |
| `departement_nom_officiel` | string | Department name. |
| `jugement` | string | Legal details regarding judgments (if applicable). |
| `acte` | string | Structured notice details or act summary. |
| `url` | string | Direct link to the notice view. |
| `scraped_at` | string | UTC timestamp of extraction. |
| `error` | string | Included only if a row hits a network issue. |

### FAQ

**Can I export data directly to CSV or Excel?**
Yes, you can download your final dataset in JSON, CSV, or Excel formats directly from the platform interface.

**What happens if a search yields no results?**
If no records match your parameters, the run finishes smoothly with 0 items saved.

**How many notices can I retrieve per execution?**
`maxItems` defaults to 100 records and can be increased up to 1,000 per run. To get the best results, use department or date filters to narrow down large queries.

**Why do duplicate notice IDs appear across multiple runs?**
Records are identified by their unique ID. If you run the exact same search filters over time, you will receive the same underlying records, updated with the new run's timestamp.

### Trademark Notice

France BODACC Legal Notices and related names, logos, and trademarks belong to their respective owners. Their use in this documentation is solely to identify the source of data and does not imply affiliation, sponsorship, endorsement, or partnership.

### Disclaimer

This Actor is an independent tool developed by Kawsar and is not affiliated with, endorsed by, or official partner to any legal entity referenced within. Users are responsible for complying with relevant data licensing and terms of use.

### Is web scraping legal?

This Actor only collects publicly available data without requiring user accounts or bypassing access barriers. Scraping public data is widely practiced, but how you handle and use the data is important:

- **Personal data:** If your results contain personal details (such as names or sole trader details), privacy laws such as the GDPR in the EU or CCPA in California may apply. Make sure you process personal data under a valid legal basis.
- **Copyright:** Certain content may be protected by intellectual property rules. Avoid republishing full copyrighted texts without permission.
- **Terms of use:** Respect rate limits, user guidelines, and any license requirements attached to the data you collect.
- **Legal advice:** This summary is for general information purposes and does not constitute legal advice. Consult legal counsel for specific compliance questions.

To learn more, check out the guide: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

# Actor input Schema

## `mode` (type: `string`):

search wraps query in search() on the records endpoint. by_family filters familleavis_lib on records. bulk_export reads the JSON export endpoint with the same filters.

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

Full-text query for search mode, sent as search("your text"). Also applied on bulk export when set. Leave blank to skip full-text.

## `familleavis_lib` (type: `string`):

Exact familleavis_lib value. Required for by_family. Examples: Procédures collectives, Créations, Ventes et cessions, Dépôts des comptes. Optional extra filter on search and bulk export.

## `departement` (type: `string`):

numerodepartement filter, for example 75 for Paris or 2A for Corse-du-Sud. Leave blank to skip.

## `dateFrom` (type: `string`):

Keep notices with dateparution on or after this day. Use YYYY-MM-DD. Leave blank to skip the lower bound.

## `dateTo` (type: `string`):

Keep notices with dateparution on or before this day. Use YYYY-MM-DD. Leave blank to skip the upper bound.

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

Maximum notice rows to save this run. Hard cap is 1000. Error rows do not count toward this limit.

## `requestDelaySecs` (type: `number`):

Seconds to wait before each page request. Retries use their own backoff and do not add this delay again.

## `userAgent` (type: `string`):

User-Agent sent on every request. Include an app name and a contact so the host can identify the client.

## `timeoutSecs` (type: `integer`):

Stop the run after this many seconds and keep rows already collected. Default 300. Maximum 3600.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for one BODACC response before treating that call as failed. Default 30 seconds.

## `proxyConfiguration` (type: `object`):

Optional proxy for BODACC requests. Leave useApifyProxy off unless the host blocks your IP.

## Actor input object example

```json
{
  "mode": "search",
  "query": "boulangerie",
  "familleavis_lib": "Procédures collectives",
  "departement": "75",
  "dateFrom": "2026-10-01",
  "dateTo": "2026-10-11",
  "maxItems": 100,
  "requestDelaySecs": 1,
  "userAgent": "",
  "timeoutSecs": 300,
  "requestTimeoutSecs": 30,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Notice id, publication date, family, company, registry, court, town, and source URL.

## `errors` (type: `string`):

Failed requests with URL, HTTP status, and message.

## `dataset` (type: `string`):

Every row from the run, without a table view applied.

# 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 = {
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("kawsar/france-bodacc-legal-notices-scraper").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 = { "proxyConfiguration": { "useApifyProxy": False } }

# Run the Actor and wait for it to finish
run = client.actor("kawsar/france-bodacc-legal-notices-scraper").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 '{
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call kawsar/france-bodacc-legal-notices-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kawsar/france-bodacc-legal-notices-scraper"
        }
    }
}
```

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/ClYPsJvdWfoazo3Fp/builds/OPp7SjbjWtbD3bDRi/openapi.json
