Bulk Website Contact & Email Finder
Pricing
from $3.50 / 1,000 website contact records
Bulk Website Contact & Email Finder
Email and contact scraper for a list of websites or domains. One row per site: emails with likely owner and CEO addresses ranked above info@, plus phones and social profiles from the homepage and its contact and about pages. Optional MX check. Pay only per website with contacts.
Pricing
from $3.50 / 1,000 website contact records
Rating
0.0
(0)
Developer
Gerson Cesar
Maintained by CommunityActor stats
0
Bookmarked
44
Total users
8
Monthly active users
22 days ago
Last modified
Categories
Share
Turn a list of websites into a B2B prospect list. Paste your domains and this email and contact scraper reads each site's homepage plus its contact and about pages, then returns emails, phone numbers and social profiles in one row per website. Likely owner, founder and CEO addresses are ranked above info@ inboxes, and an optional MX check flags emails whose domain cannot receive mail. You pay per website that returns a contact, never per page, and websites with nothing found cost nothing.
It is built for agencies, SDRs, recruiters and founders who run cold outreach or enrich company lists. Pages are fetched over plain HTTP with no headless browser, which keeps long lists fast and cheap.
What does the Bulk Website Contact & Email Finder do?
It takes a list of websites or domains and scans the pages most likely to hold contact details: the homepage, then the contact and about pages the homepage links to (or common paths such as /contact when it links none). From those pages it extracts business emails, phone numbers and social media profiles, ranks the emails so likely decision makers come first, and can check each email's domain for live mail servers. Each website that yields at least one contact becomes one dataset row and one charge.
Why use this contact & email scraper?
- Outreach lists in minutes. Paste a list of target company domains and get back deduplicated contact records ready to import into a CRM or sequencer.
- Enrich the list you already have. Add emails, phones and LinkedIn or X profiles to a spreadsheet of company websites.
- Reach a person, not the help desk. Addresses such as
ceo@,founder@orjane.doe@are sorted ahead ofinfo@andsupport@, so the most promising contact sits at the top of each row. - Drop dead domains before sending. The optional MX check marks emails whose domain has no mail server, so they never reach your sending tool.
- Cost you can predict. About $5 per 1,000 websites that return a contact on the free tier, less on paid Apify plans. No per-page billing and no subscription.
How to extract contacts from websites
- Click Try for free (or open the Actor in Apify Console).
- Paste your domains into Websites / domains, one per line, or upload a CSV of URLs.
- Choose what to extract. Emails, phones and socials are on by default; decide whether you want decision-maker ranking and the MX check.
- Adjust Max pages per domain if you want more pages read per site.
- Click Start. Websites are crawled in parallel and rows appear as each site finishes.
- Download the results as JSON, CSV, HTML or Excel, or pull them through the Apify API into n8n, Make, Zapier or Google Sheets.
Input
| Field | Key | Type | Default | Description |
|---|---|---|---|---|
| Websites / domains | startUrls | array of URLs (required) | none | Websites or domains to scan. Each is read from the root of its domain; paths are ignored and www. is dropped. |
| Max pages per domain | maxPagesPerDomain | integer (1 to 20) | 5 | Pages read per website, homepage included. More pages add run time, not cost. |
| Extract emails | extractEmails | boolean | true | Emails in the page HTML, including mailto: links and simple [at]/[dot] obfuscation. |
| Extract phones | extractPhones | boolean | true | Numbers in tel: and callto: links only. |
| Extract socials | extractSocials | boolean | true | LinkedIn, X/Twitter, Facebook, Instagram, YouTube and TikTok links. |
| Verify emails | verifyEmails | boolean | false | MX lookup on each email's domain, billed as email-verified. Up to 5 seconds per email. |
| Rank decision maker | rankDecisionMaker | boolean | true | Sorts emails so likely decision-maker addresses come first. |
| Max concurrency | maxConcurrency | integer (1 to 50) | 10 | Pages fetched at the same time across all websites. |
| Proxy configuration | proxyConfiguration | proxy object | Apify Proxy on | Proxy used to fetch pages. |
Input example
{"startUrls": [{ "url": "https://apify.com" }, { "url": "https://crawlee.dev" }],"maxPagesPerDomain": 5,"verifyEmails": false,"rankDecisionMaker": true}
Output
Each website that returns at least one email, phone or social profile produces one dataset item like the one below. Websites with nothing found are left out of the dataset and are not charged; the run log reports how many sites yielded contacts.
{"domain": "apify.com","sourceUrls": ["https://apify.com", "https://apify.com/contact", "https://apify.com/contact-us"],"emails": [{ "email": "hello@apify.com", "type": "role", "score": 0.15, "verification": null }],"phones": [],"socials": [{ "platform": "linkedin", "url": "https://linkedin.com/company/apify" },{ "platform": "twitter", "url": "https://x.com/apify" },{ "platform": "tiktok", "url": "https://tiktok.com/@apifytech" }],"scrapedAt": "2026-06-15T06:16:25.355Z","pagesCrawled": 3}
You can download the results as JSON, CSV, HTML or Excel.
Output data fields
| Field | Type | Description |
|---|---|---|
domain | string | Normalized domain that was scanned. |
sourceUrls | string[] | Pages read for this domain. |
emails | array | Emails found for the domain (sub-fields below). |
emails[].email | string | The email address. |
emails[].type | role | personal | other | role for shared inboxes (info@, sales@), personal for first.last@ style addresses, other for everything else. |
emails[].score | number (0 to 1) | Decision-maker likelihood read from the address. Titles in the address (ceo, founder, owner, director) score 0.95, personal addresses 0.7, other addresses 0.4, role inboxes 0.15 to 0.3. 0 when ranking is off. |
emails[].verification | valid | invalid | unknown | null | MX result. valid: the domain has mail servers. invalid: it has none or the address is malformed. unknown: the lookup timed out (not charged). null: Verify emails was off. |
phones | string[] | Normalized numbers from tel: and callto: links. |
socials | array | Social media profiles found for the domain. |
socials[].platform | linkedin | twitter | facebook | instagram | youtube | tiktok | The social network. |
socials[].url | string | URL of the profile. |
scrapedAt | string (ISO 8601) | When the domain was scraped. |
pagesCrawled | number | How many pages were actually read for this domain. |
How much does it cost to find website contacts?
This Actor uses pay per event pricing. There is no subscription, and you are billed only for websites that return a contact.
| Event | Free plan | Bronze | Silver | Gold and above | When it's charged |
|---|---|---|---|---|---|
contact-record-extracted | $0.005 per website | $0.0045 | $0.004 | $0.0035 | Once per website that returns at least one contact. Websites with nothing found are never charged. |
email-verified | $0.002 per email | $0.0018 | $0.0016 | $0.0014 | Only when Verify emails is on, once per email with a definite answer (valid or invalid). Timeouts are not charged. |
Apify also adds two small platform events to every pay-per-event Actor: Actor start at $0.00005 per GB of run memory (once per run) and result at $0.00001 per dataset row. On a list of 1,000 websites they add about one cent.
Examples on the free plan
- 1,000 websites that each return a contact cost about $5.
- If those sites hold 3,000 emails and you turn on verification, add up to $6.
Because you pay per website and not per page, raising Max pages per domain makes a run slower but not more expensive.
Tips & advanced options
- Bulk-load with CSV. Upload a CSV or paste a newline-separated list into Websites / domains to queue thousands of domains in one run.
- Read more pages on big sites. Raise
maxPagesPerDomain(up to 20) for corporate sites where contact details sit a few clicks past the homepage. - Turn on
verifyEmailsbefore sending. It removes emails on domains that cannot receive mail. It does not prove a mailbox exists, so a separate SMTP verifier is still worth it for large campaigns. - Keep decision-maker ranking on. The highest-scoring email appears first in each row, so a spreadsheet's first email column is the best guess at the person who decides.
- Tune concurrency. Raise
maxConcurrencyto finish long lists faster; lower it for a gentler crawl. - Keep Apify Proxy on. Some sites block datacenter traffic; the default proxy setting gets more of them to answer.
FAQ & legal
Is scraping website contact data legal? This Actor only collects information businesses publish on their own websites, the same data a visitor sees on a contact or about page. You are responsible for how you use the results. When the data includes personal information about individuals (for example a named person's email), regulations such as the GDPR (EU) and LGPD (Brazil) may apply. Make sure you have a lawful basis for processing and outreach, honor opt-out and unsubscribe requests, and follow anti-spam laws such as CAN-SPAM in the recipient's jurisdiction.
Why are some fields null or empty?
verification is null unless Verify emails was on. An empty array such as "phones": [] means that type of contact was not published on the pages that were read.
I got fewer results than expected. What can I do?
Contacts hidden behind forms, drawn as images, or loaded by JavaScript are not visible to this crawler, and phone numbers are read only from tel: links. Try raising maxPagesPerDomain, check that the domains are correct and reachable, and keep Apify Proxy on so strict sites still respond.
Support & contact Found a bug or want a feature? Open an issue on the Actor's Issues tab in Apify Console.