# Impressum Scraper - German Company Data & B2B Leads (`aolmo/impressum-leads`) Actor

Company data from the Impressum of German, Austrian and Swiss websites, by site list or keyword search: company name, legal form, address, phone, fax, email, managing directors, register court, HRB number and VAT ID. You only pay for sites where the company is found: $0.008 each.

- **URL**: https://apify.com/aolmo/impressum-leads.md
- **Developed by:** [Antonio del Olmo Tena](https://apify.com/aolmo) (community)
- **Categories:** Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.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

Turn German, Austrian and Swiss websites into B2B leads. Every business website in these countries must publish an Impressum (legal notice) with the company's legal name, address and contact details. Give a list of websites, or keyword searches such as `Zahnarzt München`, and the Actor finds each site's Impressum and returns the company name, legal form, street, postal code, city, phone, fax, email, managing directors, register court, commercial register number (HRB) and VAT ID. You only pay for websites where the company is found. DACH prospecting, CRM enrichment and KYC checks at $0.008 per company.

### What you get

**Company** (one row per website): `companyName`, `legalForm`, `street`, `postalCode`, `city`, `country`, `phone`, `fax`, `email`, `emails`, `managingDirectors`, `registerCourt`, `registerNumber`, `vatId`, `socials`, `website`, `imprintUrl`, `imprintFound`, `error`, `position`, `source`.

**Changes** on scheduled keyword searches: `isNew` is true for companies that were not found in the previous run.

Websites without an Impressum or without company details are returned with `imprintFound: false` and are free.

### How to use it

1. Open the **Input** tab.
2. Add **Websites**, one per line: `firma.de` or `https://www.firma.de` (up to 500 per run).
3. Or add **Keyword searches** with a trade and a city, such as `Steuerberater Hamburg`, and set **Websites per search** (up to 30).
4. Click **Start** and export the rows as JSON, CSV or Excel.

### Input

```json
{
  "websites": ["www.steueragenten.de", "www.bmw.de"],
  "searches": ["Zahnarzt München"],
  "maxResults": 20
}
```

### Output

```json
{
  "source": "search:steuerberater hamburg",
  "website": "https://www.steueragenten.de/",
  "imprintUrl": "https://www.steueragenten.de/impressum",
  "imprintFound": true,
  "companyName": "steueragenten.de Steuerberatungsgesellschaft mbH",
  "legalForm": "mbH",
  "street": "Alexanderstraße 9",
  "postalCode": "20457",
  "city": "Hamburg",
  "country": "DE",
  "phone": "+4940284645390",
  "email": "hamburg@steueragenten.de",
  "emails": ["hamburg@steueragenten.de"],
  "managingDirectors": ["Uwe Riediger"],
  "registerCourt": "Hamburg",
  "registerNumber": "HRB 113951",
  "vatId": "DE271732706",
  "socials": {},
  "error": null,
  "isNew": false,
  "timestamp": "2026-11-06T10:00:00.000Z"
}
```

### Pricing

Pay per event: **$0.008 per website where the company is found**, and **$0.004 per new company** in a monitored keyword search. Websites without company details cost nothing. 1,000 websites where 700 have an Impressum cost $5.60.

### Limits and notes

- The Impressum is free text, so fields are read by pattern. Practices and sole traders have no legal form; their name comes from the first line of the Impressum.
- `emails` lists the site's own addresses first. Impressum pages of regulated professions also show the email of their chamber or authority, which come after.
- Sites that load the Impressum only with JavaScript, or that block automated visits, return an error.
- Keyword searches use a public search engine; results vary from run to run.

### Responsible use

The data is what each company publishes by law. Under the GDPR and the German UWG, unsolicited advertising emails to businesses usually need prior consent: check the rules before contacting the leads.

### Related Actors

- **Google Maps Email & Leads Extractor**: local businesses with their websites and contacts.
- **Website Contact Extractor**: emails and phones of any website.
- **Tech Stack Detector**: the technologies a website uses.

# Actor input Schema

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

One per line: firma.de or https://www.firma.de. Up to 500 per run.

## `searches` (type: `array`):

Optional: find websites by keyword and city, such as Zahnarzt München or Steuerberater Hamburg.

## `maxResults` (type: `integer`):

Websites taken from each keyword search, up to 30.

## `product` (type: `string`):

Internal. Leave as is.

## Actor input object example

```json
{
  "websites": [
    "www.steueragenten.de"
  ],
  "maxResults": 20,
  "product": "impressum-leads"
}
```

# Actor output Schema

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

Dataset items: url, changed, events, data, timestamp and error (when the target failed).

# 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.steueragenten.de"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("aolmo/impressum-leads").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.steueragenten.de"] }

# Run the Actor and wait for it to finish
run = client.actor("aolmo/impressum-leads").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.steueragenten.de"
  ]
}' |
apify call aolmo/impressum-leads --silent --output-dataset

```

## MCP server setup

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

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/aJidiiiFVrruSzjbj/builds/V7d3H3zrGSQGMGd9Z/openapi.json
