Website Contact Scraper — Emails, Phones & Social Media
Pricing
from $4.00 / 1,000 email founds
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 days ago
Last modified
Categories
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.
What data can Website Email Extractor & Contact Scraper extract?
| Data type | Details |
|---|---|
| 📧 Email addresses | Deduplicated per domain, quality-filtered, Cloudflare obfuscation decoded, [at]/(at) obfuscation decoded, optional MX validation |
| 📞 Phone numbers | High-confidence (phones) from tel: links + lower-confidence (possiblePhones) from page text. US and international formats. |
| 🏢 Company name | Extracted from og:site_name and application-name meta tags |
| 📍 Physical address | Extracted from Schema.org PostalAddress JSON-LD or HTML microdata |
| 📄 Page context | pageTitle and pageDescription of the page where each email was found (per-email mode) |
| Company and personal profiles | |
| 🐦 Twitter / X | Brand and personal handles |
| Business and creator profiles | |
| Pages and business profiles | |
| ▶️ YouTube | Brand channels |
| 🎵 TikTok | Brand and creator profiles |
| 💻 GitHub | Organization profiles, user profiles, and repositories |
| Business numbers, direct links, and WhatsApp Channels | |
| ✈️ Telegram | Channels, groups, and user profiles |
| 🎮 Discord | Server invite links |
| Brand profiles | |
| 👻 Snapchat | Public profiles |
| 🧵 Threads | Public profiles |
| Subreddits 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.
| Feature | This Actor | Email-only scrapers | $10–$20/mo scrapers |
|---|---|---|---|
| Email addresses | ✅ | ✅ | ✅ |
| Phone numbers | ✅ | ❌ | ✅ |
| 14 social platforms | ✅ | ❌ | ✅ |
| Company name | ✅ | ❌ | ❌ |
| Physical address | ✅ | ❌ | ❌ |
| Page title & description | ✅ | ❌ | ❌ |
| Email domain validation | ✅ | ❌ | Paid 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
- Create a free Apify account using your email.
- Open Website Email Extractor & Contact Scraper and go to the Input tab.
- Add your URLs — one domain per entry. Duplicates are handled automatically.
- Pick an output mode —
per-emailfor CRM import orper-domainto get everything grouped by site. - Click Start — the Actor automatically discovers contact pages and crawls up to the configured depth.
- 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:
| Event | Price | When it fires |
|---|---|---|
domain-processed | $0.01 | Once 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.004 | Once per unique email found. Does not fire if no emails are found. |
Estimated cost by batch size (assuming ~2 emails per domain on average):
| Domains | Emails found | Estimated 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
| Parameter | Type | Default | Description |
|---|---|---|---|
urls | array | required | Website URLs to crawl |
outputMode | string | per-email | per-email: one row per email (includes pageTitle + pageDescription) · per-domain: all contacts grouped |
maxEmailsPerDomain | integer | 0 | Global email cap per domain — cost control (0 = unlimited) |
maxPagesPerDomain | integer | 0 | Max pages to crawl per domain — cost control (0 = unlimited) |
crawlDepth | integer | 2 | How deep to follow links (1–5) |
contactPagesOnly | boolean | true | Only visit contact-related pages (faster, cheaper) |
extractPhones | boolean | true | Extract phone numbers |
extractSocials | boolean | true | Extract 14 social profiles |
extractAddress | boolean | true | Extract physical address via Schema.org |
validateEmails | boolean | false | DNS MX check — filters dead email domains |
includeDebugInfo | boolean | false | Add debugInfo array to output for troubleshooting |
proxyConfiguration | object | Apify Proxy | Pass 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:
| Value | Meaning |
|---|---|
success | Contacts found, no pages were blocked |
partial | Contacts found, but some pages were blocked by bot protection |
empty | Crawled OK but no contacts found (contact form only, or genuinely no public email) |
blocked | All pages were blocked — no data collected |
js-only | Site 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-email | per-domain | |
|---|---|---|
| Row unit | One email | One domain |
| CRM import | ✅ Direct | ❌ Needs processing |
| Spreadsheet analysis | ⚠️ Repeated rows per domain | ✅ Clean |
pageTitle / pageDescription | ✅ Yes | ❌ No |
| Multiple emails per domain | Multiple rows | Single 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 API —
apify-clientfor 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.
Is it legal to scrape contact information from websites?
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.