Impressum Scraper: Pay per Filled German Imprint avatar

Impressum Scraper: Pay per Filled German Imprint

Pricing

from $3.28 / 1,000 imprint record returneds

Go to Apify Store
Impressum Scraper: Pay per Filled German Imprint

Impressum Scraper: Pay per Filled German Imprint

Scrape German Impressum pages and pay only for filled imprints, with whichever of company name, address, register court and number, VAT ID, legal representatives, email and phone the page prints. No per-site fee, no start fee beyond the platform's, and a time budget for API and agent runs.

Pricing

from $3.28 / 1,000 imprint record returneds

Rating

0.0

(0)

Developer

Pradio Actors

Pradio Actors

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

What does Impressum Scraper do?

Impressum Scraper reads the Impressum of every company website you give it and returns one row per site, billed per filled imprint. You pay $4.20 per 1,000 filled imprints; a site that yields nothing costs you nothing, and its row says why. A filled row carries up to 37 fields. They are the registered company name and address, register court and number, VAT ID, managing directors, email, phone, fax and social profiles. Paste a list of domains, or type search terms with your own search-API key, and press Start.

Your first run: three company sites

{
"startUrls": [
{ "url": "https://www.trigema.de" },
{ "url": "https://www.stihl.de" },
{ "url": "https://www.mymuesli.com" }
]
}

Who uses Impressum Scraper

WhoWhat they run it for
Contact-data buildersTurn a domain list into legal names, emails and phones from each company's own notice.
Compliance and due-diligence teamsCollect register court, register number and representatives without opening each site.
B2B sales teamsCheck the legal entity and business contact a company publishes before you sign.
CRM and data teamsAdd registered addresses and registry identifiers to rows that hold a domain.

Features

  • Pay per filled imprint. A row bills at $4.20 per 1,000 when the run reads its notice and pulls a company field off it. Every other outcome returns a row that says why.
  • The imprint page found for you. It follows the site's own impressum or legal link up to two hops. It tries the contact page when the homepage links to none.
  • Clean values, or none. Every field is checked against its own shape. A street has a house number and a court is a town, so a menu entry reads as null rather than a board member.
  • JavaScript sites rendered. A plain request first, then a headless-browser pass for script shells; a block or bot challenge ends the site instead.
  • A refusal ends the site. A site that refuses, rate-limits or bot-checks you is left alone for the rest of the run, whatever proxy you set.
  • A time budget for API calls and agents. Each site a deadline cuts off gets a row that says why.
  • Search by term, your key. Terms resolve to domains through Brave or Google Custom Search. Searches look up businesses; a query that reads as a person's name is refused.
  • Company e-mails checked on request. A DNS lookup per domain says whether it accepts mail; the check sends nothing.
  • Decision makers with their roles. Each representative the notice names, with its role when the notice prints one: Geschäftsführer, Vorstand, Inhaber, Managing Director.
  • One column per social network. Facebook, LinkedIn, XING, Instagram, X and YouTube each in their own column, ready to filter on. Share buttons and a person's own profile stay out.

Why this one

Impressum ScraperMost-used alternative
Rows returned on the same site11
Price per 1,000 filled imprints$4.20$5.00
A site that yields nothingfree$1.20 per 1,000 sites read
Charge to start a run$0.0001$0.04
Run memory2,048 MB1,024 MB

Both ran on one of the four sites in the example run, on 2026-09-27.

  • Every miss names its kind. The row names what the site did — not found, refused, timed out — so your list comes back fully answered; a detail fills in when the read produced one.
  • The source is on the row. Each value links back to the notice page it was read from.

What data does Impressum Scraper return?

One row per site — two entries on one domain share it. A real row, lists shortened:

{
"domain": "trigema.de",
"pageUrl": "https://www.trigema.de/kundenservice/rechtliches/impressum/",
"company_name": "Trigema W. Grupp KG",
"street": "Josef-Mayer-Str. 31-35",
"postal_code": "72393",
"city": "Burladingen",
"country": "DE",
"legal_representatives": "Wolfgang Grupp, Trigema Verwaltung GmbH",
"decision_makers": [
{ "name": "Wolfgang Grupp", "role": "Persönlich haftende Gesellschafter" }
],
"register_court": "Stuttgart",
"register_number": "HRA 740365",
"vat_id": "DE144846566",
"email": "bestellservice@trigema.de",
"phone": "+497475880",
"fax": "+49747588228",
"linkedin": "https://www.linkedin.com/company/trigema-w-grupp-kg",
"status": "ok",
"legal_form": "KG"
}

Every field on a row, and what it carries:

FieldWhat it is
domainThe site's hostname without www, from your entry.
start_urlThe start entry this row answers, or the site root a search found.
websiteThe site's root URL (https://domain).
websitesThe root plus non-social URLs the page's structured data lists.
pageUrlThe page actually read; on a miss, the page the run reached.
imprint_urlThe notice page the company fields came from; null when none was found.
titleThe notice page's HTML title on a filled row.
company_nameThe registered company name as the notice prints it.
legal_formThe entity's legal form, from its name or the page's own words.
legal_representativesEvery representative the notice names, one line as printed.
decision_makersThe same representatives as {name, role} pairs, one entry each.
addressThe postal address on one line, joined from checked parts.
streetThe street-and-number line of the postal address.
house_numberThe house number split off the street line.
postal_codeThe postal code in the notice's address block.
cityThe town beside the postal code.
countryThe address's country as a two-letter code, read off the notice.
register_courtThe town of the commercial-register court named.
register_numberThe register number as printed, prefix included (HRA 740365).
register_kindWhich register the number belongs to, such as HRA/HRB in Germany.
vat_idThe VAT identification number stated.
emailThe contact mailbox, own-domain first; department and regulator addresses skipped.
email_mx_okWith Check e-mail domains on: whether the domain accepts mail. Null when off or the lookup did not answer.
phoneThe phone number, in international form when the address is German, Austrian or Swiss, else as the page wrote it.
faxThe fax number, on the same rule as phone.
facebook, linkedin, xing, instagram, twitter, youtubeThe company's page on that network, linked on the page; a person's own page stays out of the LinkedIn and XING columns.
social_profilesEvery social profile linked on the page; share buttons stay out.
search_queryThe search term that found this site; null for a listed URL.
statusThe per-site verdict; the values are under Output.
reasonOn a miss, the detail behind the verdict; on a private person's row, what was withheld.
imprint_hashA fingerprint of the notice's content that flips when it changes.
row_typeThe row's kind: data row, per-site miss or run-level row.

A null means the site left that value unpublished; data and miss rows keep the same shape, and a run's summary row adds its three counters.

How much does it cost?

$4.20 per 1,000 filled imprints. One filled imprint is one $0.0042 event on your invoice, charged after the row lands in your dataset. A miss row says why the site yielded nothing and is never billed.

Filled imprintsYou payPlus the run's start
100$0.42$0.0001
1,000$4.20$0.0001
10,000$42.00$0.0001

Starting a run costs the platform's per-run event — at this Actor's memory, about $0.0001. A single-site lookup costs well under a cent in all. At the share the test list returned, 100 sites come to about 55 filled imprints and about $0.23. A 1,000-site list comes to about 548 and $2.30.

On paid Apify plans the per-imprint price drops: $3.86 per 1,000 on Bronze, $3.70 on Silver, $3.28 on Gold and above.

Searches run on your own API key, under its terms and quota; the Actor bills no search event of its own.

How do I use Impressum Scraper?

  1. Open the Actor with Try for free on its Store page.
  2. List your sites in Start Urls, one per line, a site root or its imprint page. Or put terms in Search queries and they resolve to domains through an official search API.
  3. Adjust the run: Maximum items, the Headless browser fallback, Check e-mail domains (MX), a Time budget. Exclude takes the domains and names this run leaves out.
  4. Press Start. Rows land in the dataset as they are read.

Worked examples

Check who runs a supplier before you sign:

{
"startUrls": [{ "url": "https://www.stihl.de" }],
"maxItems": 1
}

Collect business contacts whose mail domains answer, and keep sites with no e-mail out:

{
"startUrls": [
{ "url": "https://www.trigema.de" },
{ "url": "https://www.mymuesli.com" }
],
"verifyEmails": true,
"skipWithoutEmail": true
}

Find machinery companies through search, on your own Brave key:

{
"searchQueries": ["site:.de GmbH Impressum Maschinenbau"],
"searchEngine": "brave",
"searchApiKey": "<your Brave Search API key>"
}

Through the API:

curl -X POST "https://api.apify.com/v2/acts/Pradio~imprint-contact/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"startUrls":[{"url":"https://www.trigema.de"}]}'

Input

InputTypeDefaultWhat it does
startUrlsarray4 example sitesThe sites to read, one row per site; two entries on one domain share a row.
searchQueriesarraynoneTerms resolved to domains through an official search API. Search names businesses: a query that reads as a person's name is never sent.
searchEnginestringbravebrave (Brave Search API) or google (Google Custom Search JSON API, needs searchCx).
searchApiKeystringnoneYour own key for the engine, kept secret; a query with none is a free search_failed row.
searchCxstringnoneThe Google programmable engine ID, for the google engine.
proxyConfigurationobjectApify datacenterSite requests go through this proxy group. A refused, rate-limited or bot-challenged site yields a free fetch_failed row and is never asked again: no other group, session or browser.
useBrowserbooleanonRender pages that answer as a JavaScript shell. A block or bot challenge is not a shell and is never rendered.
maxItemsinteger100The most rows one run returns, at most 10,000.
maxRunSecondsintegernoneA time budget in seconds, minimum 30; sites it cuts off return as free aborted rows.
verifyEmailsbooleanoffCheck each e-mail's shape and its domain's mail servers; a DNS lookup only, nothing sent.
skipWithoutEmailbooleanoffA site whose notice names no e-mail returns a free no_email row instead of the company row.
maxDomainsPerSearchQueryinteger20The most domains one search term may resolve to.
excludearraynoneDomains and names to leave out, one per line. A fetched row naming one is dropped, never billed.

