# Impressum & EU Legal Notice Scraper (`parsebird/impressum-legal-notice-scraper`) Actor

Extract Impressum, Mentions Légales, Aviso Legal, and EU legal notice data from any domain: company name, address, VAT ID, managing director, register number, court, email, and phone.

- **URL**: https://apify.com/parsebird/impressum-legal-notice-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.39 / 1,000 domains

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?

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

### Impressum & EU Legal Notice Scraper

The Impressum & EU Legal Notice Scraper extracts company registration data — legal name, address, VAT ID, managing director, commercial register number, register court, email, and phone — from the Impressum, Mentions Légales, Aviso Legal, or other statutory legal-notice page of any domain.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Point it at a list of domains — URLs and email addresses work too — and it finds each site's legal-notice page automatically, falls back to a contact page when none exists, and returns clean, structured company data ready for compliance checks, B2B lead enrichment, or KYC workflows.
</td>
</tr></table>

##### Copy to your AI assistant

```
Use the Apify Actor "parsebird/impressum-legal-notice-scraper" (Impressum & EU Legal Notice Scraper) via the ApifyClient: client.actor("parsebird/impressum-legal-notice-scraper").call(run_input={"domains": ["sipgate.de", "flaconi.de", "teamviewer.com"], "contactPageFallback": True, "maxConcurrency": 20, "proxyConfiguration": {"useApifyProxy": False}}) — inputs are domains (array of domains, URLs, or emails — required), contactPageFallback (boolean, default true), maxConcurrency (integer, default 20), and proxyConfiguration (Apify Proxy object, off by default); output items contain domain, companyName, address, emails, phone, vatId, managingDirector, registrationNumber, registerCourt, legalPageUrl, legalPageType, foundVia, error, and scrapedAt; full API spec at https://apify.com/parsebird/impressum-legal-notice-scraper/api and get an API token at https://console.apify.com/account/integrations.
```

#### What does the Impressum & EU Legal Notice Scraper do?

Legal-notice pages are the most reliable public source of a company's registered legal name, address, and registration details — every commercial website operating in the EU, UK, or Switzerland is required to publish one. The Impressum & EU Legal Notice Scraper reads that page for you, across dozens of domains at once:

- 🔎 Locates the legal-notice page automatically by scanning footer/navigation links and, if needed, trying common URL paths (`/impressum`, `/mentions-legales`, `/aviso-legal`, `/imprint`, and more) in the site's own language
- 📇 Extracts company name, full address, VAT ID, managing director / legal representative, commercial register number, and register court
- 📧 Decodes obfuscated email addresses, including Cloudflare's `data-cfemail` cloaking and `name(at)domain.tld`-style obfuscation
- 🔁 Optional contact-page fallback so you still get an email and phone number when a site has no formal legal notice
- ⚡ Configurable concurrency to process large domain lists quickly, with an optional Apify Proxy for sites that block direct requests
- 💸 Only billed for domains where real data was actually extracted — unreachable domains and dead ends cost nothing

Feed it plain domains, full URLs, or even email addresses (e.g. `hello@example.com`) — the domain is normalized automatically.

#### Supported countries and legal-notice formats

The Actor recognizes legal-notice pages and vocabulary in many languages and formats:

| Country | Legal-notice name |
|---|---|
| 🇩🇪 Germany | Impressum |
| 🇦🇹 Austria | Impressum / Offenlegung |
| 🇨🇭 Switzerland | Impressum |
| 🇫🇷 France | Mentions légales |
| 🇪🇸 Spain | Aviso legal |
| 🇮🇹 Italy | Note legali / Dati societari |
| 🇳🇱 Netherlands | Colofon / Juridische informatie |
| 🇧🇪 Belgium | Mentions légales / Wettelijke vermeldingen |
| 🇬🇧 United Kingdom | Legal notice / Company information |
| 🇵🇹 Portugal | Aviso legal / Informação legal |
| … and more | Generic "Legal notice" / "Imprint" pages |

Coverage of the register number, VAT ID, and managing-director fields is strongest for **Germany, Austria, and Switzerland**, where the Impressum format is highly standardized (Handelsregister, USt-IdNr., Geschäftsführer). For other countries, expect reliable company name, address, email, and phone, with the structured register fields filled in wherever the site publishes them in a recognizable format.

#### What data can you extract from an Impressum or legal notice page?

| Field | Description |
|---|---|
| `domain` | The domain you supplied |
| `companyName` | Legal company name (e.g. Flaconi GmbH) |
| `address` | Street and postal city |
| `emails` | Email addresses found on the legal notice |
| `phone` | Phone number |
| `vatId` | VAT number / USt-IdNr. (e.g. DE219349391) |
| `managingDirector` | Managing director / legal representative |
| `registrationNumber` | Commercial-register number (e.g. HRB 133604) |
| `registerCourt` | Registering court or chamber (e.g. Düsseldorf) |
| `legalPageUrl` | URL of the legal-notice page that was read |
| `legalPageType` | `legal-notice` or `contact` (fallback) |
| `foundVia` | How the page was located (`footer-link`, `common-path`, or `contact-fallback`) |
| `error` | Populated only if nothing could be read |
| `scrapedAt` | ISO timestamp |

