Website Email Finder — Public Sources avatar

Website Email Finder — Public Sources

Pricing

$4.00 / 1,000 contact sets

Go to Apify Store
Website Email Finder — Public Sources

Website Email Finder — Public Sources

Website email finder and domain email scraper for public company contact pages. Extract published email addresses with the exact source URL and surrounding text. No guessing or login. Pay only when at least one address is found.

Pricing

$4.00 / 1,000 contact sets

Rating

0.0

(0)

Developer

Meka.im

Meka.im

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

39 minutes ago

Last modified

Share

Use this website email finder to extract public company email addresses from a list of domains. It returns the addresses that actually appear on those public pages, and for every single address it tells you which URL it came from, which page type it was, and the surrounding text, so you can open the page and check.

$4 per 1,000 domains where we find at least one address. Domains where we find nothing, domains that block us, and domains that no longer resolve are all written to the dataset so you can see what happened — and none of them are charged.

No login, no cookies, no browser, no proxy pool of your own. Only public pages.

What it does not do

This matters more than the feature list, because most tools in this category quietly do one of these and call the result an "email":

  • It never guesses an address. No firstname.lastname@domain, no info@domain fallback, no pattern permutations. If the address is not written on a page, you do not get it. Passing a person's name as input is rejected with an error rather than silently ignored.
  • It does not verify mailboxes. There is an mxAvailable field, which says whether the email's domain publishes MX records. That is a DNS fact about the domain, not a check of the individual mailbox, and not a deliverability guarantee.
  • It does not look anyone up in a database. Everything comes from the pages themselves.
  • It does not return employees' personal addresses. What you get is whatever the company chose to publish on its own website.

Input: find emails from website domains

{
"domains": ["apify.com", "acme-widgets.de", "example-shop.co.uk"],
"maxPages": 5
}

Every domain produces one row:

{
"domain": "acme-widgets.de",
"websiteUrl": "https://acme-widgets.de/",
"status": "contacts_found",
"emailCount": 3,
"sameDomainCount": 2,
"freeMailCount": 1,
"emails": [
{
"email": "info@acme-widgets.de",
"sourceUrl": "https://acme-widgets.de/kontakt",
"sourcePage": "contact",
"sourceType": "entity",
"discoveryMethod": "html-entity-decode",
"context": "… Haben Sie eine Frage? Schreiben Sie an info@acme-widgets.de oder rufen Sie …",
"emailDomain": "acme-widgets.de",
"isSameDomain": true,
"isFreeMailProvider": false,
"addressType": "role",
"mxAvailable": true,
"firstSeenAt": "2026-09-21T09:14:02.118Z"
}
],
"pagesScraped": [
{ "url": "https://acme-widgets.de/", "page": "home", "outcome": "ok", "status": 200 },
{ "url": "https://acme-widgets.de/kontakt", "page": "contact", "outcome": "ok", "status": 200 }
]
}

Quick start: how the website email scraper works

The homepage, plus up to four more chosen deterministically from the homepage's own links: contact, about, team, legal/imprint — one of each, same registrable domain only. It is not a site crawler; five pages is the ceiling, and maxPages lowers it.

Link text and paths are matched in many languages, so /kontakt, /contacto, /contatti, /iletisim, /お問い合わせ and /연락처 are all recognised.

Output: how each address is found

Seven sources, in order of how strong the evidence is. The share of addresses each one contributed in our own 1,039-domain test is in brackets:

SourceWhat it isShare
mailto<a href="mailto:…">60.7%
entityHTML-entity encoded, e.g. info&#64;example.com18.9%
cfemailCloudflare's data-cfemail obfuscation, decoded with its public scheme11.1%
jsonldschema.org email field5.9%
textplain text on the page1.4%
scripta structured "email": field in page data1.2%
obfuscatedclearly marked forms such as info [at] example [dot] com0.8%

Addresses written as X at Y dot Z are only restored when the dot marker is there too. Text like "learn more at Visa.com" is left alone — restoring that would be guessing.

What the labels mean

FieldMeaning
isSameDomainThe address is on the input domain (subdomains count)
isFreeMailProvidergmail, outlook, gmx and similar. Kept, because small businesses often publish one as their contact address, but counted separately
isDisposableDomainThe domain is on a list of known throwaway-mail providers. The list is not exhaustive
addressTyperole (info@, sales@, kontakt@ …), personal, or unknown
mxAvailableWhether the email domain publishes MX records. A DNS fact, not a mailbox check

