Website Contact Scraper - Emails, Phones & Socials
Pricing
from $0.03 / 1,000 results
Website Contact Scraper - Emails, Phones & Socials
💰From $0.025/1K results | Extract public contact details from any list of websites. Finds emails, international phone numbers and LinkedIn, X, Facebook, Instagram, YouTube, TikTok and GitHub profiles by reading the pages that actually carry them - contact, about, team and imprint.
Pricing
from $0.03 / 1,000 results
Rating
0.0
(0)
Developer
Mary Lou
Maintained by CommunityActor stats
3
Bookmarked
10
Total users
5
Monthly active users
a day ago
Last modified
Categories
Share
Website Contact Scraper — emails, phone numbers and social profiles
Give it a list of websites. Get back the email addresses, phone numbers and social media profiles those companies publish — ready for your CRM, your outreach list or your enrichment pipeline.
An email scraper, phone number extractor and social profile finder in one, and it is built around precision: the hard part of contact scraping is not finding strings that look like emails, it is not returning the junk.
No login, no API key, no browser. Paste domains and press Start.
What you can do with it
- B2B lead generation — turn a list of company domains into contactable leads
- CRM enrichment — fill in missing contact details for accounts you already have
- Sales prospecting — take a list from any source and get the contact layer
- Recruitment outreach — find how to reach the companies you are targeting
- Agency and partner research — build a contact sheet for a whole market
- Data cleaning — re-check a stale contact list and see what has changed
- Pair it with a search or jobs scraper — collect domains there, contacts here
How to scrape contact details
1. Paste your websites into Websites, one per line. https:// is
optional — example.com works. So does a row pasted from a spreadsheet, an
email address (info@acme.com reads acme.com), or a company name with no
website (Gymshark is tried as gymshark.com, and the log says so).
2. Press Start. Every other field has a sensible default.
A list of 500 domains at default settings takes a few minutes.
It reads the right pages, not every page
A contact scraper that spiders an entire website burns a hundred requests to find an address that was in the footer of the homepage. This one scores every internal link and visits only the pages that actually carry contact details, shallowest first:
| Priority | Page types |
|---|---|
| Highest | /contact, /contact-us, /kontakt, /contacto, /contatti |
/impressum, /imprint, /legal-notice, /mentions-legales | |
/about, /about-us, /company, /quienes-somos, /ueber-uns, /over-ons | |
/team, /people, /staff, /leadership, /management | |
/support, /help, /customer-service | |
| Lowest | /press, /media, /newsroom, /privacy, /datenschutz |
Default is 8 pages per site, which finds almost everything. Raise Max pages per site for sprawling corporate sites.
Multi-language page names are recognised, so German, French, Spanish, Italian and Dutch sites work as well as English ones.
A site that will not load gets a second try
On a real list of domains, some sites will not load the first time. Before one is reported as failed, it is tried once more, in a way that matches what went wrong:
| What went wrong | The second try |
|---|---|
| The domain does not resolve | The other spelling: www.acme.com for acme.com, and back |
| Certificate expired, or issued for another name | www., then with certificate checks off, then plain http:// |
| Connection refused on https | Plain http://, then www. |
| Timed out | A longer timeout, then http:// |
| 403, 429 or a bot check page: the site refused the scraper | Another browser's fingerprint, through Apify's proxy when the run had none |
| The page given is gone (404) | The site's home page |
| The proxy would not connect | Without the proxy |
A start page that redirects to another domain has usually moved, so the new
address is read: cocacola.com reads coca-cola.com. The exceptions are a
domain-parking or for-sale page and a sign-in page. A domain that redirects to
its Facebook or Instagram page is delivered with that profile as its contact.
No run fails because of the list. A site that still cannot be read costs only itself: it is listed in the run summary with the reason, and it is not charged. An empty list, or one where no site loads at all, ends the run normally, and the status message says why.
Input
| Field | What it does |
|---|---|
| Websites | The domains to scan, one per line. Links, bare domains, email addresses and company names all work |
| Max pages per site | How deep to go on each site. Default 8 |
| Max results | Hard cap on how many websites are delivered |
| Skip sites with no contacts | Leave empty sites out of the dataset entirely |
| Max concurrency | How many sites to scan at once. Default 5 |
| Delay between pages | Politeness pause within a single site |
| Proxy | Optional. Most sites serve their contact page to anyone |
Output
One row per website. Export as JSON, CSV, Excel, XML or RSS.
{"url": "https://apify.com/","domain": "apify.com","emails": ["hello@apify.com", "privacy@apify.com"],"phones": ["+14242545300"],"socials": ["https://linkedin.com/company/apify","https://x.com/apify","https://youtube.com/c/Apify","https://github.com/apify"],"socials_by_network": { "linkedin": ["https://linkedin.com/company/apify"] },"has_contact": true,"pages_crawled": 4,"pages": ["https://apify.com/", "https://apify.com/contact"],"errors": []}
| Field | Notes |
|---|---|
domain | Lowercased, no www.. This is the dedup key — one row per domain |
emails | Deduplicated and validated. See the filtering below |
phones | E.164-style digits, from tel: links and page text |
socials | Canonical profile URLs, one entry per profile |
socials_by_network | The same profiles grouped, for when you only want the LinkedIn |
has_contact | False when the site yielded nothing at all |
pages | Exactly which URLs were read, so any result traces back to its source |
errors | Pages that could not be read, with the reason |
Networks covered: LinkedIn, X/Twitter, Facebook, Instagram, YouTube, TikTok, GitHub.
What makes the output usable
Most contact scrapers hand you a pile of junk to clean up. Every rule below exists because a real page produced a real false positive:
Not emails:
icon@2x.png,font@latin.woff2— sprite and asset filenames parse as addresses- Sentry DSNs — every site using Sentry has one whose userinfo looks like an email
you@example.com,name@domain.com— template placeholders...our service@scale.while others...— prose running into an address. Caught by validating the top-level domain against reality rather than trusting the regex
Not phone numbers: years, prices, VAT numbers, product SKUs and timestamps.
A number has to be 8–15 digits after normalisation and not be 0000000000.
Not four copies of one profile. Social links arrive escaped inside
JavaScript and JSON (...\/company\/acme\\) and with punctuation stuck to them
from surrounding prose. Every link is unescaped and canonicalised — apify.com
alone produced six spellings of the same LinkedIn page before this was fixed.
The same goes for a network's mobile and country hosts (m.facebook.com,
uk.linkedin.com) and a YouTube channel's tabs (/videos, /featured).
Not the site it redirected to. A link on a company's own page can redirect anywhere. A naive crawler follows it and quietly returns Google's contact details instead of the company's. Only the start page may move the crawl to a new domain, because then the company itself has moved.
Not third parties quoted in a blog post. The crawler stays on pages about the company itself, so a competitor mentioned in an article does not end up in your row.
Not a bot check page. Some sites answer a scraper with a challenge instead of the site: "Access Denied", or "verify that you're not a robot". A naive crawler delivers that as a company with no contact details, and you pay for the row. Checks from Cloudflare, Akamai, AWS WAF, DataDome, PerimeterX, Imperva, Kasada, SiteGround, Sucuri and Wordfence are recognised, and so is a near-blank page that talks about robots or verification. The same goes for a site whose contact page is walled or refused while its home page loads: with nothing found, "no contacts" would not be the truth. The site gets its second try, and if it is still walled it is reported as failed and not charged. Ordinary pages that merely carry those vendors' scripts are told apart by their content.
Not a "Redirecting..." page. Some sites send visitors on with a script or
a meta refresh. Those pages are followed to where they lead. gymshark.com
used to come back empty; it now yields its press and support addresses and
its social profiles. A language or country chooser is followed into the
site the same way: bestbuy.com now reads its contact and support pages.
Pricing
From $0.025 per 1,000 websites, plus Apify platform usage.
| Apify plan | Price per 1,000 websites |
|---|---|
| Free, Starter | $0.05 |
| Scale, Business, Enterprise | $0.025 |
Worth comparing carefully, because a result here is a whole website, not a page. The widely used alternative charges per 1,000 pages, and this crawler reads up to 8 pages per site — so on a typical site you pay a fraction of what per-page pricing costs, for the same answer.
Platform usage is billed by Apify at your own plan rate and is small here: about $0.08 per 1,000 websites measured, since no proxy is needed by default.
Two ways to keep it tight:
- Sites that could not be loaded at all, even on the second try (a dead domain, a DNS failure, a site that only ever showed a bot check), are reported as failures and are not charged as results.
- Turn on Skip sites with no contacts and you are only charged for websites that actually yielded something.
Set Max results to cap any single run exactly.
FAQ
Is scraping contact details legal?
It reads pages that companies publish deliberately, with no login and no
paywall — the same pages a person visits to find a phone number. Business
contact details are exactly what a /contact page is for. What you then do
with the data is governed by GDPR, CAN-SPAM and similar rules, and that part is
your responsibility: have a lawful basis before you email anyone.
Do I need a proxy? Usually not. Most sites serve their own contact page to anyone. Turn one on if you are scanning thousands of domains or hitting a WAF.
What happens when a site will not load?
It is tried once more at the end of the run, in a way matched to the error:
the www. spelling, plain http://, the home page, or another browser
fingerprint (see the table above). If that fails too, the site is listed in
the run summary (SUMMARY.failedSites) with the reason, and it costs nothing.
The other sites carry on either way.
I only have company names, not websites. Does it work?
Partly. A name with no website is tried as name.com
(The North Face -> thenorthface.com), and the log notes it as a guess.
That works well for brands and less well for small businesses, so give the
website itself whenever you have it. Every entry read this way is listed in
SUMMARY.readAs.
Why did a site come back empty?
Either it genuinely publishes no contact details, or they are rendered by
JavaScript, or they are inside an image to defeat scrapers. Check pages to
see what was read and errors for anything that failed. A bot check page is
never delivered as an empty row: that site is reported as failed instead, in
SUMMARY.failedSites.
Can it find personal emails of specific employees? No. It returns what a company publishes on its own website. It does not guess addresses from name patterns and it does not search anywhere else.
Does it work on non-English websites?
Yes. impressum, kontakt, contacto, contatti, over-ons,
quienes-somos and others are all recognised page names.
How many pages does it read per site? 8 by default, chosen by relevance rather than crawl order. Raise it for large corporate sites.
How fast is it? Measured: 4 sites in 5 seconds at concurrency 4, including one dead domain correctly reported as a failure.
Can I run it on a schedule? Yes. Re-check a domain list weekly and diff the results to catch changes.
Related scrapers
- LinkedIn Jobs Scraper — job postings without a login or cookie. Companies that are hiring are companies worth contacting
- Google Search Scraper — build domain lists from
site:and intent queries, then enrich them here - TikTok Ad Library Scraper, Meta Ads Library Scraper, Google Ads Transparency Center Scraper — competitor ad intelligence