Not every field is present on every site — legal notices vary by country and company. Core fields (`companyName`, `emails`, `phone`, `address`) fill at a high rate; register/VAT/director fields are richest in German-speaking markets (DE/AT/CH), where the legal-notice format is most standardized.

#### Input parameters

| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| `domains` | array | **Yes** | — | Domains to process. Full URLs and email addresses are accepted too — the domain is extracted automatically. |
| `contactPageFallback` | boolean | No | `true` | If no legal notice is found, try a contact page to still capture email and phone. |
| `maxConcurrency` | integer | No | `20` | How many domains to process in parallel. |
| `proxyConfiguration` | object | No | off | Apify Proxy. Off by default; enable if some targets block direct requests. |

**Minimal input:**

```json
{
  "domains": ["sipgate.de", "flaconi.de", "teamviewer.com"]
}
```

**Larger run:**

```json
{
  "domains": ["site1.de", "site2.fr", "site3.nl", "site4.it"],
  "contactPageFallback": true,
  "maxConcurrency": 30
}
```

#### Output example

```json
[
  {
    "domain": "flaconi.de",
    "companyName": "Flaconi GmbH",
    "address": "Franklinstraße 15a, 10587 Berlin",
    "emails": "service@flaconi.de",
    "phone": "030 / 920 363 63",
    "vatId": "DE815275589",
    "managingDirector": "Bastian Siebers (Vorsitzender), Alexandra Szarmach, Henry Brodski",
    "registrationNumber": "HRB 133604",
    "registerCourt": "Berlin-Charlottenburg",
    "legalPageUrl": "https://www.flaconi.de/impressum/",
    "legalPageType": "legal-notice",
    "foundVia": "footer-link",
    "scrapedAt": "2026-07-09T10:00:00.000Z"
  },
  {
    "domain": "sipgate.de",
    "companyName": "sipgate GmbH",
    "address": "Gladbacher Straße 74, 40219 Düsseldorf",
    "emails": "info@sipgate.de",
    "phone": "+49 211 635555-0",
    "vatId": "DE219349391",
    "managingDirector": "Thilo Salmon",
    "registrationNumber": "HRB 39841",
    "registerCourt": "Düsseldorf",
    "legalPageUrl": "https://www.sipgate.de/impressum",
    "legalPageType": "legal-notice",
    "foundVia": "footer-link",
    "scrapedAt": "2026-07-09T10:00:00.000Z"
  }
]
```

