Pricing
$3.00 / 1,000 result items
Website Contact & Email Scraper
Extract emails, phone numbers and social links from any list of websites โ with contact-page crawling and email validation. Bulk B2B lead enrichment, pay per result.
Pricing
$3.00 / 1,000 result items
Rating
0.0
(0)
Developer
Actor stats
0
Bookmarked
2
Total users
0
Monthly active users
8 days ago
Last modified
Categories
Share
Extract emails, phone numbers and social links from any list of websites โ with contact-page crawling, a JS-render fallback for SPA sites, and email validation. Built for bulk B2B lead enrichment. Pay per result.
What it does
Give it a list of websites (plain URLs, bare domains, or objects with a
url/website field). For each site it:
- Fetches the homepage.
- Optionally crawls common contact pages (
/contact,/contact-us,/about,/about-us). - Extracts every email, phone number and social profile โ LinkedIn, Facebook,
Twitter/X, Instagram, YouTube, TikTok, Telegram, WhatsApp, GitHub and
Pinterest โ from
mailto:/tel:links, visible text, and inline JSON/JSON-LD (many sites only ship their socials inside a Next.js data blob, which an anchor-only scraper misses). - Validates each email (syntax), tags role (
info@,sales@) andno-replyaddresses, and can drop them on request. - JS-render fallback: when a homepage is an empty single-page-app shell, it re-fetches with a full browser profile to recover contacts the plain crawler would miss.
One row is pushed per website โ pay-per-result ready, export to CSV/JSON/Excel.
Input
| Field | Type | Default | Description |
|---|---|---|---|
startUrls | array (required) | โ | Websites to scrape. URLs, bare domains, or { url } objects. |
crawlContactPages | boolean | true | Also fetch contact/about pages. |
contactPaths | array | /contact, /contact-us, /about, /about-us | Extra relative paths to probe. |
dropRoleEmails | boolean | false | Exclude role + no-reply addresses, keep personal only. |
renderJs | boolean | true | Browser-profile retry for JS-rendered/SPA homepages. |
maxConcurrency | integer | 10 | Sites crawled in parallel. |
requestTimeoutSecs | integer | 20 | Per-page fetch timeout. |
proxyConfiguration | object | Apify Proxy | Outbound proxy. |
Output (one row per site)
{"website":"https://acme.com","domain":"acme.com","emails":["jane@acme.com","info@acme.com"],"emailDetails":[{"email":"jane@acme.com","type":"personal","valid":true},{"email":"info@acme.com","type":"role","valid":true}],"phones":["+15125550123"],"linkedin":"https://linkedin.com/company/acme","facebook":null,"twitter":"https://x.com/acme","instagram":null,"youtube":"https://www.youtube.com/acme","tiktok":null,"telegram":null,"whatsapp":null,"github":null,"pinterest":null,"hasEmail":true,"hasPhone":true,"emailCount":2,"phoneCount":1,"pagesScanned":3,"jsFallbackUsed":false,"status":"scraped","error":null,"scrapedAt":"2026-06-20T00:00:00.000Z"}
status is one of scraped, no_contacts_found, unreachable, error โ so a
single bad site never breaks the run.
Notes on accuracy
Social detection is host-anchored (parses each link's host) rather than naive
substring matching, so a URL like measure-ux.com is never mis-tagged as Twitter/X
โ a class of false positive that simple .includes("x.com") scrapers produce.
The biggest entrenched incumbent in this category is very strong (15+ platforms,
optional paid email verification); this actor is the cheaper, no-add-on option with
solid 10-platform coverage, the JSON-blob fallback above, and per-email role/no-reply
typing for clean segmentation.
