# Impressum Scraper - Website to Company Data $5/1K (`perceptr0n/impressum-company-data-enrichment`) Actor

Turn a list of websites into verified company records: legal name and form, registered address, commercial register court and number, VAT ID, e-mail, phone and fax — read from the legal notice every German site must publish. No anti-bot fight, no personal data by default.

- **URL**: https://apify.com/perceptr0n/impressum-company-data-enrichment.md
- **Developed by:** [Thomas Ehrler](https://apify.com/perceptr0n) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / actor start

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/platform/actors/running/actors-in-store#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

## Website → Company Data (German Impressum Enrichment)

Turn a list of **websites** into **verified company records**: legal name and
form, registered address, commercial register court and number, VAT ID, e-mail,
phone and fax.

The source is the **legal notice** ("Impressum") that every German website is
required by law to publish (§ 5 DDG). That makes this the most reliable company
data on the open web — it is mandated, standardised and kept current by the
company itself.

### The enrichment step everyone needs

You scraped a list of companies — from a trade fair, a directory, a search
engine — and now you have names and websites but no usable company identity.
This actor closes that gap:

**Input:** `liebherr.com`
**Output:** Liebherr-International Deutschland GmbH · Hans-Liebherr-Straße 45,
88400 Biberach an der Riß · HRB 640080, Amtsgericht Ulm · DE811154028 · phone,
e-mail

### What you get

| Field | Example |
|---|---|
| `companyName`, `legalForm` | Frischpack GmbH · GmbH |
| `street`, `postalCode`, `city` | Mailling 11 · 83104 · Tuntenhausen |
| `registerNumber`, `registerType`, `registerCourt` | HRB 19182 · HRB · Amtsgericht Traunstein |
| `vatId`, `vatCountry` | DE127913213 · DE |
| `email`, `allEmails`, `phone`, `fax` | info@frischpack.de · +49 8065 189-0 |
| `impressumUrl`, `foundVia` | the exact page the data came from |
| `dataQuality`, `completeness` | high / medium / low · 0.0–1.0 |
| `representatives` | managing directors — **only if you switch it on** |

### Why this beats the alternatives

- 🔓 **No anti-bot fight.** Legal notices are meant to be found. No proxies, no
  browser, no blocking — so runs are fast, cheap and stable.
- 🧾 **Legally the cleanest company data there is.** It is a mandatory public
  disclosure, published by the company itself.
- 🔗 **The register number is the key to everything else.** With `HRB 19182` and
  the register court you can look a company up in any official register.
- 🎯 **Honest about gaps.** Every record carries `dataQuality` and
  `completeness`. When no legal notice can be reached, you get
  `impressumFound: false` instead of a silently empty row — and for a German
  site that absence is itself a finding.
- 🔒 **No personal data by default.** Person names are off unless you ask for
  them, with the GDPR implication stated in the input form.

### Use cases

- **Lead-list enrichment** — turn a scraped company list into records your CRM
  can actually use
- **Compliance and KYC prep** — company name, register number and VAT ID in one
  step, ready for verification against official registers
- **Invoice and contract data** — the legally binding company details
- **Sales territory research** — which companies sit in which city or region
- **Website audits** — find sites that publish no legal notice at all
- **AI agents** — one input, one clean record, callable via MCP

### Input example

```json
{
    "websites": ["liebherr.com", "https://www.sap.com", "frischpack.de"],
    "include_person_names": false
}
```

Works especially well downstream of the trade-fair actors listed below: export
exhibitors, feed their websites in here, and you have complete company records.

### Output example

```json
{
    "input": "frischpack.de",
    "website": "https://frischpack.de",
    "companyName": "Frischpack GmbH",
    "legalForm": "GmbH",
    "street": "Mailling 11",
    "postalCode": "83104",
    "city": "Tuntenhausen",
    "registerType": "HRB",
    "registerNumber": "HRB 19182",
    "registerCourt": "Amtsgericht Traunstein",
    "vatId": "DE127913213",
    "vatCountry": "DE",
    "email": "info@frischpack.de",
    "phone": "+49 8065 189-0",
    "fax": "+49 8065 189-89",
    "impressumUrl": "https://frischpack.de/impressum",
    "foundVia": "footer link",
    "completeness": 1.0,
    "dataQuality": "high",
    "impressumFound": true
}
```

### What does a run cost?

| Websites | Cost |
|---|---|
| 100 | $0.51 |
| 1,000 | $5.01 |
| 10,000 | $50.01 |

$0.01 per run start plus $0.005 per website — charged per website processed,
including the ones where no legal notice exists, because finding that out is the
work.

### Coverage — measured, not promised

On a mixed test set of German and international company sites, a legal notice
was located for **roughly 5 out of 6 sites**, and the located pages yielded a
`high` quality record in most cases. Where it fails, it is usually because:

- the site publishes no legal notice (common outside the German-speaking world)
- the company is not German, so no register or VAT number exists to find
- the site blocks datacenter traffic entirely

All three cases are reported explicitly rather than hidden.

### FAQ

**Which countries does this work for?**
Best for Germany, Austria and Switzerland, where a legal notice is mandatory and
standardised. It also works on any other site that publishes one — the parser
recognises international legal forms (S.L., S.p.A., B.V., Ltd. and others).

**Do I get managing directors?**
Only if you switch `include_person_names` on. Those are personal data under
GDPR, so the default is off and the input form says so.

**Why is `companyName` sometimes empty although the address is there?**
Some legal notices state the address without repeating the legal entity in a
recognisable form. Rather than guess, the field stays empty and `dataQuality`
drops to `medium` or `low`.

**Can I feed in a dataset from another actor?**
Yes — export the websites column and paste it in. This actor is built as the
enrichment step after any company-list scraper.

**Is scraping legal notices allowed?**
The legal notice exists precisely so that anyone can identify who operates a
website. It is public, mandatory and non-sensitive company information.

### Related actors

| Actor | What it does |
|---|---|
| [Messe München Exhibitors](https://apify.com/perceptr0n/messe-muenchen-exhibitor-list-scraper) | bauma, IFAT, BAU exhibitors — feed their websites in here |
| [Anuga & Koelnmesse Exhibitors](https://apify.com/perceptr0n/anuga-ism-koelnmesse-exhibitor-scraper) | Anuga, ISM, imm cologne, interzum exhibitors |
| [EUDAMED Medical Devices](https://apify.com/perceptr0n/eudamed-medical-device-scraper) | EU medical device registry with manufacturers |

### Support

Missing a field or a country pattern? Open an issue in the **Issues** tab —
response within 1–2 business days.

# Actor input Schema

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

Domains or URLs — e.g. `liebherr.com`, `https://www.sap.com`. Paste the whole list; one row of company data comes back per entry.

## `include_person_names` (type: `boolean`):

OFF by default. Person names in a legal notice are personal data under GDPR — switch this on only if you have a lawful basis for processing them. Company data, address, register and VAT number are returned either way.

## `max_items` (type: `integer`):

Optional cap. Leave empty to process the whole list.

## Actor input object example

```json
{
  "websites": [
    "liebherr.com",
    "frischpack.de",
    "trumpf.com"
  ],
  "include_person_names": false
}
```

# 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": [
        "liebherr.com",
        "frischpack.de",
        "trumpf.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("perceptr0n/impressum-company-data-enrichment").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": [
        "liebherr.com",
        "frischpack.de",
        "trumpf.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("perceptr0n/impressum-company-data-enrichment").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": [
    "liebherr.com",
    "frischpack.de",
    "trumpf.com"
  ]
}' |
apify call perceptr0n/impressum-company-data-enrichment --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=perceptr0n/impressum-company-data-enrichment",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/YoHobeQht8StZit0A/builds/MXDx7170SNBeBT7F1/openapi.json
