Website Email Finder & Contact Details Scraper
Pricing
from $1.40 / 1,000 website with contacts
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Features
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
- Paste websites into Websites - domains (
apify.com) or any page URL. No list? Fill in a city and kinds of business instead (see below). - 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.
- 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:
| Field | Description |
|---|---|
domain / url | The website and the page it was read from |
companyName / description | Company name and the site's own description |
primaryEmail / emails | Best 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 / phones | First phone number and every number found, in international format where the site gives it |
linkedin / twitter / facebook / instagram / youtube / tiktok / github / vimeo | Social profile links |
address | Postal address, when the site publishes one |
contactPageUrl | The contact / imprint / about page where details were found |
pagesScraped / scrapedAt | Pages checked and when |
source | When 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:
- Open the other Actor (for example a Google Maps scraper) and go to its Integrations tab.
- Choose Add integration > Actor, pick Website Contact Details Scraper, and trigger it when the run succeeds.
- 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:
| Field | Example |
|---|---|
emailChecks[].kind | person, role (a shared inbox such as info@ or sales@), free (a consumer webmail address), disposable or invalid |
emailChecks[].acceptsMail | true 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 |
primaryEmailAcceptsMail | the 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.
| Field | Example |
|---|---|
people[].name / people[].role | Jane Doe, Founder & CEO |
people[].seniority | owner, executive, vp, director, head, manager or other; the list is sorted most senior first (up to 25 people) |
people[].email / people[].linkedin | when the site shows them next to the person |
contactName, contactRole, contactEmail | the most senior person as flat columns, ready for a CRM import |
emailPattern | how 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 |
emailPatternConfidence | high when two or more people's addresses follow the pattern, medium for one |
people[].emailGuess | the 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.