# French Website to SIREN & Mentions Légales Extractor (`atesen-software/french-website-siren-mentions-legales`) Actor

Turn a list of French websites or domains into SIREN, SIRET, VAT number, RCS city, legal name and address, read from each site's mentions légales and checked against official SIRENE data. Pay only for websites matched to a company.

- **URL**: https://apify.com/atesen-software/french-website-siren-mentions-legales.md
- **Developed by:** [Atesen Software](https://apify.com/atesen-software) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 website matched to sirens

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

## French Website to SIREN & Mentions Légales Extractor

Give it a list of **French websites or domains**, get back the company behind each one: **SIREN, SIRET, VAT number, RCS city, share capital, emails and phones** read from the site's **mentions légales**, then **verified against official SIRENE data** (legal name, registered address, NAF code, headcount, size category, latest revenue). **You only pay for websites matched to a company.**

French law (LCEN, art. 6) requires company websites to publish their legal identity, so for most SME and B2B sites the SIREN is right there; this actor finds the right page, extracts it and validates it.

Good for: enriching lead lists that only have a website (Apollo, Clay, Google Maps or event exports), matching domains to SIREN for a CRM, KYB / supplier onboarding, and preparing lists for [French Company Data: SIRENE enrichment](https://apify.com/atesen-software/french-company-enrichment-sirene) or [French Company Financials & Ratios](https://apify.com/atesen-software/french-company-financials-ratios).

### How it works

1. Loads the homepage (https, falls back to http) and respects `robots.txt`.
2. Follows the most likely legal links: *mentions légales*, *informations légales*, *legal notice*, *CGV/CGU*, *à propos*, *contact*, plus common paths such as `/mentions-legales`.
3. Extracts SIREN / SIRET (only when written next to SIREN, SIRET, RCS or *immatriculée*), French VAT numbers, RCS city, share capital, emails, phones. Every number is **checked with the Luhn algorithm** and VAT keys are recomputed, so random 9-digit numbers are not returned.
4. Picks the best SIREN (legal pages and VAT matches weigh more), then looks it up in the official **Recherche d'entreprises** API (INSEE SIRENE + RNE).
5. Crawls politely: one page per second per site, at most 6 pages by default, and stops as soon as a legal page with a SIREN is found.

### Input example

```json
{
  "websites": ["pennylane.com", "payfit.com", "swile.co", "qonto.com", "danone.com/fr"],
  "enrichWithSirene": true,
  "maxPagesPerSite": 6,
  "maxConcurrency": 3,
  "respectRobotsTxt": true
}
```

### Output example

```json
{
  "input": "swile.co",
  "domain": "swile.co",
  "status": "found",
  "siren": "824012173",
  "legalName": "SWILE",
  "vatNumber": "FR67824012173",
  "rcsCity": "Montpellier",
  "shareCapital": "90 402,50",
  "emails": [
    "hello@swile.fr"
  ],
  "phones": [
    "0974594217"
  ],
  "legalPageUrl": "https://www.swile.co/legal/company-details",
  "registryAddress": "IMMEUBLE L'ALTIS BATIMENT A @ 7CENTER 561 RUE GEORGES MELIES 34000 MONTPELLIER",
  "postalCode": "34000",
  "city": "MONTPELLIER",
  "nafCode": "66.19B",
  "legalFormCode": "5710",
  "companyCategory": "ETI",
  "headcountRange": "41",
  "creationDate": "2016-11-24",
  "isActive": true,
  "sirenCandidates": [
    "824012173"
  ],
  "sireneMatch": true
}
```

#### Status values

| Status | Meaning | Charged? |
|---|---|---|
| `found` | SIREN found on the site and confirmed in SIRENE | **Yes** |
| `found_not_in_sirene` | Valid SIREN found but not in the public SIRENE base (or enrichment off) | No |
| `found_sirene_unavailable` | SIREN found on the site, but the government API was down after retries, so it could not be verified | No |
| `not_found` | Site crawled, no SIREN published (emails/phones still returned) | No |
| `blocked` | The site refused the request (403/429, bot protection). Try the proxy option | No |
| `robots_disallowed` | `robots.txt` forbids crawling | No |
| `unreachable` / `invalid_url` / `error` | DNS, TLS or timeout problems | No |

### Pricing

Pay per event: **one charge per website matched to a SIREN confirmed in SIRENE** (`found`). Every other status is free. Example: 1,000 domains with a 60 % match rate = 600 charged events (at $0.005 per match that is $3). See the Pricing tab for current prices.

### Use with Make, Zapier, n8n, Clay or Google Sheets

- **Make / n8n / Zapier:** Apify app → *Run an Actor* (`atesen-software/french-website-siren-mentions-legales`) with `{"websites": ["{{domain}}"]}`, then *Get dataset items* and map `siren`, `legalName`, `vatNumber` to your CRM.
- **API:** `POST https://api.apify.com/v2/acts/atesen-software~french-website-siren-mentions-legales/run-sync-get-dataset-items?token=YOUR_TOKEN` with the JSON input.
- **Clay / Sheets:** export as CSV, or call the run-sync endpoint from an HTTP column.

### FAQ

**Which sites work best?** French SMEs, startups, B2B companies and e-shops, which nearly always publish mentions légales. Very large consumer sites behind Cloudflare/DataDome may return `blocked` from cloud IPs; try a residential proxy.

**Do you guess the SIREN from the company name?** No. The SIREN must be published on the website; there is no fuzzy name guessing, so false matches are rare. Several candidates are listed in `sirenCandidates`.

**Personal data?** The actor returns contact emails/phones published on the site's legal and contact pages, which may include a named person's address. Process them under a lawful basis (GDPR art. 6) and honour opt-outs. Director names are not extracted.

**Is this a Pappers / societe.com alternative?** For domain → company matching, yes; the enrichment uses official open data (INSEE SIRENE, RNE) via the French government API.

This Actor is not affiliated with INSEE, INPI, the French government, Pappers or societe.com.

# Actor input Schema

## `websites` (type: `array`):

One per line: a domain (pennylane.com), a URL (https://www.payfit.com/fr/) or a sub-site. Duplicates are removed. Use 'Bulk edit' to paste a whole column.

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

Verify each SIREN found against the official Recherche d'entreprises API (INSEE SIRENE + RNE) and add the registered legal name, address, NAF code, headcount range, size category, latest revenue and the computed VAT number.

## `maxPagesPerSite` (type: `integer`):

Homepage + the most likely legal pages (mentions légales, informations légales, CGV, à propos, contact). The crawl stops early as soon as a legal page with a SIREN is found.

## `maxConcurrency` (type: `integer`):

How many websites are processed at the same time. Each website is crawled politely, one page per second.

## `respectRobotsTxt` (type: `boolean`):

Skip pages that the website's robots.txt disallows.

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

Optional. Some large sites (Cloudflare/DataDome) answer 403 to cloud servers; an Apify residential proxy usually helps. Not needed for most SME websites.

## Actor input object example

```json
{
  "websites": [
    "pennylane.com",
    "payfit.com",
    "swile.co",
    "qonto.com",
    "danone.com/fr"
  ],
  "enrichWithSirene": true,
  "maxPagesPerSite": 6,
  "maxConcurrency": 3,
  "respectRobotsTxt": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per website

## `all` (type: `string`):

No description

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

No description

# 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 = {
    "websites": [
        "pennylane.com",
        "payfit.com",
        "swile.co",
        "qonto.com",
        "danone.com/fr"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("atesen-software/french-website-siren-mentions-legales").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 = {
    "websites": [
        "pennylane.com",
        "payfit.com",
        "swile.co",
        "qonto.com",
        "danone.com/fr",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("atesen-software/french-website-siren-mentions-legales").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 '{
  "websites": [
    "pennylane.com",
    "payfit.com",
    "swile.co",
    "qonto.com",
    "danone.com/fr"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call atesen-software/french-website-siren-mentions-legales --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,atesen-software/french-website-siren-mentions-legales"
        }
    }
}
```

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/dYIxdUB9DpalhzDaj/builds/TQWemobIMiLw2gDGP/openapi.json
