# German Impressum & Imprint Scraper (`codescraper/german-imprint-scraper`) Actor

Fast, automated scraper to find and extract Impressum (legal notice & imprint) data from German websites. Extracts company names, decision-makers (Geschäftsführer), addresses, emails, phones, Handelsregister numbers (HRB), tax IDs, and social links with AI or Regex.

- **URL**: https://apify.com/codescraper/german-imprint-scraper.md
- **Developed by:** [CodeScraper](https://apify.com/codescraper) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 135 total users, 2 monthly users, 100.0% runs succeeded, 6 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

$3.00/month + usage

To use this Actor, you pay a monthly rental fee to the developer. The rent is subtracted from your prepaid usage every month after the free trial period. You also pay for the Apify platform usage, which gets cheaper the higher Apify subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#rental-actors

## 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 Impressum Scraper – Extract Legal Details Automatically (Regex + AI)

This Apify Actor automatically detects, renders, and extracts **Impressum (legal disclosure / legal notice)** data from German, Austrian, and Swiss websites.

Powered by **Playwright (full browser automation)**, it executes JavaScript, renders modern dynamic SPAs (React, Vue, Next.js, Nuxt, Shopify themes), handles cookie banners, and parses even the most complex web layouts.

***

#### ⚡ Looking for a faster, ultra-cheap alternative?

If your target websites are simple static HTML pages and do not require full JavaScript browser rendering, check out our companion Actor:
👉 **[German Imprint Scraper (Contact+Social Links)](https://console.apify.com/actors/3hMKKq9OycbeUJ79G/info)** (`codescraper/german-impressum-scraper-fast`)

- **Cheerio-based (Fast):** Extremely high-speed, lightweight HTTP scraping at lower cost.
- **Best for:** Simple, non-JavaScript websites. (May miss dynamic single-page applications or heavy JS stores that require browser automation).

***

### 🚀 What It Does

The scraper visits each website, finds its legal disclosure page across headers, footers, sub-bars, and drawers, and extracts:

- 🏢 **Company Name**, **Decision Maker Name(s)**, and **Role** (e.g. *Geschäftsführer*, *Inhaber*, *Vorstand*)
- 🏠 **Full Address** + separated fields (*Street*, *House Number*, *Postal Code*, *City*, *Country*)
- ☎️ **Phone Numbers** and 📧 **Email Addresses**
- 🧾 **Commercial Register Number** (*HRB*, *HRA*, *VR*), **Register Court** (*Amtsgericht*), and **Tax ID** (*USt-IdNr.*)
- 🌐 **14+ Social Media Channels** (Facebook, Instagram, LinkedIn, X, Xing, YouTube, TikTok, WhatsApp, Telegram, Threads, Pinterest, GitHub, Discord, Bluesky)
- 🧠 **Meta Title** and **Meta Description**
- 🏷️ **Extraction Method** (`regex` or `ai`) – full transparency on how each row was parsed

***

### ⚡ Two Extraction Engines

| Feature | ⚙️ Standard Regex Engine | 🤖 Premium AI Engine |
| :--- | :--- | :--- |
| **How it works** | Hundreds of tuned German legal heuristics | Advanced LLM reads and extracts like a human |
| **Speed** | ⚡ Ultra-fast | ⚡ Fast (adds ~1–2s per site) |
| **Best for** | Large lead lists, standard Impressum layouts | Complex multi-manager structures, unusual wording, messy layouts |
| **Cost** | **$0.007** per website ($7.00 / 1,000) | **$0.010** per website ($10.00 / 1,000) |
| **Fallback** | – | **Automatic silent fallback to Regex** if AI is unavailable (you are charged only the Regex price!) |

***

### 💰 Pay-Per-Event (PPE) Pricing

You pay **only when Impressum data is successfully delivered**.

- ✅ **Platform compute is 100% FREE** (no memory or CPU hourly charges).
- ✅ **No Impressum found? You are NOT charged for extraction.**
- ✅ **Website failed to load / invalid domain? You are NOT charged.**

#### Official Pricing Table

| Event | Free Plan (No discount) | Starter (Bronze discount) | Scale (Silver discount) | Business (Gold discount) |
| :--- | :---: | :---: | :---: | :---: |
| **Standard Impressum (Regex)** | **$7.00** / 1,000 | **$6.30** / 1,000 | **$5.90** / 1,000 | **$5.50** / 1,000 |
| **Premium Impressum (AI)** | **$10.00** / 1,000 | **$9.00** / 1,000 | **$8.50** / 1,000 | **$8.00** / 1,000 |
| **Dataset Result** | $1.00 / 1,000 | $1.00 / 1,000 | $1.00 / 1,000 | $1.00 / 1,000 |
| **Actor Start** | $0.0005 / run | $0.0005 / run | $0.0005 / run | $0.0005 / run |
| **Platform Usage** | **FREE** | **FREE** | **FREE** | **FREE** |

***

#### 💵 Real-World Cost Examples

*(Note: Calculations below assume a standard Free/Pay-as-you-go plan. Starter, Scale, and Business plans receive up to 21% discount!)*

- **Example 1: 100 Websites Crawled**
  - **Regex Mode:** 100 sites found → (100 × $0.007) + (100 × $0.001 result) + $0.0005 start ≈ **$0.80 total**
  - **AI Mode:** 100 sites found → (100 × $0.010) + (100 × $0.001 result) + $0.0005 start ≈ **$1.10 total**

- **Example 2: 200 Websites Crawled**
  - **Regex Mode:** 200 sites found → (200 × $0.007) + (200 × $0.001 result) + $0.0005 start ≈ **$1.60 total**
  - **AI Mode:** 200 sites found → (200 × $0.010) + (200 × $0.001 result) + $0.0005 start ≈ **$2.20 total**

- **Example 3: 500 Websites Crawled**
  - **Regex Mode:** 500 sites found → (500 × $0.007) + (500 × $0.001 result) + $0.0005 start ≈ **$4.00 total**
  - **AI Mode:** 500 sites found → (500 × $0.010) + (500 × $0.001 result) + $0.0005 start ≈ **$5.50 total**

- **Example 4: 1,000 Websites Crawled (with 50 missing / failed sites)**
  - Suppose out of 1,000 websites:
    - 930 websites have an Impressum extracted by AI: 930 × $0.010 = $9.30
    - 20 websites fall back to Regex: 20 × $0.007 = $0.14
    - 50 websites have no Impressum or were down: **$0.00** *(No extraction event charged!)*
    - Results saved (950): 950 × $0.001 = $0.95
    - Actor start: $0.0005
    - **Total cost for 1,000 URLs: ~$10.39**

***

### ⚙️ Input Configuration

| Field Name | Type | Default | Description | Example / Allowed Values |
| :--- | :--- | :--- | :--- | :--- |
| `startUrls` | Array of strings | `[]` | List of target websites. **Any format works!** Accepts raw domains, subdomains, or full URLs without pre-cleaning. | `["marley.de", "https://www.dr-johanna-budwig.de/"]` |
| `enableAi` | Boolean | `false` | Turn on premium AI extraction. If disabled, uses fast Regex engine. | `true` or `false` |
| `aiModel` | String | `openai/gpt-oss-20b` | AI model to use for extraction when `enableAi` is true. | `openai/gpt-oss-20b`, `openai/gpt-oss-120b`, `qwen/qwen3.8-27b` |
| `socialPlatforms` | Array of strings | `["facebook", "instagram", "linkedin", "youtube", "tiktok", "x"]` | Multi-select picker for social links. Only selected platforms will appear in output. | `["facebook", "instagram", "linkedin", "x", "xing", "youtube", "tiktok", "whatsapp", "telegram", "threads", "pinterest", "github", "discord", "bluesky"]` |
| `excludeMainUrl` | Boolean | `false` | Exclude the original input URL column. | `true` / `false` |
| `excludeImpressumUrl` | Boolean | `false` | Exclude the direct link to the Impressum page. | `true` / `false` |
| `excludeAddress` | Boolean | `false` | Exclude all address columns (full address, street, house number, PLZ, city, country). | `true` / `false` |
| `excludePhones` | Boolean | `false` | Exclude phone numbers. | `true` / `false` |
| `excludeEmails` | Boolean | `false` | Exclude email addresses. | `true` / `false` |
| `excludeDecisionMaker` | Boolean | `false` | Exclude decision maker names and roles. | `true` / `false` |
| `excludeRegisterNumber` | Boolean | `false` | Exclude commercial register number (HRB/HRA/VR). | `true` / `false` |
| `excludeRegisterCourt` | Boolean | `false` | Exclude register court (Amtsgericht). | `true` / `false` |
| `excludeTaxId` | Boolean | `false` | Exclude VAT tax ID (USt-IdNr.). | `true` / `false` |
| `excludeSocial` | Boolean | `false` | Exclude all social media profile columns. | `true` / `false` |
| `excludeMeta` | Boolean | `false` | Exclude page title and meta description. | `true` / `false` |
| `maxConcurrency` | Integer | `40` | Maximum number of websites processed simultaneously. | `10` to `50` |
| `userAgent` | String | *Chrome Desktop* | Custom browser User-Agent signature. | `"Mozilla/5.0 ... Chrome/120.0.0.0 ..."` |

***

### 🧩 Input & Output Examples

#### 1️⃣ Example: Regex Extraction (Standard Mode)

##### Input Configuration:

```json
{
  "startUrls": [
    "marley.de",
    "https://www.dr-johanna-budwig.de/"
  ],
  "enableAi": false,
  "socialPlatforms": [
    "facebook",
    "instagram",
    "linkedin",
    "youtube",
    "tiktok",
    "x"
  ]
}
```

##### Output Result:

```json
[
  {
    "mainUrl": "marley.de",
    "impressumUrl": "https://marley.de/policies/legal-notice",
    "companyName": "Marley Deutschland GmbH",
    "decisionMakerName": "Stefan Ostertag, Christian Holland-Moritz",
    "decisionMakerRole": "Geschäftsführer",
    "address": "Adolf-Oesterheld-Str. 28, 31515 Wunstorf, DE",
    "addressStreet": "Adolf-Oesterheld-Str.",
    "addressHouseNumber": "28",
    "addressPostalCode": "31515",
    "addressCity": "Wunstorf",
    "addressCountry": "DE",
    "phones": "+495031530",
    "emails": "info@marley.de",
    "registerCourt": "Amtsgericht Hannover",
    "registerNumber": "HRB 110009",
    "taxId": "DE811119134",
    "socialFacebook": "https://www.facebook.com/MarleyDeutschland",
    "socialInstagram": "https://www.instagram.com/marley_deutschland",
    "socialLinkedin": "https://www.linkedin.com/company/marleydeutschland",
    "socialYoutube": "https://www.youtube.com/@MarleyDeutschland",
    "socialTiktok": "https://www.tiktok.com/@marleydeutschland",
    "socialX": null,
    "extractionMethod": "regex",
    "error": "",
    "fetchTime": "2026-10-04T08:07:31.331Z",
    "metaTitle": "Marley Deutschland GmbH",
    "metaDescription": "— Marley Deutschland GmbH"
  },
  {
    "mainUrl": "https://www.dr-johanna-budwig.de/",
    "impressumUrl": "https://www.dr-johanna-budwig.de/policies/legal-notice",
    "companyName": "Dr. Johanna Budwig GmbH",
    "decisionMakerName": "Franz Nowotny",
    "decisionMakerRole": "Geschäftsführer",
    "address": "An den Kolonaten 2-4, 26160 Bad Zwischenahn, DE",
    "addressStreet": "An den Kolonaten",
    "addressHouseNumber": "2-4",
    "addressPostalCode": "26160",
    "addressCity": "Bad Zwischenahn",
    "addressCountry": "DE",
    "phones": "+494413906300",
    "emails": "kontakt@dr-johanna-budwig.de",
    "registerCourt": "Amtsgericht Oldenburg",
    "registerNumber": "HRB 209987",
    "taxId": "DE300469959",
    "socialFacebook": "https://www.facebook.com/Dr.Johanna.Budwig",
    "socialInstagram": "https://www.instagram.com/dr.johannabudwig",
    "socialLinkedin": null,
    "socialYoutube": "https://www.youtube.com/user/DrJohannaBudwig",
    "socialTiktok": "https://www.tiktok.com/@dr.johannabudwig",
    "socialX": null,
    "extractionMethod": "regex",
    "error": "",
    "fetchTime": "2026-10-04T08:08:40.012Z",
    "metaTitle": "Dr. Johanna Budwig",
    "metaDescription": "Dr. Johanna Budwig"
  }
]
```

***

#### 2️⃣ Example: AI Extraction (Premium Mode)

##### Input Configuration:

```json
{
  "startUrls": [
    "marley.de",
    "https://www.dr-johanna-budwig.de/"
  ],
  "enableAi": true,
  "aiModel": "openai/gpt-oss-20b",
  "socialPlatforms": [
    "facebook",
    "instagram",
    "linkedin",
    "youtube",
    "tiktok",
    "x"
  ]
}
```

##### Output Result:

```json
[
  {
    "mainUrl": "marley.de",
    "impressumUrl": "https://marley.de/policies/legal-notice",
    "companyName": "Marley Deutschland GmbH",
    "decisionMakerName": "Stefan Ostertag, Christian Holland-Moritz",
    "decisionMakerRole": "Geschäftsführer",
    "address": "Adolf-Oesterheld-Str. 28, 31515 Wunstorf, DE",
    "addressStreet": "Adolf-Oesterheld-Str.",
    "addressHouseNumber": "28",
    "addressPostalCode": "31515",
    "addressCity": "Wunstorf",
    "addressCountry": "DE",
    "phones": "+495031530, +49503153371, +495031530, +4950315337",
    "emails": "info@marley.de",
    "registerCourt": "Amtsgericht Hannover",
    "registerNumber": "HRB 110009",
    "taxId": "DE811119134",
    "socialFacebook": "https://www.facebook.com/MarleyDeutschland",
    "socialInstagram": "https://www.instagram.com/marley_deutschland",
    "socialLinkedin": "https://www.linkedin.com/company/marleydeutschland",
    "socialYoutube": "https://www.youtube.com/@MarleyDeutschland",
    "socialTiktok": "https://www.tiktok.com/@marleydeutschland",
    "socialX": null,
    "extractionMethod": "ai",
    "error": "",
    "fetchTime": "2026-10-04T08:37:44.033Z",
    "metaTitle": "Marley Deutschland GmbH",
    "metaDescription": "— Marley Deutschland GmbH"
  },
  {
    "mainUrl": "https://www.dr-johanna-budwig.de/",
    "impressumUrl": "https://www.dr-johanna-budwig.de/policies/legal-notice",
    "companyName": "Dr. Johanna Budwig GmbH",
    "decisionMakerName": "Franz Nowotny",
    "decisionMakerRole": "Geschäftsführer",
    "address": "An den Kolonaten 2-4, 26160 Bad Zwischenahn, DE",
    "addressStreet": "An den Kolonaten",
    "addressHouseNumber": "2-4",
    "addressPostalCode": "26160",
    "addressCity": "Bad Zwischenahn",
    "addressCountry": "DE",
    "phones": "+494413906300",
    "emails": "kontakt@dr-johanna-budwig.de",
    "registerCourt": "Amtsgericht Oldenburg",
    "registerNumber": "HRB209987",
    "taxId": "DE300469959",
    "socialFacebook": "https://www.facebook.com/Dr.Johanna.Budwig",
    "socialInstagram": "https://www.instagram.com/dr.johannabudwig",
    "socialLinkedin": null,
    "socialYoutube": "https://www.youtube.com/user/DrJohannaBudwig",
    "socialTiktok": "https://www.tiktok.com/@dr.johannabudwig",
    "socialX": null,
    "extractionMethod": "ai",
    "error": "",
    "fetchTime": "2026-10-04T08:37:53.938Z",
    "metaTitle": "Dr. Johanna Budwig",
    "metaDescription": "Dr. Johanna Budwig"
  }
]
```

***

### 📋 Output Fields Defined

Each output row contains clean, standardized data:

| Field Name | Type | Description | Example |
| :--- | :--- | :--- | :--- |
| `mainUrl` | Text | The exact website URL you entered. | `marley.de` |
| `impressumUrl` | Link | Direct URL to the detected Impressum page. | `https://marley.de/policies/legal-notice` |
| `companyName` | Text | Official legal company name. | `Marley Deutschland GmbH` |
| `decisionMakerName` | Text | Names of managing directors / owners. | `Stefan Ostertag, Christian Holland-Moritz` |
| `decisionMakerRole` | Text | Legal role label. | `Geschäftsführer` |
| `address` | Text | Full formatted address string. | `Adolf-Oesterheld-Str. 28, 31515 Wunstorf, DE` |
| `addressStreet` | Text | Street name only. | `Adolf-Oesterheld-Str.` |
| `addressHouseNumber` | Text | House / building number. | `28` |
| `addressPostalCode` | Text | 5-digit German/DACH postal code (PLZ). | `31515` |
| `addressCity` | Text | City or municipality. | `Wunstorf` |
| `addressCountry` | Text | 2-letter ISO country code. | `DE` |
| `phones` | Text | Phone numbers normalized to international format. | `+495031530` |
| `emails` | Text | Clean business email addresses. | `info@marley.de` |
| `registerCourt` | Text | Commercial court where the company is filed. | `Amtsgericht Hannover` |
| `registerNumber` | Text | Commercial registration number. | `HRB 110009` |
| `taxId` | Text | VAT identification number (*USt-IdNr.*). | `DE811119134` |
| `socialFacebook` | Link | Official Facebook profile / page URL. | `https://facebook.com/MarleyDeutschland` |
| `socialInstagram` | Link | Official Instagram profile URL. | `https://instagram.com/marley_deutschland` |
| `socialLinkedin` | Link | Official LinkedIn company profile URL. | `https://linkedin.com/company/marleydeutschland` |
| `socialX` | Link | Official X / Twitter profile URL. | `https://x.com/marley` |
| `socialXing` | Link | Official Xing profile / Kununu company page. | `https://xing.com/pages/marley` |
| `socialYoutube` | Link | Official YouTube channel URL. | `https://youtube.com/@MarleyDeutschland` |
| `socialTiktok` | Link | Official TikTok profile URL. | `https://tiktok.com/@marleydeutschland` |
| `socialWhatsapp` | Link | Official WhatsApp contact / chat link. | `https://wa.me/491701234567` |
| `socialTelegram` | Link | Official Telegram channel / chat link. | `https://t.me/marley` |
| `socialThreads` | Link | Official Threads profile URL. | `https://threads.net/@marley` |
| `socialPinterest` | Link | Official Pinterest profile URL. | `https://pinterest.com/marley` |
| `socialGithub` | Link | Official GitHub profile / organization URL. | `https://github.com/marley` |
| `socialDiscord` | Link | Official Discord invite link. | `https://discord.gg/example` |
| `socialBluesky` | Link | Official Bluesky profile URL. | `https://bsky.app/profile/marley.bsky.social` |
| `extractionMethod` | Text | Shows which engine produced the row: `ai` or `regex`. | `ai` |
| `metaTitle` | Text | Page title of the homepage. | `Marley Deutschland GmbH` |
| `metaDescription` | Text | Meta description tag of the website. | `Innovative Haustechnik und Dachentwässerung.` |
| `fetchTime` | Text | ISO timestamp when data was retrieved. | `2026-10-04T12:00:00.000Z` |
| `error` | Text | Error message if no Impressum was found. | `Impressum not found` |

***

### ❓ Frequently Asked Questions (FAQ)

##### What is the difference between this Actor and your fast Cheerio Actor?

- **This Actor (`german-imprint-scraper`):** Uses a full **headless browser (Playwright)**. It renders client-side JavaScript (React, Vue, Next.js, modern Shopify stores), scrolls to trigger lazy footers, handles shadow DOM and drawers, and offers optional AI parsing. It is slower but delivers **maximum completeness** on modern dynamic websites.
- **Fast Actor (`[german-impressum-scraper-fast](https://console.apify.com/actors/3hMKKq9OycbeUJ79G/info)`):** Uses lightweight HTTP requests (**Cheerio**). It is ultra-fast and cheaper, but cannot execute JavaScript. Perfect for large lists of simple static HTML websites.

##### Do I need my own Groq or OpenAI API key?

**No.** All AI API costs and token processing are included in the Pay-Per-Event price. Just check **Enable AI extraction** in the input and click Start.

##### What happens if the AI engine is temporarily unavailable?

The scraper will **automatically and silently fall back to the Regex engine** for that website. You will only be charged the **cheaper Regex event price ($0.007)**, never the AI price.

##### Am I charged if a website does not have an Impressum?

**No.** Websites that return 404, domains that do not resolve, or sites without an Impressum are recorded with `"error": "Impressum not found"` and are **completely free of extraction charges**.

##### How do I limit how much money a run can spend?

In the Apify Console, open your Actor run options and set a **Max cost (USD)**. Once that dollar limit is reached, the scraper stops gracefully and saves all results collected up to that point.

##### Can I export results to Excel or CSV?

Yes! Click on the **Dataset** tab of your finished run and export directly to **Excel (.xlsx)**, **CSV**, **JSON**, or connect via the **Apify API**, Make, Zapier, or n8n.

***

### ⚖️ Legal & GDPR Compliance

This Actor extracts exclusively **publicly available business information** published in compliance with §5 DDG (formerly §5 TMG) on German websites. All data is gathered for B2B intelligence, compliance auditing, and CRM enrichment.

***

### 🧑‍💻 Developer Info

- **Author:** `codescraper`
- **Contact:** `codescraper011@gmail.com`
- **Cheerio Scraper:** [German Imprint Scraper (Contact+Social Links)](https://console.apify.com/actors/3hMKKq9OycbeUJ79G/info)

# Actor input Schema

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

Add one website per line. Any format works: <code>marley.de</code>, <code>www.marley.de</code>, <code>https://www.marley.de</code>. The URL is shown in the results exactly as you entered it.

## `enableAi` (type: `boolean`):

Use AI to read the Impressum like a human for cleaner, more accurate results (names, roles, addresses). Only the Impressum part of the page is analysed. If the AI is unavailable, the scraper automatically falls back to Regex extraction and you are charged the cheaper Regex price.

## `aiModel` (type: `string`):

Model used when AI extraction is enabled. The default is the best balance of speed, accuracy and reliability for Impressum data.

## `socialPlatforms` (type: `array`):

Select the social media channels you want to extract. Both DACH platforms (Xing, Kununu) and international networks are supported.

## `excludeMainUrl` (type: `boolean`):

Remove the website URL you entered from the output.

## `excludeImpressumUrl` (type: `boolean`):

Remove the URL of the Impressum page from the output.

## `excludeAddress` (type: `boolean`):

Remove the full address and its parts (street, house number, postal code, city, country).

## `excludePhones` (type: `boolean`):

Remove phone numbers.

## `excludeEmails` (type: `boolean`):

Remove email addresses.

## `excludeDecisionMaker` (type: `boolean`):

Remove decision maker name and role (Geschäftsführer, Inhaber, Vorstand …).

## `excludeRegisterNumber` (type: `boolean`):

Remove the Handelsregister number (e.g. HRB 12345).

## `excludeRegisterCourt` (type: `boolean`):

Remove the register court (e.g. Amtsgericht München).

## `excludeTaxId` (type: `boolean`):

Remove the VAT ID (Umsatzsteuer-ID).

## `excludeSocial` (type: `boolean`):

Remove all extracted social media links completely.

## `excludeMeta` (type: `boolean`):

Remove the page meta title and meta description.

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

How many websites are processed at the same time. Leave the default unless you know what you are doing.

## `userAgent` (type: `string`):

Optional. Browser user-agent string used for requests.

## Actor input object example

```json
{
  "startUrls": [
    "marley.de",
    "https://www.dr-johanna-budwig.de/"
  ],
  "enableAi": false,
  "aiModel": "openai/gpt-oss-20b",
  "socialPlatforms": [
    "facebook",
    "instagram",
    "linkedin",
    "youtube",
    "tiktok",
    "x"
  ],
  "maxConcurrency": 40,
  "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
```

# Actor output Schema

## `impressumData` (type: `string`):

Main dataset containing company name, decision makers, address, phones, emails, register number, register court, tax ID and social links.

# 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": [
        "marley.de",
        "https://www.dr-johanna-budwig.de/"
    ],
    "socialPlatforms": [
        "facebook",
        "instagram",
        "linkedin",
        "youtube",
        "tiktok",
        "x"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("codescraper/german-imprint-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": [
        "marley.de",
        "https://www.dr-johanna-budwig.de/",
    ],
    "socialPlatforms": [
        "facebook",
        "instagram",
        "linkedin",
        "youtube",
        "tiktok",
        "x",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("codescraper/german-imprint-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": [
    "marley.de",
    "https://www.dr-johanna-budwig.de/"
  ],
  "socialPlatforms": [
    "facebook",
    "instagram",
    "linkedin",
    "youtube",
    "tiktok",
    "x"
  ]
}' |
apify call codescraper/german-imprint-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,codescraper/german-imprint-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/0yAZU0yPvGQLGuDXX/builds/nQcQizgAvbll6ej1F/openapi.json
