Website Email Scraper & Phone Finder avatar

Website Email Scraper & Phone Finder

Pricing

from $1.99 / 1,000 results

Go to Apify Store
Website Email Scraper & Phone Finder

Website Email Scraper & Phone Finder

Website Email Scraper & Phone Finder crawls domains for emails, phone numbers and social links across Facebook, Instagram, LinkedIn, Twitter, YouTube and TikTok, with page limits and concurrency. ๐Ÿ“‡ Complete contact data enrichment.

Pricing

from $1.99 / 1,000 results

Rating

0.0

(0)

Developer

Scrapers Hub

Scrapers Hub

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

๐Ÿ“ง Website Email Scraper & Phone Finder โ€“ Contact Details, Phones & Socials From Any Domain

The website email scraper crawls a list of websites and returns the email addresses, phone numbers and social media profiles published on them, with full provenance for every contact found. Give this website email scraper and phone finder a list of domains and it visits each site, follows a configurable number of internal pages, and writes one record per domain containing the emails discovered, where each was found, any phone numbers, and social profile URLs split by network.

What separates it from a naive regex crawler is the detail it keeps. Each record carries fetchedUrls showing exactly which pages were visited, httpStatusCodes showing what each returned, emailDetails recording the source URL and inferred type of every address, and contactSignals summarising the yield. That means you can audit any contact back to the page it came from โ€” which matters both for data quality and for compliance.


๐Ÿ“Š What Data Can You Extract with This Website Email Scraper?

Each dataset item covers one input domain:

CategoryFieldsWhat you get
๐Ÿ”— Identityinput, url, domain, statusThe value you supplied, the resolved URL, the normalised domain and the outcome status for that site
๐Ÿ“ง Email dataemails, emailDetailsThe list of addresses found, plus per-address detail including source URL and inferred type
โ˜Ž๏ธ Phone dataphonesPhone numbers discovered across the crawled pages
๐ŸŒ Social profilessocialLinks, facebooks, instagrams, linkedIns, twitters, youtubes, tiktoksA combined social link map plus per-network arrays for six platforms
๐Ÿ•ท๏ธ Crawl provenancepagesFetched, fetchedUrls, httpStatusCodesHow many pages were visited, exactly which URLs, and the status code each returned
๐Ÿ“ˆ DiagnosticscontactSignals, errors, durationMsA summary of contact counts, any errors encountered, and how long the site took to process

The field that earns its place most often is emailDetails. A bare list of addresses gives you no way to distinguish a genuine contact address on a /contact page from a stray image-credit address in a footer. emailDetails records the source URL and inferred type for each, so you can rank and filter by where the address actually appeared before anything reaches an outreach tool.


๐ŸŒŸ Key Features of the Website Email Scraper & Phone Finder

FeatureDescription
๐Ÿ“‹ Bulk domain processingdomains accepts a list of website URLs or bare domains and processes the whole batch in one run
๐Ÿ•ธ๏ธ Configurable crawl depthmaxPagesPerWebsite controls how many pages per site are checked โ€” deeper crawls find more contacts but take longer
โšก High parallelismconcurrency defaults to 100 parallel websites, so large lists complete quickly
๐ŸŽฏ Three result modesresultMode returns only sites with emails, only sites with any contacts, or every site scanned including empty ones
โ˜Ž๏ธ Phone extractionextractPhones collects phone numbers alongside email addresses
๐ŸŒ Six social networksextractSocials returns Facebook, Instagram, LinkedIn, Twitter/X, YouTube and TikTok profiles in separate arrays
๐Ÿ”’ Same-domain containmentsameDomainOnly keeps the crawl on the target domain rather than wandering to external sites
๐Ÿงพ Full provenancefetchedUrls, httpStatusCodes and emailDetails let you trace every contact back to its source page
โฑ๏ธ Timeout controlrequestTimeoutSecs bounds per-request wait time so slow sites cannot stall a batch

๐Ÿš€ Why Choose This Website Email Scraper?

Provenance for every contact. Most email finders hand you an address and nothing else. This one records which URL it came from in emailDetails, which pages were visited in fetchedUrls, and what each returned in httpStatusCodes. When a prospect asks where you got their address โ€” or when you need to verify a suspicious result โ€” you have the answer.

