# German Impressum Scraper - Leads from DE, AT & CH Websites (`parseforge/german-impressum-scraper`) Actor

Extract Impressum data from German, Austrian and Swiss websites: directors, email, phone, address, HRB, VAT ID. Google search built in. CSV, Excel, JSON, XML.

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

## Pricing

from $3.00 / 1,000 impressum leads

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

![ParseForge Banner](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner-v4.webp)

## 🇩🇪 German Impressum Scraper

> 🚀 **Export B2B leads from German, Austrian and Swiss Impressum pages in seconds.** 39 fields per company: legal name, legal form, managing directors, email, phone in E.164, full address, Handelsregister number and court, VAT ID and social profiles. Start from a URL list or straight from Google.

Every business website in Germany, Austria and Switzerland has to publish an Impressum (legal notice) with the company's legal name, address, contact details, the people who represent it and its register entries. This Actor finds that page on each website, reads it, and returns the data as clean, structured rows. Give it your own website list, or type Google search terms such as `dachdecker köln` and it turns every organic result into a lead.

In a test on 95 websites found through Google across 12 trades and cities in all three countries, the Actor read a legal notice on 77 of them. On those 77 it returned a company name on 75, a street address on 76, an email on 68, a phone number on 67, a named managing director or owner on 51, a VAT ID on 50 and a commercial register number on 45. Every value is read from the page itself by a rule-based parser, with no AI guessing, so a name or number in your dataset is one the company published.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| B2B sales and outbound teams selling into DACH | Build lead lists with the managing director's name, email and phone |
| Lead generation and marketing agencies | Turn "trade + city" Google searches into ready-to-call prospect lists |
| CRM and data teams | Enrich a list of company websites with legal name, register number and VAT ID |
| Web agencies and legal-tech providers | Find sites whose Impressum still cites the repealed Telemediengesetz |
| KYC, compliance and procurement | Check a supplier's legal entity, register court and VAT ID from its own website |

### 📋 What the German Impressum Scraper does

- Opens each website, ranks its links and picks the Impressum page (Impressum, Imprint, Legal notice, Anbieterkennzeichnung, Offenlegung), then falls back to the usual paths and to the homepage itself for one-page sites.
- Reads the company name and legal form (GmbH, UG (haftungsbeschränkt), AG, SE, GmbH & Co. KG, e.K., GbR, PartG mbB, OG, Swiss AG and 20 more), the address, phone, fax and every email address.
- Names the people behind the company: managing directors, board members, owners, partners and the person responsible for content under § 18 MStV, with first name, last name, academic title and profession split out.
- Extracts register data for all three countries: Handelsregister (HRB, HRA, PR, GnR, VR) with the register court, the Austrian Firmenbuch number (FN), the Swiss UID (CHE), and VAT IDs (DE, ATU, CHE MWST).
- Searches Google Germany, Austria or Switzerland for your terms, pages through up to 100 results per term, and skips directories, marketplaces and portals so your list contains real companies.
- Decodes the ways sites hide emails from bots: `info (at) firma.de`, `[at]`/`[dot]`, Cloudflare email protection and TYPO3 encrypted mailto links.

> 💡 **Why it matters:** the Impressum is the one place where a German company must publish who runs it and how to reach them, by law. That makes it a better lead source than directory listings: the name on the row is the legally responsible person, and the address and register number are the company's own.

### 🎬 Full Demo (🚧 Coming soon)

### 📊 Output

| Field | Description |
|---|---|
| 🖼 `imageUrl` | Website preview image (og:image or icon) |
| 🏢 `companyName` / ⚖️ `legalForm` | Legal company name and the legal form read from it |
| 🌐 `website` / 🔤 `domain` / 📜 `imprintUrl` | Homepage, domain and the Impressum page that was read |
| 📧 `email` / 📨 `emails` / 📬 `emailMxValid` | Main email (company domain first), every email on the page, and whether the email domain has a mail server |
| 📞 `phone` / ☎️ `phoneE164` / 📠 `fax` | Phone as printed, phone in international E.164 format, fax |
| 🏠 `street` / 🔢 `postalCode` / 🏙️ `city` / 🇩🇪 `countryCode` / 📍 `fullAddress` | Postal address split into parts, country DE, AT or CH |
| 👤 `contactName` / 🙂 `contactFirstName` / 🪪 `contactLastName` / 🎓 `contactAcademicTitle` / 🧑‍💼 `contactRole` | The primary person: first managing director, board member, owner, partner or content responsible |
| 👥 `managingDirectors` | Every person named, each with fullName, firstName, lastName, salutation, academicTitle, profession and role |
| ✍️ `contentResponsible` | Person responsible for content under § 18 MStV |
| 🗂️ `registerType` / #️⃣ `registerNumber` / 🏛️ `registerCourt` | HRB, HRA, PR, GnR, VR (DE), FN (AT) or UID (CH), the number and the register court |
| 🧾 `vatId` | USt-IdNr., Austrian UID or Swiss MWST number |
| 🛡️ `supervisoryAuthority` / 🏫 `chamber` / 🎖️ `professionalTitle` | Regulated professions: supervisory authority, chamber and statutory professional title |
| 🪑 `supervisoryBoardChair` | Chair of the supervisory board (AG, SE, large GmbH) |
| 📘 `legalBasis` / 🕰️ `citesRepealedTmg` | The law the Impressum cites, and for German sites whether it still cites the Telemediengesetz that was replaced by the DDG in May 2024 |
| 🔗 `socialLinks` | LinkedIn company page, Xing, Facebook, Instagram, YouTube, X, TikTok and Pinterest |
| 🔎 `searchTerm` / 📥 `inputUrl` | The Google term that found the site, and the original input |
| 🕒 `scrapedAt` | When the row was collected |
| ❌ `error` | Always `null` on data rows |

