Website Contact Finder avatar

Website Contact Finder

Pricing

Pay per event

Go to Apify Store
Website Contact Finder

Website Contact Finder

Website emails scraper and contact finder for lead generation. Extract email addresses, phone numbers, social profiles, and optional email verification from company websites in bulk. CRM-ready output, no browser required.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Arnas

Arnas

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Website Contact Finder — Website Emails Scraper, Phone & Social Extractor

What does Website Contact Finder do?

Website Contact Finder is a bulk website emails scraper and contact finder for lead generation. Paste company website URLs and it extracts email addresses, phone numbers, social media profile links, contact-page URLs, and optional email verification — returning one clean contact record per website for CRM import or outreach campaigns.

If you need an email scraper for websites, use it to scan one site or hundreds of sites in the same run. The actor automatically prioritizes contact, about, and team pages — across eight languages, including German, Spanish, French, Italian, Portuguese, Dutch, and Japanese — for faster email discovery on non-English sites. It filters false positives (image-embedded emails, example domains, noreply addresses), handles international phone formats via libphonenumber, decodes Cloudflare-obfuscated emails, and detects profiles on LinkedIn, Twitter/X, Facebook, Instagram, YouTube, GitHub, and TikTok.

No browser required — fast pure HTTP crawling keeps costs low and runs fast.

Why use Website Contact Finder?

  • Bulk processing — scan dozens or hundreds of websites in a single run with one flat start fee
  • 🌐 i18n contact-page prioritization — recognizes impressum, kontakt, contacto, nosotros, contatti, contactez-nous, お問い合わせ, and more, so non-English sites don't waste your crawl budget
  • 🔓 Cloudflare email decoding — finds emails hidden behind data-cfemail XOR obfuscation that most baseline scrapers silently miss
  • 🧪 Email obfuscation handlingname [at] domain [dot] com, (at) / (dot), HTML entities (@, .), and Cloudflare email protection are all decoded automatically
  • 📞 libphonenumber-validated phones — full E.164 validation kills false positives from SKUs, order numbers, and dates
  • 📧 Filtered emails — removes image-embedded addresses, example domains (@example.com), noreply addresses, and analytics IDs
  • 📍 Per-finding source tracking — every email and phone is tagged with the page URLs where it was discovered
  • 🌐 7 social networks — LinkedIn, Twitter/X, Facebook, Instagram, YouTube, GitHub, and TikTok with share-button filtering
  • No browser — fast pure HTTP requests, no Chromium overhead
  • 📤 CRM-ready output — one structured JSON record per website
  • 🔧 Configurable depth — control how many pages to crawl per site (default: 20, max: 200)
  • 💰 Predictable pricing — pay only for pages crawled, not for what was found

Who is it for?

Sales teams and SDRs doing outbound prospecting

  • 📋 Enrich a lead list from LinkedIn or Apollo with verified email addresses and phone numbers
  • 📞 Find direct contact info for decision-makers at target companies before cold outreach

Marketing agencies building lead databases

  • 🗂️ Scan hundreds of client-submitted company websites overnight and deliver a contact spreadsheet
  • 🎯 Find social media handles for prospect companies to target with paid social campaigns

Recruiters and HR professionals

  • 🔍 Find careers email addresses and HR contacts at target employers
  • 🌐 Discover company social pages to research culture and team before outreach

Developers building lead generation pipelines

  • 🤖 Integrate contact extraction into automated prospecting workflows via the Apify API
  • ⚡ Process thousands of URLs programmatically without manual browser work
  • 🧩 Feed results into HubSpot, Salesforce, Pipedrive, or Airtable via Make or Zapier

What data can you extract?

FieldExample
websiteUrl"https://example.com"
emails["info@example.com", "sales@example.com"]
phones["+15551234567", "+442079460958"] (E.164 normalized)
socialLinks.linkedin"https://linkedin.com/company/example"
socialLinks.twitter"https://x.com/example"
socialLinks.facebook"https://facebook.com/example"
socialLinks.instagram"https://instagram.com/example"
socialLinks.youtube"https://youtube.com/@example"
socialLinks.github"https://github.com/example"
socialLinks.tiktok"https://tiktok.com/@example"
contactPageUrl"https://example.com/contact"
pagesCrawled15
crawledAt"2026-05-15T12:00:00.000Z"
emailSources{ "info@example.com": ["https://example.com/contact"] }
phoneSources{ "+15551234567": ["https://example.com/contact"] }
emailVerificationarray, only when verifyEmails: true

