# Impressum Scraper: Company Data & VAT Check (`layerwiselabs/impressum-company-data`) Actor

Turn websites into company data from the Impressum: name, legal form, directors, register number and court, VAT ID checked in EU VIES, address, e-mail and phone. Germany, Austria and Switzerland. Reads Google Maps results directly. Pay only for companies found.

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

## Pricing

$2.00 / 1,000 company founds

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?

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 does Impressum Scraper do?

It turns a list of websites into **verified company data from the legal notice (Impressum)**. Every business website in Germany, Austria and Switzerland must publish one, and it holds exactly the facts sales, compliance and data teams need. Give the Actor domains or links, and for each website you get:

- **The company**: registered name and legal form (GmbH, UG, GmbH & Co. KG, AG, e.K., PartG mbB, GesmbH, Sàrl and more).
- **The people**: managing directors, owners or partners.
- **The register entry**: register type and number (HRB, HRA, PR, GnR, VR, Austrian FN, Swiss UID) and the register court.
- **The VAT ID, checked**: looked up live in **VIES**, the European Commission's VAT register, with the registered name and address where the country shares them.
- **The contact**: street, postal code, city, country, e-mail and phone.

It reads **Google Maps results directly**: pick the dataset of your Google Maps scraper run, and the Actor adds the legal company data to every place with a website.

### At a glance

| | This Actor |
|---|---|
| Finds the legal notice on its own | ✅ follows the Impressum link, also on one-page sites and sites with the notice in the footer |
| VAT ID checked against the EU register | ✅ included, free of charge |
| Google Maps results as input | ✅ pick the dataset, no export or copy-paste |
| Clear status for every website | ✅ found, no legal notice, not readable, not reachable |
| Price | ✅ **$2 per 1,000 companies found**, no start fee; websites without company data cost nothing |

### Why use it?

- **Pay only for results.** You are charged for companies found. Websites that have no legal notice, cannot be read or do not answer are listed with the reason, free of charge.
- **The right company, not the web designer.** Legal notices also name the hosting provider, the web agency, the liability insurer and the professional chamber. The Actor reads the name that stands with the address of the business and leaves those out.
- **A VAT check you can rely on.** Every EU VAT ID is checked in VIES at the moment of the run. You see at once whether a number is valid, and for most countries the name and address the tax office has on file.
- **Built for messy real-world websites.** Old and new site builders, e-mail addresses hidden from spam bots, broken certificates, slow servers and legal notices split over several lines are all handled.
- **Fits your workflow.** Schedule it, export to JSON, CSV, Excel or Google Sheets, or call it from Make, Zapier, n8n or the API.

### Who uses it

- **Sales and lead generation**: complete Google Maps leads with the legal company name, managing director and register number before outreach.
- **CRM and data teams**: clean and enrich company records with verified names, addresses and VAT IDs.
- **Compliance, KYC and procurement**: check suppliers and partners: is the company registered, is the VAT ID valid, who runs it?
- **Agencies and market researchers**: build lists of businesses by legal form or region.

### How to use it

1. Enter one or more **websites**: `example.de`, `www.example.at` or any link to the site.
2. Or pick a **dataset with websites**, for example the results of a Google Maps scraper run.
3. Leave **Check VAT IDs in VIES** on and click **Start**.
4. Download the companies from the **Output** tab, or read them through the API.

### How much does it cost to get company data from the Impressum?

Pay per event: **$2 per 1,000 companies found** ($0.002 per company). Apify platform usage is included, there is no start fee, and websites without readable company data are free.

| What you do | Price |
|---|---|
| 100 websites from a Google Maps search, 70 with a legal notice | $0.14 |
| 5,000 CRM records to enrich | up to $10 |

Free Apify plan users get $5 of credit every month, which is 2,500 companies.

### Input