Values a company does not publish come back as `Not Disclosed`; values that cannot apply (for example the TMG check on an Austrian site) are `N/A`. No field is ever `null` except `error`.

#### Sample records

A roofer found with the search term `dachdecker köln`:

```json
{
  "imageUrl": "https://plueck-bedachungen.de/assets/images/12-1-2000x1125.png",
  "companyName": "Kristian Plück Bedachungen GmbH",
  "legalForm": "GmbH",
  "website": "https://plueck-bedachungen.de/",
  "domain": "plueck-bedachungen.de",
  "imprintUrl": "https://plueck-bedachungen.de/impressum.html",
  "email": "info@plueck-bedachungen.de",
  "emailMxValid": "Yes",
  "emails": ["info@plueck-bedachungen.de"],
  "phone": "0221-7407779",
  "phoneE164": "+492217407779",
  "fax": "0221-9742306",
  "street": "Schmiedegasse 36",
  "postalCode": "50735",
  "city": "Köln",
  "countryCode": "DE",
  "fullAddress": "Schmiedegasse 36, 50735 Köln",
  "contactName": "Kristian Plück",
  "contactFirstName": "Kristian",
  "contactLastName": "Plück",
  "contactAcademicTitle": "Not Disclosed",
  "contactRole": "Owner",
  "contentResponsible": "Not Disclosed",
  "registerType": "HRB",
  "registerNumber": "HRB 106413",
  "registerCourt": "Amtsgericht Köln",
  "vatId": "DE344813864",
  "supervisoryAuthority": "Not Disclosed",
  "chamber": "Not Disclosed",
  "professionalTitle": "Not Disclosed",
  "supervisoryBoardChair": "Not Disclosed",
  "legalBasis": "Not Disclosed",
  "citesRepealedTmg": "Yes",
  "socialLinks": {
    "linkedin": "Not Disclosed",
    "xing": "Not Disclosed",
    "facebook": "https://www.facebook.com/people/Kristian-Plück-Bedachungen-GmbH/100070663999650",
    "instagram": "https://www.instagram.com/k.plueck_bedachungen_gmbh",
    "youtube": "Not Disclosed",
    "x": "Not Disclosed",
    "tiktok": "Not Disclosed",
    "pinterest": "Not Disclosed"
  },
  "managingDirectors": [
    {
      "fullName": "Kristian Plück",
      "firstName": "Kristian",
      "lastName": "Plück",
      "salutation": "Herr",
      "academicTitle": "Not Disclosed",
      "profession": "Not Disclosed",
      "role": "Owner"
    }
  ],
  "searchTerm": "dachdecker köln",
  "inputUrl": "https://plueck-bedachungen.de/",
  "scrapedAt": "2026-09-28T22:55:08.615Z",
  "error": null
}
```

A tax advisory partnership from a URL list (partnership register, § 5 DDG):

```json
{
  "companyName": "Senn und Partner Steuerberater",
  "website": "https://steuerberater-senn.de/",
  "imprintUrl": "https://steuerberater-senn.de/impressum",
  "email": "info@steuerberater-senn.de",
  "emailMxValid": "Yes",
  "phone": "+49 (0) 89 4 523 526 0",
  "phoneE164": "+498945235260",
  "fax": "+49 (0) 89 4 523 526 26",
  "fullAddress": "Sonnenstr. 19, Zugang 1, 80331 München",
  "countryCode": "DE",
  "contactName": "Thomas Senn",
  "contactRole": "Legal Representative",
  "registerType": "PR",
  "registerNumber": "PR 2170",
  "registerCourt": "Amtsgericht München",
  "vatId": "DE341245509",
  "legalBasis": "§ 5 DDG",
  "managingDirectors": [
    {
      "fullName": "Thomas Senn",
      "firstName": "Thomas",
      "lastName": "Senn",
      "salutation": "Not Disclosed",
      "academicTitle": "Not Disclosed",
      "profession": "Steuerberater",
      "role": "Legal Representative"
    }
  ]
}
```

