Website Email & Contact Scraper - Find Emails, Phones & Socials avatar

Website Email & Contact Scraper - Find Emails, Phones & Socials

Pricing

from $4.00 / 1,000 results

Go to Apify Store
Website Email & Contact Scraper - Find Emails, Phones & Socials

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

Anas Nadeem

Maintained by Community

Actor stats

0

Bookmarked

12

Total users

6

Monthly active users

4 days ago

Last modified

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 maxDepth and maxPages to keep spend predictable
  • include/exclude URL globs for crawl control

Input

Core fields:

  • startUrls (required)
  • mode (full | emails_only)
  • crawlerType (http | browser)
  • maxPages, maxDepth
  • sameDomainOnly, includeSubdomains
  • includeUrlGlobs, excludeUrlGlobs
  • extractEmails, 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)
```bash
curl -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 ApifyClient
client = 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:

  1. Google Maps scraper → extracts business website URLs
  2. This actor (website-link-scraper) → crawls each site for emails, phones, socials
  3. MillionVerifier or NeverBounce API → validates emails before sending
  4. 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 install
npm run build
npm run dev
npm 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: true for 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.