# German Imprint Scraper (`dominic-quaiser/imprint-contact-scraper`) Actor

An Actor that automatically locates and scrapes key contact details from German website imprint pages (Impressum). It extracts information such as company name, address, phone numbers, emails, and decision-makers (Entscheider, Entscheidungsträger)

- **URL**: https://apify.com/dominic-quaiser/imprint-contact-scraper.md
- **Developed by:** [Dominic M. Quaiser](https://apify.com/dominic-quaiser) (community)
- **Categories:** Automation, Lead generation, Developer tools
- **Stats:** 575 total users, 23 monthly users, 100.0% runs succeeded, 19 bookmarks
- **User rating**: 3.92 out of 5 stars

## Pricing

from $2.52 / 1,000 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?

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

## German Imprint Scraper

A Apify Actor designed to find and extract contact and legal information from German imprint pages ("Impressum"). Simply provide a list of website homepages, and the actor will automatically locate the imprint page and scrape key details like company name, address, phone number, email, and commercial register number.

**Beta Version Notice**: This actor is currently in beta. While it's fully functional and returns results, you may encounter occasional quirks or incomplete features. I welcome your feedback! Please report any issues or suggestions you have.

### 💡 Features

- **Automatic Imprint Page Discovery**: Intelligently crawls websites to find the correct imprint page from your starting URLs.
- **Selective Data Extraction**: Choose exactly which data points you need, from basic contact info to advanced details like company decision-makers.
- **Dual Fetching Technology**:
  - **HTTP Mode**: A fast, lightweight method for scraping simple, server-rendered websites.
  - **Headless Browser Mode (Playwright)**: A powerful option for modern, JavaScript-heavy websites. The actor can be configured to use this mode for all sites or as an automatic fallback if the standard HTTP method fails, ensuring maximum success rates.
- **Proxy Support**: Integrates seamlessly with Apify's proxy service to handle IP rotation and avoid blocking.
- **Customizable Output**: Include optional metadata or error records for detailed analysis and troubleshooting.
- **Structured JSON Output**: Delivers clean, well-structured data ready for use in your applications, databases, or CRM systems.

### 📥 Input Parameters

Configure the actor's behavior using these fields in the Apify Console Input tab or via API:

| Field | Type | Description | Default | Required |
| --- | --- | --- | --- | --- |
| `startUrls` | Array   | Enter the homepage URLs of the websites to process. | `[{ "url": "https://www.vita-cola.de/" }]` | Yes |
| `fieldsToExtract` | Array | Choose the specific pieces of information you want to collect. | `["company_name", "business_address"]` | No |
| `usePlaywright` | Boolean | Use a headless browser for all websites. Slower but more reliable for JavaScript-heavy sites. | `false` | No |
| `metaData` | Boolean | Include technical details in the output. | `false` | No |
| `errorOutput` | Boolean | Include a row in the output for each website that failed to process. | `false` | No |
| `debugLog` | Boolean | Generate a verbose log for troubleshooting. | `false` | No |
| `proxyConfiguration` | Object  | Proxy settings. Apify Proxy is recommended. | `{ "useApifyProxy": true }` | No |

### 📤 Output Data Structure

The exact fields depend on your `fieldsToExtract` selection.

#### Example Output

```json
{
  "start_url": "https://muster-firma.de/",
  "imprint_url": "https://muster-firma.de/impressum",
  "company_name": {
    "name": "Muster GmbH",
    "confidence": 1
  },
  "business_address": {
    "full_address": "Musterstraße 123, 12345 Berlin",
    "street": "Musterstraße",
    "house_number": "123",
    "postal_code": "12345",
    "city": "Berlin"
  },
  "phone_number": {
    "phone_1": "+493012345678"
  },
  "fax_number": {
    "fax_1": "+493012345679"
  },
  "emails": {
    "email_1": "kontakt@muster-firma.de"
  },
  "register_number": {
    "number": "HRB 12345 B",
    "court": "Amtsgericht Charlottenburg"
  },
  "vat_id": {
    "vat_id": "DE123456788"
  },
  "social_media": {
    "linkedin": "https://www.linkedin.com/company/muster-firma"
  },
  "decision_makers": ["Max Mustermann"],
  "metadata": {
    "domain": "muster-firma.de",
    "fetch_method": "http",
    "fallback_attempted": false,
    "scraped_at": "2025-08-28T12:04:48.003780"
  }
}
```

**Note:** The numbered outputs like emails and phone numbers are sorted by confidence in how likely they are the main contact data for the company.

### 📊 Extractable Data in Detail

You can select any combination of the following fields for extraction:

| Field                  | Description                                                                                                                                                                                             | Data Structure |
| --- | --- | --- |
| **`company_name`**     | Extracts the official company name. The result includes a `confidence` score indicating the likelihood of a correct match. The higher the number, the lower is the confidence.                          | `Object`       |
| **`business_address`** | Parses the full business address into structured components: `full_address`, `street`, `house_number`, `postal_code`, and `city`.                                                                       | `Object`       |
| **`phone_number`**     | Finds and extracts one or more phone numbers from the page. Results are keyed as `phone_1`, `phone_2`, etc.                                                                                             | `Object`       |
| **`fax_number`**       | Finds and extracts one or more fax numbers from the page. Results are keyed as `fax_1`, `fax_2`, etc.                                                                                                   | `Object`       |
| **`emails`**           | Finds and extracts one or more email addresses. The extractor prioritizes emails that match the website's domain.                                                                                       | `Object`       |
| **`register_number`**  | Extracts the commercial register number ("Handelsregisternummer") and the corresponding registration `court` (`Registergericht`).                                                                       | `Object`       |
| **`vat_id`**           | Extracts the German VAT ID ("Umsatzsteuer-Identifikationsnummer") with checksum validation. Returns single best match in format "DE123456789".                                                          | `Object`       |
| **`social_media`**     | Scans for and extracts links to common social media platforms like LinkedIn, Xing, Facebook, Instagram, etc.                                                                                            | `Object`       |
| **`decision_makers`**  | **(Premium)** Identifies and extracts the names of key decision-makers ("Entscheidungsträger"). This feature uses an external NER (Named Entity Recognition) machine learning model to ensure accuracy. | `Array`        |

### 💲 Pricing

This actor uses a pay-per-event pricing model. You are charged based on your usage, ensuring you only pay for what you need. The costs are as follows:

- **Actor Start**: `$0.10` per run
- **Per Website**:
  - **Website Processed**: $0.0004 for each URL from your input list
  - **Successful Result**: $0.0026 for each website where data is successfully extracted
  - **Decision Maker Extracted**: $0.0006 for decision-makers found per website (this is in addition to the successful result charge)
  - **Maximum Sum:** $0.0036 per Website
- **Per 1000 Websites**:
  - **Website Processed**: $0.40 for 1000 URL from your input list
  - **Successful Result**: $2.60 for 10000 websites where data is successfully extracted
  - **Decision Maker Extracted**: $0.60 for decision-makers found per 1000 websites (this is in addition to the successful result charge)
  - **Maximum Sum:** $3.60 per 1000 Websites

### ⚙️ Usage

1. **Input URLs**: Go to the **Input** tab and paste the homepage URLs of the websites you want to scrape.
2. **Select Data**: In the `fieldsToExtract` dropdown, select all the data points you wish to collect.
3. **Configure Settings**: Adjust settings like `usePlaywright` or `proxyConfiguration` as needed.
4. **Start the Actor**: Click the **Start** button.
5. **Get Data**: Once the run is finished, find your results in the **Storage** → **Dataset** tab.

#### 🤖 Other Actors

🔗 Combine with Other Actors for Powerful Workflows.

You can enhance your data processing pipelines by combining the German Imprint Scraper with other Apify actors.

For example, you might also check out:

- **[Gelbe Seiten (German Yellow Pages) Scraper](https://apify.com/dominic-quaiser/gelbe-seiten-german-yellow-pages-scraper)**: Extract business listings from Germany's Yellow Pages with three detail levels.
- **[Das Telefonbuch Scraper](https://apify.com/dominic-quaiser/das-telefonbuch-scraper)**: Extract business listings from Das Telefonbuch, Germany's official telephone directory
- **[Das Örtliche Scraper](https://apify.com/dominic-quaiser/das-oerdliche-scraper)**: Extract business listings from Das Örtliche, Germany's nationwide telephone directory.

### 🎯 Use Cases

- **Lead Generation**: Build targeted contact lists for sales and marketing.
- **Compliance & Verification**: Check for legally compliant imprint information.
- **Market Research**: Aggregate data on companies in a specific industry or region.
- **Data Enrichment**: Enhance existing company profiles with official contact and registration details.

### ⚖️ Legal Disclaimer

You are solely responsible for determining the legality of your use of this actor and the data it generates. The scraping and handling of data, particularly personal information, is subject to complex legal frameworks like the General Data Protection Regulation (GDPR/DSGVO), copyright laws, and the terms of service of the websites you scrape. It is your responsibility to ensure your use case is compliant with all applicable laws. This text does not constitute legal advice.

#### GDPR Notice: "Decision Makers" Feature

Please be aware that the **`decision_makers`** feature uses an external API hosted on a private server in **Europe** for data processing.

- **What is Processed**: The text of the imprint page is sent to this API to identify personal names.
- **Why**: This is necessary for the Named Entity Recognition (NER) model to accurately extract decision-makers.
- **Data Controller**: You, the user, are the data controller. The actor's developer acts as the data processor for this specific task.
- **Location & Compliance**: All processing for this feature occurs within the EU (Germany) and is subject to GDPR (DSGVO).
- **Data Storage**: The text is processed in-memory and is **not** stored or logged on the external server.
- **Important**: This processing is external to the Apify platform and is not covered by Apify's DPA. By using this feature, you acknowledge this separate data processing activity.

### 🛠️ Maintainer

- **Author**: Dominic M. Quaiser
- **Contact**: [mail@dominic-quaiser.io](mailto:mail@dominic-quaiser.io "null")
- **Website**: [dominic-quaiser.io](https://dominic-quaiser.io/ "null")

# Changelog

This Actor's version history is a separate document: https://apify.com/dominic-quaiser/imprint-contact-scraper/changelog.md

# Actor input Schema

## `startUrls` (type: `array`):

Enter the homepage URLs of the websites you want to process. The actor will automatically navigate each site to find its specific imprint page.

## `fieldsToExtract` (type: `array`):

Choose the specific pieces of information you want to collect from the imprint pages.

## `headlessBrowser` (type: `string`):

Configure how the headless browser is used for fetching pages. Auto mode uses HTTP first with browser fallback (recommended for best performance).

## `metaData` (type: `boolean`):

When enabled, the output will include extra technical details. This is useful for troubleshooting or detailed analysis.

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

Specifies proxy servers that will be used by the scraper in order to hide its origin.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.renault.de/"
    }
  ],
  "fieldsToExtract": [
    "company_name",
    "business_address",
    "phone_number",
    "emails",
    "social_media"
  ],
  "headlessBrowser": "headlessBrowserAuto",
  "metaData": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

All extracted imprint records with full metadata (JSON format)

## `datasetCsv` (type: `string`):

Download all results as a CSV spreadsheet

## `datasetExcel` (type: `string`):

Download all results as an Excel spreadsheet (XLSX format)

## `viewOverview` (type: `string`):

All extracted fields for every result — the complete picture in one view

## `viewContactInfo` (type: `string`):

Company name, email addresses, and phone/fax numbers — ready for outreach

## `viewCompanyDetails` (type: `string`):

Legal company information — name, address, register number, and VAT ID

## `viewDecisionMakers` (type: `string`):

Extracted Geschäftsführer and other named responsible persons per company

## `viewSocialMedia` (type: `string`):

Social media profile links found on each imprint page

# 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 = {
    "startUrls": [
        {
            "url": "https://www.renault.de/"
        }
    ],
    "fieldsToExtract": [
        "company_name",
        "business_address",
        "phone_number",
        "emails",
        "social_media"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("dominic-quaiser/imprint-contact-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 = {
    "startUrls": [{ "url": "https://www.renault.de/" }],
    "fieldsToExtract": [
        "company_name",
        "business_address",
        "phone_number",
        "emails",
        "social_media",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("dominic-quaiser/imprint-contact-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 '{
  "startUrls": [
    {
      "url": "https://www.renault.de/"
    }
  ],
  "fieldsToExtract": [
    "company_name",
    "business_address",
    "phone_number",
    "emails",
    "social_media"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call dominic-quaiser/imprint-contact-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dominic-quaiser/imprint-contact-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/YpzZ4RnzljluUzBs1/builds/cTI1sa0YlHyCmPsPT/openapi.json
