Website Contact Finder (Dataset, CSV or Sheet)
Pricing
from $14.00 / 1,000 website contacts
Website Contact Finder (Dataset, CSV or Sheet)
Finds published business contacts for every website in an Apify dataset, CSV file or Google Sheet. Returns each original row plus role inbox emails, phones in E.164, socials and the contact page. Inputs: datasetId or fileUrl, websiteField. Charged per site with a contact. Agent-ready via x402, MCP.
Pricing
from $14.00 / 1,000 website contacts
Rating
0.0
(0)
Developer
Adam Pearce
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
You have a list of companies. What you need is a way to reach them.
Point this Actor at the list you already have, an Apify dataset, a CSV, an Excel file or a Google Sheet, and it opens each company's website, finds the contact details they have published, and hands back every original column untouched with the contact columns added alongside. No copying a domain column out, no matching results back to company names by hand.
What it returns, and what it deliberately does not
By default this Actor returns role inboxes only: shared business addresses like info@, sales@, enquiries@ and bookings@, which identify a function rather than a named person.
Addresses that look like one individual's own (firstname.lastname@), no-reply inboxes, and anything the classifier is not confident about are counted but not returned. You can see exactly how many were withheld and why, on every row. You can switch personal addresses on, and the input field tells you what comes with that decision.
This is a deliberate design choice, not a limitation. Under UK and EU rules a shared business inbox that identifies no individual is treated very differently from a named person's address, and the second one brings real obligations for whoever collects it. Defaulting to role inboxes keeps the output useful for B2B outreach while leaving the sharper edges opt-in.
Two other things this Actor will not do: it never guesses or generates an address (no inventing firstname.lastname@domain and hoping), and it never returns a number that is not a real phone number.
What makes it different from the other contact scrapers
Every other contact finder on the Store takes a typed-in list of domains. If your companies live in a scraped dataset, a CRM export or a spreadsheet, you have to pull the domain column out, paste it in, and then reattach the results to your own rows. This one takes the whole thing.
The other difference is what it throws away. A real business website is full of email addresses that are not the business's:
| What a naive scraper returns | What this one does |
|---|---|
support@webador.com | Dropped. That is the website builder the company used, not the company. |
0689...fa@o23827.ingest.sentry.io | Dropped. An error-tracking key that happens to contain an @. |
yourname@example.com | Dropped. A placeholder in the page template. |
u003ehelp@company.com | Dropped. A fragment of escaped JSON, not an address. |
logo@2x.png | Dropped. An image filename. |
tel:000000000027434378 | Dropped. An advertising tracking id sitting in a phone link. |
Every example in that table came off a real website during testing, not from imagination. The single most effective filter is simple: keep addresses at the company's own domain, which is on by default and removes most of the noise in one move. Off-domain addresses are still counted and can be switched back on.
What you get on every row
| Column | What it is |
|---|---|
primaryEmail | The best role inbox found, ready to use |
contactEmails | All returned addresses for that site |
emailClasses | Per address: its class, whether it is at the site's own domain, and whether it came from a mailto: link or body text |
excludedEmailCounts | What was found but withheld, and why |
primaryPhone / contactPhones | Published numbers, normalised to E.164 with Google's libphonenumber |
socialProfiles | The company's own LinkedIn, X, Facebook, Instagram, YouTube and TikTok links |
contactPageUrl | The contact page it found, useful when there is no address to publish |
contactStatus | ok, no_contacts_found, blocked, unreachable, disallowed_by_robots or invalid_url |
websiteDomain | The registrable domain, handy for grouping and deduplication |
How it crawls
The homepage first, then the most contact-like pages on the same site, up to a page budget you control (four by default).
That matters more than it sounds. In testing, restricting the run to homepages only found nothing at all on sites that gave up their address readily once the contact page was followed. Most businesses do not put an email on the front page.
It reads robots.txt and honours it by default. Most contact pages are allowed, so this rarely costs a result, and it means the run does what site owners have actually asked automated visitors to do. You can switch it off for your own crawls.
Pricing
- $0.02 per website that returns a contact
- $0.002 per website reached that publishes nothing (a real answer, at a tenth of the price)
- Nothing at all for a site that could not be reached, blocked the request, or was disallowed by its own robots.txt
So a 1,000-company list where 6 in 10 publish something costs about $13. A hundred companies is about $1.30. Adding a CSV and an Excel export is two cents.
Store discount tiers are on from day one, so Bronze, Silver and Gold plan customers pay 10, 20 and 30 percent less.
FAQ
What hit rate should I expect?
It depends entirely on your list. Small and mid-size businesses, trades, agencies, clinics and local firms usually publish an address or a phone number, and those lists do well. Large consumer brands frequently publish neither, on purpose, and route everything through a contact form instead, so a list of household names will look disappointing no matter which tool you use. The contactStatus column tells you which case each row was, so you are never guessing.
Some sites came back blocked. Why?
A minority of sites refuse automated requests outright. The Actor uses Apify's residential proxy by default, which clears most of it, and reports the rest honestly as blocked rather than pretending the company has no contact details. Blocked sites are not charged.
Can it find a specific person's email at a company? No, and it will not pretend to. It returns what a company has chosen to publish. Tools that produce a named individual's address usually guess it from a name-and-domain pattern, and this Actor deliberately does not do that.
Is this legal to use? Reading a page a company has published is not the hard part; what you then do with the details is. You are the controller of whatever you collect here. In the UK, marketing email to a limited company is treated differently from marketing email to a sole trader, and no tool can tell you from a website which of the two you are looking at. Keeping the default (role inboxes only) puts you in a far simpler position than harvesting named individuals. This is not legal advice, and if you are running outreach at scale it is worth getting your own.
Does it store anything? No. The results go to your own dataset in your own account. Nothing is kept, and the optional webhook payload carries counts and download links only, never the contact details themselves.
Can an AI agent run this? Yes. Pay per event, limited permissions, no standby mode, so it is payable through x402 and callable over MCP.
The rest of the toolkit
Natural next steps once you have the contacts: Email List Cleaner & Validator checks the addresses are real and drops throwaway domains and duplicates, and Phone Number Validator & Cleaner does the same for the numbers, telling you which are mobiles.
For the data itself: Dataset Cleaner & Exporter, Filter & Transform, Join & Merge, Aggregate, Group By & Pivot, Diff & Change Detector, AI Enrich, Charts & Report, to Postgres, Supabase & MySQL, to REST API, and Actor Pipeline Runner to chain them in one call.
If this saved you an afternoon of opening contact pages by hand, a review on the Store page helps a lot. If something looks wrong, open an issue on the Issues tab and I will answer personally.