✨ German Imprint Scraper & Leads Finder (Google Search) avatar

✨ German Imprint Scraper & Leads Finder (Google Search)

Pricing

from $3.00 / 1,000 successful data extractions

Go to Apify Store
✨ German Imprint Scraper & Leads Finder (Google Search)

✨ German Imprint Scraper & Leads Finder (Google Search)

AI-powered Apify Actor that scrapes Impressum pages on German websites and extracts decision-makers (Geschäftsführer, Vorstand), validated B2B emails, company addresses, VAT IDs, and Handelsregister numbers. Structured JSON output for B2B lead generation, sales prospecting, and CRM enrichment.

Pricing

from $3.00 / 1,000 successful data extractions

Rating

5.0

(3)

Developer

Winning Solutions

Winning Solutions

Maintained by Community

Actor stats

6

Bookmarked

133

Total users

26

Monthly active users

17 hours

Issues response

19 hours ago

Last modified

Share

German Impressum Scraper & Leads Finder – Decision Makers, Email Verification & Company Data

An AI-powered Apify Actor that finds and scrapes German website Impressum pages to extract contact details at scale. Start from your own URL list or simply enter Google search terms - the built-in Lead Finder turns queries like marketing agency berlin into ready-to-scrape leads automatically.

It detects imprint links, navigates pages reliably, and returns structured JSON with company name, all decision-makers (Geschäftsführer, Vorstand, Inhaber, ...), address, phone, email (with optional validation), VAT ID, and Handelsregister numbers.

Designed for lead generation, CRM enrichment, and compliance workflows, the scraper ensures high data accuracy through intelligent page detection, robust parsing logic, and optional email validation. It supports batch processing, handles edge cases like non-standard layouts, and includes retry mechanisms for scalable data extraction.

🚀 New in version 2.0: Lead Finder

No URL list? No problem.

Just type Google search terms like marketing agency berlin or steuerberater münchen and the Actor turns them into ready-to-use leads. It pulls the organic Google results for each query, visits every website, and extracts the full Impressum contact data automatically - from keyword to verified B2B lead in a single run.

Use Cases

  • Generate B2B leads with verified contact data
  • Enrich your CRM with German company information
  • Build outreach lists with validated emails
  • Run market and competitor research
  • Automate data collection workflows

Index

Release Notes

v2.2.1 - fixed an issue where the actor could time-out

v2.2 - All decision makers extracted

  • New decision_makers array — every responsible person found in the imprint (Geschäftsführer, Gesellschafter, Vorstand, Vertretungsberechtigte, Inhaber, Ansprechpartner, ...) is now returned as a structured array. Each entry contains first_name, last_name, salutation, academic_title (e.g. Dr., Prof. Dr.), profession (e.g. Steuerberater, Rechtsanwalt), and roles (array of section headings that person appears under).
  • Backward compatible — the existing singular contact_person field is unchanged and always contains the highest-priority person (Geschäftsführer → Verantwortlicher → Ansprechpartner → Inhaber).
  • New disableDecisionMakers input flag — set to true to omit the decision_makers array from output rows.
  • New All Decision Makers dataset view — shows the full array per company in the Apify Console.

v2.1 - Domain blacklist for lead discovery

  • Domain blacklist — new domainBlacklist input field (comma-separated domains) for Google Search lead discovery mode; matching discovered URLs are still charged (website-processed) but not scraped or written to the dataset
  • Lead discovery via Google Search — new inputMode: searchTerms mode to discover URLs from Google queries, then scrape their imprints automatically
  • New input fieldssearchTerms, resultsPerSearchTerm, locationName, languageCode, device
  • New output fieldsearch_term on every row (null when using Target URLs mode)
  • New pay-per-eventserp-search-page at $0.005 per SERP page ($5.00 / 1,000 pages, approximately 10 results per page)

v1.3 - API and MCP readiness

  • API and MCP usage guide - new README section with copyable curl, apify-client (JavaScript), and Apify MCP examples
  • Improved schema descriptions - input, output, and dataset descriptions sharpened for programmatic and AI tool callers; no field names or runtime behavior changed