Result modes that match how you actually work. resultMode has three settings for three genuinely different jobs. emailsOnly gives a clean outreach list. contactsOnly widens it to sites with any contact signal including phones and socials. allWebsites returns every domain scanned, including empty ones, which is what you need when the absence of a contact is itself the finding.

Genuinely fast on large lists. With concurrency defaulting to 100 parallel websites and a short requestTimeoutSecs, thousands of domains are practical in a single run. The sample record shows a three-page crawl completing in 1,431 milliseconds โ€” small sites are processed in around a second each.

Phones and socials in the same pass. Running separate tools for emails, phone numbers and social profiles means three crawls of the same sites. Here extractPhones and extractSocials are both on by default, so one crawl yields the complete contact surface.


๐Ÿ“ฅ Input

{
"domains": ["centralrestaurante.com", "alchemist.dk", "caitlinmcweeney.com"],
"maxResults": 1000,
"resultMode": "emailsOnly",
"maxPagesPerWebsite": 3,
"concurrency": 100,
"requestTimeoutSecs": 5,
"extractPhones": true,
"extractSocials": true,
"includePersonalData": true,
"sameDomainOnly": true
}

๐Ÿ”ง Website Email Scraper Input Fields

FieldTypeRequiredDefaultDescription
domainsarrayYes["centralrestaurante.com", "alchemist.dk", "caitlinmcweeney.com"]List of website URLs or domains to scan
maxResultsintegerNo1000Maximum number of saved results
resultModestringNoemailsOnlyWhich results to save. emailsOnly (only websites with emails), contactsOnly (only websites with contacts), allWebsites (all scanned websites)
maxPagesPerWebsiteintegerNo3Pages to check per website. Controls crawl depth and saved contact fields. Higher values can find more emails but increase runtime
concurrencyintegerNo100Number of parallel websites to process
requestTimeoutSecsintegerNo5Timeout for requests in seconds
extractPhonesbooleanNotrueExtract phone numbers
extractSocialsbooleanNotrueExtract social media profiles
includePersonalDatabooleanNotrueExtract personal data
sameDomainOnlybooleanNotrueRestrict crawl to the same domain

๐Ÿ’ก Input Examples

Fast, wide sweep for email addresses only:

{
"domains": ["example.com", "example.org", "example.net"],
"resultMode": "emailsOnly",
"maxPagesPerWebsite": 2,
"concurrency": 150,
"requestTimeoutSecs": 4,
"extractPhones": false,
"extractSocials": false
}

Deep contact discovery on a small, high-value list:

{
"domains": ["centralrestaurante.com", "alchemist.dk"],
"resultMode": "contactsOnly",
"maxPagesPerWebsite": 10,
"concurrency": 10,
"requestTimeoutSecs": 15
}

Full audit of every domain scanned, with personal data excluded:

{
"domains": ["example.com", "example.co.uk"],
"resultMode": "allWebsites",
"includePersonalData": false,
"sameDomainOnly": true,
"maxResults": 5000
}

๐Ÿ“ค Output

{
"input": "caitlinmcweeney.com",
"url": "https://caitlinmcweeney.com",
"domain": "caitlinmcweeney.com",
"status": "found",
"pagesFetched": 3,
"fetchedUrls": [
"https://caitlinmcweeney.com/",
"https://caitlinmcweeney.com/contact",
"https://caitlinmcweeney.com/about"
],
"emails": ["caitlin@caitlinmcweeney.com"],
"phones": [],
"facebooks": ["https://www.facebook.com/caitlinmcweeneyphotography"],
"instagrams": ["https://www.instagram.com/caitlinmcweeneyphotography/"],
"linkedIns": [],
"contactSignals": {
"emails": 1,
"phones": 0,
"socialProfiles": 2,
"pagesFetched": 3
},
"errors": [],
"durationMs": 1431
}

๐Ÿงพ Website Email Scraper Output Fields

