Website Contact Scraper — Emails, Phones & Social Media avatar

Website Contact Scraper — Emails, Phones & Social Media

Pricing

from $4.00 / 1,000 email founds

Go to Apify Store
Website Contact Scraper — Emails, Phones & Social Media

Website Contact Scraper — Emails, Phones & Social Media

Email extractor and B2B lead scraper. Crawls any website and extracts emails, phone numbers, and 14 social media profiles (LinkedIn, Twitter/X, Instagram, Facebook, WhatsApp, Telegram, Discord, TikTok, YouTube, Pinterest, Snapchat, Reddit, Threads, GitHub). Pay per email found — no wasted spend.

Pricing

from $4.00 / 1,000 email founds

Rating

0.0

(0)

Developer

extractmaster01

extractmaster01

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Share

Website Email Extractor & Contact Scraper — Emails, Phones, Address & 14 Socials

Website Email Extractor & Contact Scraper crawls any website and extracts the full contact profile for every domain: emails, phone numbers, physical address, company name, and 14 social media platforms. Give it a list of URLs and get back a clean dataset ready to import into any CRM or spreadsheet. No subscriptions.

TRY IT FOR FREE


What data can Website Email Extractor & Contact Scraper extract?

Data typeDetails
📧 Email addressesDeduplicated per domain, quality-filtered, Cloudflare obfuscation decoded, [at]/(at) obfuscation decoded, optional MX validation
📞 Phone numbersHigh-confidence (phones) from tel: links + lower-confidence (possiblePhones) from page text. US and international formats.
🏢 Company nameExtracted from og:site_name and application-name meta tags
📍 Physical addressExtracted from Schema.org PostalAddress JSON-LD or HTML microdata
📄 Page contextpageTitle and pageDescription of the page where each email was found (per-email mode)
💼 LinkedInCompany and personal profiles
🐦 Twitter / XBrand and personal handles
📸 InstagramBusiness and creator profiles
📘 FacebookPages and business profiles
▶️ YouTubeBrand channels
🎵 TikTokBrand and creator profiles
💻 GitHubOrganization profiles, user profiles, and repositories
💬 WhatsAppBusiness numbers, direct links, and WhatsApp Channels
✈️ TelegramChannels, groups, and user profiles
🎮 DiscordServer invite links
📌 PinterestBrand profiles
👻 SnapchatPublic profiles
🧵 ThreadsPublic profiles
👥 RedditSubreddits and user pages

Why use Website Email Extractor & Contact Scraper?

Most contact scrapers return only emails or lock you into a monthly subscription. This one returns the full contact profile for every domain — including address, company name, and 14 social platforms — and you only pay for what the Actor actually finds.

FeatureThis ActorEmail-only scrapers$10–$20/mo scrapers
Email addresses
Phone numbers
14 social platforms
Company name
Physical address
Page title & description
Email domain validationPaid add-on
Contact page auto-discovery
Cloudflare + [at] email decode
Pay per event (no subscription)Some
Per-email and per-domain output

How to scrape contact information from any website

  1. Create a free Apify account using your email.
  2. Open Website Email Extractor & Contact Scraper and go to the Input tab.
  3. Add your URLs — one domain per entry. Duplicates are handled automatically.
  4. Pick an output modeper-email for CRM import or per-domain to get everything grouped by site.
  5. Click Start — the Actor automatically discovers contact pages and crawls up to the configured depth.
  6. Download your data as JSON, CSV, Excel, XML, or HTML, or connect via API.
{
"urls": [
{ "url": "https://company1.com" },
{ "url": "https://company2.com" },
{ "url": "https://company3.com" }
],
"contactPagesOnly": true,
"outputMode": "per-domain"
}

How much does it cost to scrape emails from websites?

Website Email Extractor & Contact Scraper uses the pay-per-event (PPE) pricing model — no subscription, no monthly fee. You pay only for what the Actor actually does. Check the Pricing tab for the full event list.

There are two billable events:

EventPriceWhen it fires
domain-processed$0.01Once per domain, when the first page loads successfully. Does not fire if all pages are blocked (status: "blocked") or the site is a JS-only SPA (status: "js-only").
email-found$0.004Once per unique email found. Does not fire if no emails are found.

