Website Contact Scraper: Emails, Phones & Socials
Pricing
from $3.00 / 1,000 website with contacts
Website Contact Scraper: Emails, Phones & Socials
Turn a list of websites into a ready-to-use lead list: emails, phone numbers, LinkedIn, X, Facebook, Instagram and more, one clean row per site. Checks the homepage plus contact, about, team and impressum pages. Fast plain-HTTP crawl, and you only pay for sites where contacts are found.
Pricing
from $3.00 / 1,000 website with contacts
Rating
0.0
(0)
Developer
Omar Prime
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Paste a list of websites, get back a clean lead list: one row per website with every email address, phone number and social profile the site publishes, plus the company name.
You only pay for websites where at least one contact was found. Dead domains, blocked sites and pages with nothing on them cost you nothing.
What it does
For every website you give it, the scraper:
- Opens the homepage.
- Finds the pages most likely to hold contact details, such as Contact, About, Team, Impressum/Imprint, Support and Privacy, including common non-English slugs like kontakt, contacto, mentions légales or über uns. It checks up to 5 of them by default, and you can raise that to 20.
- Extracts and de-duplicates:
- Emails: from
mailto:links, page text, structured data (JSON-LD), Cloudflare-protected addresses and simple obfuscations likeinfo [at] acme [dot] com. Junk is removed: image names likelogo@2x.png, placeholder addresses likeyou@example.com, and tracking addresses like Sentry/Wix. Addresses on the site's own domain are listed first. - Phone numbers:
tel:links first, then structured data, then a careful text match that only accepts phone-shaped numbers next to words like "phone" or "call". Trademark numbers, dates and IDs are skipped. - Social profiles: LinkedIn, X/Twitter, Facebook, Instagram, YouTube, TikTok, GitHub and Pinterest, each in its own column. When several accounts appear, the company's own account is chosen, not a share button or a partner's page. Threads, Bluesky, Discord, Telegram, Reddit, Medium, Yelp, Crunchbase, WhatsApp and others go into
other_socials. - Company name, taken from the site's
og:site_name, or else the part of the page title that matches the domain.
- Emails: from
- Writes one row per website, ready for a spreadsheet, CRM import or outreach tool.
It uses fast, plain HTTP requests: no browser and no proxies. That makes it cheap and quick, with about 10 sites processed in parallel and hundreds of sites per minute. Sites that refuse automated visitors (HTTP 403) are skipped politely and marked blocked, and they are free.
Use cases
- Lead generation: turn a list of company domains from Google Maps, a trade-show list, a directory or a CSV export into emails, phone numbers and LinkedIn pages.
- Enrich your CRM: fill in missing phone numbers and social profiles for accounts you already have.
- Agency prospecting: build outreach lists of local businesses such as plumbers, restaurants, dentists and shops in any niche.
- Partnership and PR outreach: find the
press@,partners@orhello@address for a list of brands. - Market research: see which competitors are active on which social networks.
- Data cleaning: check which domains in a list are still alive.
Input
| Field | What it is | Default |
|---|---|---|
websites | Website URLs or bare domains. Duplicates are removed. | ["https://apify.com", "https://stripe.com"] |
maxPagesPerSite | Extra pages to check per site besides the homepage (0–20). | 5 |
maxConcurrency | Websites processed in parallel (1–50). | 10 |
{"websites": ["https://apify.com", "stripe.com", "saddlebackleather.com", "www.hetzner.com"],"maxPagesPerSite": 5}
Output
One row per website. Example (real output, trimmed):
{"url": "https://saddlebackleather.com/","domain": "saddlebackleather.com","company_name": "Saddleback Leather Co.","emails": ["ihaveaquestion@saddlebackleather.com", "corporate@saddlebackleather.com"],"phones": ["817-402-4550"],"linkedin": "https://www.linkedin.com/company/saddleback-leather-co.","twitter": "https://x.com/saddlebackbags","facebook": "https://www.facebook.com/saddlebackleather","instagram": "https://www.instagram.com/saddlebackleather","youtube": "https://www.youtube.com/user/saddlebackLeather","tiktok": null,"github": null,"pinterest": "https://www.pinterest.com/saddlebackbags","other_socials": [],"pages_scanned": ["https://saddlebackleather.com/","https://saddlebackleather.com/contact-us/","https://saddlebackleather.com/faq-common-questions/","https://saddlebackleather.com/privacy"],"status": "ok","error": null}
| Field | Description |
|---|---|
url | Final homepage URL, after redirects |
domain | Domain without www. |
company_name | Brand or company name |
emails | All unique emails, with the site's own domain first |
phones | Unique phone numbers, in the format the site uses |
linkedin, twitter, facebook, instagram, youtube, tiktok, github, pinterest | The company's profile URL on each network, or null |
other_socials | Other profiles: Threads, Bluesky, Discord, Telegram, Reddit, Medium, Yelp, Crunchbase, WhatsApp, Vimeo and more |
pages_scanned | Every page that was checked |
status | ok (contacts found), no_contacts, blocked (site refused access) or error (dead domain, timeout or bad URL) |
error | Why a site failed, if it did |
Download the results as CSV, Excel, JSON or HTML, or pull them through the API or into Make, Zapier, n8n or Google Sheets. A run summary is saved in the key-value store under SUMMARY.
Pricing
Simple pay-per-result pricing, per website and not per page:
| What happens | You pay |
|---|---|
| Website with at least one email, phone or social profile found | $0.003 ($3 per 1,000 websites) |
| Website with no contacts found | $0 |
| Blocked, dead or invalid website | $0 |
| Extra pages checked per site (up to 20) | $0 |
Most contact scrapers charge per page crawled. Checking the homepage plus 5 likely pages typically costs $0.01 or more per website with them, even when nothing is found. Here you pay a flat $0.003, and only when you get something.
Set a maximum cost per run in Apify Console and the scraper stops cleanly when it reaches your limit.
FAQ
How many contacts will I get? Most business websites list at least one email or social profile. Local businesses usually show a phone number, and SaaS companies usually show an email and LinkedIn/X. Results depend on what each site publishes.
Does it find personal emails of employees? It finds the addresses a website publishes, such as info@, sales@, support@ or a founder's address on the team page. It does not guess or generate email addresses.
Why is a site marked blocked? Some sites refuse automated visitors (HTTP 403). The scraper respects that and moves on. You are not charged.
Does it render JavaScript? No. It reads the HTML the server sends, which is where nearly all sites put their footer links, mailto: links and contact pages. That's why it is fast and cheap. For sites built purely in JavaScript, it also tries /contact and /about directly.
Can I pass bare domains? Yes: acme.com, www.acme.com and https://acme.com/some/page all work. If https fails, plain http is tried.
How fast is it? About 10 websites run in parallel by default. A batch of 10 sites usually finishes in under 10 seconds, and you can raise maxConcurrency for large lists.
Is it legal? It only collects contact information that businesses publish on their own public websites. You are responsible for using the data in line with the laws that apply to you, such as GDPR, CAN-SPAM and CASL, especially for cold outreach.
One row per site, or one row per email? One row per site, so your lead list stays lead-shaped. If you need one row per email, use the "unwind" option when exporting the dataset, or split the emails column in your spreadsheet.