FieldTypeDescription
inputstring | nullThe value as you supplied it in domains
urlstring | nullCanonical URL of the scraped site
domainstring | nullNormalised domain name
statusstring | nullOutcome status for this site, such as found
pagesFetchedinteger | nullNumber of pages fetched for this site
fetchedUrlsarray | nullThe exact URLs that were fetched
emailsarray | nullEmail addresses found
emailDetailsarray | nullPer-email detail including source URL and inferred type
phonesarray | nullPhone numbers found
socialLinksobject | nullCombined map of social links keyed by platform domain
facebooksarray | nullFacebook profile URLs
instagramsarray | nullInstagram profile URLs
linkedInsarray | nullLinkedIn profile URLs
twittersarray | nullTwitter/X profile URLs
youtubesarray | nullYouTube channel URLs
tiktoksarray | nullTikTok profile URLs
contactSignalsobject | nullSummary counts of emails, phones, social profiles and pages fetched
httpStatusCodesobject | nullHTTP status code returned by each fetched URL
errorsarray | nullErrors encountered while processing this site
durationMsinteger | nullProcessing time for this site in milliseconds

๐Ÿ’ป How to Use the Website Email Scraper (Step by Step)

Step 1: Assemble and clean your domain list

domains accepts either full website URLs or bare domains, so both https://example.com/about and example.com work. Cleaner input still gives cleaner output: strip tracking parameters, deduplicate, and remove obviously dead domains before running. The value you supply is echoed back in input, which makes joining results to your source list straightforward regardless of format.

Step 2: Choose a result mode

This is the most consequential input. emailsOnly โ€” the default โ€” saves only sites where an email was found, giving you a ready-to-use outreach list with no filtering. contactsOnly widens the net to any site with a contact signal, including phone-only or social-only sites. allWebsites saves every domain scanned, which is what you want for coverage auditing, because it lets you distinguish "no contact found" from "not processed".

Step 3: Set crawl depth per website

maxPagesPerWebsite defaults to 3, which typically covers a homepage plus contact and about pages โ€” exactly where contact details usually live, as the sample output shows. Increasing it to 8 or 10 finds contacts on sites that bury them deeper, at proportionally higher runtime. For very large lists, staying at 2 or 3 and re-running the misses more deeply is more efficient than deep-crawling everything.

Step 4: Tune concurrency and timeout together

concurrency defaults to 100 parallel websites and requestTimeoutSecs to 5. These interact: high concurrency with a short timeout maximises throughput but drops slow-responding sites, which then appear with errors or no contacts. For a high-value list where every domain matters, lower concurrency to 10โ€“20 and raise requestTimeoutSecs to 15. For a bulk sweep, keep the defaults.

Step 5: Decide on personal data and crawl containment

includePersonalData controls whether personal data is extracted. Where you are targeting corporate contacts only, or operating under strict privacy policy, setting it to false narrows what is collected. sameDomainOnly defaults to true and should usually stay there โ€” it prevents the crawler following external links and collecting contacts belonging to unrelated third parties.

Step 6: Run and read the diagnostics

Start the run, then examine contactSignals, pagesFetched and httpStatusCodes on a sample of records. If pagesFetched is consistently 1 while maxPagesPerWebsite is 3, the crawler is not finding internal links to follow โ€” often a sign of JavaScript-rendered navigation. Non-200 codes in httpStatusCodes explain most empty results.

Step 7: Filter with emailDetails before outreach

Export the dataset and, before anything is sent, use emailDetails to rank addresses by source. An address found on /contact is a stronger prospect than one scraped from a blog post byline. Filtering on source URL and inferred type at this stage does more for deliverability and reply rates than any amount of tweaking the crawl.


๐Ÿ”Œ API Access & Integrations

Run the website email scraper and phone finder in a single call:

curl -X POST "https://api.apify.com/v2/acts/scrapers-hub~website-email-phone-extractor/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"domains": ["centralrestaurante.com", "alchemist.dk"],
"resultMode": "emailsOnly",
"maxPagesPerWebsite": 3,
"extractPhones": true,
"extractSocials": true
}'

Python, using the official client:

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("scrapers-hub/website-email-phone-extractor").call(
run_input={
"domains": ["example.com", "example.org"],
"resultMode": "contactsOnly",
"maxPagesPerWebsite": 5,
"concurrency": 50,
"requestTimeoutSecs": 10,
}
)
for site in client.dataset(run["defaultDatasetId"]).iterate_items():
print(site["domain"], site["status"], site.get("emails"), site.get("phones"))