Estimated cost by batch size (assuming ~2 emails per domain on average):

DomainsEmails foundEstimated cost
10~20~$0.18
50~100~$0.90
100~200~$1.80
500~1,000~$9.00
1,000~2,000~$18.00

You are not charged for sites that cannot be scraped. Domains that require residential proxies may incur additional platform proxy usage costs.

To control costs, use maxEmailsPerDomain to cap emails per site and maxPagesPerDomain to limit the number of pages crawled per domain.


⚙️ Input parameters

ParameterTypeDefaultDescription
urlsarrayrequiredWebsite URLs to crawl
outputModestringper-emailper-email: one row per email (includes pageTitle + pageDescription) · per-domain: all contacts grouped
maxEmailsPerDomaininteger0Global email cap per domain — cost control (0 = unlimited)
maxPagesPerDomaininteger0Max pages to crawl per domain — cost control (0 = unlimited)
crawlDepthinteger2How deep to follow links (1–5)
contactPagesOnlybooleantrueOnly visit contact-related pages (faster, cheaper)
extractPhonesbooleantrueExtract phone numbers
extractSocialsbooleantrueExtract 14 social profiles
extractAddressbooleantrueExtract physical address via Schema.org
validateEmailsbooleanfalseDNS MX check — filters dead email domains
includeDebugInfobooleanfalseAdd debugInfo array to output for troubleshooting
proxyConfigurationobjectApify ProxyPass null for direct mode (no proxy)

For the full input reference, see the Input tab.


📊 Output examples

outputMode: "per-email" — one row per email (CRM-ready)

Best for importing directly into HubSpot, Salesforce, Apollo, or any sequencer. Every row includes the email, which page it came from, company name, address, phones, and social profiles.

{
"sourceUrl": "https://acme.com",
"domain": "acme.com",
"companyName": "Acme Corp",
"address": "123 Main St, San Francisco, CA 94105, US",
"pageUrl": "https://acme.com/contact",
"pageTitle": "Contact Us — Acme Corp",
"pageDescription": "Get in touch with our sales and support teams.",
"email": "sales@acme.com",
"phones": ["+1-555-0123"],
"possiblePhones": [],
"socials": {
"linkedin": "https://linkedin.com/company/acme",
"twitter": "https://x.com/acmecorp",
"instagram": null,
"facebook": "https://facebook.com/acmecorp",
"youtube": null,
"tiktok": null,
"github": null,
"whatsapp": "https://wa.me/15550123",
"telegram": null,
"discord": null,
"pinterest": null,
"snapchat": null,
"reddit": null,
"threads": null
},
"scrapedAt": "2026-06-04T10:00:00.000Z"
}

outputMode: "per-domain" — all contacts grouped

One row per domain with all emails, phones, address, company name, and socials found across every page visited.

{
"sourceUrl": "https://acme.com",
"domain": "acme.com",
"companyName": "Acme Corp",
"address": "123 Main St, San Francisco, CA 94105, US",
"emails": ["sales@acme.com", "info@acme.com", "support@acme.com"],
"phones": ["+1-555-0123", "+1-555-9876"],
"possiblePhones": ["(800) 555-9876"],
"socials": {
"linkedin": "https://linkedin.com/company/acme",
"twitter": "https://x.com/acmecorp",
"instagram": null,
"facebook": "https://facebook.com/acmecorp",
"youtube": null,
"tiktok": null,
"github": null,
"whatsapp": "https://wa.me/15550123",
"telegram": null,
"discord": null,
"pinterest": null,
"snapchat": null,
"reddit": null,
"threads": null
},
"pagesScanned": 3,
"status": "success",
"scrapedAt": "2026-06-04T10:00:00.000Z"
}

The status field tells you what happened per domain:

ValueMeaning
successContacts found, no pages were blocked
partialContacts found, but some pages were blocked by bot protection
emptyCrawled OK but no contacts found (contact form only, or genuinely no public email)
blockedAll pages were blocked — no data collected
js-onlySite renders content via JavaScript (SPA/React/Vue) — no static HTML contact data found

