# Impressum Scraper: Company Data for DACH and EU Legal Notices (`getascraper/impressum-scraper`) Actor

Extract company name, address, register number, VAT ID, director and contact details from any site's legally mandated Impressum or legal notice page. Best coverage for Germany, Austria and Switzerland. One transparent price per result, no stacked billing events.

- **URL**: https://apify.com/getascraper/impressum-scraper.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** Lead generation, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.78 / 1,000 impressum results

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?

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: Legal Notice Data for DACH and EU Sites

<table width="100%">
<tr>
<td style="padding:24px 28px;background:#F0FDFA;border:1px solid #99F6E4;border-top:4px solid #0F766E;border-radius:12px">
<span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">Legally sourced company data, straight from the source</span><br>
<span style="font-size:15px;color:#57534E;line-height:1.6">Company name, address, register number, VAT ID and director, pulled from any site's own mandatory legal notice page. One price, no stacked fees.</span>
</td>
</tr>
</table>

<table width="100%">
<tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #99F6E4;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#0F766E">⚖️ Legally clean by design</span><br>
<span style="font-size:12px;color:#57534E">Impressum pages are required by law to be public. No login, no gray area.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #99F6E4;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#0F766E">💶 One price, no stacking</span><br>
<span style="font-size:12px;color:#57534E">A single transparent price per result. No five-part billing to add up before you can run it.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #99F6E4;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#0F766E">🎯 DACH-first coverage</span><br>
<span style="font-size:12px;color:#57534E">Strongest results for Germany, Austria and Switzerland. Usable data for the rest of the EU too.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #99F6E4;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#0F766E">🔔 Change alerts</span><br>
<span style="font-size:12px;color:#57534E">Get flagged when a company's director, address or legal form changes.</span>
</td>
</tr>
</table>

