Website Contact Finder (Dataset, CSV or Sheet) avatar

Website Contact Finder (Dataset, CSV or Sheet)

Pricing

from $14.00 / 1,000 website contacts

Go to Apify Store
Website Contact Finder (Dataset, CSV or Sheet)

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

Adam Pearce

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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 returnsWhat this one does
support@webador.comDropped. That is the website builder the company used, not the company.
0689...fa@o23827.ingest.sentry.ioDropped. An error-tracking key that happens to contain an @.
yourname@example.comDropped. A placeholder in the page template.
u003ehelp@company.comDropped. A fragment of escaped JSON, not an address.
logo@2x.pngDropped. An image filename.
tel:000000000027434378Dropped. 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

ColumnWhat it is
primaryEmailThe best role inbox found, ready to use
contactEmailsAll returned addresses for that site
emailClassesPer address: its class, whether it is at the site's own domain, and whether it came from a mailto: link or body text
excludedEmailCountsWhat was found but withheld, and why
primaryPhone / contactPhonesPublished numbers, normalised to E.164 with Google's libphonenumber
socialProfilesThe company's own LinkedIn, X, Facebook, Instagram, YouTube and TikTok links
contactPageUrlThe contact page it found, useful when there is no address to publish
contactStatusok, no_contacts_found, blocked, unreachable, disallowed_by_robots or invalid_url
websiteDomainThe 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.