# Impressum Extractor DACH: Company Data from Websites (`webify-lab/impressum-extractor-dach`) Actor

Turns DACH websites into structured company records from their Impressum: name, legal form, address, managing directors, phone, email, HRB and court, VAT ID with live EU VIES check. $0.004 per found imprint.

- **URL**: https://apify.com/webify-lab/impressum-extractor-dach.md
- **Developed by:** [Batu T.](https://apify.com/webify-lab) (community)
- **Categories:** Lead generation, Business
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.80 / 1,000 imprint extracteds

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

## Impressum Extractor DACH

German, Austrian and Swiss websites must publish an Impressum (legal notice). It is the most reliable public source for company master data. This Actor finds the Impressum on any website and returns clean, structured fields.

### Output fields

| field | example |
|---|---|
| `companyName` | Otto GmbH |
| `legalForm` | GmbH |
| `street`, `postalCode`, `city`, `country` | Werner-Otto-Straße 1-7, 22179, Hamburg, DE |
| `managingDirectors` | \["Petra Scharner-Wolff"] |
| `phone`, `fax`, `email` | 040 64610, impressum@... |
| `registerNumber`, `registerCourt` | HRB 188101, Hamburg |
| `vatId` | DE340596305 |
| `completeness` | 0 to 100 |

### Why this one

- Locates the imprint block and ignores third parties named on the same page (hosting, analytics, social networks).
- Handles obfuscated emails like `info [at] firma.de`.
- Supports DE, AT (FN, ATU) and CH (CHE UID) formats.
- Validates found EU VAT IDs live against the official EU VIES service (`vatStatus`: valid, invalid, unavailable).
- Optional Apify Proxy for sites that block datacenter traffic.
- Falls back to common paths (`/impressum`, `/imprint`) if no link is found.

### Use cases

- Enrich lead lists from Google Maps or directories with managing directors and register data.
- KYC and supplier checks.
- CRM cleanup for DACH companies.

### Pricing

$0.004 per website where an Impressum was found and extracted. Sites without an Impressum are not charged.

### FAQ

**What am I charged for?** One event per website where an Impressum was found and extracted. Sites that cannot be loaded or have no Impressum come back as items with `found: false` and an `error` field and are not charged. The EU VIES check of VAT IDs is included.

**How does it find the Impressum?** It loads the homepage, follows the best matching link (Impressum, Imprint, Legal notice and similar) and, if there is none, tries common paths like `/impressum` and `/imprint`.

**Does it render JavaScript?** No. It reads the HTML the server sends. Sites that need JavaScript to render the Impressum may return fewer fields.

**Do I need a proxy or a login?** No login. A proxy is optional and only helps with sites that block datacenter traffic.

**How many sites can one run handle?** Up to `maxSites` (default 1000, at most 50000), with up to 10 sites processed at the same time.

### Notes

Only public legal notices are read. Personal data in an Impressum is published by law, but your own use must still comply with GDPR (for example for direct marketing). Sites that need JavaScript to render the Impressum may return fewer fields.

### Input example

```json
{ "urls": ["otto.de", "https://www.check24.de"] }
```

### Use with AI agents (MCP)

This Actor works as a tool for Claude, ChatGPT, Cursor and other MCP clients through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp). Add only this Actor:

```
https://mcp.apify.com?tools=webify-lab/impressum-extractor-dach
```

On first use the server signs you in with OAuth. Alternatively send the header `Authorization: Bearer <APIFY_TOKEN>`. Agents on the default Apify MCP setup can also find this Actor with `search-actors` and run it with `call-actor`. Pricing is the same as in Apify Console: you pay per result.

# Actor input Schema

## `urls` (type: `array`):

Domains or URLs. The Impressum is found automatically.

## `maxSites` (type: `integer`):

Safety limit per run.

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

Sites processed at the same time.

## `validateVat` (type: `boolean`):

Checks found EU VAT IDs against the official VIES service (free, included). German VIES has short nightly maintenance windows.

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

Optional. Use Apify Proxy for sites that block datacenter traffic.

## Actor input object example

```json
{
  "urls": [
    "https://www.otto.de",
    "https://www.check24.de"
  ],
  "maxSites": 1000,
  "concurrency": 5,
  "validateVat": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One dataset item per website: website, found, impressumUrl, companyName, legalForm, street, postalCode, city, country, phone, fax, email, emails, managingDirectors, registerNumber, registerCourt, vatId, vatStatus, vatRegisteredName, uid, taxNumber, completeness.

# 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 = {
    "urls": [
        "https://www.otto.de",
        "https://www.check24.de"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("webify-lab/impressum-extractor-dach").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 = {
    "urls": [
        "https://www.otto.de",
        "https://www.check24.de",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("webify-lab/impressum-extractor-dach").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 '{
  "urls": [
    "https://www.otto.de",
    "https://www.check24.de"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call webify-lab/impressum-extractor-dach --silent --output-dataset

```

## MCP server setup

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

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/JMJk6lvktm5x2SDkM/builds/d5AaBTASLJEKWCmM1/openapi.json