Addresses belonging to website builders, analytics and consent tools (Wix, Squarespace, Sentry, Cookiebot and about 45 others) are excluded by default — they are the template's address, not the company's. The count is reported as excludedVendorCount rather than hidden.

Pricing

Price$4.00 per 1,000 delivered contact sets ($0.004 each)
What counts as oneOne domain where at least one address was found
Start feeNone
Charged for a domain with 1 addressOnce
Charged for a domain with 9 addressesOnce
Charged for a domain where nothing was foundNever
Charged for a blocked, timed-out or dead domainNever
Charged for the same domain twice in one listNever — duplicates are removed before crawling

Set Maximum charge on the run to cap spend. The run stops before it would exceed it.

What to expect

From a 1,039-domain cold test across 50 countries (489 Google Maps business sites, 307 LinkedIn company sites, 243 creator sites):

ReachableAt least one address on the site's own domainAny public address
Local business websites90.6%59.8%77.4%
Company websites80.5%60.9%69.0%
Creator / small sites90.1%32.9%46.1%

Reading the four pages beyond the homepage found addresses on 13.8% more domains than the homepage alone.

Results depend on the sites you feed it. A domain that publishes no address anywhere returns no address — and costs nothing.

Ordering, failures and resuming

  • Dataset order is your input order, after duplicates are removed. A domain that fails keeps its position instead of letting later domains jump ahead.
  • If a run is aborted and resumed, already-delivered domains are recognised from the dataset and are neither re-delivered nor re-charged.
  • Failures are reported per domain in outcome: http_403, http_429, dns_failed, timeout, tls_failed, challenged, http_5xx and so on — each is its own bucket, so "the site blocked us" never looks like "the site has no address".

Limits

  • Five pages per domain. A contact address buried on page six is not found.
  • No JavaScript is executed. An address that only exists after a script runs is not found.
  • Pages behind a login, a paywall or a CAPTCHA are not opened. They are reported as challenged and not charged.
  • Images are not read. An address published only as a picture is not found.
  • The disposable-domain and vendor-domain lists are curated, not exhaustive.

Privacy

This Actor reads public web pages. It stores nothing about the pages beyond what is in your dataset, and it sends nothing to third parties. The addresses it returns were published by the site owners themselves on their own public pages.

Use of the data is your responsibility: contacting people has rules — GDPR, CAN-SPAM, CASL and similar laws — and publishing an address is not the same as consenting to be emailed.

Not affiliated with, endorsed by, or connected to any of the websites it reads.

API and automation

Run it from the Apify API, a scheduled task, or as a step in a workflow. The input is the same JSON shown above; results land in the run's default dataset.

curl -X POST "https://api.apify.com/v2/acts/<actor-id>/runs?token=<token>&maxTotalChargeUsd=2" \
-H "content-type: application/json" \
-d '{"domains":["apify.com","fietstop.com"],"maxPages":5}'

Pair it with a Google Maps or LinkedIn company scraper: take the website field from those results, feed it in as domains, and you get the contact set for each one. Because duplicate domains are removed before crawling, the same company appearing twice in your list is only crawled — and only charged — once.

Related discovery tools:

FAQ and troubleshooting

Why does a domain I know has an address come back empty? Five pages per domain is the ceiling and JavaScript is not executed. An address on a sixth page, inside an image, or injected by a script after load is not found. That domain costs nothing.

Why is status unreachable? Check outcome on the same row: http_403 means the site refused us, dns_failed means the domain no longer resolves, challenged means a CAPTCHA or bot-check page was served. Each is its own bucket precisely so that "blocked" never gets mistaken for "no address published".

An address has isSameDomain: false. Is it wrong? Not necessarily. Many small businesses publish a gmail or outlook address as their contact. Those are marked with isFreeMailProvider: true so you can decide. Addresses belonging to website builders and tooling vendors are removed before you see them.

What does mxAvailable: true tell me? Only that the email's domain publishes MX records. It says nothing about whether that particular mailbox exists or accepts mail.

Can I give it a person's name and get their work address? No. Passing a name field makes the run fail with an explanation rather than returning a constructed address.