v1.2 - Faster processing & smarter AI analysis

  • Improved parallel processing - Actor is now 50% faster
  • Improved imprint analysis with fallbacks - LLM is always used for the best result
  • Added "PerformanceMax" option - for faster processing (requires at least 2 GB RAM)
  • Improved log formatting
  • **imprint_url is null when not found** - if the imprint URL is not found, it will now show as null
  • New imprint_status field - indicates the outcome of imprint URL discovery (FOUND, NOT_FOUND, FETCH_ERROR, URL_ERROR, ERROR, UNKNOWN)

v1.1 - Bug fixes & reliability improvements

  • Reliability fixes - graceful charge-limit handling under concurrency, input-schema cleanup, and several scraper edge-case fixes
  • Improved AI analysis reliability - more robust handling of LLM responses with multi-provider fallback
  • Slimmer Build image - faster cold starts and smaller pulls

🎉 v1.0 - Initial public release

  • AI-powered imprint detection - finds Impressum links even when traditional parsing fails
  • Intelligent scraping engine - automatically switches between a lightweight fast mode and a full browser mode depending on the website's complexity
  • Comprehensive email validation - syntax, MX records, disposable filter, role-based detection, alias resolution, typo suggestions and live status tracking
  • Per-field privacy toggles - disable any output field you don't need (e.g. disableEmail, disableVatId)
  • Pay-per-event pricing - only pay for processed websites and (optionally) validated emails

Instead of providing URLs manually, you can let the Actor discover leads automatically via Google Search. Set Input Mode to Google Search Terms and enter one search query per line (e.g. zahnarzt berlin, rechtsanwalt münchen). The Actor fetches organic Google results for each term and scrapes the imprint of every discovered website.

Each SERP page returned (approximately 10 organic results per page) is billed as one Google SERP page (Lead Discovery) pay-per-event charge of $0.005 per page ($5.00 / 1,000 pages) on top of the usual imprint-scraping fees.

Features

🤖 AI-Powered Link Detection: Uses AI to find imprint page links when traditional parsing fails

🧠 Smart Contact Extraction: Extracts comprehensive contact and company information

🇩🇪 German Website Optimization: Specifically optimized for German website structures and imprint pages

🛡️ Robust Error Handling: Built-in retry mechanisms and comprehensive error handling

📊 Detailed Output: Structured data with contact person, company details, and legal information

🌐 Proxy Support: Optional proxy configuration for enhanced reliability

Advanced Email Validation

When enabled, the Actor performs comprehensive email validation using multiple verification methods:

  • Syntax validation - Ensures proper email format
  • Domain existence check - Verifies the domain is active and reachable
  • MX record validation - Confirms the domain can receive emails
  • Disposable email detection - Filters out temporary/disposable email addresses
  • Role-based email detection - Identifies generic addresses (info@, admin@, etc.)
  • Email alias detection - Detects aliases for major providers (Gmail, Yahoo, Outlook/Hotmail)
  • Typo suggestions - Provides corrections for common email typos
  • Real-time monitoring - Live validation status tracking

This ensures you only get high-quality, deliverable email addresses for your lead generation campaigns.

Pricing

Cost itemRate
Successful data extraction$4.50 / 1,000 results
Website processing fee$0.60 / 1,000 websites
Email validation service$2.50 / 1,000 validations
Google SERP page (Lead Discovery)$5.00 / 1,000 SERP pages (~10 results each)
Actor start$0.04 (infrequent)
Apify platform compute (RAM/time)Billed by Apify platform pricing

Cost per lead: ~$0.005 - stays constant regardless of run size.

Email validation is billed separately at $0.0025 per validated address when validateEmail is enabled.

Cost Examples

Scenario A: 100 URLs, ~90 successful imprints

  • Actor start: $0.04
  • 100 websites processed: $0.06
  • 90 successful results: $0.41
  • Total: ~$0.51

Scenario B: 500 URLs, ~430 successful imprints

  • Actor start: $0.04
  • 500 websites processed: $0.30
  • 430 successful results: $1.94
  • Total: ~$2.28

Scenario C: Lead Discovery, 50 search terms (10 results each), ~350 successful imprints

  • Actor start: $0.04
  • 50 SERP pages: $0.25
  • ~500 websites processed: $0.30
  • 350 successful results: $1.58
  • Total: ~$2.17

