# Impressum Scraper (`lergassy/impressum-scraper`) Actor

Extract Impressum data from German, Austrian and Swiss websites: company name, legal form, managing directors, register court and HRB number, VAT ID, tax number, address, phone, fax and email. B2B leads in bulk via API, export to CSV or Excel, schedule runs, connect n8n, Make or Zapier.

- **URL**: https://apify.com/lergassy/impressum-scraper.md
- **Developed by:** [Matvey](https://apify.com/lergassy) (community)
- **Categories:** Lead generation
- **Stats:** 5 total users, 4 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.73 / 1,000 company imprints

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?

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

### What is Impressum Scraper?

**Impressum Scraper** reads the **Impressum** (the legal notice every German, Austrian and Swiss website must publish) and turns it into a clean company record: **company name, legal form, managing directors, register court, HRB / HRA / FN number, VAT ID, address, phone, fax and email**.

Give it a list of domains — `muster-gmbh.de`, `https://www.example.at/`, or a direct link to the Impressum page — and it finds the Impressum on each site by itself: home page → the "Impressum / Imprint / Legal notice / Rechtliche Hinweise" link → the usual paths (`/impressum`, `/imprint`, `/impressum.html`). One website = one row.

This is the B2B lead data Google Maps scrapers don't give you: **the names of the people who legally run the company** (Geschäftsführer, Inhaber, Vorstand), split into an array, plus the official register entry and VAT ID to verify the company.

- 🇩🇪 🇦🇹 🇨🇭 Germany (HRB/HRA/VR, Amtsgericht, USt-IdNr.), Austria (FN, Landesgericht / Handelsgericht, ATU…) and Switzerland (UID CHE-…, cantonal register)
- 👥 Managing directors as an array, not a text blob
- 🏛️ Register court and register number in separate columns
- ✅ Optional VAT ID check in the official EU VIES service
- 💸 No start fee. Websites without an Impressum and unreachable sites are free

### What data can it extract?

| Field | Example | Notes |
|---|---|---|
| `companyName` | einhorn products GmbH | Name as written in the Impressum; a person's name for sole traders and freelancers |
| `legalForm` | GmbH | GmbH, UG (haftungsbeschränkt), AG, SE, KG, GmbH & Co. KG, OHG, e.K., e.V., eG, AT/CH forms |
| `managingDirectors` | \["Philip Siefer", "Luise Tremel"] | Geschäftsführer, Inhaber, Vorstand, vertreten durch, managing director |
| `registerCourt` | Amtsgericht Berlin Charlottenburg | Amtsgericht / Landesgericht / Handelsgericht / cantonal register |
| `registerType` + `registerNumber` | HRB + 165893 B | HRB, HRA, VR, GnR, PR, FN (Austria), ZVR (Austrian associations), UID (Switzerland) |
| `vatId` | DE300246395 | USt-IdNr. DE…, ATU…, CHE-… MWST, other EU formats |
| `vatIdValid` | true | Paid add-on: EU VIES check |
| `taxNumber` | 33/207/01527 | Steuernummer, when shown |
| `address`, `street`, `zip`, `city`, `country` | Skalitzer Straße 100, 10997 Berlin, Germany | One line plus separate columns |
| `phones`, `fax` | \["+49 (0) 30 690 046 69"] | The company's own numbers |
| `emails` | \["contact@einhorn.my"] | Including obfuscated `[at]` / `(at)` / Cloudflare-protected addresses |
| `responsibleForContent` | Carolin Frericks | V.i.S.d.P. / § 18 MStV, when named |
| `supervisoryAuthority` | Bezirkshauptmannschaft Feldbach | Aufsichtsbehörde / Kammer, when named |
| `socialLinks` | {"linkedin": "…", "instagram": "…"} | Company profiles linked from the site |
| `impressumUrl`, `website`, `language` | https://einhorn.my/policies/legal-notice | Where the data came from |

Keys that a website does not publish are left out of its row — no empty strings, no "N/A". Measured on 130 real DACH websites (shops, agencies, publishers, law firms, freelancers, associations, Austrian and Swiss companies): an Impressum was read on 110 of them; on those, company name 99 %, address 97 %, emails 91 %, legal form 92 %, VAT ID 85 %, register number 84 %, managing directors 83 %, register court 81 %, phones 76 %.

### How much does it cost?

Pay per result, **no start fee, no monthly rent**:

| Event | Price (Free plan) | Price (Gold and up) |
|---|---|---|
| Company imprint (one website with company name + directors, register number, VAT ID or address) | $0.0035 | $0.00273 |
| Add-on: VAT ID check in EU VIES (only with the option on) | $0.00175 | $0.00175 |

That is **about 285 companies per $1** on the Free plan and about 366 per $1 on Gold. With the $5 of monthly credit on Apify's free plan you can read roughly **1,400 Impressums a month for free**.

You are **not charged** for websites without an Impressum, sites that can't be opened, invalid input, or an Impressum where too little could be read (the row is still written, with a `note`). Set **Max cost per run** in the run options and the run stops cleanly at your budget.

### How to scrape Impressum data

1. Open Impressum Scraper and paste your websites into **Websites**, one per line (domains or URLs).
2. Optional: switch on **Check VAT ID in EU VIES** if you need confirmed VAT numbers.
3. Click **Start**. Five websites take about 5–10 seconds; 1,000 take roughly 20–25 minutes.
4. Download the result as CSV, Excel or JSON, or fetch it through the API.

### ⬇️ Input

```json
{
    "websites": ["www.mymuesli.com", "www.trigema.de", "www.sevdesk.de", "www.hetzner.com", "www.zotter.at"],
    "validateVatId": false,
    "maxPagesPerSite": 4,
    "includeRawText": false
}
```

- `websites` — domains, URLs or direct Impressum links. Duplicates are removed; an email address is turned into its domain.
- `validateVatId` — paid add-on, checks each VAT ID in EU VIES.
- `maxPagesPerSite` — at most this many pages are opened per website (default 4).
- `includeRawText` — adds `impressumText`, the plain text of the Impressum block.

### ⬆️ Output

One row per website (real output from a run):

```json
{
  "type": "company",
  "website": "https://zotter.at",
  "impressumUrl": "https://www.zotter.at/impressum",
  "companyName": "Zotter Schokolade GmbH",
  "legalForm": "GmbH",
  "managingDirectors": ["Julia Zotter"],
  "registerCourt": "Landesgericht für ZRS Graz",
  "registerType": "FN",
  "registerNumber": "220619s",
  "vatId": "ATU53816900",
  "address": "Bergl 56, 8333 Riegersburg, Austria",
  "street": "Bergl 56",
  "zip": "8333",
  "city": "Riegersburg",
  "country": "Austria",
  "phones": ["+43 - 3152 - 5554"],
  "fax": "+43 - 3152 - 5554 - 3222",
  "emails": ["schokolade@zotter.at"],
  "supervisoryAuthority": "Bezirkshauptmannschaft Feldbach",
  "socialLinks": {
    "facebook": "https://www.facebook.com/zotterschokolade",
    "instagram": "https://www.instagram.com/zotterschokolade",
    "linkedin": "https://www.linkedin.com/company/zotter-schokolade"
  },
  "language": "de",
  "scrapedAt": "2026-10-22T15:03:26.698Z"
}
```

A website without an Impressum gives a free row: `{"type": "error", "kind": "no-results", "website": "…", "error": "No Impressum found on this site. Not charged."}`. A site that can't be opened gives `{"type": "error", "website": "…", "error": "Could not open this website: … Not charged."}`. The last row of every run is a free `notice` with the run summary — filter by `type = "company"` to keep only companies.

### Use cases

#### Sales and lead generation

Turn a list of shop or agency domains into named decision makers: address the Geschäftsführer by name instead of info@. Combine with a Google Maps or directory export: their websites in, managing directors and VAT IDs out.

#### CRM enrichment and data hygiene

Add legal name, legal form, register number and VAT ID to existing accounts, and check that the company you invoice is the company you think it is.

#### KYC, supplier and partner checks

Collect the register entry (court + HRB / FN / UID) and VAT ID of suppliers or marketplace sellers, then confirm the VAT ID in VIES with the add-on.

#### Market research

Map who really operates a set of brands — the GmbH behind the shop, its directors, its seat — for M\&A screening, competitor research or journalism.

#### AI agents and automations

One call with a list of websites returns structured JSON, so an AI agent (via the Apify MCP server) or a workflow can enrich companies without parsing HTML itself.

### Integrations

- **API**: start a run and read the dataset with the Apify API, or use `run-sync-get-dataset-items` for small lists.
- **Python / JavaScript**: the `apify-client` packages (`client.actor("lergassy/impressum-scraper").call(run_input={...})`).
- **n8n, Make, Zapier**: use the Apify app/node, pass the website list, map the fields into your CRM.
- **Google Sheets**: export the dataset to a sheet, or schedule a run and push results with an integration.
- **MCP**: available to Claude, ChatGPT and other AI agents through the Apify MCP server.
- **Schedules**: re-check your supplier or customer list every month to catch new directors or addresses.

### Migrating from another Impressum scraper?

| Other actor's field | Use here |
|---|---|
| `targetUrls` / `startUrls` (`[{"url": "…"}]`) | `websites` (plain strings or `{"url": "…"}` objects both work) |
| `domains` | `websites` |
| `maxConcurrency`, `timeout`, `maxRetries` | not needed — handled internally |
| `validateEmail` | `validateVatId` (VAT ID check in EU VIES) |
| `proxyConfiguration` | optional — blocked sites are retried through a residential address automatically |
| `contactPageFallback` | built in: the crawler follows Kontakt / Legal links when needed (`maxPagesPerSite`) |

### Troubleshooting

- **"No Impressum found on this site"** — the site has none, or renders it only with JavaScript (some big shops do). Try the direct Impressum URL as input. Not charged.
- **"Could not open this website"** — the domain does not resolve, the server is down, or it blocks all automated visitors even from a residential address. Not charged.
- **A row with a `note`** — the Impressum was found, but the company name plus at least one of directors, register number, VAT ID or address could not be read. The row is free.
- **Directors missing** — many Impressums of sole traders, associations or Swiss companies simply do not name them.
- **English pages** — if a site sends you to its English version, the crawler switches to the German one when the site links it.

### ❓ FAQ

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

The Impressum is published because the law requires it (§ 5 DDG, formerly § 5 TMG, in Germany; § 5 ECG and § 25 MedienG in Austria; the Swiss UWG) and it is meant to be read by anyone who wants to contact or identify the provider. Reading public pages is generally lawful; what you do with the data is your responsibility. Check the rules that apply to your use case and jurisdiction.

#### Is Impressum data personal data? (GDPR)

Partly. Managing directors' names, a sole trader's name and personal email addresses are personal data under the GDPR, even though they are published by legal obligation. You are responsible for a lawful basis: B2B outreach usually relies on legitimate interest (Art. 6(1)(f) GDPR) with an easy opt-out, and German law (§ 7 UWG) restricts unsolicited advertising emails. Don't use the data for spam, keep only what you need, and honour objections.

#### Why are some fields missing for a company?

The actor writes only what the Impressum says. Freelancers have no register number, associations have no managing directors, many Swiss sites show no VAT ID. Missing keys are dropped instead of filled with placeholders.

#### How does it handle sites that block bots?

Pages are fetched with a real browser TLS fingerprint. A site that refuses the request is retried once through a residential address — only that site, so you don't pay for proxies on the rest.

#### Can I give it the Impressum URL directly?

Yes — a link that contains impressum / imprint / legal is read first.

#### Does it work for websites outside Germany, Austria and Switzerland?

It is built for DACH legal notices (German-language Impressum pages and their English "Legal notice" versions). Sites from other countries rarely publish an Impressum, so they usually end as a free "no Impressum" row.

### Your feedback

Found a website where a field was read wrong? Open an issue on the Actor's **Issues** tab with the URL — real-world layouts are how the parser gets better.

### You might also like

| Actor | What it does |
|---|---|
| [Email Scraper — Phones, Socials & Contacts](https://apify.com/lergassy/website-contacts-api) | Emails, phones and social profiles from any website |
| [US New Business Leads](https://apify.com/lergassy/us-business-filings) | Newly registered US companies as leads |
| [Email Finder API](https://apify.com/lergassy/email-finder-api) | Find a person's work email from name and domain |

# Actor input Schema

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

Company websites to read the Impressum from — one per line. A bare domain (muster-gmbh.de), a full URL (https://www.muster-gmbh.de/) or a direct link to the Impressum page all work. Duplicates are removed. Each website gives one row: the company data, or a free row saying why there is none.

## `validateVatId` (type: `boolean`):

Paid add-on: checks every VAT ID found (DE…, ATU…, other EU) against the official EU VIES service and adds vatIdValid (true/false), plus the registered name and address where the member state shares them (Germany does not). Charged only when VIES gives a definite answer. Swiss CHE numbers are not in VIES and are skipped.

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

How many pages to open per website at most while looking for the Impressum: the home page, the Impressum / Imprint / Legal notice link, then the usual paths (/impressum, /imprint, …). 4 finds it on almost every site; raise it for unusual sites. Minimum 2 (home page + Impressum).

## `includeRawText` (type: `boolean`):

Adds impressumText: the plain text of the Impressum block (up to 20,000 characters), for your own parsing or an AI model. Off by default to keep exports small.

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

Not needed: websites are opened directly, and a site that blocks that is retried through a residential address automatically. Set a proxy only if you must use your own.

## Actor input object example

```json
{
  "websites": [
    "www.mymuesli.com",
    "www.trigema.de",
    "www.sevdesk.de",
    "www.hetzner.com",
    "www.zotter.at"
  ],
  "validateVatId": false,
  "maxPagesPerSite": 4,
  "includeRawText": false
}
```

# Actor output Schema

## `companies` (type: `string`):

One row per website: company name, legal form, managing directors, register court and number, VAT ID, address, phones, emails, Impressum URL. Websites without an Impressum get a free error row.

## `stats` (type: `string`):

Counters for the run: websites, companies charged, websites without Impressum, unreachable sites, pages fetched, residential proxy use.

# 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": [
        "www.mymuesli.com",
        "www.trigema.de",
        "www.sevdesk.de",
        "www.hetzner.com",
        "www.zotter.at"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("lergassy/impressum-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 = { "websites": [
        "www.mymuesli.com",
        "www.trigema.de",
        "www.sevdesk.de",
        "www.hetzner.com",
        "www.zotter.at",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("lergassy/impressum-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 '{
  "websites": [
    "www.mymuesli.com",
    "www.trigema.de",
    "www.sevdesk.de",
    "www.hetzner.com",
    "www.zotter.at"
  ]
}' |
apify call lergassy/impressum-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lergassy/impressum-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/pbv8EyHuUeU0Mhf8R/builds/59WmwuV3kB0xMaL05/openapi.json
