Website Email & Contact Scraper - Find Emails, Phones & Socials
Pricing
from $4.00 / 1,000 results
Website Email & Contact Scraper - Find Emails, Phones & Socials
Feed any list of website URLs and get clean CSV/JSON of public emails, phone numbers, and social links from each contact page. Skip the $1,250/mo ZoomInfo bills and 50% bounce rates
Pricing
from $4.00 / 1,000 results
Rating
0.0
(0)
Developer
Anas Nadeem
Maintained by CommunityActor stats
0
Bookmarked
12
Total users
6
Monthly active users
4 days ago
Last modified
Categories
Share
Website Email & Contact Scraper — Find Emails, Phones, Socials (CSV)
Skip ZoomInfo's $15K/year subscription. Feed any list of website URLs to this actor and get clean CSV/JSON of public emails, phone numbers, and social profile links — pulled from each site's contact page. Built for cold-email teams, lead-gen agencies, and bulk-prospecting workflows that need real contact data without per-credit pricing or 50% bounce rates.
Why this scraper, not Hunter.io or Apollo? Hunter.io charges $49/mo for 2,000 lookups by domain — and only finds emails, not phones or socials. Apollo's per-credit pricing burns through monthly limits in two weeks of multi-vertical prospecting. This actor takes any list of website URLs (1 or 10,000), crawls each site's pages, and returns every public email, phone, and social link found — at $0.004/row, no monthly minimum, no credit system.
Pricing: $0.004 per page-row in full mode or $0.004 per unique email in emails_only mode. Example: a 1,000-domain crawl with avg 5 pages each = ~5,000 rows = $20. Compare to Hunter.io's $49/mo for 2,000 lookups, ZoomInfo's $1,250/mo, Apollo's $49+/mo.
Who is this scraper for?
- Cold-email agencies replacing ZoomInfo — Canceled a $15K/year ZoomInfo subscription and built your own pipeline? Feed the domain list to this actor and get fresh, live-extracted contacts at a fraction of the cost (r/Entrepreneur).
- Sales reps doing manual contact-page lookups — "open website → scroll → contact page → copy email → repeat 300 times." This actor automates that exact loop across any number of domains (r/SaaS).
- GTM engineers building n8n + email-finder pipelines — Wire this actor into an n8n or Make.com workflow after a Google Maps or LinkedIn scrape to hydrate each result with direct-site contact data (r/automation).
- microSaaS founders building lead-gen products on Apify — Build a full lead gen pipeline across 4 platforms (Google Maps, Yellow Pages, BBB, email finder) — all on Apify (r/microsaas).
- Sourcing and recruiting teams enriching CRM lists — Bulk-crawl company websites to surface direct email formats, LinkedIn handles, and Twitter/X profiles for candidate outreach.
Why this Actor
- HTTP-first crawling (
crawlerType: "http") for cheaper runs - optional browser mode (
crawlerType: "browser") for JS-heavy pages - shallow crawling with
maxDepthandmaxPagesto keep spend predictable - include/exclude URL globs for crawl control
Input
Core fields:
startUrls(required)mode(full|emails_only)crawlerType(http|browser)maxPages,maxDepthsameDomainOnly,includeSubdomainsincludeUrlGlobs,excludeUrlGlobsextractEmails,extractPhones,extractSocial,extractImages,extractFiles,extractLinks
See .actor/input_schema.json for the full schema.
Output examples
Full mode row
{"recordType": "page","seedUrl": "https://example.com/","pageUrl": "https://example.com/contact","depth": 1,"statusCode": 200,"title": "Contact","emails": ["hello@example.com"],"phoneNumbers": ["+12025550123"],"socialLinks": {"linkedin": [],"x": [],"facebook": [],"instagram": [],"youtube": [],"tiktok": [],"threads": [],"telegram": [],"whatsapp": [],"discord": [],"pinterest": [],"reddit": [],"github": []},"internalLinks": [],"externalLinks": [],"images": [],"files": [],"counts": {"emails": 1,"phoneNumbers": 1,"socialLinks": 0,"internalLinks": 0,"externalLinks": 0,"images": 0,"files": 0}}
Emails-only row
{"recordType": "email","seedUrl": "https://example.com/","url": "https://example.com/contact","email": "hello@example.com","depth": 1,"statusCode": 200}### Seed summary row```json{"recordType": "seed_summary","seedUrl": "https://example.com/","mode": "full","crawlerType": "http","pagesCrawled": 14,"failedRequests": 1,"uniqueEmails": 6,"statusCodeHistogram": {"200": 13,"404": 1},"totals": {"emails": 9,"phoneNumbers": 4,"socialLinks": 11,"internalLinks": 173,"externalLinks": 42,"images": 88,"files": 7}}
Run summary row
{"recordType": "run_summary","mode": "full","crawlerType": "http","seedsTotal": 3,"pagesCrawled": 39,"failedRequests": 2,"uniqueEmails": 15,"totals": {"emails": 24,"phoneNumbers": 11,"socialLinks": 29,"internalLinks": 513,"externalLinks": 126,"images": 244,"files": 19},"durationMs": 5841}
## Integrations & Code Examples### bash (curl)```bashcurl -X POST \"https://api.apify.com/v2/acts/whoareyouanas~website-link-scraper/run-sync-get-dataset-items" \-H "Authorization: Bearer YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"startUrls":[{"url":"https://example.com"},{"url":"https://acme.com"},{"url":"https://startup.io"}],"mode":"emails_only","maxPages":5}'
Python SDK
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("whoareyouanas/website-link-scraper").call(run_input={"startUrls": [{"url": "https://example.com"}],"mode": "emails_only","maxPages": 5,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item.get("email"))
Node.js SDK
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('whoareyouanas/website-link-scraper').call({startUrls: [{ url: 'https://example.com' }],mode: 'emails_only',maxPages: 5,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.map(i => i.email));
n8n / Make.com pipeline recipe
4-step lead-gen pipeline:
- Google Maps scraper → extracts business website URLs
- This actor (
website-link-scraper) → crawls each site for emails, phones, socials - MillionVerifier or NeverBounce API → validates emails before sending
- Instantly / Smartlead → pushes verified contacts to cold-email campaign
Use the Apify node in n8n and connect the output directly to an email-verification step. Full integration docs: Apify integrations.
Local development
npm installnpm run buildnpm run devnpm test
Frequently Asked Questions (FAQ)
Does this work on JS-heavy sites (React, Vue, Next.js)?
Yes. Set crawlerType: "browser" to switch from the default HTTP crawler to a full Chromium browser. HTTP mode is faster and cheaper; browser mode handles sites that load content via client-side JavaScript.
How fast is bulk extraction? HTTP mode runs 25 concurrent requests by default. On a 1,000-domain list with avg 3 pages each, expect ~5 minutes per run at default settings.
Will sites block me?
The HTTP-first crawler sends standard User-Agent headers and is fast enough to stay under most rate limits. For sites that enforce Cloudflare or similar bot protection, use Apify proxy (proxyConfiguration: { useApifyProxy: true }) or switch to browser mode.
Does this validate emails? No — extraction only. The actor finds any string matching an email pattern on each page; it does not ping SMTP or run deliverability checks. Pair with MillionVerifier or NeverBounce in your pipeline to cut bounce rates before sending.
Is this CAN-SPAM / GDPR compliant? Extracting publicly available contact information from a website is generally legal in most jurisdictions. Sending marketing email to extracted addresses is your responsibility — follow CAN-SPAM (US) and GDPR (EU) requirements.
How is this different from ZoomInfo / Apollo / Hunter.io? ZoomInfo and Apollo are pre-built databases — they're expensive ($49–$1,250+/mo) and reflect data that was last crawled months ago. Hunter.io is per-domain-lookup and email-only. This actor crawls the live site right now and returns whatever public contact information is on the page — phones, socials, and emails — at $0.004/row with no monthly minimum.
Can I exclude specific URL patterns?
Yes. Use excludeUrlGlobs: ["**/blog/**", "**/news/**"] to skip sections of the site you don't need.
Can I scrape only contact pages?
Yes. Use includeUrlGlobs: ["**/contact**", "**/about**", "**/team**"] to restrict crawling to those paths. This dramatically reduces cost on large sites.
Notes
- Invalid start URLs are skipped with a warning.
- 4xx/5xx pages may produce no data but do not crash the whole run.
- Use
sameDomainOnly: truefor cost-efficient, controlled crawls.
Was this scraper useful?
If this actor saved you time on lead extraction or email prospecting, please leave a review on the Apify Store. Reviews are the single biggest visibility lever in the Apify Store.