An Austrian company with a Firmenbuch number and ATU VAT ID:

```json
{
  "companyName": "Gecheckt GmbH",
  "legalForm": "GmbH",
  "email": "info@gecheckt.at",
  "phoneE164": "+4314420067",
  "fullAddress": "Mariahilfer Straße 32, 1070 Wien",
  "countryCode": "AT",
  "contactName": "Jure Kodzoman",
  "registerType": "FN",
  "registerNumber": "FN 628985d",
  "registerCourt": "Handelsgericht Wien",
  "vatId": "ATU80839167",
  "citesRepealedTmg": "N/A"
}
```

The second and third samples are trimmed for readability; real rows carry all 39 fields.

### ✨ Why choose this Actor

- **Germany, Austria and Switzerland.** Handelsregister, Firmenbuch and Swiss UID numbers, DE, ATU and CHE MWST VAT IDs, and the Austrian "postcode, city, street" address format are all understood.
- **Google search built in, one flat price.** Type `steuerberater münchen` and get leads. There is no extra fee per Google page, per website visited or per email check: you pay per lead delivered.
- **The right company's data.** Impressum pages also list the chamber, the supervisory authority, the insurer and the web agency, each with their own address and phone. The Actor recognises those blocks and keeps them out of the company fields.
- **Every person, split and labelled.** First name, last name, academic title, profession and role for every managing director, board member, owner or partner, including names written inside sentences ("wird durch den Vorstand ... vertreten").
- **Ready for your dialer and CRM.** Phones in E.164, the address split into street, postcode and city, and a free MX check on each email domain.
- **No AI guessing.** A rule-based parser reads what the page says. When a value is not on the page you get `Not Disclosed`, never an invented one.

### 📈 How it compares to alternatives

| | This Actor | Typical Impressum scrapers |
|---|---|---|
| Countries | Germany, Austria, Switzerland | Germany |
| Lead discovery | Google search built in (DE, AT or CH market), directories skipped | URL list only, or search billed per results page |
| Billing | One event per lead delivered | Per website visited plus per result, plus search and validation fees |
| People | Every director, owner, board member and partner, with title, profession and role | One contact person, or names without roles |
| Register data | HRB/HRA/PR/GnR/VR + court, FN, CHE UID, VAT ID | Register number and VAT ID |
| Phone | As printed and in E.164 | As printed |
| Email check | Free MX lookup per domain | Paid add-on, or none |
| Extraction | Rule-based, values read from the page | Often LLM-based |

Ceiling of the public surface: the Actor reads what each website publishes over plain HTTP. On a realistic mix of Google results it reads a legal notice on about 8 of 10 websites. The rest are sites that only render their Impressum with JavaScript, block automated visitors, or have no Impressum at all; they are listed in the run's `FAILED_WEBSITES` record and are never charged. Google returns at most 100 results per search term, so for large lists combine a trade with many cities. Deliverability of a mailbox is not verified: `emailMxValid` tells you whether the email's domain can receive mail at all.

### 🚀 How to use