How much does it cost to find website contacts?

This Actor uses pay-per-event pricing — you pay only for what you scan. No monthly subscription. All platform costs are included.

EventFreeBronze ($29/mo)Silver ($199/mo)Gold ($999/mo)
Run started (once per run)$0.035$0.033$0.030$0.026
Per page crawled$0.001$0.0009$0.0008$0.00065

Real-world cost examples (Free tier, 20 pages per site):

Websites scannedCost
1 website~$0.055
10 websites~$0.235
100 websites~$2.035
500 websites~$10.035

Set maxPagesPerSite lower to reduce cost on a large batch — most contact info is found on the homepage, footer, and contact page (3-5 pages).

Note: page-crawled is charged only for successful HTML responses. PDFs, images, and failed requests never bill.

How to use Website Contact Finder

  1. Click Try for free on the Actor page (no credit card needed for the free $5 credit)
  2. Enter your list of website URLs — one per line. Bare domains (acme.com) are auto-prefixed with https://
  3. Set Max pages per site (default 20 covers most sites)
  4. Click Start and wait for results
  5. Export to JSON, CSV, or Excel for CRM import or outreach

Example input

{
"urls": [
"https://apify.com",
"https://example.com"
],
"maxPagesPerSite": 10,
"maxConcurrency": 5,
"requestTimeoutSecs": 15,
"useProxy": false,
"verifyEmails": false,
"verificationLevel": "mx"
}

Input parameters

ParameterTypeRequiredDefaultDescription
urlsarrayYesList of website URLs to scan
maxPagesPerSiteintegerNo20Max internal pages to crawl per website (1–200)
maxConcurrencyintegerNo5Parallel HTTP requests (1–20)
requestTimeoutSecsintegerNo15Per-request timeout, seconds (5–60)
useProxybooleanNofalseEnable Apify proxy
proxyConfigurationobjectNoProxy settings (used only when useProxy: true)
verifyEmailsbooleanNofalseInline email verification, free
verificationLevelstringNo"mx"format, mx, or smtp

Output examples

Standard output (verifyEmails: false)

{
"websiteUrl": "https://example.com",
"emails": ["info@example.com", "sales@example.com"],
"phones": ["+15551234567"],
"socialLinks": {
"linkedin": "https://linkedin.com/company/example",
"twitter": "https://x.com/example",
"facebook": null,
"instagram": "https://instagram.com/example",
"youtube": null,
"github": "https://github.com/example",
"tiktok": null
},
"contactPageUrl": "https://example.com/contact",
"pagesCrawled": 15,
"crawledAt": "2026-05-15T12:00:00.000Z",
"emailSources": {
"info@example.com": ["https://example.com/", "https://example.com/contact"],
"sales@example.com": ["https://example.com/contact"]
},
"phoneSources": {
"+15551234567": ["https://example.com/contact"]
}
}

With email verification (verifyEmails: true, verificationLevel: "mx")

The emailVerification array carries per-email metadata:

"emailVerification": [
{
"email": "info@example.com",
"isValidFormat": true,
"hasMxRecords": true,
"isVerified": false,
"confidenceScore": 45,
"isDisposable": false,
"isFreeProvider": false,
"isRoleAccount": true,
"provider": "google_workspace"
}
]