| Field | What it does |
|---|---|
| **Websites** | Domains or links, one per line. Each website is read once, even if it appears several times, and each company is charged once. A link to any page of a website is read from its homepage; a website of its own on a shared host (for example `user.wixsite.com/site` or an agent's page like `insurer.de/vm/max.muster`) is read as that website. |
| **Dataset with websites** | A dataset from one of your runs, for example Google Maps results. The `website` field of each item is used (else `domain` or `url`). Can be combined with the list. |
| **Check VAT IDs in VIES** | On by default. Checks each EU VAT ID in the European Commission's register. Swiss UID numbers are not part of VIES and are marked `notInVies`. |
| **Proxy** | Usually not needed: websites are read directly. |

```json
{
  "websites": ["www.heise.de", "www.willhaben.at"],
  "checkVat": true
}
```

### Output

One row per website:

```json
{
  "website": "www.willhaben.at",
  "url": "https://www.willhaben.at/iad",
  "imprintUrl": "https://www.willhaben.at/iad/impressum",
  "status": "found",
  "companyName": "willhaben internet service GmbH",
  "legalForm": "GmbH",
  "managingDirectors": [
    "Mag. Sylvia Dellantonio"
  ],
  "registerType": "FN",
  "registerNumber": "271791 v",
  "registerCourt": "Handelsgericht Wien",
  "vatId": "ATU62224319",
  "vatValid": true,
  "vatCheck": "valid",
  "vatRegisteredName": "willhaben internet service GmbH",
  "vatRegisteredAddress": "Landstraßer Hauptstraße 97-101/B6, AT-1030 Wien",
  "street": "Landstraßer Hauptstraße 97-101 / Top Nr. B6",
  "postalCode": "1030",
  "city": "Wien",
  "country": "AT",
  "email": "impressum@willhaben.at",
  "phone": null,
  "error": null
}
```

| Status | Meaning | Charged |
|---|---|---|
| `found` | Company data read from the legal notice | yes |
| `notRecognized` | No company data could be read for this website: the legal notice has no company name with address, VAT ID or register entry, or the only notice belongs to someone else (the web host, a domain seller, or a platform the domain forwards to). The reason is in `error` | no |
| `noImprint` | The website has no legal notice, or shows its content only with JavaScript | no |
| `unreachable` | The website did not answer (the reason is in `error`) | no |
| `invalidInput` | The entry is not a website address, or a profile on a platform (Facebook, Doctolib, Linktree and similar) whose legal notice belongs to the platform | no |
| `duplicate` | The same website or the same company is already in the list (for example two branches on one domain, or two domains of one company); its row has the data | no |
| `error` | The legal notice could not be processed; the reason is in `error` | no |

`vatCheck` is `valid`, `invalid`, `notInVies` (Swiss numbers) or `unavailable` when VIES or the tax system of a country did not answer at that moment. Fields that a legal notice does not state are `null`.

### Use it through the API

```bash
curl -X POST "https://api.apify.com/v2/acts/layerwiselabs~impressum-company-data/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"websites": ["www.heise.de", "www.willhaben.at"]}'
```

### FAQ

#### Which countries does it cover?

Germany, Austria and Switzerland, where a legal notice is required by law (§ 5 DDG, § 5 ECG and § 25 MedienG, Swiss UWG).

#### How does it find the legal notice?

It loads the homepage, follows the link named Impressum, Imprint, Legal notice or similar, and falls back to the usual addresses such as `/impressum`. On one-page websites it reads the notice from the homepage itself.

#### Why is the VAT check sometimes `unavailable`?

VIES asks the tax system of each EU country live. When a country's system, or VIES itself, is down for maintenance, the check for those numbers is marked `unavailable`, and the rest of the data is delivered as usual. The Actor pauses the checks for a few minutes and then asks again, so a short outage does not slow the run down. Germany confirms whether a number is valid but does not share the registered name and address.

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

The legal notice is published so that anyone can identify the business behind a website. The data describes companies; where it names people (managing directors, sole traders), make sure your use of it complies with the GDPR. This is not legal advice.

#### Something does not work

Open an issue in the **Issues** tab with the website, and we will look into it.

# Changelog

This Actor's version history is a separate document: https://apify.com/layerwiselabs/impressum-company-data/changelog.md

# Actor input Schema

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

Websites of the companies, one per line: a domain (example.de) or any link to the website. The Actor finds the legal notice (Impressum) on its own.

## `datasetId` (type: `string`):

Reads the websites from a dataset of one of your runs, for example the results of a Google Maps scraper. Each item's 'website' field is used (else 'domain' or 'url'). Can be combined with the list above.

## `checkVat` (type: `boolean`):

Checks every EU VAT ID found against VIES, the official register of the European Commission: valid or not, and the registered name and address where the country shares them (Germany does not). Free of charge.

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

Usually not needed: the Actor reads the websites directly. A proxy set here is used for every website.

## Actor input object example

```json
{
  "websites": [
    "www.heise.de",
    "www.willhaben.at"
  ],
  "checkVat": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One item per website: company data from its legal notice, VAT check and status.

# 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.heise.de",
        "www.willhaben.at"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("layerwiselabs/impressum-company-data").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.heise.de",
        "www.willhaben.at",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("layerwiselabs/impressum-company-data").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.heise.de",
    "www.willhaben.at"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call layerwiselabs/impressum-company-data --silent --output-dataset

```

## MCP server setup

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

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/wriQB6nE69lrhOUER/builds/O4055TPoyJAZmJDd1/openapi.json
