# Website to Company: Impressum & Mentions Légales Scraper (`ostrata/website-company-check`) Actor

Website to company: find the legal entity behind any domain from its legal notice (mentions légales, Impressum, imprint, aviso legal): SIREN/SIRET, VAT, HRB, org.nr, IČO, LEI. Then verify it in official registries, EU VIES and BODACC (KYB). Hosting providers skipped, no personal data.

- **URL**: https://apify.com/ostrata/website-company-check.md
- **Developed by:** [Ostrata](https://apify.com/ostrata) (community)
- **Categories:** Lead generation, Business, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 verified companies

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

## Website to Company: Impressum & Mentions Légales Scraper

**Give it a list of websites. Get back the legal entity behind each one, verified.** The Actor reads the site's legal-notice pages (🇫🇷 *mentions légales*, 🇩🇪 *Impressum*, 🇪🇸 *aviso legal*, 🇮🇹 *note legali*, terms and privacy pages), extracts the company identifiers, skips the hosting provider's, and checks the company in official registries and the EU VIES VAT service.

**Also known as:** Impressum scraper, imprint scraper, mentions légales scraper, legal notice extractor, domain to company, website to SIREN, VAT number from website, company from domain enrichment. 🇫🇷 *trouver le SIREN d'un site web, extraire les mentions légales* · 🇩🇪 *Impressum auslesen, Firma hinter Domain finden*.

- **Identifiers found:** French SIREN/SIRET and RCS, EU VAT numbers (all 27 member states + XI, checksum-validated for France), Norwegian org.nr, Finnish Y-tunnus, Czech IČO, LEI, and German/Austrian trade-register entries (HRB/HRA/FN, kept as information).
- **Verification:** official register for 🇫🇷 France, 🇳🇴 Norway, 🇫🇮 Finland, 🇨🇿 Czechia (name, status, legal form, address, activity code), live **EU VIES** VAT check, **BODACC** insolvency notices (FR), optional **GLEIF** LEI.
- **One clear row per website** with a `status`, a `verdict` (`verified` / `review` / `inactive`) and the reasons behind it.

**Use cases:** lead qualification and CRM enrichment (domain → SIREN/VAT), supplier and customer onboarding (KYB), marketplace seller checks, fraud checks ("is there a real, active company behind this site?"), invoice data cleaning. It also works as a tool for AI agents over MCP.

### Why this Actor

| | This Actor | Typical legal-notice scraper |
|---|---|---|
| Identifier **plus** official verification (register, VIES, insolvency) in one row | ✅ | ❌ raw text only |
| Hosting providers and agencies (OVH, IONOS, Gandi, Scaleway…) recognised and skipped | ✅ | ❌ often returns the host's SIREN |
| Checksums validated (SIREN/SIRET, FR VAT key, org.nr, Y-tunnus, IČO, LEI) | ✅ | rarely |
| **No personal data**: no director names, emails or phone numbers | ✅ | ❌ |
| robots.txt respected, plain HTTP, ≥ 1 s between pages | ✅ | varies |
| Pay only for companies identified: blocked sites, sites without identifiers and errors are free | ✅ | usually per row |

### Input

```json
{
  "websites": ["qonto.com", "ostrata.io", "zalando.de", "https://www.n26.com"],
  "verify": true,
  "checkVat": true,
  "checkInsolvency": true,
  "checkLei": false,
  "excludeSoleProprietors": true,
  "maxPagesPerSite": 4,
  "concurrency": 5
}
```

A business email address (`jane@acme.fr`) is accepted too: its domain is used.

### Output

| Field | Meaning |
|---|---|
| `status` | `verified` (identified and found in the register/VIES), `identified` (identifier found, verification off or no match), `no_identifier_found`, `blocked` (robots.txt or bot protection), `fetch_error`, `invalid_input`, `sole_proprietor_excluded` |
| `verdict`, `reasons`, `warnings` | from the verification: `verified`, `review` (e.g. VAT invalid, insolvency notice), `inactive` (ceased in the register) |
| `legalName`, `country`, `registrationNumber`, `vatNumber`, `vatValid`, `registryStatus`, `insolvencyFlag`, `lei` | the verified entity |
| `identifier` | the identifier used, the page it was found on, and the other identifiers of the same entity |
| `otherIdentifiers` | other companies named on the site (hosting provider, parent company…), with a `role` hint |
| `tradeRegisterEntries` | e.g. `HRB 123456` with the court (DE/AT), for information |
| `legalNoticeUrl`, `pagesFetched` | where the data came from |
| `domainMatchScore` | similarity between the domain and the legal name (brand ≠ legal name is common, so this is a hint) |
| `company`, `vat`, `insolvency`, `sources` | full details with sources and licences |

#### Sample output (real local runs, 19 Oct 2026)

| Website | Status | Legal name | Reg. no. | VAT (VIES) | Found on |
|---|---|---|---|---|---|
| `qonto.com` | verified | QONTO | 819489626 | FR10819489626 ✅ | homepage |
| `ostrata.io` | verified | SUBLIME TRADERS | 917821340 | FR13917821340 ✅ | /terms |
| `alan.com` | verified | ALAN TECH | 908274236 | FR85908274236 | /fr-fr/cgv-shop (ALAN INSURANCE also listed in `otherIdentifiers`) |
| `zalando.de` | verified | – (DE VIES returns no name) | – | DE260543043 ✅ | /legal-notice |
| `www.n26.com` | verified | – | – | DE305957096 ✅ | /en-eu/imprint |
| `malt.fr`, `blablacar.fr`, `alza.cz` | blocked (free) | | | | bot protection on robots.txt |
| `example.com` | no_identifier_found (free) | | | | |

### Pricing (pay per event)

- **$0.004 per company identified** (`company-identified`): a checksum-valid company identifier was found on the site.
- **+$0.005 per company verified** (`company-verified`): the company was found in an official register or VIES (verdict `verified`, `review` or `inactive`).
- **Free:** blocked sites, sites without identifiers, invalid inputs, errors, sole traders.
- Set a *maximum cost per run*: the Actor stops cleanly before going over it.

### Use it from AI agents (MCP)

```json
{ "mcpServers": { "apify": { "url": "https://mcp.apify.com?tools=ostrata/website-company-check" } } }
```

*"Which company is behind acme.fr, and is its VAT number valid?"*

### How it crawls (and what it doesn't do)

- Fetches `robots.txt` first and obeys it (group `website-company-check` or `*`, longest-match rules, `Crawl-delay` up to 10 s). A robots.txt answering 401/403/429/5xx is treated as "do not crawl".
- **One plain HTTP GET per page**, no browser, no retries, no proxies, no CAPTCHA solving, at least 1 second between pages of the same site, max 4 pages per site by default (homepage + legal pages).
- Sites protected by bot-detection (Cloudflare, DataDome…) are reported as `blocked` and are free. We do not try to get around them.

### Limitations

- Pages that only render with JavaScript are not read.
- Germany, Spain and some other countries never return the company name in VIES: you get `vatValid` and the VAT number, `legalName: null`. Register adapters exist for FR, NO, FI and CZ.
- When a site names several group companies, the Actor picks the one presented as publisher with the most consistent identifiers; the others are in `otherIdentifiers`.
- Results reflect the sources at query time. This is a data tool, not legal advice.

### Privacy

Only company identifiers are extracted. Names of directors or publication managers, emails and phone numbers on legal pages are **never** stored or returned. Sole traders (natural persons) are excluded by default and not billed.

### Related Actors

- [EU Company Verification (KYB)](https://apify.com/ostrata/eu-company-check): verify companies from a name, SIREN/SIRET, VAT number or LEI (register status, VIES VAT, BODACC insolvency, LEI).
- [France Company List (SIRENE)](https://apify.com/ostrata/france-company-list): build lists of French companies by NAF code, area, headcount and revenue from the official register.
- [Greenhouse, Lever & Ashby Jobs API](https://apify.com/ostrata/ats-jobs-api): normalized job postings from Greenhouse, Lever, Ashby, Workable, SmartRecruiters and Recruitee boards, with only-new-jobs mode.
- [AI Brand Visibility Tracker](https://apify.com/ostrata/ai-search-visibility): check whether ChatGPT, Perplexity and Gemini mention and cite your brand, with position, competitors and share of voice (your own API keys).

***

### 🇫🇷 En bref

**Du site web à l'entreprise vérifiée.** L'Actor lit les mentions légales (ou CGU, politique de confidentialité, Impressum…) d'une liste de sites, extrait le SIREN/SIRET, le numéro de TVA intracommunautaire et les autres identifiants, écarte ceux de l'hébergeur (OVH, IONOS, Gandi…), puis vérifie l'entreprise dans le registre officiel (API Recherche d'entreprises), dans VIES et dans le BODACC.

**0,004 $ par entreprise identifiée + 0,005 $ si elle est vérifiée.** Sites bloqués, sans identifiant ou en erreur : gratuits. Requêtes HTTP simples, robots.txt respecté, aucune donnée personnelle (ni dirigeants, ni e-mails, ni téléphones), entrepreneurs individuels exclus.

Publié par Sublime Traders SAS (Ostrata), France.

# Actor input Schema

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

Domains or URLs, e.g. qonto.com or https://www.example.fr. A business email address also works (its domain is used). Max 5000 per run.

## `verify` (type: `boolean`):

Check the identified company in the official register (FR, NO, FI, CZ) and EU VIES. Off: identification only (cheaper, $0.004 per company).

## `checkVat` (type: `boolean`):

Live VIES check of the VAT number (derived from the SIREN for France).

## `checkInsolvency` (type: `boolean`):

France: BODACC collective proceedings in the last 3 years. NO/FI/CZ: registry flags.

## `checkLei` (type: `boolean`):

Also look up the Legal Entity Identifier (slower: GLEIF allows 60 requests per minute).

## `excludeSoleProprietors` (type: `boolean`):

If the register shows the site belongs to a sole trader (a natural person), return no data about them and charge nothing.

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

Homepage + legal-notice candidates. One plain request per page, at least 1 s apart (or the site's Crawl-delay, up to 10 s). robots.txt is not counted.

## `concurrency` (type: `integer`):

Different websites processed in parallel. Each website is crawled sequentially.

## Actor input object example

```json
{
  "websites": [
    "qonto.com",
    "ostrata.io",
    "zalando.de"
  ],
  "verify": true,
  "checkVat": true,
  "checkInsolvency": true,
  "checkLei": false,
  "excludeSoleProprietors": true,
  "maxPagesPerSite": 4,
  "concurrency": 5
}
```

# Actor output Schema

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

Dataset items, one per website.

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

Counts per status and billed events.

# 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": [
        "qonto.com",
        "ostrata.io",
        "zalando.de"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ostrata/website-company-check").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": [
        "qonto.com",
        "ostrata.io",
        "zalando.de",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("ostrata/website-company-check").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": [
    "qonto.com",
    "ostrata.io",
    "zalando.de"
  ]
}' |
apify call ostrata/website-company-check --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ostrata/website-company-check"
        }
    }
}
```

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/85Mvfp2YQmLQRKcjZ/builds/6z8iUjtZ0jxHx4uUT/openapi.json