Input

The Actor accepts the following input parameters (see the Input tab in the Apify Console for the full, interactive schema):

ParameterTypeRequiredDefaultDescription
inputModestringnourlsInput mode: urls (Target URLs) or searchTerms (Google Search lead discovery).
targetUrlsarraywhen inputMode=urlsArray of { "url": "..." } objects. Invalid URLs are skipped and reported as input warnings.
searchTermsstringwhen inputMode=searchTermsOne Google query per line. Used only in searchTerms mode.
resultsPerSearchTermintegerno10Organic results to fetch per search term (1–100).
locationNamestringnoGermanyRegion for Google search results. Enter a country or city spelled out in full, e.g. Germany or Berlin.
languageCodestringnodeISO language code for Google results.
devicestringnodesktopDevice for SERP requests: desktop or mobile.
domainBlackliststringnoComma-separated domains to exclude from output in searchTerms mode. Matching URLs are still charged but not written to the dataset. Ignored when inputMode is urls.
skipResultsWithoutEmailbooleannofalseWhen enabled, results without an email address are not written to the dataset.
maxRetriesintegerno3Maximum retry attempts for failed requests (0–10).
timeoutintegerno5Per-request timeout in seconds (5–60).
validateEmailbooleannofalseEnable email validation; extra usage fees apply when on.
proxyConfigurationobjectnoApify Proxy or custom proxy URLs (useApifyProxy, optional proxyUrls, groups, countryCode).
performanceMaxbooleannofalseHigher parallelism; use only with at least 2 GB Actor memory.
disableImprintUrlbooleannofalseOmit imprint_url and imprint_status from each row.
disableContactPersonbooleannofalseOmit contact_person from each row.
disableDecisionMakersbooleannofalseOmit decision_makers array from each row. Does not affect contact_person.
disableCompanyNamebooleannofalseOmit company_name from each row.
disableCompanyAddressbooleannofalseOmit company_address from each row.
disablePhoneNumberbooleannofalseOmit phone_number from each row.
disableEmailbooleannofalseOmit email and email_status from each row.
disableRegisterNumberbooleannofalseOmit register_number from each row.
disableVatIdbooleannofalseOmit vat_id from each row.
useHeadlessBrowserbooleannofalseNot shown in Console. If true, force browser-based scraping for all URLs.
enableAxiosRetrybooleannotrueNot shown in Console. If true, axios-first scraping with browser fallback.
retryOptionsobjectnoNot shown in Console. Retry trigger criteria for axios-first mode (requireEmail, requireContactPerson, requireAnyField, minFieldsRequired).

Input Example (Target URLs)

{
"inputMode": "urls",
"targetUrls": [
{"url": "https://example.de"},
{"url": "https://another-site.de"}
],
"skipResultsWithoutEmail": false,
"maxRetries": 1,
"timeout": 5,
"validateEmail": true,
"proxyConfiguration": {
"useApifyProxy": false
}
}

Input Example (Lead Discovery)

{
"inputMode": "searchTerms",
"searchTerms": "zahnarzt berlin\nrechtsanwalt münchen",
"resultsPerSearchTerm": 10,
"locationName": "Germany",
"languageCode": "de",
"device": "desktop",
"validateEmail": false
}

API and MCP usage

Runs write dataset rows for each valid input URL that reaches processing. Every row includes target_url for deterministic input-output mapping. The Actor does not write a separate key-value OUTPUT record. Fetch rows from the default dataset after the run succeeds (or use the synchronous endpoint below).

REST (sync, returns dataset items): replace YOUR_USERNAME, YOUR_API_TOKEN, and use the same JSON body as in Input Example.

curl "https://api.apify.com/v2/acts/YOUR_USERNAME~german-imprint-scraper/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
-X POST \
-H "Content-Type: application/json" \
-d '{"targetUrls":[{"url":"https://www.winning-solutions.de"}],"validateEmail":false}'

