# Impressum Scraper – DACH B2B Leads, Directors, Emails & VAT (`pellucid_silt/dach-impressum-leads`) Actor

Turn a list of German, Austrian and Swiss company websites into verified B2B leads from their legally required Impressum: company name, managing directors, email, phone, address, register number and VIES-validated VAT ID. Pay only for complete leads.

- **URL**: https://apify.com/pellucid\_silt/dach-impressum-leads.md
- **Developed by:** [dapperflare](https://apify.com/pellucid_silt) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 complete leads

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?

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 Scraper for Germany, Austria & Switzerland – B2B leads with directors, emails and verified VAT IDs

Every business website in Germany, Austria and Switzerland must publish an **Impressum** (legal notice) with the company's legal name, managing directors, address, email, phone, commercial register number and VAT ID. This Actor turns a list of company websites into clean, structured B2B leads from exactly that data.

Give it `firma.de`, `hotel-beispiel.at` or `treuhand.ch` – it finds the Impressum page on its own, extracts the fields, normalizes them and validates the VAT ID against the official EU VIES database.

**You only pay for complete leads.** Unreachable websites and incomplete results are free.

#### What you get for each website

| Field | Example |
| --- | --- |
| Company name & legal form | MusterTech Solutions GmbH · GmbH |
| Managing directors / owners | Max Mustermann, Erika Musterfrau |
| Best email + all emails | kontakt@mustertech.de (flags: role-based, matches domain) |
| Phone & fax in international E.164 format | +49891234560 |
| Street, postal code, city, country | Leopoldstraße 244 · 80807 · München · DE |
| VAT ID (USt-IdNr / UID / CHE) | DE811569869 – checksum ✔, VIES ✔ |
| Commercial register | HRB 123456 · Amtsgericht München (DE), FN 123456a · Handelsgericht Wien (AT), CHE-UID (CH) |
| Person responsible for content (§ 18 MStV) | Max Mustermann |
| Social profiles | LinkedIn, XING, Facebook, Instagram, X, YouTube, TikTok |
| Lead score 0–100 | 100 |

#### Measured quality

Tested on 68 real DACH websites – from sole-trader carpenters, dentists and tax advisors to hotels, car dealers and hosting companies:

- **91 %** of websites returned a complete lead (93 % of reachable ones)
- In those leads: company name 100 %, email 97 %, address 98 %, phone 89 %, VAT ID 87 %, register number 73 %, managing directors 71 %
- 51 of 52 extracted VAT IDs were confirmed valid by EU VIES
- 68 websites processed in under 30 seconds

#### Why this Impressum scraper

- **Pay per complete lead, nothing else.** No start fee, no per-page fee, no charge for failed domains.
- **Finds hidden emails** – decodes Cloudflare email protection and obfuscations like `info [at] firma [dot] de` or `kontakt(at)firma.at`.
- **Official VAT validation** via EU VIES, plus local checksum validation for German, Austrian and Swiss IDs. For Austrian and most EU companies VIES also returns the registered legal name.
- **Understands all three countries**: HRB/HRA and Amtsgericht, Firmenbuchnummer and Landes-/Handelsgericht, Swiss CHE-UID and Handelsregisteramt, `A-1010 Wien`, `CH-8001 Zürich`, `+49 (0) 89`, `+43 [0]1`.
- **Filters the noise**: web-design agency credits, bank branch addresses, share buttons, disclaimers and staff bios are not mistaken for company data.
- **Fast and cheap to run**: plain HTTP, no browser, no proxy required for most sites.

#### How to use it

1. Paste your websites or domains (one per line) – a CSV column from Google Maps, a trade-fair exhibitor list, a CRM export, anything.
2. Click **Start**.
3. Download the results as Excel, CSV or JSON, or send them straight to Google Sheets, HubSpot, Clay, Make, Zapier or n8n.

##### Input example

```json
{
    "websites": ["hetzner.com", "hotelischgl.at", "ferax.ch"],
    "validateVatVies": true
}
```

##### Output example

```json
{
    "domain": "mustertech.de",
    "status": "ok",
    "leadScore": 100,
    "companyName": "MusterTech Solutions GmbH",
    "legalForm": "GmbH",
    "managingDirectors": ["Max Mustermann", "Erika Musterfrau"],
    "email": "kontakt@mustertech.de",
    "emailIsRoleBased": true,
    "emailMatchesDomain": true,
    "phone": "+49891234560",
    "fax": "+498912345699",
    "street": "Leopoldstraße 244",
    "postalCode": "80807",
    "city": "München",
    "country": "DE",
    "vatId": "DE811569869",
    "vatIdChecksumValid": true,
    "vatIdViesValid": true,
    "registerNumber": "HRB 123456",
    "registerCourt": "Amtsgericht München",
    "socialLinks": { "linkedin": "https://www.linkedin.com/company/mustertech" },
    "imprintUrl": "https://www.mustertech.de/impressum"
}
```

`status` is one of `ok` (complete lead – company name plus email or phone, **charged**), `partial`, `no_data` or `fetch_failed` (all **free**).

#### Use cases

- **B2B lead generation** in the DACH market: enrich Google Maps or directory exports with decision-makers and verified company data.
- **KYB / supplier onboarding**: confirm legal name, register entry and VAT ID of a business partner.
- **CRM data cleaning**: fill in missing legal names, addresses and VAT IDs for existing accounts.
- **Market research**: map legal forms, register courts and regions across an industry.

#### Pricing

Pay-per-event: you are charged per **complete lead** only. See the pricing tab for the current price. Set a maximum cost per run and the Actor stops cleanly when it is reached – it never starts more websites than your budget can pay for.

#### FAQ

**Do I need a proxy?** Usually not. Company websites rarely block requests. If a large share of your list returns `fetch_failed`, enable Apify Proxy in the input.

**Why is a website `partial`?** The Impressum was found but lacked either a company name or any contact details, or the site loads its legal notice with JavaScript only. Partial rows are included for free so your output lines up with your input.

**Does it work outside DACH?** It reads legal notices in any language that uses the same structure (e.g. Liechtenstein, Luxembourg, Dutch *colofon*, French *mentions légales*), but it is tuned and tested for Germany, Austria and Switzerland.

**Is scraping Impressum data legal?** The Impressum is information businesses are legally obliged to publish. How you use it is your responsibility: in particular, GDPR applies to personal names, and German competition law (§ 7 UWG) restricts unsolicited advertising by email and phone. Use the data for lawful purposes such as KYB, research and compliant outreach.

**Can I call it from my own code?** Yes – use the Apify API or the `apify-client` libraries for JavaScript and Python, or run it from Make, Zapier, n8n and other integrations.

#### Feedback

Found a website where extraction is wrong? Open an issue on the Issues tab with the URL – fixes are usually shipped within days.

# Actor input Schema

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

Company websites to process. Plain domains (firma.de), full URLs (https://www.firma.at) or direct Impressum links all work. Paste one per line; duplicates are removed automatically.

## `validateVatVies` (type: `boolean`):

Checks every EU VAT ID against VIES and adds the registered company name where the member state provides it (e.g. Austria). Swiss UIDs are checksum-validated only.

## `includeFailed` (type: `boolean`):

Adds rows for unreachable sites and partial results so you can match the output to your input list. These rows are never charged.

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

How many websites are processed at the same time.

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

Give up on a single page after this many seconds.

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

Not needed for most company websites. Enable Apify Proxy only if many of your sites block data-center IPs.

## Actor input object example

```json
{
  "websites": [
    "hetzner.com",
    "hotelischgl.at",
    "ferax.ch"
  ],
  "validateVatVies": true,
  "includeFailed": true,
  "maxConcurrency": 20,
  "requestTimeoutSecs": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `leads` (type: `string`):

All results, one item per website. Items with status "ok" are complete (charged) leads; "partial", "no\_data" and "fetch\_failed" rows are free.

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

Counts of processed websites by status and whether the run stopped at the spending limit.

# 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": [
        "hetzner.com",
        "hotelischgl.at",
        "ferax.ch"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("pellucid_silt/dach-impressum-leads").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": [
        "hetzner.com",
        "hotelischgl.at",
        "ferax.ch",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("pellucid_silt/dach-impressum-leads").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": [
    "hetzner.com",
    "hotelischgl.at",
    "ferax.ch"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call pellucid_silt/dach-impressum-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,pellucid_silt/dach-impressum-leads"
        }
    }
}
```

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/SzhH0XDyywMnFq4Os/builds/4fWizWpSf0gh56ML2/openapi.json