You can download the dataset as JSON, CSV, Excel, XML, or HTML from the dataset view.


🤔 Which output mode should I use?

Use per-email if you are:

  • Importing contacts into a CRM (HubSpot, Salesforce, Apollo, Instantly)
  • Running an email outreach sequence
  • Working with tools that expect one row = one contact

Every row has the email, the page it came from (pageUrl, pageTitle, pageDescription), and all the domain's phones and social profiles attached. If a domain has 3 emails, you get 3 rows — one per contact, ready to import.

Use per-domain if you are:

  • Building a spreadsheet or report where the company is the unit
  • Enriching an existing account list (you already have the company, you want to fill in missing fields)
  • Running market research or competitive analysis across many domains

Every row has all emails as an array, all phones, and all socials grouped under one domain. One domain = one row, no matter how many emails were found.

per-emailper-domain
Row unitOne emailOne domain
CRM import✅ Direct❌ Needs processing
Spreadsheet analysis⚠️ Repeated rows per domain✅ Clean
pageTitle / pageDescription✅ Yes❌ No
Multiple emails per domainMultiple rowsSingle row, array

💡 Use cases for website contact scraping

B2B sales prospecting — Turn a list of target domains into a contact file ready to import, with email, phone, LinkedIn, and company address in every row.

Agency lead generation — Find contacts at target companies by category and city, at scale.

CRM enrichment — Fill missing email, phone, address, and social fields for existing accounts in bulk.

Recruiting — Collect contact info from company career and team pages.

Partnership outreach — Extract contacts from potential partners, resellers, or integration targets.

Competitor research — Map the social media presence and contact points of competitors.


🔗 Integrations

You can integrate Website Email Extractor & Contact Scraper with almost any cloud service or web app. The Apify platform has built-in integrations, a full REST API, scheduling, and webhook support.

  • Make / Zapier — trigger workflows when new contacts are found
  • Google Sheets — direct dataset export
  • HubSpot / Salesforce / Apollo — import CSV or use the API
  • Webhooks — get notified when a run completes
  • Apify APIapify-client for Node.js and Python
  • MCP Server — use this Actor directly inside Claude or any MCP-compatible client

❓ Frequently asked questions

Does Website Email Extractor & Contact Scraper work on all websites?

It works on most contact, about, and team pages since these are almost always static HTML. For sites that require JavaScript to render content, the Actor detects this and marks the domain as status: "js-only" in the output.

Why didn't it find emails on a specific site?

The most common causes are: emails only visible after a form submission, domain blocking datacenter IPs, or a JavaScript-rendered site. Check the status field in per-domain mode — blocked means IPs were rejected, js-only means the site requires a browser. Enable includeDebugInfo: true in the input to get detailed reason codes in the output.

What is possiblePhones?

possiblePhones contains phone numbers extracted from visible page text via regex — lower confidence than phones, which come from tel: href links. Numbers in possiblePhones may include false positives like order IDs or dates. Use phones for outreach and possiblePhones as a fallback.

How does address extraction work?

The Actor looks for Schema.org PostalAddress data in JSON-LD blocks (the structured data search engines use). If not found, it falls back to HTML microdata (itemprop="streetAddress"). Sites that don't publish structured data will return address: null. You can disable extraction with extractAddress: false.

How do I extract emails from multiple websites at once?

Add all your URLs to the urls array. Each domain is processed independently and results are deduplicated automatically.

Can I use Website Email Extractor & Contact Scraper with the Apify API?

Yes. The Apify API lets you run the Actor, retrieve datasets, schedule runs, and set up webhooks. Use the apify-client package for Node.js or Python. See the API tab for the full reference.

Scraping publicly available contact information is generally legal, but you should check compliance with GDPR, CAN-SPAM, and the terms of service of each website before using the data for outreach.

What does email validation do?

When validateEmails: true, each email domain is checked for a valid MX record via DNS. Domains without one are discarded, which filters out dead domains and placeholder addresses. This adds ~100ms per unique email domain.


Your feedback

If you found a bug or have a feature request, please create an issue in the Issues tab.


You might also like

Apify Store Scraper — scrapes all 26,000+ Actors on the Apify Store. Useful for market research and competitor tracking.