Email Domain Scraper - Find Emails by Domain From Any Website
Pricing
from $3.00 / 1,000 emails
Email Domain Scraper - Find Emails by Domain From Any Website
Enter up to 10 company domains or website URLs and get the email addresses published for each one: one row per address with its domain, ready for CSV, Excel or JSON. For lead generation, outreach lists and finding press, sales or support contacts. You only pay per email found.
Pricing
from $3.00 / 1,000 emails
Rating
5.0
(2)
Developer
SR
Maintained by CommunityActor stats
22
Bookmarked
1.9K
Total users
31
Monthly active users
17 days ago
Last modified
Categories
Share
Email Domain Scraper - Find Emails by Domain
Email Domain Scraper finds publicly listed email addresses for a list of website domains, so you can build lead lists and reach the right company inbox without visiting every site by hand. It combines Google result snippets with contact pages from the requested website. Every dataset row contains one address and its domain. Duplicate addresses are removed within each domain, and the results for that domain are sorted alphabetically.
Enter a company domain such as bol.com or a full website URL, and the actor returns each address it finds for that domain as a separate row. Use it to locate company contact inboxes, press contacts, customer service addresses and other contacts already published on the web. It searches the public record; it does not verify mailbox delivery or promise that every website has an indexed email address. Some domains return several addresses, while others return no results.
Input
Provide domains as an array containing one to ten strings. The actor accepts bare domains and website URLs. It trims spaces, converts names to lowercase, and removes www., URL schemes and paths. A mailto: address is reduced to its domain. Repeated domains are searched once after normalization. Entries that cannot be interpreted as domains are skipped and retained in the summary under rejectedInput.
max_emails_per_domain defaults to 10. Set it to a positive integer to limit each domain's results. Set it to 0 to return all addresses found within the search budget. This controls the number of delivered addresses, rather than the number of searches. An optional run_name string is copied to each result row, which helps identify exports from different runs. As before, run_name is not shown in the Console form; add it to the JSON input or send it through the API.
This input is from an actual run on 1 October 2026 (UTC):
{"domains": ["apify.com", "ft.com"],"max_emails_per_domain": 5}
The actor searched both domains and returned seven rows: two for apify.com and the five-address cap for ft.com. Results can change when search engines change their snippets or websites update their contact pages. The example describes that recorded run, rather than a guaranteed result count for future runs.
Output
The default dataset contains only email results. Each row retains the original string fields domain and email. The domain is normalized, and the email address is lowercase. Additional fields identify the source, search engine and UTC collection time. When run_name is supplied, that field also appears on every row.
These are the actual rows from the recorded example (shown with the two original fields):
[{"domain": "apify.com", "email": "hello@apify.com"},{"domain": "apify.com", "email": "support@apify.com"},{"domain": "ft.com", "email": "amrit.harrar@ft.com"},{"domain": "ft.com", "email": "ccpa.privacy@ft.com"},{"domain": "ft.com", "email": "contact@ft.com"},{"domain": "ft.com", "email": "customer.support@ft.com"},{"domain": "ft.com", "email": "ean@ft.com"}]
A complete row carries the original fields plus the newer ones. This row comes from an actual run on 1 October 2026 (UTC) with run_name set:
{"source": "email-domain-scraper","fetched_at": "2026-10-01T23:00:13.928Z","engine": "google","domain": "coolblue.nl","email": "klantenservice@coolblue.nl","run_name": "baseline-all-options"}
In that same run, with max_emails_per_domain set to 0, coolblue.nl returned eight addresses, zalando.de nine, ikea.com four and apple.com two, among them pers@coolblue.nl, impressum@zalando.de and product-security@apple.com.
| field | type | meaning |
|---|---|---|
domain | string | the normalized domain you asked for |
email | string | the address, in lowercase |
source | string | always email-domain-scraper |
engine | string | the search engine the snippets came from (google) |
fetched_at | string | UTC time of collection, ISO 8601 |
run_name | string | your run_name input, only present when you set it |
The summary record in the run's key-value store retains domainsRequested, domainsSearched, emailsFound, perDomain, withoutEmails, notFinished, failed, rejectedInput and notes. domainsRequested counts usable, unique domains after normalization. perDomain gives delivered email counts. withoutEmails lists searched domains without a delivered match; check notes for any incomplete search. Each note starts with the affected domain, so an empty interrupted search remains identifiable when several domains have the same warning. notFinished records domains that could not be completed before the run ended. The additional OUTPUT record contains run status, delivered counts and any free-plan cap information.
A domain without results produces no dataset row. Warnings and error details go into the run records, so they are not mixed with the addresses in CSV or JSON exports.
Email domain scraper search strategy
For each domain, the actor runs four Google searches using the terms email, contact, team and an exclusion of www. A separate search looks for contact pages on the website, and contact links found in the first searches are added to it. Contact, imprint, legal, about and editorial pages are preferred, in several languages (for example kontakt, impressum and colofon). When no contact link turns up, the actor tries the usual contact paths and the homepage of the domain itself. The market and interface language follow supported country-code domains; other domains use the US English search market.
Addresses must match the requested domain exactly. Addresses on unrelated domains or subdomains are excluded. Known example-name patterns, such as the placeholder formats shown on email-format websites, and exact no-reply local parts are filtered. An address at the end of a sentence keeps its trailing full stop out of the domain, so it is still found. The actor reads visible text instead of treating encoded query strings as contact data. Website pages can contribute addresses beyond the snippets, but only when they belong to the requested domain or one of its website subdomains. Repeated search results do not produce duplicate email rows.
Use cases for an email domain scraper
- Lead generation and outreach. Turn a list of target companies into the inboxes they publish, such as
info@,sales@orpartners@, and import the CSV into your CRM or mailing tool. - Press and PR contacts. Find newsroom, press office and tip addresses for media domains before a launch.
- Customer service routing. Collect support and complaints addresses of shops, suppliers or carriers you deal with.
- Partnerships and procurement. Locate the published contact points of suppliers, distributors and marketplaces in one run.
- Data enrichment. Add a contact column to a spreadsheet of domains you already have, using
run_nameto tag each batch. - Compliance and privacy requests. Find a company's published privacy or legal contact address.
How it compares to other email finders
Many email tools start from a person: you give a name and a company, and the tool guesses an address from a pattern and then verifies it. Others crawl a whole website and return phone numbers, social profiles and every address they encounter, including addresses on other domains.
This actor starts from the domain and returns only addresses that are actually published for that domain. It does not guess patterns or build addresses from names. Addresses on unrelated domains are removed, and duplicates are removed per domain. You get one clean row per address with no empty or error rows in your export. You pay only for addresses found, never for searches that come back empty. If you need personal addresses of named employees or verified deliverability, use a dedicated person-level finder alongside this actor.
Pricing and limits
The existing Apify pricing model stays in effect. Only delivered email rows are billed through Apify's dataset-item event. There is no actor start fee. Empty results have zero email charges. The listed base price is $0.005 per address on FREE, $0.004 on BRONZE, $0.0035 on SILVER, and $0.003 on GOLD, PLATINUM and DIAMOND. Check the actor's Pricing tab for the applicable plan price.
Users without a paid Apify plan receive at most ten rows per run. Paid users retain the per-domain limit they requested, including the unlimited setting of zero. Both groups can submit at most ten domains in one run. If you have more domains, split your list into separate runs. Searches have a time budget; the summary reports any interruption instead of silently treating an incomplete domain as a completed empty search.
FAQ
What does an email domain scraper return?
One dataset row per published address, with the domain it belongs to. A domain with ten published addresses and the default limit gives ten rows. A domain with none gives no rows and costs nothing.
Why does a valid domain return no emails?
The website may not publish email addresses, Google may not index them, or a requested page may be unavailable. Empty results are normal and do not create charged dataset rows. Inspect the summary to distinguish a completed empty search from an interrupted search. When contact pages could not be read, a note such as "Contact pages could not be read; results contain search snippets only." tells you the addresses came from search snippets alone.
Can I submit a full website URL?
Yes. The actor reduces website URLs to domain names before searching. Different URLs on the same normalized domain are searched once. Unusable entries are retained in rejectedInput so you can correct them later.
Does zero mean no results?
No. max_emails_per_domain: 0 removes the per-domain email cap for paid users. Search availability and the run budget still determine how many addresses can be found. The free-plan delivery cap remains ten rows per run.
Are the addresses verified?
The actor extracts publicly visible addresses. It does not send mail, verify inbox delivery, or guarantee that a published address is current. Review the addresses for your intended use.