JavaScript (apify-client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const input = {
targetUrls: [{ url: 'https://www.winning-solutions.de' }],
validateEmail: false,
};
const run = await client.actor('YOUR_USERNAME~german-imprint-scraper').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Apify MCP server (AI agents): configure your MCP client with URL https://mcp.apify.com?tools=YOUR_USERNAME~german-imprint-scraper (you can combine multiple tools per Apify MCP docs). Pass the API token via your client (for example an Authorization: Bearer ... header), not inside the Actor input JSON.

Output Structure

The Actor returns structured data for each processed URL. The table below lists the main fields. Optional dataset views in the Apify Console may show a subset or flattened columns. When disable options are enabled, the corresponding keys are omitted from each row.

FieldTypeDescriptionExample Value
search_termstringnullGoogle query that surfaced this URL; null in Target URLs mode
target_urlstringOriginal input URL that produced this row"https://example.de"
imprint_urlstringFound impressum page URL, null when not found or an error occurred"https://example.de/impressum"
imprint_statusstringResult of imprint URL discovery: FOUND, NOT_FOUND, FETCH_ERROR, URL_ERROR, ERROR, or UNKNOWN"FOUND"
contact_person.first_namestringFirst name of the primary contact (backward compatible, always present)"Max"
contact_person.last_namestringLast name of the primary contact"Mustermann"
contact_person.salutationstringSalutation (Herr/Frau)"Herr"
decision_makersarrayAll responsible persons found in the imprint. Each entry has first_name, last_name, salutation, academic_title (e.g. "Dr."), profession (e.g. "Steuerberater"), and roles (array, e.g. ["Geschäftsführer", "Gesellschafter"]).see below
company_namestringFull official company name"Example GmbH"
company_address.streetstringStreet name"Musterstraße"
company_address.house_numberstringHouse number"123"
company_address.postalcodestringPostal code"12345"
company_address.citystringCity name"Musterstadt"
phone_numberstringContact phone number"+49 123 456789"
emailstringContact email address"info@example.de"
email_statusstringWith validation: DELIVERABLE, UNDELIVERABLE, UNKNOWN, or MISSING_EMAIL if no email was found"DELIVERABLE"
register_numberstringCommercial register number / Handelsregisternummer"HRB 12345"
vat_idstringVAT ID number / Umsatzsteuer-Id"DE123456789"
retryTriggeredbooleanWhether retry was triggered during scrapingfalse
retryReasonsarrayArray of reasons why retry was triggered (optional)["email is empty"]
_metadata.websiteProcessedbooleanWhether the website was successfully processedtrue
_metadata.resultChargedbooleanWhether this result was chargedtrue
_metadata.emailValidatedbooleanWhether email validation was performedtrue
_metadata.limitReachedbooleanWhether usage limit was reachedfalse
_metadata.errorstringPresent when the row records a top-level run failure(varies)
_metadata.errorContextmixedExtra debugging context when error is set(varies)

Output Example

{
"search_term": "steuerberater münchen",
"target_url": "https://example.de",
"imprint_url": "https://example.de/impressum",
"imprint_status": "FOUND",
"contact_person": {
"first_name": "Felix",
"last_name": "Keß",
"salutation": "Herr"
},
"decision_makers": [
{
"first_name": "Felix",
"last_name": "Keß",
"salutation": "Herr",
"academic_title": "",
"profession": "Steuerberater",
"roles": ["Vertretungsberechtigter", "Gesellschafter"]
},
{
"first_name": "Marcus",
"last_name": "Stein",
"salutation": "Herr",
"academic_title": "Dr.",
"profession": "Steuerberater",
"roles": ["Vertretungsberechtigter", "Gesellschafter"]
},
{
"first_name": "Jutta",
"last_name": "Keß",
"salutation": "Frau",
"academic_title": "",
"profession": "Steuerberaterin",
"roles": ["Gesellschafterin"]
}
],
"company_name": "Keß & Partner Steuerberatungsgesellschaft mbB",
"company_address": {
"street": "Musterstraße",
"house_number": "123",
"postalcode": "80331",
"city": "München"
},
"phone_number": "+49 89 123456",
"email": "info@example.de",
"email_status": "DELIVERABLE",
"register_number": "HRB 12345",
"vat_id": "DE123456789",
"retryTriggered": false,
"retryReasons": [],
"_metadata": {
"websiteProcessed": true,
"resultCharged": true,
"emailValidated": true,
"limitReached": false
}
}