Download results in **JSON, CSV, Excel, HTML, or XML** directly from the Apify Console, or pull them via the [Dataset API](https://docs.apify.com/api/v2) / [Apify SDK](https://docs.apify.com/sdk).

#### How to scrape Impressum data with Python and JavaScript

1. Open the Impressum & EU Legal Notice Scraper on the Apify Store, or call it via the API below.
2. Paste in your list of domains (or URLs, or email addresses).
3. Run the Actor and download the dataset as JSON, CSV, or Excel — or read it straight from your own code.

**Python:**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("parsebird/impressum-legal-notice-scraper").call(run_input={
    "domains": ["sipgate.de", "flaconi.de", "teamviewer.com"],
    "contactPageFallback": True,
    "maxConcurrency": 20,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["domain"], item["companyName"], item["vatId"])
```

**JavaScript (Node.js):**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('parsebird/impressum-legal-notice-scraper').call({
    domains: ['sipgate.de', 'flaconi.de', 'teamviewer.com'],
    contactPageFallback: true,
    maxConcurrency: 20,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Use cases

- **KYC and vendor onboarding** — verify a supplier's or partner's legal name, registered address, and VAT ID before signing a contract
- **B2B lead enrichment** — append verified company name, address, and contact details to a list of domains
- **Compliance monitoring** — check that your own or a competitor's sites publish a valid, up-to-date Impressum
- **M\&A and due-diligence research** — pull commercial register numbers and managing directors for a list of target companies
- **Directory and aggregator building** — batch-collect standardized company data across many websites at once

#### How it works

1. Normalizes each input value (domain, URL, or email) down to a bare domain.
2. Fetches the homepage and scans its footer and navigation links for a legal-notice link, matching keywords across German, French, Spanish, Italian, Dutch, Portuguese, and English.
3. If no link is found, tries a set of common legal-notice URL paths (`/impressum`, `/mentions-legales`, `/aviso-legal`, and more) and verifies the resulting page actually contains legal-notice content before trusting it.
4. Parses the page text for company name, address, VAT ID, managing director, registration number, register court, email, and phone using pattern-based extraction tuned for German, Austrian, and Swiss formats plus generic multi-language fallbacks.
5. If **Contact page fallback** is on and no legal notice was found, repeats steps 2–4 against the site's contact page to still capture an email and phone number.
6. Pushes one row per domain to the dataset, with `error` populated only when nothing could be read.

#### How much does it cost to scrape Impressum pages?

This Actor uses [Pay-Per-Event pricing](https://docs.apify.com/platform/actors/publishing/monetize#pay-per-event-pricing-model) — you pay only for domains where real data was actually extracted.

| Event | Price per event | Price per 1,000 domains |
|---|---|---|
| `domain-scraped` | $0.00199 | **$1.99** |

A `domain-scraped` event fires once for every domain where a legal-notice page (or, with the fallback on, a contact page) was found **and** at least one field was successfully extracted. Domains that are unreachable or where nothing could be read are not charged — so a batch of 1,000 domains where 850 have a readable legal or contact page costs roughly $1.69. Apify's free monthly platform usage credits apply to this Actor like any other.

#### FAQ

**Does this Actor use a browser?**
No — it fetches pages directly over HTTP, which keeps runs fast and cheap. This means it cannot read a legal-notice page that is rendered entirely client-side with no server-rendered HTML.

**What if a domain has no Impressum page?**
With **Contact page fallback** on (the default), the Actor tries the site's contact page instead and still returns any email or phone number it can find, with `legalPageType` set to `contact`.

**Why are some fields empty?**
Legal-notice formats vary by country. Coverage of `vatId`, `registrationNumber`, `registerCourt`, and `managingDirector` is strongest for German-speaking markets (DE/AT/CH); other countries reliably return `companyName`, `address`, `emails`, and `phone` but may not publish the structured register fields at all.

**A domain fails with "Could not reach the domain" — what do I do?**
Some sites (particularly ones behind Cloudflare) block requests from shared datacenter IPs. Turn on **Proxy configuration** and select an Apify Proxy RESIDENTIAL group for those domains.

**Can I pass a URL or email instead of a bare domain?**
Yes. `https://www.example.com/some/page` and `hello@example.com` are both automatically normalized to `example.com`.

**Can I schedule this to run automatically?**
Yes — use [Apify Schedules](https://docs.apify.com/platform/schedules) to re-check a domain list daily, weekly, or on any interval, and pair it with [webhooks](https://docs.apify.com/platform/integrations/webhooks) or the [Google Sheets](https://docs.apify.com/platform/integrations/google-sheets), [Slack](https://docs.apify.com/platform/integrations/slack), [Zapier](https://docs.apify.com/platform/integrations/zapier), or [Make](https://docs.apify.com/platform/integrations/make) integrations to route the results.

**Can I access this via API?**
Yes — every Actor on Apify has a full [REST API](https://docs.apify.com/api/v2), plus native clients for [Python](https://docs.apify.com/api/client/python) and [JavaScript](https://docs.apify.com/api/client/js). See the code samples above.

**Found a domain this Actor doesn't handle well?**
Open an issue on the [Issues tab](https://apify.com/parsebird/impressum-legal-notice-scraper/issues) — bug reports on specific domains help improve the extraction patterns.

#### Is it legal to scrape Impressum and legal notice pages?

Yes. A legal-notice page is legally required to be publicly accessible, and this Actor only reads information the site itself has published for that exact purpose. That said, always respect a target site's terms of service and applicable data-protection law (e.g. GDPR) for how you subsequently use any personal data, such as a named managing director. See Apify's [blog post on the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) for a broader overview.

#### Related Actors

- [Website Contact Finder](https://apify.com/parsebird/website-contact-finder) — general-purpose contact-detail extraction for any website
- [Zefix.ch Scraper](https://apify.com/parsebird/zefix-ch-scraper) — search the Swiss commercial register by name, canton, or legal form
- [FirmenABC.at Scraper](https://apify.com/parsebird/firmenabc-at-scraper) — Austrian company registry data
- [UK Companies House Scraper](https://apify.com/parsebird/uk-companies-house-scraper) — official UK company registration records
- [Pappers.fr Company Scraper](https://apify.com/parsebird/pappers-scraper) — French company registry data
- [Northdata Scraper](https://apify.com/parsebird/northdata-scraper) — cross-border company and ownership data

# Actor input Schema

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

Domains to process. Full URLs and email addresses are accepted too — the domain is extracted automatically (e.g. "https://www.example.com/page" or "hello@example.com" both become "example.com").

## `contactPageFallback` (type: `boolean`):

If no legal notice page is found, try a contact page instead to still capture an email and phone number.

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

How many domains to process in parallel.

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

Apify Proxy. Off by default — most sites serve their legal notice page without any blocking. Enable it only if some of your target domains block direct requests.

## Actor input object example

```json
{
  "domains": [
    "sipgate.de",
    "flaconi.de",
    "teamviewer.com"
  ],
  "contactPageFallback": true,
  "maxConcurrency": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "domains": [
        "sipgate.de",
        "flaconi.de",
        "teamviewer.com"
    ],
    "maxConcurrency": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/impressum-legal-notice-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": [
        "sipgate.de",
        "flaconi.de",
        "teamviewer.com",
    ],
    "maxConcurrency": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/impressum-legal-notice-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": [
    "sipgate.de",
    "flaconi.de",
    "teamviewer.com"
  ],
  "maxConcurrency": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call parsebird/impressum-legal-notice-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/impressum-legal-notice-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/lzytl0levL6Z7qzgu/builds/5Z5FoXpts5stz5J6x/openapi.json