Results can be pushed to Zapier, Make, Google Sheets or Slack, or delivered to your own endpoint with an Apify webhook that fires when the run succeeds.


๐Ÿ’ก Best Use Cases for Website Contact Data

๐ŸŽฏ B2B lead enrichment at scale

Take the domain list from your CRM and fill the contact gaps. emails gives you addresses, phones gives sales a direct line, and linkedIns gives the company page for research. Because input is echoed back verbatim, joining enriched results to existing records needs no fuzzy matching at all.

๐Ÿฝ๏ธ Local business and hospitality outreach

The default domain list โ€” restaurants and independent studios โ€” reflects a common use case. Small businesses publish contact details openly but inconsistently, sometimes only on a contact page and sometimes only in an Instagram bio. Running with resultMode set to contactsOnly and extractSocials enabled captures whichever channel each business actually uses.

๐Ÿค Partnership and supplier discovery

When evaluating a list of potential partners or suppliers, contactSignals gives a quick read on how reachable each one is, and socialLinks shows where they are active. A company with no email, no phone and no social presence on its own site is a meaningful signal in a procurement shortlist.

๐Ÿ“ฐ PR and media list building

Publications and independent journalists list contact addresses across contact, about and masthead pages. Setting maxPagesPerWebsite higher and using emailDetails to filter for addresses found on editorial pages produces a targeted media list rather than a pile of generic info@ addresses.

๐Ÿ” Contact data auditing and verification

With resultMode set to allWebsites, the output becomes an audit rather than a lead list. fetchedUrls and httpStatusCodes document exactly what was checked and what responded, which is what you need to prove a domain genuinely publishes no contact details rather than assuming the crawler missed them.

๐Ÿ“Š Competitive contact surface analysis

Run a competitor set and compare the per-network arrays โ€” facebooks, instagrams, linkedIns, twitters, youtubes, tiktoks. Which networks a company links from its own site is a direct statement of where it invests, and the contactSignals counts quantify how accessible each competitor makes itself.

๐Ÿงน CRM hygiene and dead-domain detection

Run your existing account domains periodically. Records where status is not found, where errors is populated, or where httpStatusCodes shows widespread non-200 responses identify domains that have gone dark โ€” companies that closed, rebranded or migrated. That is data decay you would otherwise only discover when an email bounces.


โš™๏ธ Tips for Better Website Email Scraping Results

  • Match concurrency to requestTimeoutSecs. High concurrency with a 5-second timeout maximises throughput but drops slow sites. For high-value lists, lower concurrency and raise the timeout.
  • Use allWebsites for coverage, emailsOnly for outreach. Running once in allWebsites mode tells you your true hit rate; switching to emailsOnly afterwards gives the clean working list.
  • Increase depth only on the misses. Crawl everything at 2โ€“3 pages, then re-run just the empty results at 8โ€“10. That is far cheaper than deep-crawling the whole list.
  • Keep sameDomainOnly enabled. Letting the crawler follow external links collects contacts belonging to third parties who are not your prospects and may not be lawful targets.
  • Rank by emailDetails source URL. Addresses found on contact pages consistently outperform those scraped from blog footers. This single filter improves list quality more than any crawl setting.
  • Watch pagesFetched versus your configured depth. A consistent gap indicates JavaScript-rendered navigation the crawler cannot follow, which tells you those sites need a different approach.

๐Ÿ› ๏ธ Troubleshooting

A domain I know publishes an email returned nothing. Check pagesFetched and httpStatusCodes on that record. If only one page was fetched, the crawler could not find internal links โ€” common on JavaScript-rendered sites. If the status codes are non-200, the site blocked or failed the request. Try raising maxPagesPerWebsite and requestTimeoutSecs.

Most of my domains are missing from the output entirely. That is expected behaviour with the default resultMode of emailsOnly, which only saves sites where an email was found. Switch to allWebsites to see every domain that was scanned, including the empty ones.

The run is timing out on large lists. Reduce requestTimeoutSecs so slow sites are abandoned faster, keep concurrency high, and lower maxPagesPerWebsite to 2. If the list is very large, also confirm maxResults is high enough that you are not capping output prematurely.