Pull [Impressum](https://en.wikipedia.org/wiki/Impressum) data from any German, Austrian, Swiss or EU company site. Export to JSON, CSV or Excel, or connect it into Google Sheets and your own pipeline via the API. Run it on demand or on a schedule. No account, no API key, no coding required.

### ✨ Why use this Actor

**Built for anyone who needs real, legally sourced company data instead of a guess.**

- 📈 **Sales and RevOps teams**: get a verified decision-maker name and registered company address to open a DACH conversation, sourced from a document companies are legally required to publish.
- 🛡️ **Compliance and KYC teams**: confirm a counterparty's legal entity, register court and register number in seconds instead of digging through a footer by hand.
- 🔔 **Account-based sellers**: know the moment a target company's managing director or address changes, a real trigger for a fresh outreach.

**Pricing is the difference.** The leading alternative bills through five separate stacked events, including a charge for browser use, so you cannot predict a run's cost from one number. This Actor is one flat price per result, and it never needs a browser: legal notice pages are static text, confirmed by testing real sites before building this.

### ⚙️ How it works

<table width="100%">
<tr>
<td style="padding:16px 14px;width:33%;background:#F0FDFA;border:1px solid #99F6E4;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#0F766E;letter-spacing:1px">STEP 1</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Add your domains</span><br>
<span style="font-size:12px;color:#57534E">Any company domain, e.g. otto.de or check24.de.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#F0FDFA;border:1px solid #99F6E4;border-left:none;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#0F766E;letter-spacing:1px">STEP 2</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Run the Actor</span><br>
<span style="font-size:12px;color:#57534E">It finds each site's own legal notice page and reads it.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#F0FDFA;border:1px solid #99F6E4;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#0F766E;letter-spacing:1px">STEP 3</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Get your data</span><br>
<span style="font-size:12px;color:#57534E">Company details, register number and contact info land in your dataset.</span>
</td>
</tr>
</table>

### 📥 Input

| Field | Type | Required | Description |
|---|---|---|---|
| `domains` | array of strings | No | Company domains or URLs, e.g. otto.de or https://www.check24.de. |
| `contactPageFallback` | boolean | No | If no legal notice page is found, try the site's contact page instead. |
| `monitorMode` | boolean | No | Remember each company's data and flag what changed since the last run. |
| `maxItems` | integer | No | Stop after processing this many domains. |
| `maxConcurrency` | integer | No | How many domains to process at once. |
| `proxyConfiguration` | object | No | Proxy settings. Datacenter by default. |

### 📤 Output

Every result is one company:

```json
{
  "domain": "check24.de",
  "legalPageUrl": "https://www.check24.de/unternehmen/impressum/",
  "legalPageType": "impressum",
  "companyName": "CHECK24 Vergleichsportal GmbH",
  "legalForm": "GmbH",
  "address": "Erika-Mann-Str. 62-66, 80636 München",
  "registerCourt": "München",
  "registrationNumber": "HRB 228747",
  "vatId": "DE308470788",
  "managingDirector": "Dr. Henrich Blase",
  "emails": ["info@check24.de"],
  "phone": null
}
```

Download the dataset in JSON, CSV, Excel, HTML or XML from the Apify Console, or pull it through the API.

### 📊 Data table

| Field | Type | Description |
|---|---|---|
| `domain` | string | The domain you provided. |
| `legalPageUrl` / `legalPageType` | string | Where the data came from: the site's own legal notice page, or a contact-page fallback. |
| `companyName` / `legalForm` | string | The registered company name and legal form (GmbH, AG, and so on). |
| `address` | string | Registered business address. |
| `registerCourt` / `registrationNumber` | string | The register court and Handelsregister or Firmenbuch number, where published. |
| `vatId` | string | VAT identification number, where published. |
| `managingDirector` | string | The named director or representative as the page states it. When a site lists several directors with no clear separator, this field captures the raw text rather than guessing where one name ends and the next begins. |
| `emails` / `phone` | array / string | Contact details found on the page. |
| `changedFields` | array | Monitor mode only: which fields changed since the last run for this domain. |

The Output tab also ships three pre-built views: legal notice overview, contacts, and monitor changes.

### 💰 Pricing

This Actor is pay per result: you only pay for the companies you actually collect, and a run that returns nothing costs nothing. There is no subscription and no stacked billing events to add up.

### ⭐ Enjoying Impressum Scraper?

<table width="100%" style="display:table;width:100%">
<tr>
<td style="padding:20px 24px 14px;background:#F0FDFA;border:1px solid #99F6E4;border-left:5px solid #0F766E;border-radius:10px 10px 0 0">
<span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br>
<span style="font-size:17px;font-weight:800;color:#1C1917">Found a decision-maker without guessing at a company page?</span><br>
<span style="font-size:14px;color:#57534E">A 5-star rating takes 10 seconds and helps other sales and compliance teams find it. Your feedback also tells us what to build next.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#0F766E;border:1px solid #99F6E4;border-top:none;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/impressum-scraper/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a>
</td>
</tr>
</table>

### 🛠️ Tips for better runs

- Field completeness is strongest for German, Austrian and Swiss companies, since their legal notice format is the most standardized. Other EU countries usually still return a name, address and contact.
- Turn on `contactPageFallback` for smaller sites that skip a dedicated legal notice page and only publish a contact page.
- Use `monitorMode` on a schedule to get notified the moment a target company's director or address changes, a real trigger worth acting on.
- A small minority of sites, mostly large e-commerce chains with heavy JavaScript or strong bot protection, cannot be reached. Those return a clear error field instead of empty data.

### ❓ FAQ

**Is it legal to extract Impressum data?**
Yes. German, Austrian and Swiss law require commercial sites to publish this information publicly and unauthenticated, specifically so it can be found. This Actor only reads what the law already requires to be public. You are responsible for how you use the data, particularly around any named individual.

**Does this work on every website?**
For the vast majority of sites, yes. A small number of large sites with heavy JavaScript rendering or strong bot protection cannot be reached by this Actor. Those are reported honestly with an error, never left blank without explanation.

**Why does managingDirector sometimes look like several names run together?**
Some companies list multiple directors with no clear separator on the page itself. Rather than guess where one name ends and the next begins, this Actor returns the text as published. Splitting it further would risk cutting a real name in half.

**Can I get alerted when a company's details change?**
Yes. Turn on monitor mode and schedule the Actor to run periodically. You will see exactly which fields changed since the last check for each domain.

Found a bug or need a custom version of this Actor? Open an issue from the Actor's Issues tab and it'll be looked at directly.

### 🔗 Other actors

- [US Short Interest Scraper: NYSE, Nasdaq and OTC via FINRA Data](https://apify.com/getascraper/short-interest-scraper) ↗ - official short interest data with the same monitor-mode pattern.
- [Dealroom Scraper: Company Funding and Investor Cap Tables](https://apify.com/getascraper/dealroom-scraper) ↗ - startup funding rounds and investor cap tables.
- [Capitol Trades Scraper: Congress Stock Trades & Monitor Mode](https://apify.com/getascraper/capitol-trades-scraper) ↗ - US Congress stock trade disclosures.
- [Simply Wall St Scraper: Snowflake Scores and Fair Value](https://apify.com/getascraper/simply-wall-street-scraper) ↗ - stock valuation scores and fair value.

# Actor input Schema

## `domains` (type: `array`):

Company domains or URLs, e.g. otto.de or https://www.check24.de. Works best for German, Austrian and Swiss sites; other EU countries return whatever fields the site actually publishes.

## `contactPageFallback` (type: `boolean`):

If no legal notice page can be found, try the site's contact page instead. Off means a domain with no legal notice page returns nothing.

## `monitorMode` (type: `boolean`):

Remembers each domain's company name, address, director and legal form, and reports which of those changed since the last run. A director or address change is a real signal worth acting on.

## `maxItems` (type: `integer`):

Stop after processing this many domains.

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

How many domains to process at once.

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

Proxy settings. Datacenter is the default and works for most sites; a handful of large e-commerce sites with strong bot protection may not be reachable regardless of proxy tier.

## Actor input object example

```json
{
  "domains": [
    "otto.de",
    "check24.de"
  ],
  "contactPageFallback": true,
  "monitorMode": false,
  "maxItems": 10,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

# 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 = {
    "domains": [
        "otto.de",
        "check24.de"
    ],
    "maxItems": 10,
    "maxConcurrency": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/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 = {
    "domains": [
        "otto.de",
        "check24.de",
    ],
    "maxItems": 10,
    "maxConcurrency": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/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 '{
  "domains": [
    "otto.de",
    "check24.de"
  ],
  "maxItems": 10,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call getascraper/impressum-scraper --silent --output-dataset

```

## MCP server setup

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