An entry that fails to parse as a URL comes back as a miss row naming it. Two entries on one domain are read once and share a row. For API calls and agents, set the budget a little under the caller's wait — the run stops starting new sites in time to finish inside it.

Output

Every site on your list gets a row. A filled row's status is ok; every other verdict is a miss row, and its reason says what happened:

statusWhat it means
okThe notice was found and at least one company field was read. The billed verdict.
no_imprint_foundThe site answered but published no findable notice, or it held nothing billable.
fetch_failedThe site refused, rate-limited or bot-challenged the read, or the connection failed.
js_requiredThe page needs a browser and none could read it: the fallback off, or the render gave no text.
timeoutThe host gave no answer.
bad_urlThe entry could not be read as a URL.
search_failedThe term could not be resolved: a person's name, a missing key or a failed lookup.
abortedThe time budget or the run's own end cut this site off.
no_emailWith the skip option on, the notice names no e-mail.

A row's row_type marks it: a data row, a per-site miss, or a run-level row with the run's counts. A run summary in your key-value store says what it read, returned and charged, so a short run and a broken one look different.

Personal data

A row can name a person: a company officer on the company's own legal-notice page. What the product is for, where the data comes from and how removal works:

  • Purpose. For identifying a company and reaching it through the business contact details it publishes. The rows are for lawful business contact, not for building people databases, profiling or marketing to individuals.
  • Source. Every row is read from a company's own imprint or legal-notice page, which the company publishes under its disclosure duty. The row links back to that page, and the page's prose stays on the page.
  • Officers in business capacity. A row names company officers exactly as the notice prints them: name and role. It carries no personal e-mail, handle or phone fields for them.
  • Nothing contacts a person. The e-mail check is a DNS lookup of the domain's mail records; no mail server is contacted and nothing is sent. A search query that reads as a person's name is refused before it is sent.
  • Objection route. A company or person that wants its notice left out opens an issue on this Actor's Issues tab. The entry joins an exclusion list every run reads, and a fetched row naming it is dropped, unbilled. Your own Exclude input works the same way.
  • Private persons. A notice that shows no business at all keeps the person's street, house number, phone and fax back. The row says which fields were withheld.
  • You are the controller. You need your own lawful basis for the rows your runs collect, for example legitimate interests for B2B contact. You tell the people named where their data came from when you first contact them.
  • Nothing kept. The Actor keeps no rows between runs; datasets live in your Apify account.

Limits

  • Coverage is partial. On the test list of 104 German company sites, 57 came back filled. The misses were 31 fetch failures (14 refused or bot-challenged, 17 whose robots.txt could not be read), 12 sites with no findable notice and 4 timeouts. Of the filled rows: company name 98%, register number 75%, register court 63%, VAT ID 46%, representatives and email 63% each.
  • German- and English-first. A site that names its notice something outside the usual words comes back as a miss rather than misread.
  • One notice page per site. The read follows the site's own imprint links, at most two hops and twelve pages. A refusal ends the site there.
  • A field the site leaves unpublished stays null on your row rather than filled from a guess.
  • Search needs your key. None is configured for you; a term without one, or a failed lookup, is a miss row naming it.
  • An empty input fails fast. A run given nothing to read fails at once. A bad entry becomes a miss row and the run carries on.
  • A broken read fails the run. An error in the reading itself fails the run with the error in its log, rather than handing back rows of nulls.

FAQ

What if a site has no legal notice? You still get a row for the site that says the notice could not be found. Your list comes back fully answered.

In which format can I export? JSON, CSV, Excel, XML, RSS or an HTML table, from the run's Storage tab or through the API.

How many domains can it handle? As many as you list: a run returns up to 10,000 rows, 100 by default. Sites are read a few at a time with a short pause between hits to one host. A longer list takes longer rather than costing more per site, and a very long list splits across runs.

Is it legal to scrape imprint pages? Imprint pages are disclosures companies publish under a legal duty, and this data is for lawful business contact. Each page is fetched on a path the site's robots.txt allows, with a pause between requests to one host. Data-protection rules still govern what you do with the rows. You are responsible for having the right to read the sites you give it, and for how you use the rows. Personal data says what the product is for and how a site asks to be left out.

Can I use integrations with Impressum Scraper? Yes — Zapier, Make, Google Sheets and webhooks from the Integrations tab, and it runs on a schedule.

Can I use it through the Apify API or an MCP server? Both. The curl line above is the whole API call, wrapped by the JavaScript and Python clients, and the AI-agents section registers it with MCP.

Not affiliated

This Actor is not affiliated with or endorsed by the sites it reads; it reads what each publishes.