German Website Impressum Scraper
Pricing
from $2.78 / 1,000 lead extracteds
German Website Impressum Scraper
Find public Impressum pages on supplied German business websites and extract legal company, address, contact, VAT, register, and representative records with source evidence.
Pricing
from $2.78 / 1,000 lead extracteds
Rating
0.0
(0)
Developer
Automation Lab
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
a month ago
Last modified
Categories
Share
Turn a list of public German company websites into evidence-backed legal and contact records. The Actor finds each site's statutory Impressum, then extracts the legal company name, address, public email and phone, VAT ID, commercial register details, representatives, and short source excerpts.
It is designed for recurring B2B lead enrichment, CRM cleanup, supplier research, and compliance triage where a homepage alone does not provide the legal entity behind a brand. You provide the websites; the Actor performs bounded same-site discovery and returns one typed result row per unique input URL.
What does this German website scraper do?
For every submitted homepage or direct legal-notice URL, the Actor:
- validates that the target is a public HTTP or HTTPS URL;
- downloads the supplied page as lightweight HTML;
- follows a same-host link labelled
Impressum,Imprint, orAnbieterkennzeichnung; - tries a bounded set of conventional Impressum paths when no link is available;
- detects statutory German legal labels;
- extracts normalized lead fields and source evidence;
- records every URL checked and a clear
found,not_found, orerroroutcome.
Direct Impressum URLs are supported too. A recognized legal page returns immediately, without probing additional paths. Discovery can continue past unavailable candidate pages within the same total page budget.
Who is it for?
- Sales operations teams enriching a domain list before account assignment.
- Revenue operations teams matching brands to their legal entities in a CRM.
- Procurement teams collecting displayed supplier identity and register evidence.
- Market researchers building structured samples of German business websites.
- Compliance analysts triaging public legal-notice coverage before manual review.
- Data engineers feeding recurring website enrichment into a warehouse or spreadsheet.
The Actor does not discover companies from Google or another directory. It processes the public website URLs that you supply.
Why use structured Impressum records?
German legal notices often contain fields that are absent from a homepage or contact page:
- the exact legal entity rather than only a trading brand;
- a registered or service address;
- managing directors or board representatives;
- VAT identification and commercial register numbers;
- a register court;
- editorial responsibility details;
- direct evidence from the source page.
Unlike a generic contact extractor, this Actor keeps the located Impressum URL, checked-page trail, processing status, and bounded evidence excerpts next to the extracted values. That makes downstream review and refresh workflows easier.
What data can I extract?
| Field | Meaning |
|---|---|
inputUrl | Original normalized website or Impressum URL |
inputDomain | Hostname from the input |
resolvedDomain | Hostname after redirects |
status | found, not_found, or error |
imprintUrl | Located public legal-notice URL |
companyName | Displayed legal company or organization name |
legalForm | Detected form such as GmbH, AG, KG, SE, or e.V. |
address | Displayed legal or registered address text |
emails | Public email addresses on the legal page |
phoneNumbers | Public phone numbers on the legal page |
vatId | Displayed German VAT ID |
registrationCourt | Register or local court text |
registrationNumber | HRB or HRA number |
representatives | Managing directors, board members, or representatives |
responsiblePerson | Editorially responsible person when displayed |
sourceEvidence | Short legal-label excerpts supporting the fields |
pagesChecked | Pages visited during bounded discovery |
httpStatus | Last relevant HTTP status |
errorMessage | Bounded failure diagnostic |
scrapedAt | ISO 8601 extraction timestamp |
Website markup varies. Any unavailable extracted field is returned as null or an empty
array rather than being invented.
How to run the German Website Impressum Scraper
- Open the Actor in Apify Console.
- Add one or more company homepages or direct Impressum URLs to Company website URLs.
- Keep Maximum pages per website at
6for normal discovery. - Set Maximum websites to cap the batch.
- Click Start.
- Open the Impressum leads dataset view or export it as JSON, CSV, Excel, XML, or RSS.
A useful first input is:
{"startUrls": [{ "url": "https://www.bosch.de/" },{ "url": "https://www.sap.com/germany/about/legal/impressum.html" }],"maxItems": 2,"maxPagesPerWebsite": 6,"maxConcurrency": 2}
Input parameters
startUrls (required)
A list of public HTTP or HTTPS URLs. Values may be homepages or direct Impressum pages. Private-network, localhost, credential-bearing, and unsupported-protocol URLs are rejected. Duplicate normalized URLs are processed once.
maxItems
Maximum unique input URLs processed in the run. Default: 100. Range: 1 to 1000.
The limit is applied before requests are scheduled.
maxPagesPerWebsite
Maximum total distinct URL attempts per website, including the supplied page and failed
candidate fetches. At 1, only the supplied page is attempted. Bounded transient retries
of the same URL and HTTP redirects do not consume additional URL slots.
Default: 6. Range: 1 to 15.
maxConcurrency
Maximum websites processed at once. Default: 5. Range: 1 to 15. Reduce this for
small or rate-sensitive sites.
requestTimeoutSecs
Per-page HTTP timeout. Default: 20 seconds. Range: 5 to 60 seconds. Transient network
and selected temporary HTTP failures receive bounded retries.
Output example
A Bosch direct-page run checked on 4 October 2026 returned this shape (evidence shortened; public page content can change):
{"inputUrl": "https://www.bosch.de/impressum/","inputDomain": "bosch.de","resolvedDomain": "bosch.de","status": "found","imprintUrl": "https://www.bosch.de/impressum/?prevent-auto-open-privacy-settings=1","companyName": "Robert Bosch GmbH","legalForm": "GmbH","address": "Robert-Bosch-Platz 1, 70839 Gerlingen-Schillerhöhe","emails": ["kontakt@bosch.de"],"phoneNumbers": ["+49 711 400 40990"],"vatId": "DE811128135","registrationCourt": "Registergericht: Amtsgericht Stuttgart","registrationNumber": "HRB 14000","representatives": ["Dr. Christian Fischer", "Dr. Markus Forschner", "Stefan Grosch", "Dr. Markus Heyn", "Dr. Frank Meyer", "Katja von Raven", "Dr. Tanja Rückert"],"responsiblePerson": "Dr. Michael Schmidtke","sourceEvidence": ["Registergericht: Amtsgericht Stuttgart HRB 14000 ..."],"pagesChecked": ["https://www.bosch.de/impressum/"],"httpStatus": 200,"errorMessage": null,"scrapedAt": "2026-10-04T10:39:36.636Z"}
The dataset retains diagnostic outcome rows so batch integrations can reconcile every
submitted URL. Only a successfully located legal record triggers the lead billing event.
How much does it cost to extract German website Impressum leads?
The Actor uses pay-per-event pricing:
startevent:$0.005once per run.leadevent: applies once for each successfully located and extracted Impressum record.- Diagnostic outcome rows do not trigger the
leadevent.
Current per-lead prices decrease by Apify plan:
| Plan | Price per found lead |
|---|---|
| FREE | $0.005336 |
| BRONZE | $0.00464 |
| SILVER | $0.0036192 |
| GOLD | $0.002784 |
| PLATINUM | $0.001856 |
| DIAMOND | $0.0012992 |
At BRONZE pricing, a run with 10 found Impressum leads costs about $0.0514; 100 found leads
cost about $0.469; and 1,000 found leads cost about $4.645. Batches with fewer extracted
records trigger fewer lead events. Apify compute usage is billed under the user's
platform plan.
Bulk lead-enrichment workflow
For a recurring CRM process:
- export domains missing legal-entity fields from the CRM;
- map them into
startUrls; - schedule the Actor daily, weekly, or monthly;
- join rows back on
inputDomain; - accept
foundfields into a staging table; - route
not_foundanderrorstatuses to a retry or review queue; - compare
sourceEvidenceandscrapedAton later runs.
The Actor returns current public page content. It does not maintain history or claim that a field changed; store snapshots in your own dataset or warehouse when change detection is needed.
Export to spreadsheets and data pipelines
The default dataset works with Apify's standard exports. Common patterns include:
- CSV or Excel export for sales operations;
- Google Sheets via an Apify integration;
- Make or Zapier workflows triggered after a run;
- webhook delivery to an enrichment service;
- JSON API ingestion into a data warehouse;
- scheduled Tasks for recurring domain batches.
Use status as the workflow branch and keep imprintUrl plus sourceEvidence for review.
Run with the Apify API
Replace YOUR_TOKEN with an Apify API token.
cURL
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~german-imprint-leads/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"startUrls": [{"url": "https://www.bosch.de/"}],"maxItems": 1}'
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/german-imprint-leads').call({startUrls: [{ url: 'https://www.bosch.de/' }],maxItems: 1,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('automation-lab/german-imprint-leads').call(run_input={'startUrls': [{'url': 'https://www.bosch.de/'}],'maxItems': 1,})items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(items)
Use with MCP and AI assistants
Claude Code
Add the Actor as an Apify MCP tool in Claude Code:
claude mcp add --transport http apify \"https://mcp.apify.com?tools=automation-lab/german-imprint-leads"
Claude Desktop, Cursor, and VS Code
Use this equivalent MCP JSON configuration in Claude Desktop, Cursor, or VS Code:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/german-imprint-leads"}}}
Hosted MCP run-to-result recipe
- Discover the scoped tools. Use the Actor-specific endpoint above and read its
tools/listnames and argument schemas. Actor selection also addsget-actor-run,get-dataset-items,get-key-value-store-record, andabort-actor-run; it does not expose only one tool. Use only the Actor/run/data helpers needed for your authorized workflow. Read-only discovery does not authorize starting or aborting a run. - Start once and keep the same run. Retain the returned run ID, status, and storage
IDs; these are metadata, not result rows.
call-actorwaits at mostwaitSecs(0–45 seconds, default 30), so a response may be nonterminal. Pollget-actor-runfor that same run with bounded backoff (for example 2, 4, 8 seconds, capped at 10) and a total deadline of 120 seconds. Set the client's request timeout above the selected server wait plus transport margin, within that deadline. On client timeout, check the known run rather than starting another; if the ID is unknown, report uncertainty instead of blindly rerunning. At the deadline, report pending with the run ID and stop polling. Report terminal failures honestly; any available rows are partial, not a successful full result. - Read actual, bounded dataset rows. After success, call
get-dataset-itemswith the returneddefaultDatasetIdand explicitlimit,offset, andfieldsusing the discovered schema. For example, request untransformed JSON in pages of 20 source rows from offset 0, projecting; admit at most 100 rows and 64 KiB of serialized UTF-8 result content across all pages into model context, whichever comes first. Track source offsets and pagination metadata, not transformed row counts: filtering or unwinding can change those counts. Process pages host-side before model injection and enforce the cumulative byte ceiling even when one row or page is oversized. Omit or summarize oversized content with disclosure, never a claim of completeness. If your client cannot intercept oversized responses, do not claim a hard byte guarantee or request unbounded results. Stop at dataset exhaustion or the budget; report admitted row count, continuation offset, and partial/truncated status when incomplete. Keep full exports/downloads in storage or downstream processing outside model context. These are consumer context limits, not restrictions on Actor collection defaults, capabilities, or output fields.inputUrl,status,companyName,address,vatId, registrationNumber,imprintUrl - Qualify client context claims.
tools/listtransport bytes are not model-visible context. Host-side discovery, caching, progressive loading, and prompt caching depend on the client and negotiated capabilities; none guarantees universal token savings. No numeric savings are promised here. A measured claim would need client/version, capabilities and discovery/cache mode, model/tokenizer, actual visible tool/result subset, and a documented baseline and measurement method.
The backoff, deadline, and row/byte budgets above are example consumer choices, not Apify defaults. See Apify MCP tools and results and dataset pagination and fields.
Example prompts:
- “Extract the public Impressum records for these five German supplier websites.”
- “Return company name, VAT ID, register number, representatives, and source URL as JSON.”
- “Separate found records from websites that need manual review.”
Accuracy, limits, and failure behavior
- Extraction uses deterministic parsing of public server-rendered HTML; it does not run a browser or use AI/model services.
- Unretrievable or blocked pages return
error; retrieved HTML without sufficient legal signals returnsnot_found. JavaScript-only content cannot be rendered. - Labels and page structures differ, so fields may be null even when other fields are found.
- The Actor checks same-host pages only and does not crawl an entire site.
- It does not validate email deliverability, VAT registration, or register status.
- It does not infer hidden contacts or enrich people from third-party sources.
- A
foundresult means a page with German legal signals was located, not that every field was available or legally sufficient. - Redirects are followed and recorded through
resolvedDomainandimprintUrl. - Temporary request failures receive bounded retries; permanent HTTP failures do not loop.
For best results, provide canonical company homepages or direct Impressum URLs and keep the crawl limit at its default.
Responsible and legal use
Only process pages you are permitted to access. Respect website terms, robots guidance, applicable rate limits, database rights, privacy rules, and the purpose for which public contact data was displayed. German Impressum pages can contain personal names and contact details. A public page does not automatically authorize unsolicited marketing, profiling, or unrestricted redistribution.
Use an appropriate lawful basis, minimize retained fields, secure exports, honor deletion or objection rights where applicable, and obtain legal advice for your jurisdiction and use case. This Actor is a technical extraction tool, not legal or compliance advice.
FAQ and troubleshooting
Why did I get not_found?
The Actor could fetch pages but did not find enough legal-page signals within the configured
page limit. Try supplying the site's direct Impressum URL or increasing
maxPagesPerWebsite up to 15.
Why did I get error?
Inspect errorMessage, httpStatus, and pagesChecked. The site may be unavailable,
challenge-protected, non-HTML, or too slow. Increase the request timeout when the public page
responds slowly.
Why is a field null?
The page may not display it in recognizable text. Check imprintUrl and sourceEvidence
before deciding whether manual extraction or another authoritative source is appropriate.
Does the Actor search Google for businesses?
No. It deliberately processes user-supplied URLs. This keeps the workflow predictable and avoids charging for unrelated search results.
How does event billing work?
The one-time start event applies to the run. The lead event applies only when an
Impressum record is successfully located and extracted; diagnostic rows do not trigger it.
Related automation-lab Actors
- Website Contact Details Extractor for broader email, phone, and social-link extraction outside legal notices.
- Website Company Address Extractor for identifying office, mailing, and company address candidates across public pages.
Use this Actor when Germany-specific statutory identity and evidence are the core job; use the related Actors when broader website contact or address coverage is more important.
This independent tool is not affiliated with or endorsed by Bosch, SAP, or the websites it processes. Source names and URLs identify example pages only.
Data handling and retention
Input URLs and displayed public legal/contact fields are stored in your run-owned Apify input and dataset. Run storage and logs follow your Apify account's retention and deletion controls; delete runs/datasets in Console when no longer needed. The Actor maintains no additional contact database, persistent cache, or browsing profile. No paid enrichment, validation, or AI service receives your data. Only the private failure diagnostics below leave the run for troubleshooting. Contact Support for a diagnostic deletion request.
Diagnostic privacy
Failed operations send sanitized diagnostic input, exceptions, and Actor/build/run IDs to
our private GlitchTip service for troubleshooting and repair. Secret fields and URL query
strings are removed, and reports are retained for 30 days. Successful fallback requests,
ordinary missing pages, and expected not_found outcomes are not reported as exceptions.
Support
When reporting a problem, include a reproducible public URL, the input settings, run ID,
status, pagesChecked, and the bounded errorMessage. Do not post API tokens, private
customer lists, or confidential exports.