Phone numbers look malformed or include non-phone digits. Phone extraction works from patterns in page text, and numbers appearing near other digit sequences can be captured imperfectly. Validate against an expected country format before dialling, and cross-check against fetchedUrls to see the source page.

Emails appear that clearly belong to a different company. This usually means the crawl followed a link off-domain. Confirm sameDomainOnly is set to true, and use emailDetails to check the source URL of any suspicious address before using it.


โ“ Frequently Asked Questions About Website Email Scraping

What does the website email scraper and phone finder do? It crawls a list of websites and extracts the email addresses, phone numbers and social media profiles published on them, along with full provenance showing which pages were visited and where each contact was found.

How many websites can I process in one run? As many as maxResults allows, which defaults to 1000 saved results. With concurrency at 100 parallel sites, large batches complete quickly.

What is the difference between the three result modes? emailsOnly saves only sites where an email was found. contactsOnly saves sites with any contact signal, including phone or social only. allWebsites saves every site scanned, including those with nothing found.

How deep does it crawl each site? maxPagesPerWebsite pages, defaulting to 3. That typically covers the homepage plus contact and about pages, which is where contact details usually live.

Can I extract phone numbers as well as emails? Yes. extractPhones is enabled by default and populates the phones array.

Which social networks are supported? Six, each in its own array: Facebook, Instagram, LinkedIn, Twitter/X, YouTube and TikTok, plus a combined socialLinks map. Controlled by extractSocials.

How do I know where an email came from? emailDetails records the source URL and inferred type for each address, and fetchedUrls lists every page the crawler visited for that domain.

What does includePersonalData do? It controls whether personal data is extracted. Set it to false when you want to restrict collection to non-personal contact information.

Should I leave sameDomainOnly enabled? Yes, in almost all cases. It keeps the crawl on the target domain so you do not collect contacts belonging to unrelated third-party sites.

Do I need to configure proxies? No. Proxy rotation is handled automatically by the actor; there is no proxy input to fill in.

Why is durationMs useful? It shows how long each site took to process. Consistently high values across a batch usually mean requestTimeoutSecs is set too generously for the throughput you want.

Can I schedule this to run regularly? Yes. Apify Schedules can run the actor on any cron expression, which makes it practical as a recurring CRM hygiene job as well as a one-off enrichment.

Can I accept full URLs rather than bare domains? Yes. The domains field accepts website URLs or bare domains, and the resolved value is returned in url with the normalised form in domain.

Why does status matter? It reports the outcome for each site โ€” found in the sample record. Combined with errors and httpStatusCodes, it distinguishes a site with no contacts from a site that failed to load.

Is it legal to scrape email addresses from websites? The scraper collects only publicly published information. Email addresses are personal data under GDPR and similar regimes even in a business context, so you must establish a lawful basis and comply with anti-spam law such as CAN-SPAM, CASL and PECR before using them for outreach.


๐Ÿ†˜ Support & Feedback

If a site is not being crawled correctly, contacts are missing, or a run fails, please open a report on the Issues tab with your input configuration and the run ID.

For custom work โ€” additional extraction patterns, higher-throughput builds, bespoke output formats, or a private variant for your team โ€” email scraperhubapi@gmail.com with your requirements.

If this website email scraper saves you time, a review on the actor page is much appreciated and helps decide which improvements get built next.


โš–๏ธ Disclaimer

This website email scraper collects only publicly available contact information that websites choose to publish on pages accessible without authentication. It does not log into any site, bypass access controls, or retrieve data hidden behind a form or paywall.

Email addresses, phone numbers and social profiles are personal data under GDPR, UK GDPR, CCPA and comparable privacy regimes, including when they belong to a business contact. You are responsible for establishing a lawful basis for processing, honouring opt-out and erasure requests, providing the required privacy notices, and complying with anti-spam legislation such as CAN-SPAM, CASL and PECR before contacting anyone. The includePersonalData input is provided so you can restrict collection where your policy requires it. You are also responsible for respecting the terms of service and robots directives of the websites you scan.

To request removal of specific data collected by this actor, email scraperhubapi@gmail.com with the details.