Website Email Finder & Contact Details Scraper avatar

Website Email Finder & Contact Details Scraper

Pricing

from $1.40 / 1,000 website with contacts

Go to Apify Store
Website Email Finder & Contact Details Scraper

Website Email Finder & Contact Details Scraper

Website email finder: get emails, phone numbers and LinkedIn, X, Facebook, Instagram and YouTube links from any list of websites or a Google Maps dataset. Reads Contact, Imprint and About pages and decodes Cloudflare-protected emails. $1.75 per 1,000 sites with contacts; none found, no charge.

Pricing

from $1.40 / 1,000 website with contacts

Rating

0.0

(0)

Developer

Tapaswai Choudhary

Tapaswai Choudhary

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

2 days ago

Last modified

Features

Limited permissions

Share

Turn a list of websites into a contact list: a website email finder that also returns phones and social profiles. For each website you get e-mail addresses, phone numbers, social profiles (LinkedIn, X/Twitter, Facebook, Instagram, YouTube, TikTok, GitHub), the company name, description and postal address, and the page where the contacts were found - as a clean, spreadsheet-ready table. Export to CSV or Excel, push to your CRM or Google Sheets, or call it as an API.

Built for sales and business-development teams building lead lists, marketers and agencies doing outreach, recruiters, and anyone enriching a list of company domains.

Why this scraper

  • Finds contacts where they actually are. It reads the page you give, then picks the pages most likely to list contacts - Contact, Imprint / Impressum, Legal notice, About, Team - instead of crawling blindly. Five pages per site finds most contacts.
  • Reads what simple scrapers miss. E-mails from links and text, e-mails hidden by Cloudflare's email protection, and the company's own structured data (the name, e-mail, phone and address a site publishes for search engines).
  • Clean results, not noise. Image file names, placeholder addresses (name@example.com), tracking ids and share buttons are filtered out. Phone numbers come in international format, duplicates removed, and the website's own e-mail addresses are listed first.
  • Pay only for results. Websites where nothing is found are free. Dead or unreachable domains are skipped in a second instead of wasting run time.
  • Fast and cheap to run. Many websites are checked in parallel. Platform usage for a typical run is a fraction of a cent.
  • Handles rate limits for you. When a site says "slow down" (HTTP 429) the Actor waits as long as asked and adapts its speed; timeouts and dropped connections are retried automatically.
  • Never loses or double-bills work. Each website is saved as soon as it's done; if the platform moves your run to another server it resumes without charging twice, and it stops cleanly at your maximum charge.

How to use it

  1. Paste websites into Websites - domains (apify.com) or any page URL. No list? Fill in a city and kinds of business instead (see below).
  2. Optionally change Pages per website (default 5), tick Only the website's own e-mail addresses, or report only websites with an e-mail or a phone number.
  3. Press Start. Download the results from the Output tab, or connect an integration.

Example input

{
"startUrls": ["apify.com", "zalando.de", "mailchimp.com"],
"maxPagesPerSite": 5,
"sameDomainEmailsOnly": false
}

What you get

One row per website:

FieldDescription
domain / urlThe website and the page it was read from
companyName / descriptionCompany name and the site's own description
primaryEmail / emailsBest e-mail (the site's own domain, or a free-mail inbox if the site has none; never another company's address) and every e-mail found
primaryPhone / phonesFirst phone number and every number found, in international format where the site gives it
linkedin / twitter / facebook / instagram / youtube / tiktok / github / vimeoSocial profile links
addressPostal address, when the site publishes one
contactPageUrlThe contact / imprint / about page where details were found
pagesScraped / scrapedAtPages checked and when
sourceWhen reading another scraper's results: the original row's name, id, address, phone and link

Example:

{
"domain": "apify.com",
"url": "https://apify.com/",
"companyName": "Apify",
"primaryEmail": "support@apify.com",
"emails": ["support@apify.com", "hello@apify.com"],
"linkedin": "https://www.linkedin.com/company/apify",
"twitter": "https://x.com/apify",
"github": "https://github.com/apify",
"tiktok": "https://www.tiktok.com/@apifytech",
"address": "Na Příkopě 959/27, Prague, 11000, CZ",
"contactPageUrl": "https://apify.com/contact",
"pagesScraped": 5
}

Add contacts to another scraper's results

Already scraping businesses - from Google Maps, a directory, or any list that includes websites? Let this Actor enrich those results automatically:

  1. Open the other Actor (for example a Google Maps scraper) and go to its Integrations tab.
  2. Choose Add integration > Actor, pick Website Contact Details Scraper, and trigger it when the run succeeds.
  3. Done. After every run, each website in its results is checked for e-mails, phones and social profiles.

You can also run it by hand on any existing dataset: pick it under ...or websites from another scraper's results.

The website column is found automatically (website, url, domain and similar; map, social-media and job-board links are skipped). If yours is called something else, set Website column. Every result carries a source object with the original row's name, id, address and phone, so you can join the contacts back to your list. Rows that share a website are checked once.

Find businesses by category and city

No list of websites yet? Give a city and the kinds of business and the Actor builds the list for you: every matching business in the area from open map data (name, category, address, phone, listed e-mail, website, position), then each one's website is checked for e-mails, phones and social profiles.