Confidence score rubric (matches the source actor's contract):

  • 0–29 — invalid format or disposable domain
  • 30–44 — valid syntax, domain has no MX records (or MX-check skipped)
  • 45 — MX records found; or inconclusive SMTP (catch-all server / blocking provider)
  • 60 — catch-all server (server accepts all mail; individual mailbox unverified)
  • 95 — SMTP verified individual mailbox exists (not catch-all, not a blocking provider)

isVerified: true is only set at the 95 tier. For Gmail, Microsoft 365, and Yahoo, isVerified is always false — these providers block SMTP probing, and we cap confidence honestly at 45 rather than pretending we know more.

Sites with no public contact info return emails: [] and phones: [] — never silent failures.

Tips for best results

  • 📋 Scan the full list at once — provide all URLs in one run to minimize start fees and get results in one dataset
  • 📄 Start with 15–20 pages per site — contact info is usually on the homepage, footer, contact page, or about page
  • 🔌 Leave proxy off by default — most sites work without it; enable only if you see timeouts or empty results
  • 🔗 Check contactPageUrl — if no email is found, the contact page may use a form instead of a mailto link
  • 🧹 Filter empty results — some sites deliberately hide emails or use JS-only contact widgets; plan for ~15–25% returning no email
  • 🌐 Use the full domain root — always use https://company.com rather than a deep subpage; the crawler discovers contact pages automatically
  • 🇪🇺 Works on non-English sites — German impressum, Spanish contacto, French contactez-nous, etc. are all prioritized like English contact pages

Improvements over the baseline automation-lab/website-contact-finder

This actor is drop-in input/output compatible with the popular automation-lab/website-contact-finder actor, at identical pricing, with these material improvements:

  1. Cloudflare email decoding — decodes data-cfemail XOR-obfuscated addresses (the baseline silently drops them, which is the #1 reason it returns empty results on Cloudflare-hosted sites)
  2. Email obfuscation handlingname [at] domain [dot] com, (at) / (dot) variants, HTML-entity-encoded emails
  3. i18n crawl prioritization — eight languages of contact-page keywords, not just English
  4. libphonenumber-js phone validation — drops false positives from SKUs, dates, and order numbers
  5. Per-finding source trackingemailSources and phoneSources maps tell you which page each contact came from
  6. HTML content-type gatingpage-crawled is only billed for successful HTML responses

FAQ

What types of emails does it find? Emails from mailto: links, plain text, HTML entities, [at]/[dot] obfuscation, and Cloudflare's data-cfemail protection. It filters out: image-embedded addresses, noreply@, addresses at example.com / test.com / domain.com, image-extension false positives like logo@2x.png, and pure-numeric IDs.

Does it find phone numbers? Yes. It extracts numbers from tel: links and visible body text, validated by libphonenumber-js and normalized to E.164 (e.g., +15551234567). Fictional NANP numbers (the reserved 555-01xx range) are correctly rejected.

Which social platforms does it detect? LinkedIn, Twitter/X, Facebook, Instagram, YouTube, GitHub, and TikTok. Share-button URLs (intent/tweet, sharer.php, shareArticle, etc.) are rejected so you don't get back your own outbound share links.

How many pages should I crawl per site? 10–20 pages covers most small and medium business websites. Increase to 50+ for large enterprise sites or e-commerce stores with distributed contact info across regional pages.

Do I need a proxy? Usually no. The actor uses HTTP requests without a proxy by default, and most public websites don't block them. Enable proxy only if you see timeout errors or empty results — residential proxies work best for stubborn sites.

Does it need a browser? No. Fast HTTP requests only — no Chromium or Playwright overhead. This keeps cost and run time low.

The actor found no emails on a site I know has contact info. Why? The most common remaining reason is that the email is rendered by JavaScript (we already decode Cloudflare and [at]/[dot] obfuscation). Since this actor uses HTTP-only requests, it cannot extract emails that only appear after JavaScript execution. Some sites also exclusively use contact forms without ever publishing a mailto: link — check the contactPageUrl field; it likely points to a form-based contact page.

Can I scrape multiple websites in one run? Yes — bulk processing is built in. Add all URLs to the urls array.

How does pricing work for bulk runs? You pay $0.001 per page crawled plus a $0.035 flat start fee per run (Free tier). The cost is fully predictable — page count, not "what was found", determines the bill. Setting maxPagesPerSite: 5 is a fast way to cut costs by 4x compared to the default.

This actor only accesses publicly available web pages — contact information intentionally published by website owners for visitors to find. It does not bypass login walls, CAPTCHAs, or access controls.

Automated collection of public contact data is standard practice in sales prospecting and business research. That said, you should review applicable laws in your jurisdiction and the target website's terms of service. For data containing personal information (individual email addresses), ensure compliance with GDPR, CCPA, and similar privacy regulations — particularly around how you store, use, and retain the data.

Changelog

v0.1 — 2026-05-15

Initial release. Drop-in compatible with automation-lab/website-contact-finder on input and output schema, at identical pay-per-event pricing.