Website Contact Scraper — Verified Emails, Phones & Socials
Pricing
from $5.00 / 1,000 domain enricheds
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
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 extractor | This 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 pages | homepage only | ✅ found automatically |
| MX validation | ❌ | ✅ per email |
| Role vs personal mailbox | ❌ | ✅ classified |
| VAT / company number | ❌ | ✅ extracted |
| Billing on empty results | you pay anyway | you 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
| Option | Default | What it does |
|---|---|---|
maxPagesPerDomain | 4 | Homepage + up to 3 auto-discovered contact pages. Set to 1 for the cheapest, fastest pass. |
verifyMx | true | DNS MX lookup per email domain. Undeliverable domains get flagged, not silently returned. |
includePersonalEmails | true | Set to false to return only generic mailboxes (info@, sales@). The safer setting for GDPR-conscious outreach in the EU. |
minConfidence | 0 | Every email is scored 0–100. Keep 0 and filter later, or raise it to only keep strong hits. |
defaultPhoneRegion | auto | Read 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 (amailto: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.type—role(info@,sales@) ·personal(a named individual) ·noreply(excluded by default) ·other.domainMatch—truemeans the email belongs to the site you asked about.falseusually means a Gmail address or an agency's address, still useful but worth checking.hasMx—falsemeans that domain has no mail server. Sending there will bounce.status—success(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:
| Charge | Price | When |
|---|---|---|
| Domain enriched | $5.00 / 1,000 | Only when contacts are found |
| Dataset record | $0.01 / 1,000 | Every row written, including unenriched ones |
| Actor start | $0.00005 per GB | Once 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.
verifyMxconfirms 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.
maxPagesPerDomainand 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.