# Domain to SIREN | French IDs · $4.50 / 1k (`corent1robert/domain-siren-scraper`) Actor

Paste French domains — get SIREN, SIRET and legal name from public mentions, confirmed on INSEE. $4.50 / 1k resolved. Clay / Lemlist. Misses not billed.

- **URL**: https://apify.com/corent1robert/domain-siren-scraper.md
- **Developed by:** [Corentin Robert](https://apify.com/corent1robert) (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 $2.99 / 1,000 siren founds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does Domain to SIREN do?

Paste a list of **French company websites**. This Actor reads public **mentions légales** (and nearby legal / about pages), extracts a **SIREN / SIRET / FR VAT**, then **confirms** it on the official [recherche-entreprises](https://recherche-entreprises.api.gouv.fr) register.

**One input domain = one row.** You get the legal name, head-office SIRET, NAF and administrative status when the register publishes them. Empty identifiers mean the site did not expose crawlable mentions — not a made-up number.

This is **not** a second directors / BODACC enricher. For dirigeants, chain the SIREN into [French Companies · Search & SIREN Enrich](https://apify.com/corent1robert/recherche-entreprises-scraper).

### Who is this for?

This is for you if you already have **French domains** and you are missing the **SIREN** before you can enrich.

- **French CRM / outbound** — Lemlist, Clay, Smartlead, HubSpot. A column of `.fr` / `.com` company sites, not a name search.
- **SDR / BDR on France** — you cannot call the INSEE register with a domain. This is the missing hop: URL → SIREN.
- **Agencies** running FR domain lists from BuiltWith, store locators, or scraped homepages.

Do not paste a keyword like `qonto` and expect a company search. `q=qonto.fr` on the official API returns **zero**. The identifier has to come from the site, then we check the register.

Legalstart’s publisher is **YOLAW**. Lemlist’s is **LEMPIRE**. Back Market’s is **JUNG SAS**. The row is the **legal entity on the page**, confirmed at INSEE — not the brand in the URL.

### Why scrape SIREN from a company website?

- Turn a Clay / Lemlist domain list into SIREN / SIRET without opening 200 mentions-légales tabs
- Confirm the number on the **public INSEE register** (raison sociale, siège, NAF, état) so you do not store the **OVH** SIRET sitting in the hébergeur block
- Skip Datadome homepages instead of inventing a SIREN from the company name (`alan.com` ↛ a closed SARL named ALANCOM)
- Feed [the SIREN enricher](https://apify.com/corent1robert/recherche-entreprises-scraper) for directors when you actually need them

On Apify you can **schedule** runs, download **JSON / CSV / Excel**, and push to Sheets, Make, n8n or Clay.

### What data can this domain to SIREN scraper extract?

| Field | Description |
|---|---|
| `domain`, `inputUrl`, `inputRaw` | Normalized host and the line you pasted |
| `matchStatus` | `resolved` · `not_found` · `blocked` · `ambiguous` · `invalid` |
| `siren`, `siretSiege`, `tva` | Identifiers **after** register confirm |
| `raisonSociale`, `etatAdministratif`, `naf`, `adresseSiege` | Official identity when published |
| `sourceUrl` | Mentions / legal page that contained the number |
| `rejectedHosterSiren` | OVH / Gandi / Scaleway dropped when a publisher SIREN was also present |
| `httpStatus`, `scrapedAt` | Homepage status and timestamp |

Not extracted (and not invented): dirigeants, emails, CA, BODACC, Pappers-paid fields, SIREN from the domain name, screenshots of locked pages.

### How to get a SIREN from a French company website

1. Open this Actor in Apify Console.
2. **Step 1 — Websites:** keep `qonto.fr` and `https://www.shine.fr`, or paste your Clay column. Every line is processed.
3. **Step 2 — Matching:** leave **Skip hosting SIRENs** on Yes (éditeur over OVH).
4. Click **Start**. Download JSON, CSV or Excel. Use the **Domains — Resolved** view for the file you pass downstream.

See the **Input** tab for the visible options (proxy is optional and hidden).

**Be honest about coverage:**

- Works when mentions are **HTML** on the same site (`RCS`, `SIREN`, `sous le numéro`, `TVA FR…`).
- **Not** 100% of the French web. SPA pages with no identifier in the HTML, Datadome/Cloudflare locks, legal notices on another TLD, and Luxembourg / US entities stay `not_found` or `blocked`.
- Several companies on a **CGV** (payment partner + marketplace + bank) and no éditeur → `ambiguous`, **not billed**. A wrong SIREN is worse than a miss.
- First GET is **direct**. One **proxy retry** only if you turned proxy on *and* the page is 403 / challenge. Proxy does not beat Datadome on Fnac / Sezane.

### How much does it cost to turn domains into SIREN?

**$4.50 per 1,000 resolved domains** on the Free plan. Actor start is **$0.00005** (invisible). **`not_found` / `blocked` / `ambiguous` are $0.**

Live Apify Store comps (16 Aug 2026):

| Actor | You pay for | Free / 1k |
|---|---|---|
| [Extract SIREN from websites](https://apify.com/sbzh/extract-siren) | 1 crawl row (no register confirm) | **$6.00** |
| [SIRET enricher (directors / CA)](https://apify.com/silentflow/siret-enricher-ppr) | 1 enrich row | **$8.00** |
| [French Companies · SIREN enrich](https://apify.com/corent1robert/recherche-entreprises-scraper) | 1 company from a **SIREN list** | **$5.99** |
| **This Actor** | **1 domain with a confirmed SIREN** | **$4.50** |

sbzh is the direct crawl competitor. This Actor is cheaper **and** writes the official legal name. Silentflow and the SIREN enricher are **downstream** (you already have an identifier). Do not pay $8/1k to discover a SIREN you can get here.

Paid Apify plans go lower. Diamond is **$2.25 / 1k** resolved.

**Free plan:** a run stops at **20 domains** — enough to test (~$0.09 if all resolve).

| Apify plan | Per resolved domain | Per 1,000 resolved |
|---|---|---|
| Free | $0.00450 | **$4.50** |
| Bronze | $0.00399 | **$3.99** |
| Silver | $0.00349 | **$3.49** |
| Gold | $0.00299 | **$2.99** |
| Platinum | $0.00299 | **$2.99** |
| Diamond | $0.00225 | **$2.25** |

Paste only the domains you want processed. On Apify, set a **max total charge** so a run cannot exceed your budget.

### Input

See the **Input** tab. Visible fields:

- **Domains or URLs** (required) — string list, Clay-friendly. The run length is this list.
- **Skip hosting SIRENs** — default Yes
- **Only resolved rows** — default No (keep misses so you can measure coverage)

Proxy and delay are hidden. Turn proxy on only if you see `blocked` on a site you care about.

### Output

You can download the dataset as JSON, HTML, CSV or Excel.

```json
{
  "domain": "qonto.com",
  "inputUrl": "https://qonto.fr/",
  "matchStatus": "resolved",
  "siren": "819489626",
  "siretSiege": "81948962600054",
  "tva": "FR10819489626",
  "raisonSociale": "QONTO",
  "etatAdministratif": "A",
  "naf": "64.19Z",
  "sourceUrl": "https://qonto.com/fr/about"
}
```

A miss looks like `"matchStatus": "not_found"` with `siren: null`. That row is free.

### Tips

- Prefer **mentions-légales** coverage over dumping CGV URLs as input. The Actor already prefers mentions over CGV when it discovers both.
- After this file, call [French Companies · Search & SIREN Enrich](https://apify.com/corent1robert/recherche-entreprises-scraper) with the `siren` column for directors.
- `etatAdministratif: "C"` means the number on the site is a **ceased** company (mentions can be stale after an acquisition). We still return it — we do not invent a replacement.

### FAQ

#### Does the official French API search by domain?

No. `recherche-entreprises.api.gouv.fr?q=qonto.fr` returns 0. This Actor crawls public legal pages, then queries the register **by SIREN**.

#### Will you guess the company from the domain name?

No. Name search is how you get a closed SARL that happens to be called ALANCOM. Identifiers must appear next to `SIREN` / `SIRET` / `RCS` / `TVA` / `sous le numéro`.

#### What if the page lists OVH and the company?

Default: keep the **éditeur**, store OVH in `rejectedHosterSiren`. If you are scraping ovhcloud.com itself, OVH is the company — we keep it.

#### Is this legal?

We only read **public** legal mentions that French sites are required to publish, plus the **public** INSEE search API. No login, no Pappers key. You are responsible for how you use company identifiers (GDPR / legitimate interest for B2B outreach).

Our Actors do not extract private user data such as personal emails or home addresses. Company identifiers on public legal pages and the public register are not private user profiles. You should still have a legitimate reason to process this data. If you are unsure, consult your lawyers.

#### I need something custom

corentin@outreacher.fr — or open an issue on the Actor’s **Issues** tab. Programmatic runs: see the **API** tab.

# Actor input Schema

## `domains` (type: `array`):

One French company website per line. Bare domains (`qonto.fr`) or full URLs (`https://www.shine.fr`) both work.

This is **not** a name search. `alan.com` will not be guessed from the word “Alan”.

## `skipHosters` (type: `string`):

**Yes (default):** if the page lists both the publisher and OVH / Gandi / Scaleway, keep the **éditeur**. If the site *is* the hoster, keep it.

**No:** return the first valid identifier (can be the hoster).

## `onlyResolved` (type: `string`):

**No (default):** every input domain is a row (`resolved` / `not_found` / `blocked` / `ambiguous`). Useful in Clay to see coverage.

**Yes:** dataset contains only domains that got a confirmed SIREN.

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

Optional. First request is **direct**. The Actor retries **once** with this proxy only on 403 / Datadome / Cloudflare challenge. Leave off for Clay lists of French company sites — most do not need it. Hidden in Console.

## `minDelayMs` (type: `integer`):

Minimum pause between HTTP requests to a site.

## Actor input object example

```json
{
  "domains": [
    "qonto.fr",
    "https://www.shine.fr"
  ],
  "skipHosters": "yes",
  "onlyResolved": "no",
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "minDelayMs": 350
}
```

# Actor output Schema

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

Domain, SIREN, legal name, match status

## `resolved` (type: `string`):

Confirmed SIREN / SIRET / legal name

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

All domain rows

## `output` (type: `string`):

Resolved / not\_found / blocked counts

## `runLog` (type: `string`):

Live progress

# 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 = {
    "domains": [
        "qonto.fr",
        "https://www.shine.fr"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("corent1robert/domain-siren-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 = { "domains": [
        "qonto.fr",
        "https://www.shine.fr",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("corent1robert/domain-siren-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 '{
  "domains": [
    "qonto.fr",
    "https://www.shine.fr"
  ]
}' |
apify call corent1robert/domain-siren-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,corent1robert/domain-siren-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/XPOFyHaLE0E4JwFIE/builds/PJgpJrwa5z1KtUvzH/openapi.json
