Website Contact Scraper — Verified Emails, Phones & Socials avatar

Website Contact Scraper — Verified Emails, Phones & Socials

Pricing

from $5.00 / 1,000 domain enricheds

Go to Apify Store
Website Contact Scraper — Verified Emails, Phones & Socials

Website Contact Scraper — Verified Emails, Phones & Socials

Turn a list of domains into verified B2B contacts. Decodes Cloudflare-protected and obfuscated emails, validates MX, and never charges for domains where nothing is found.

Pricing

from $5.00 / 1,000 domain enricheds

Rating

0.0

(0)

Developer

PABLO ALCOLEA AGUILAR

PABLO ALCOLEA AGUILAR

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Give it a list of domains. Get back verified business emails, phone numbers in E.164, social profiles, company name, postal address and VAT/company registration numbers.

You are only charged for domains where something is actually found. Dead domains, parked pages and sites with no contact data cost you nothing.


Why this one

Most contact extractors run a regex over the homepage and stop there. That misses the majority of real contact data, because businesses hide their addresses on purpose. This Actor handles what the others skip:

Typical extractorThis Actor
mailto: links
Plain text emails
Cloudflare-protected emails (data-cfemail)✅ decoded
info [at] company [dot] com✅ decoded
HTML-entity encoded (info…)✅ decoded
Built by JavaScript ('info' + '@' + 'site.com')✅ decoded
Contact / imprint / about pageshomepage only✅ found automatically
MX validation✅ per email
Role vs personal mailbox✅ classified
VAT / company number✅ extracted
Billing on empty resultsyou pay anywayyou don't pay

It finds the pages, you don't have to

You pass example.com. The Actor reads the homepage, then automatically locates and reads the contact, legal/imprint, about and team pages — in English, Spanish, German, French, Italian, Portuguese and Dutch. That is where the phone numbers and the VAT number actually live.


Input

{
"domains": ["basecamp.com", "hetzner.com", "https://posthog.com"],
"maxPagesPerDomain": 4,
"verifyMx": true,
"includePersonalEmails": false
}

Paste domains one per line, or connect the startUrls input to another Actor — for example, feed it the websites from a Google Maps scraper to turn a list of businesses into a list of reachable contacts.

Options that matter

OptionDefaultWhat it does
maxPagesPerDomain4Homepage + up to 3 auto-discovered contact pages. Set to 1 for the cheapest, fastest pass.
verifyMxtrueDNS MX lookup per email domain. Undeliverable domains get flagged, not silently returned.
includePersonalEmailstrueSet to false to return only generic mailboxes (info@, sales@). The safer setting for GDPR-conscious outreach in the EU.
minConfidence0Every email is scored 0–100. Keep 0 and filter later, or raise it to only keep strong hits.
defaultPhoneRegionautoRead local-format phone numbers correctly. Inferred from the TLD if empty.

Output

One record per domain. This is a real, unedited result for hetzner.com, trimmed to the first entry of each list:

{
"domain": "hetzner.com",
"status": "success",
"bestEmail": "info@hetzner.com",
"bestPhone": "+499831505216",
"company": {
"name": "Hetzner Online GmbH",
"address": "Industriestr. 25, 91710 Gunzenhausen",
"legalIds": [{ "type": "Handelsregister", "value": "HRB6089", "country": "DE" }],
"language": "en-US"
},
"emails": [
{
"email": "info@hetzner.com",
"type": "role",
"domainMatch": true,
"isFreeProvider": false,
"isDisposable": false,
"hasMx": true,
"mailProvider": "other",
"confidence": 100,
"foundVia": "mailto",
"foundOn": "https://www.hetzner.com/legal/legal-notice/"
}
],
"phones": [
{ "phone": "+499831505216", "national": "09831 505216", "country": "DE", "type": "UNKNOWN", "source": "text-intl" }
],
"socials": [
{ "network": "facebook", "handle": "hetzner.de", "url": "https://www.facebook.com/hetzner.de" }
],
"counts": { "emails": 7, "phones": 3, "socials": 8, "pages": 4 },
"durationMs": 1132
}

Note where the good data came from: the company name, the registered address and the HRB registration number are not on the homepage. They are on the legal notice page, which the Actor found and read on its own.

Reading the fields that decide quality

  • confidence (0–100) — combines how the email was found (a mailto: beats a string in raw HTML), whether the email domain matches the site, whether the domain accepts mail, and the mailbox type. Sort by it and work top-down.
  • typerole (info@, sales@) · personal (a named individual) · noreply (excluded by default) · other.
  • domainMatchtrue means the email belongs to the site you asked about. false usually means a Gmail address or an agency's address, still useful but worth checking.
  • hasMxfalse means that domain has no mail server. Sending there will bounce.
  • statussuccess (billed) · no_contacts (not billed) · failed (not billed).

Pricing

$5.00 per 1,000 enriched domains — $0.005 per domain where at least one email, phone or social profile is found.

Domains with no results do not pay the enrichment fee. Dead domains, parked pages and sites with no contact data are not charged the $0.005. They still appear in your dataset, marked no_contacts or failed, so you can see what happened to every input.

The full cost breakdown, with nothing hidden:

ChargePriceWhen
Domain enriched$5.00 / 1,000Only when contacts are found
Dataset record$0.01 / 1,000Every row written, including unenriched ones
Actor start$0.00005 per GBOnce per run

So a run over 1,000 domains where 800 return contacts costs about $4.01, not $5.00 — the 200 empty ones cost $0.002 in total instead of $1.00.

Duplicate inputs are removed before processing, so the same domain is never billed twice in one run. No monthly rental, no subscription.

The last two lines are Apify platform events that every Actor on the Store carries and that cannot be switched off. They are listed here rather than left for you to discover on the invoice.


Good use cases

  • Enriching a scraped business list. Google Maps and directory scrapers give you a website but rarely an email. This closes that gap.
  • Cleaning a CRM. Feed in your account domains, get back current addresses, phone numbers and whether the mail domain still resolves.
  • Building a prospect list from a domain list you already own — conference exhibitor lists, portfolio pages, industry directories.
  • Compliance/vendor checks. VAT and company registration numbers are pulled from the imprint or legal notice page.

What it does not do

Stated plainly so you don't waste a run:

  • It does not guess or pattern-generate email addresses. Everything returned was actually published on the site.
  • It does not log into anything, and it does not touch LinkedIn, Apollo or any platform that requires an account.
  • It does not perform SMTP handshakes. verifyMx confirms the domain accepts mail; it does not confirm an individual mailbox exists.
  • It does not render JavaScript. Sites that build their entire contact page client-side may return less. maxPagesPerDomain and the imprint fallback cover most of these, but not all.

Notes on lawful use

This Actor reads publicly published pages on companies' own websites. It respects a fixed timeout, fetches at most a handful of pages per domain, and never bypasses logins or paywalls.

Business contact data is still regulated. In the EU/UK, using personal contact data for marketing requires a lawful basis under GDPR, and you must honour opt-outs. Set includePersonalEmails to false to keep only generic company mailboxes, which substantially reduces personal-data exposure. You remain the data controller for anything you collect and send.


Pairs with

Email List Cleaner — takes the emails this Actor found and strips out the ones that will bounce: dead domains, disposables, typos, plus role and no-reply flags. $0.31 per 1,000 addresses.

Build the list here, clean it there, then send.


Support

Found a site where extraction misses something it shouldn't? Open an issue on the Actor's Issues tab with the domain — extraction rules are updated from real cases.