{
"city": "Pune",
"countryCode": "IN",
"categories": ["dentist", "orthodontist"],
"radiusKm": 8,
"requireEmail": true,
"maxItems": 500
}
  • Kinds of business take everyday words: dentist, plumber, lawyer, gym, real estate, indian restaurant. Leave empty for every business in the area.
  • Radius is measured from the city centre (up to 50 km); or give an exact area as boundingBox.
  • Only businesses with a website, Skip chains and brands and Minimum confidence (how sure the map data is that the business exists) narrow the list.
  • Only new remembers the businesses already delivered, so a weekly run returns only the newly listed ones.

Each row has name, category, address, city, postcode, lat/lon, website, primaryEmail / emails, primaryPhone / phones, social links, emailFoundOnWebsite (the address was found on the business's own site, not only in a listing), websiteReachable (the listed site still works) and licenses. Business listings come from Overture Maps Foundation open data (CDLA-Permissive-2.0, some rows Apache-2.0 or CC0; each row names its licence).

In our tests about 6 in 10 businesses with a website ended up with an e-mail.

Check the e-mail addresses

Turn on Check e-mail domains (checkEmailDomains) and every row also says what its addresses are worth, so a list goes into a CRM or a sending tool clean:

FieldExample
emailChecks[].kindperson, role (a shared inbox such as info@ or sales@), free (a consumer webmail address), disposable or invalid
emailChecks[].acceptsMailtrue when the address's domain is set up to receive mail, false when it is not (a dead or parked domain), empty when it could not be told
primaryEmailAcceptsMailthe same answer for primaryEmail

Only the domain's public mail records are looked up. Nothing is ever sent to an address, and no mailbox is probed. The check adds no charge.

Find the people behind a website

Turn on Find people (findPeople) and every row also lists the people the website itself names with a role: founders, owners, managing directors, executives, heads of department and managers. They come from the site's own team, about, management and legal-notice (Impressum) pages, plus the structured data many sites publish for search engines. Quotes, testimonials and client sections are skipped, since the people named there work elsewhere.

FieldExample
people[].name / people[].roleJane Doe, Founder & CEO
people[].seniorityowner, executive, vp, director, head, manager or other; the list is sorted most senior first (up to 25 people)
people[].email / people[].linkedinwhen the site shows them next to the person
contactName, contactRole, contactEmailthe most senior person as flat columns, ready for a CRM import
emailPatternhow the site's own addresses are built, e.g. first.last@acme.com, learned only from addresses on the site that match a person on the site
emailPatternConfidencehigh when two or more people's addresses follow the pattern, medium for one
people[].emailGuessthe pattern applied to a person whose address the site does not show. A guess, not checked: verify before sending

With this option on, the pages per site go to team and leadership pages first. People data is personal data: check that you have a lawful reason to use it (e.g. GDPR legitimate interest) before contacting anyone.

Only new websites

Working through a growing lead list? Turn on Only new websites and re-run with the whole list - websites an earlier run already delivered are skipped (and not charged).

Use it as an instant API

Get the results straight in the API response with Apify's run-sync-get-dataset-items endpoint, ideal for apps, spreadsheets and AI agents:

curl -X POST "https://api.apify.com/v2/acts/tacps126~contact-details/run-sync-get-dataset-items" \
-H "Authorization: Bearer <YOUR_APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"startUrls": ["apify.com", "zalando.de"]}'

The response is the list of contacts. AI agents can also run it through Apify's MCP server (https://mcp.apify.com?tools=tacps126/contact-details).

Use it in Clay

Add a Run Apify Actor column (Clay's Apify integration, connected to your Apify account), pick tacps126/contact-details and use this input. Type / inside the quotes to insert your column (website or domain):

{"startUrls": ["/Website"], "maxPagesPerSite": 5}

Each row gets public emails, phone numbers, social profiles and the contact page, read from the company's own site. Keep auto-update off while you test.

More Clay recipes: tacps126.github.io/clay.html.

Pricing

Pay per result: about $1.75 per 1,000 websites with contacts found (lower on higher Apify plans) plus a tiny start fee. Websites with nothing found, and unreachable ones, cost nothing. When searching a city, each business delivered costs about $1.25 per 1,000, plus the website price when contacts were found on its site (about $3 per 1,000 for a fully enriched lead). The business price starts on 6 December 2026; until then city searches bill only the website price. See the Pricing tab for exact rates, and set a maximum charge per run to cap spend.

On Apify's free plan each run returns up to 100 websites - plenty to try everything. Any paid Apify plan removes the limit.

FAQ

Why is a website missing from the results? Nothing was found on it, or it couldn't be loaded - those are free and listed in the run's summary. Turn on Include websites with no contacts to get a row for every input.

Some sites return fewer details than I expected. A few websites block automated visitors or load contacts only with JavaScript. Try raising Pages per website, or turn on a proxy.

Is it legal? The Actor collects contact details that websites publish publicly. You're responsible for how you use them - follow the privacy and marketing laws that apply to you (e.g. GDPR, CAN-SPAM) before contacting anyone.

Support

Found a problem or need a field that isn't there yet? Open an issue on the Issues tab with the website and what you expected - requests genuinely decide what gets built next.