1. [Create a free Apify account](https://console.apify.com/sign-up?fpr=vmoqkp) and get $5 of free monthly usage credit.
2. Open the German Impressum Scraper page and click **Try for free**.
3. Paste your websites into **Websites**, or type one or more **Google search terms** such as `zahnarzt berlin`.
4. Pick the **Google country**, set **Max Items**, and click **Start**.
5. Download the leads as CSV, Excel, JSON or XML, or pull them through the API.

Example: 500 roofing companies in Cologne and Düsseldorf that publish an email address.

```json
{
  "searchTerms": ["dachdecker köln", "dachdecker düsseldorf", "bedachungen köln"],
  "googleCountry": "de",
  "resultsPerSearchTerm": 100,
  "onlyWithEmail": true,
  "maxItems": 500
}
```

### 💼 Business use cases

#### Outbound sales into DACH

Search `"<your target trade> <city>"` for every city in your territory, keep `onlyWithEmail` on, and import `contactFirstName`, `contactLastName`, `email` and `phoneE164` straight into your sequencer. The contact is the managing director or owner, the person who signs.

#### CRM enrichment

Run your existing account list of websites through the Actor to add the legal entity name, legal form, register number, register court and VAT ID, then match accounts to the commercial register or your ERP by `registerNumber`.

#### Agency prospecting

Web and legal-tech agencies can filter `citesRepealedTmg = Yes` to find German companies whose Impressum still cites the Telemediengesetz, a concrete reason to reach out about a website update.

#### Supplier and partner checks

Before onboarding a supplier, confirm from its own website the legal entity, who represents it, where it is registered and its VAT ID, and keep the `imprintUrl` as your source.

### 🔌 Automating German Impressum Scraper

- **Make / Zapier:** run the Actor on a schedule and send new leads to HubSpot, Pipedrive, Salesforce or Google Sheets.
- **Slack:** post a message with each run's new companies for your sales channel.
- **Airbyte:** load the dataset into your warehouse and join it with your CRM.
- **GitHub Actions:** call the Apify API from a workflow to refresh a lead file every week.
- **Google Drive:** export every run as an Excel file into a shared folder.

### 🌟 Beyond business use cases

- **Research:** study the legal forms, register courts and professional regulation of small businesses across a region.
- **Personal:** check who really runs an online shop before you buy from it.
- **Non-profit:** build contact lists of associations (e.V.) and cooperatives (eG) in your city.
- **Experimentation:** compare how many companies in a trade still cite the old TMG, or how often the Impressum names a content responsible person.

### 🤖 Ask an AI assistant about this scraper

> I want B2B leads from German company websites. Look at the German Impressum Scraper on the ParseForge Apify page and tell me how to configure a run that finds tax advisors in Munich, Augsburg and Nuremberg through Google, keeps only companies with an email, and exports the managing director's name, email and phone to a CSV for my CRM.

### ❓ Frequently Asked Questions

#### 🌍 Which countries does it cover?

Germany, Austria and Switzerland. The parser understands the German Handelsregister, the Austrian Firmenbuch and the Swiss UID, and the Google search can target google.de, google.at or google.ch.

#### 🔗 What do I paste as input?

A homepage is enough, with or without `https://`. The Actor finds the Impressum link by itself. A direct Impressum URL works too.

#### 🔎 How does the Google search work?

Each search term is run on the Google market you pick, and the Actor visits every organic result, up to 100 per term. Directories, marketplaces, social networks, city portals and government sites are skipped by default, and every domain is visited only once per run.

#### 👤 Who is the contact person?

The first person the Impressum names as managing director, board member, owner or partner. If none is named, the person responsible for content. All people found are in `managingDirectors` with their role.

#### 📧 Are the emails verified?

Each email domain gets a free MX lookup, reported in `emailMxValid`. That tells you whether the domain can receive mail at all. Individual mailboxes are not tested.

#### 🤖 Does it use AI?

No. The data is read from the page by rules written for German, Austrian and Swiss legal notices, so every value is one the company published. When something is not on the page, the field says `Not Disclosed`.

#### ❓ Why did some websites return nothing?

Some sites load their Impressum only with JavaScript, block automated visitors, or do not have one. Those websites are listed with the reason in the key-value store record `FAILED_WEBSITES`. Switch on **Add websites without an Impressum to the dataset** to get them as rows too. They are never charged.

#### 🕰️ What is `citesRepealedTmg`?

Since 14 May 2024 the German Impressum duty is in § 5 of the Digitale-Dienste-Gesetz (DDG), which replaced the Telemediengesetz (TMG). `Yes` means the page still cites the TMG, a sign it has not been updated.

#### 🛡 Do I need a proxy?

Usually not: company websites answer plain requests, and the proxy is off by default. Switch it on if many sites in your list block the run.

#### ⚡ How fast is it?

It reads 10 websites in parallel by default (up to 50). A typical website takes 1 to 5 seconds, so 1,000 leads usually take a few minutes.

#### 💳 How am I charged?

Per lead delivered. Websites without a readable Impressum, rows dropped by **Only leads with an email address**, Google searches and email checks are free.

#### 🔒 Is this legal?

The Impressum is published because the law requires it, so the data is public. How you contact people is up to you: follow the GDPR and the German UWG rules on advertising by email and phone.

### 🔌 Integrate with any app

The dataset is available through the Apify API and every Apify integration: Google Sheets, Make, Zapier, Airbyte, Slack, webhooks, and the Apify SDKs for JavaScript and Python.

### 🔗 Recommended Actors

- [Website Contact & Leads Scraper](https://apify.com/parseforge/website-contact-leads-scraper) for emails and phones from websites in any country.
- [Contact Scraper](https://apify.com/parseforge/contact-info-scraper) for emails, phones, social profiles and addresses from any page.
- [Google Maps Contacts Scraper](https://apify.com/parseforge/google-maps-contacts-scraper) for local businesses found on Google Maps.
- [LinkedIn Company Scraper](https://apify.com/parseforge/linkedin-company-profiles-scraper) to add company size and industry to your leads.
- [XING Jobs Scraper](https://apify.com/parseforge/xing-scraper) to find German companies that are hiring.

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge).

**🆘 Need Help?** [Open our contact form](https://tally.so/r/BzdKgA)

> **⚠️ Disclaimer:** this is an independent tool and is not affiliated with, endorsed by, or connected to Google or any company whose website you scrape. It collects only publicly available data.

# Actor input Schema

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

Websites to read the Impressum from. A homepage is enough (the Actor finds the Impressum link itself), and a direct Impressum URL works too. Paste a list or upload a file with one URL per line.

## `searchTerms` (type: `array`):

Find websites through Google instead of (or on top of) a URL list. One query per entry, for example 'steuerberater münchen' or 'dachdecker köln'. Every organic result is visited and its Impressum read.

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

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000

## `googleCountry` (type: `string`):

Which Google market to search. Germany, Austria and Switzerland return different local websites for the same query.

## `resultsPerSearchTerm` (type: `integer`):

How many organic Google results to visit per search term (Google serves 10 per page, 100 at most).

## `skipDirectories` (type: `boolean`):

Skip business directories, marketplaces, social networks, city portals and government sites that show up in Google (Gelbe Seiten, Das Örtliche, Jameda, Wikipedia and similar). Their Impressum describes the portal, not a lead.

## `excludeDomains` (type: `array`):

Domains you never want in the results, for example existing customers or competitors (example.de).

## `onlyWithEmail` (type: `boolean`):

Drop companies whose Impressum shows no email address. Dropped rows are never charged.

## `checkEmailMx` (type: `boolean`):

Look up the MX record of each email domain and report in emailMxValid whether the domain can receive mail at all. Free, and adds well under a second per lead.

## `includeFailedWebsites` (type: `boolean`):

Also write one row per website that could not be read (unreachable, blocked, no Impressum), with the reason in the error column. These rows are never charged. They are always listed in the key-value store record FAILED\_WEBSITES either way.

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

How many websites are read at the same time.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for each page before giving up on it.

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

Most company websites answer without a proxy. Switch one on if many websites block the run.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://steuerberater-senn.de"
    },
    {
      "url": "https://www.werk8.de"
    },
    {
      "url": "https://www.von-poll.com"
    },
    {
      "url": "https://www.gecheckt.at"
    },
    {
      "url": "https://avanova.ch"
    },
    {
      "url": "https://www.motel-one.com"
    }
  ],
  "searchTerms": [
    "steuerberater münchen"
  ],
  "maxItems": 10,
  "googleCountry": "de",
  "resultsPerSearchTerm": 30,
  "skipDirectories": true,
  "onlyWithEmail": false,
  "checkEmailMx": true,
  "includeFailedWebsites": false,
  "maxConcurrency": 10,
  "requestTimeoutSecs": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Key lead fields

## `fullData` (type: `string`):

Complete dataset with all 39 fields

# 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://steuerberater-senn.de"
        },
        {
            "url": "https://www.werk8.de"
        },
        {
            "url": "https://www.von-poll.com"
        },
        {
            "url": "https://www.gecheckt.at"
        },
        {
            "url": "https://avanova.ch"
        },
        {
            "url": "https://www.motel-one.com"
        }
    ],
    "searchTerms": [
        "steuerberater münchen"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/german-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 = {
    "startUrls": [
        { "url": "https://steuerberater-senn.de" },
        { "url": "https://www.werk8.de" },
        { "url": "https://www.von-poll.com" },
        { "url": "https://www.gecheckt.at" },
        { "url": "https://avanova.ch" },
        { "url": "https://www.motel-one.com" },
    ],
    "searchTerms": ["steuerberater münchen"],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/german-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 '{
  "startUrls": [
    {
      "url": "https://steuerberater-senn.de"
    },
    {
      "url": "https://www.werk8.de"
    },
    {
      "url": "https://www.von-poll.com"
    },
    {
      "url": "https://www.gecheckt.at"
    },
    {
      "url": "https://avanova.ch"
    },
    {
      "url": "https://www.motel-one.com"
    }
  ],
  "searchTerms": [
    "steuerberater münchen"
  ],
  "maxItems": 10
}' |
apify call parseforge/german-impressum-scraper --silent --output-dataset

```

## MCP server setup

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