Impressum Scraper: German Company Contacts & Directors
Pricing
$3.00 / 1,000 imprint with contacts
Impressum Scraper: German Company Contacts & Directors
Extract Impressum contact data from German, Austrian and Swiss company websites: legal name, managing directors (Geschäftsführer), email, phone, address, VAT ID and register number (HRB/FN/CHE). $3 per 1,000 imprints with a contact; sites without one are free.
Pricing
$3.00 / 1,000 imprint with contacts
Rating
0.0
(0)
Developer
Data Gleaner
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
an hour ago
Last modified
Categories
Share
Impressum Scraper: German, Austrian & Swiss Company Contacts from the Legal Notice
Impressum Scraper reads the legally required legal notice (Impressum, Imprint, Legal notice, Mentions légales) of company websites and returns it as clean data. Give it domains and get each company's legal name and legal form, managing directors (Geschäftsführer), email, phone and fax, postal address, VAT ID (USt-IdNr., UID, MWST), register court and number (HRB, HRA, FN, CHE) and the person responsible for content (V.i.S.d.P.). You pay $0.003 (from 3 November 2026: $0.005) only for a website whose imprint gave a company name plus an email or phone; sites with no imprint are free.
It answers searches such as: impressum scraper, impressum email extractor, imprint contact details, German company contacts, DACH company leads, Geschäftsführer email, Handelsregister number from website and legal notice extractor.
Built for lead-generation pipelines and AI agents as well as people: one row per website, the same fields every time, and the price tied to the answer you wanted. Plain HTTP, no browser, no login.
Why the imprint
German law (§ 5 DDG, formerly § 5 TMG), Austrian law (§ 5 ECG, § 25 MedienG) and Swiss law (Art. 3 UWG) require nearly every business website to publish who runs it. That makes the Impressum the most complete free source of verified B2B contact data in the DACH region: the legal entity, the people who legally represent it, an address that takes registered mail, and the commercial register entry you can check against the Handelsregister.
What you get
| Field | Example |
|---|---|
companyName, legalForm | Tourlane GmbH, GmbH (also UG (haftungsbeschränkt), AG, KG, GmbH & Co. KG, e.K., OHG, SE, e.V., OG, SARL, SAS, SA...) |
managingDirectors | ["Julian Weselek", "Anna Semmelroth"] from Geschäftsführer, Geschäftsführung, Vorstand, "Vertreten durch", Managing Director, Gérant |
owners | Inhaber(in) of a sole trader (e.K.), persönlich haftende Gesellschafter |
responsibleForContent | Person responsible under § 18 Abs. 2 MStV (V.i.S.d.P.), or Directeur de la publication |
address | {"street": "Prinzessinnenstraße 20", "postalCode": "10969", "city": "Berlin", "country": "DE"} |
emails, primaryEmail | The company's own addresses, deobfuscated; the best general one (info@, kontakt@) as primaryEmail |
phones, fax | E.164 format, e.g. +493083795330 |
vatId | DE302188049, ATU62224319, CHE-109.030.864, FR... and other EU formats |
registerCourt, registerNumber | Amtsgericht Berlin-Charlottenburg, HRB 170081 B; Handelsgericht Wien, FN 271791 v; Handelsregister des Kantons Zürich, CHE-106.838.812 |
How it works
- Loads the home page and finds the imprint link by its text or address: Impressum, Imprint, Legal notice, Mentions légales, Colofon, Note legali, Aviso legal, Información legal. A link may point to the parent company's domain.
- With no link, tries the usual paths:
/impressum,/imprint,/legal-notice,/de/impressum,/impressum.html,/mentions-legales. A path that returns 404 costs nothing. - Reads the visible text block by block and maps the labelled fields: German and English first, French as well. Emails written as
info(at)firma.de,info [at] firma [dot] de,info @ firma.de, HTML entities or Cloudflare email protection are decoded. - Keeps only emails on the company's own domain (or a webmail box), so an agency or hosting provider named in the imprint does not end up in your CRM.
- Retries with exponential backoff on 429 and 5xx, honours
Retry-After, paces requests per site and respectsrobots.txt.
Use cases
- DACH B2B lead generation: turn a list of German, Austrian or Swiss domains (from Google Maps, Gelbe Seiten, a trade-fair exhibitor list or your CRM) into decision-maker names with a company email and phone.
- Find the Geschäftsführer and their company email for outreach, partnerships or M&A sourcing.
- KYC, supplier and partner checks: legal entity, register number and VAT ID straight from the source, ready to verify in the Handelsregister or VIES.
- CRM enrichment and deduplication:
domain,vatIdandregisterNumberare stable join keys. - AI agents that need "who runs this company and how do I reach them" for a list of websites, paying only for hits.
Input
| Field | Meaning |
|---|---|
websites | Company websites, one per line: firma.de, https://www.firma.de/ or a direct imprint URL. |
datasetId | Optional. Dataset of another Actor to take websites from, merged with websites. See below. |
datasetField / maxDatasetItems | Website field name if unusual; cap on websites read (default 1000). |
onlyWithEmail | Output only sites whose imprint gave an email (default false). Sites without one are free either way. |
maxPagesPerSite | Pages read per site (default 3): home page, imprint link, fallback paths. 404 paths do not count. |
languageHint | auto (default, from the domain), de, en or fr: which imprint link and paths to try first. |
maxConcurrency | Sites processed in parallel (default 10). |
delaySecs | Pause between two requests to the same site (default 0.5). |
respectRobotsTxt | Skip pages that robots.txt disallows (default true). |
proxyConfiguration | Optional, no proxy by default. Turn on Apify Proxy if many sites answer 429. |
Leave everything empty to run three built-in DACH examples (about 10 seconds, 3 billable rows).
{"websites": ["tourlane.de", "https://www.bergzeit.de", "https://www.willhaben.at", "https://www.post.ch"],"onlyWithEmail": false,"maxPagesPerSite": 3,"languageHint": "auto"}
Run it after Google Maps Scraper or any scraper
Open the source Actor's Integrations tab, add this Actor (datagleaner/impressum-contacts) and set its input to:
{"datasetId": "{{resource.defaultDatasetId}}"}
Every time the source run succeeds, this Actor reads the websites from its results (website, url, domain, site, homepage, link, companyWebsite or web, the first one present; datasetField names another field), skips items with no website, social-media or map links, and duplicates, and reads the imprint of each (at most maxDatasetItems, default 1000). Each row also carries sourceTitle, the title or name of the source item (for example the Google Maps place name). Billing is the same: one event per imprint with a contact, nothing for sites without one. Works with Google Maps Scraper (compass/crawler-google-places) and any Actor whose output has a website field.
The same works from code, for one finished run:
run = client.actor("datagleaner/impressum-contacts").call(run_input={"datasetId": "SOURCE_DATASET_ID"})
The status message tells how many items were read from the dataset and how many had no website, or says so if the dataset could not be read.
It also works as an integration without setting any input: in the source Actor's Integrations tab choose Add integration and pick this Actor, and the dataset is passed automatically.
Output
One row per input website. A real row:
{"domain": "tourlane.de","imprintUrl": "https://www.tourlane.de/impressum/","companyName": "Tourlane GmbH","legalForm": "GmbH","managingDirectors": ["Julian Weselek", "Anna Semmelroth"],"owners": [],"responsibleForContent": null,"address": {"street": "Prinzessinnenstraße 20", "postalCode": "10969", "city": "Berlin", "country": "DE"},"emails": ["hello@tourlane.de", "press@tourlane.com"],"primaryEmail": "hello@tourlane.de","phones": ["+493083795330"],"fax": null,"vatId": "DE302188049","registerCourt": "Amtsgericht Berlin-Charlottenburg","registerNumber": "HRB 170081 B","hasContact": true,"status": "ok","error": null,"input": "tourlane.de","scrapedAt": "2026-10-09T14:49:21+00:00"}
status is ok (imprint with contact, billed), noContact (imprint found, but no company name with an email or phone), noImprint (no legal notice found), unreachable, blockedByRobots, invalidUrl or error. Only ok rows are billed. A field that the imprint does not state is null or an empty list; nothing is guessed.
The Output tab has two views: Imprint contacts (company, directors, email, phone, VAT ID, register) and All fields. Export to CSV, Excel, JSON or Google Sheets, or read the dataset through the API.
Use it from n8n, Make, Zapier or an AI agent
Actor ID: datagleaner/impressum-contacts
Minimal input:
{"websites": ["https://www.tourlane.de", "https://www.bergzeit.de"]}
Each tool below runs this Actor with your own Apify API token.
-
n8n: add the Apify node (
@apify/n8n-nodes-apify). On n8n Cloud you install it from the community node registry. Choose Run an Actor and get dataset, set Actor todatagleaner/impressum-contactsand paste the input above. -
Make: use the Apify app's Run an Actor module, then Get Dataset Items to read the results. Watch Actor Runs can trigger a scenario when a run finishes.
-
Zapier: use the Apify action Run Actor, then the search Fetch dataset items. The trigger Finished Actor run starts a Zap when a run ends.
-
AI agents (MCP): connect to
https://mcp.apify.com/?tools=datagleaner/impressum-contacts. In Claude Code:claude mcp add --transport http apify "https://mcp.apify.com/?tools=datagleaner/impressum-contacts"Then run
/mcpto sign in to Apify in your browser. Other clients can sign in with OAuth or send the headerAuthorization: Bearer YOUR_APIFY_TOKEN. Clients that run local MCP servers can use Apify's package (@apify/actors-mcp-server, run withnpx -yandAPIFY_TOKENset) instead. Then ask the agent in plain words, for example:Find the managing directors, email and VAT ID of tourlane.de and bergzeit.de.
-
LangChain (Python):
# pip install langchain-apify, then set APIFY_TOKEN in your environmentimport jsonfrom langchain_apify import ApifyActorsTooltool = ApifyActorsTool("datagleaner/impressum-contacts")result = tool.invoke({"run_input": json.loads('{"websites": ["https://www.tourlane.de", "https://www.bergzeit.de"]}')})
Through the API, one call returns the rows:
curl -X POST "https://api.apify.com/v2/acts/datagleaner~impressum-contacts/run-sync-get-dataset-items?token=<APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"websites": ["tourlane.de", "willhaben.at"], "onlyWithEmail": true}'
Tip for agents: set onlyWithEmail to true when you only need reachable contacts, and read primaryEmail for the single best address.
How much does it cost?
Pay per event: US$3.00 per 1,000 imprints with a contact (event imprint-with-contact, US$0.003 each) until 3 November 2026. From 3 November 2026 the price is US$5.00 per 1,000 (US$0.005 each); the raise has been announced to users 14 days ahead, as the platform requires. You are charged once per website whose legal notice gave a company name plus an email or phone. Sites where no imprint is found, imprints without a contact, and unreachable sites are free.
Worked example: 1,000 German company domains, of which about 85% have a readable imprint with a contact, cost 850 x $0.003 = $2.55 until 3 November 2026 and 850 x $0.005 = $4.25 from then. Platform usage is small because the Actor makes plain HTTP requests, about 3 to 5 per site.
Limits
- No JavaScript rendering. An imprint drawn only by scripts (some single-page shops), or a site that refuses non-browser clients with 403 or 429, gives
noImprintorunreachable, free of charge. Some Shopify and Cloudflare-fronted shops answer 429 to automated clients; the Actor backs off and retries, and Apify Proxy can help. - Names are read from labelled fields. An imprint that names its directors only inside a running sentence may leave
managingDirectorsempty while the rest of the row is filled. - Emails or phones shown only as images are not read.
- Up to 10 pages per site; default 3. A site gets no new request after 90 seconds; a very slow server is returned with what was found by then, so one slow site cannot hold the whole run open.
FAQ
How do I get the Geschäftsführer and email of a German company from its website? Put the domain in websites. The Actor finds the Impressum and returns managingDirectors, primaryEmail and phones, plus the register entry to verify them.
Does it work for Austria and Switzerland? Yes. Austrian imprints give FN Firmenbuch numbers, the Handelsgericht and ATU VAT IDs; Swiss imprints give the CHE UID and the cantonal Handelsregister. French Mentions légales (RCS, SIREN, TVA) and English Imprint pages are read as well.
Is this the same as a Handelsregister lookup? No. It reads what the company itself publishes on its website, which is usually more current for email and phone. Use registerCourt and registerNumber to look the entity up in the official register.
What if a site has no imprint? The row comes back with status noImprint and costs nothing.
Can I scrape thousands of domains? Yes. Sites run in parallel (maxConcurrency), each with at most one request at a time and a polite delay.
Does it guess emails? No. It returns only addresses printed on the imprint page, and only those on the company's own domain or a webmail box.
Can I export to CSV or my CRM? Yes: CSV, Excel, JSON, Google Sheets, Zapier, Make, or the API.
Responsible use
This Actor reads publicly available legal notices that companies are required by law to publish. It does not log in, solve CAPTCHAs or get around blocks. Names of directors and responsible persons are personal data under the GDPR: you are responsible for having a lawful basis when you store or contact them, and for following anti-spam rules (in Germany § 7 UWG restricts unsolicited B2B email and calls).