Company Email Finder avatar

Company Email Finder

Pricing

from $21.00 / 1,000 domain analyseds

Go to Apify Store
Company Email Finder

Company Email Finder

Find the contact addresses a company publishes, work out its email naming convention, verify the domain can receive mail, and generate addresses for named people. One charge per domain, whatever the site size.

Pricing

from $21.00 / 1,000 domain analyseds

Rating

0.0

(0)

Developer

丂卩ㄖㄖҜㄚ

丂卩ㄖㄖҜㄚ

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Give it a company domain and it returns the contact addresses that company publishes, the email naming convention behind them, an MX check on the domain, and generated addresses for people you name.

🔍 What does Company Email Finder do?

It crawls a company's own website, collects the email addresses published on it, classifies each one, works out the naming pattern the company uses, and checks the domain can actually receive mail. Supply a list of names and it generates the likely address for each from that pattern.

Contact, about and team pages are tried first, so a low page budget still lands on the pages that carry addresses. One charge per domain, whatever the size of the site.

📊 What data can I extract?

One record per domain, in this shape:

{
"domain": "example.com",
"emailsFound": 6,
"personalEmails": 2,
"roleEmails": 3,
"unclassifiedEmails": 1,
"emails": [
{ "email": "jane.smith@example.com", "type": "personal", "isFreeProvider": false },
{ "email": "info@example.com", "type": "role", "isFreeProvider": false }
],
"pattern": "first.last",
"patternConfidence": 1,
"patternBasedOn": 2,
"mxValid": true,
"mxRecords": ["aspmx.l.google.com"],
"generatedEmails": [
{ "firstName": "Bob", "lastName": "Jones", "email": "bob.jones@example.com", "pattern": "first.last" }
],
"pagesCrawled": 8
}

💡 Why find company emails?

B2B outreach. Build a contact list from what companies publish themselves, with role and personal addresses kept apart so your first line lands right.

Sales research. Work out the naming convention at an account, then generate the address for the person you already know you need.

List hygiene. Use the MX check to drop dead domains before they burn your sender reputation.

Recruitment. Reach hiring contacts at companies that publish a careers or team page.

🚀 How do I use Company Email Finder?

  1. Click Try for free.
  2. Put a company domain into domain, or a list into domains.
  3. Add people with first and last names if you want addresses generated.
  4. Set maxPagesPerDomain and leave verifyMx on, then click Start.
  5. Download the results as JSON, CSV or Excel, or pull them from the API.

⬇️ Input

{
"domain": "monzo.com",
"maxPagesPerDomain": 8,
"verifyMx": true
}
FieldTypeDefaultWhat it does
domainstringapify.comOne company domain, protocol and www optional
domainsarrayA list of domains, each charged separately
peoplearrayNames to generate addresses for, first and last name, for example [{ "firstName": "Jane", "lastName": "Smith" }]
maxPagesPerDomaininteger8Pages to crawl per domain, maximum 15
verifyMxbooleantrueRun a DNS MX check on the domain

⬆️ Output

Table view

Results arrive as a Domains table you can sort and filter in the Console, with the domain, how many addresses were found, the addresses themselves, the inferred pattern, its confidence, the MX result and the page count lined up per domain.

JSON

A typical row:

{
"domain": "monzo.com",
"emailsFound": 1,
"emails": [
{ "email": "help@monzo.com", "local": "help", "domain": "monzo.com", "type": "role" }
],
"pattern": "first.last",
"mxValid": true,
"pagesCrawled": 2,
"personalEmails": 0,
"roleEmails": 1
}

Download it from the run as JSON, CSV or Excel, or read it straight from the API.

Three types, not two

Most tools split addresses into "personal" and "role". That is not enough, and getting it wrong is expensive: it tells you a department mailbox is a named human, and your first line lands wrong.

TypeMeaning
roleA known department word: info, sales, support, careers
personalName shaped, two parts around a separator: jane.smith, j.smith
unclassifiedGenuinely ambiguous, a single word that could be either

solar@, heat@ and greg@ are all single words. Two are departments, one is a person, and nothing in the address tells you which. So they come back unclassified rather than guessed at.

Pattern inference

Supply people with first and last names. Where one of them already has a published address, the convention is inferred from it and used to generate the rest.

patternConfidence is the share of known people the winning convention explains. Below 0.5, no single address is returned. Instead you get every candidate, because a confident wrong address is worse than a list.

Conventions covered: first.last, firstlast, flast, first_last, first-last, firstl, lastf, last.first, first.

MX verification

A DNS MX lookup, free and fast, tells you whether the domain can receive mail at all. mxValid is true, false, or null when the check was not run or the lookup itself failed. Null is not the same as false and the two are never merged.

This is not per-address SMTP verification. It rules out dead domains, not individual mailboxes.

Limits

It reads publicly published pages. It does not use a paid enrichment database, so it finds what a company chose to put on its own website, and nothing more. A domain with no published addresses returns none, which is a real finding rather than a failure.

No API keys, no accounts, no proxies.

💰 How much does it cost?

EventPrice
Domain analysed$0.035

Charged once per domain. One charge covers all of it: the crawl, the classification, the pattern inference, the MX check and any generated addresses.

The price does not move with how many addresses a site publishes, how many pages were read, or how many addresses were generated, so a company with a large team page costs the same as one with a single contact form.

🔌 Integrations

Send results straight to Google Sheets, Slack, Airtable, Zapier, Make or your own webhook using Apify integrations. You can also trigger a run whenever something happens in another tool.

🔗 Using Company Email Finder with the Apify API

curl -X POST "https://api.apify.com/v2/acts/spookyweb~company-email-finder/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"domain": "monzo.com", "maxPagesPerDomain": 8, "verifyMx": true}'

Or with the Apify client:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('spookyweb/company-email-finder').call({
domain: 'monzo.com',
maxPagesPerDomain: 8,
verifyMx: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Full detail is in the Apify API reference, and every run is also callable from the Python and JavaScript clients.

❓ FAQ

How is the address pattern worked out?

From the addresses the company already publishes. Where a published address matches a person you supplied in people, the convention behind it is inferred and applied to the others. patternConfidence is the share of known people the winning convention explains, and patternBasedOn says how many addresses it was inferred from.

What does MX validation check?

Whether the domain has mail exchanger records in DNS, which tells you it can receive mail at all. It is free and fast. mxValid is true, false, or null when the check was not run or the lookup itself failed, and null is never merged into false. It is not per-address SMTP verification, so it rules out dead domains rather than individual mailboxes.

What is the difference between a personal and a role address?

A role address is a known department word such as info, sales, support or careers. A personal address is name shaped, two parts around a separator, such as jane.smith or j.smith. Anything that is a single word could be either, so it comes back unclassified rather than guessed at. Calling a department mailbox a named human is the expensive direction of that mistake.

Can I predict an address for a named person?

Yes, put them into people with a first and last name. If the pattern is confident, you get one generated address each. Below a confidence of 0.5 you get every candidate instead of a single answer, because a confident wrong address is worse than a list.

How many pages does it read per domain?

maxPagesPerDomain decides, default 8 and maximum 15. Contact, about and team pages are tried first, so even a low budget lands on the pages that actually carry addresses. The page count that was used comes back in pagesCrawled.

What if a domain publishes no addresses?

You get a record with none found. That is a real finding rather than a failure: it tells you the company publishes no contact addresses on its own website. This does not fall back to a paid enrichment database, so it never invents what the site does not show.

This reads addresses a company has chosen to publish on its own website, which is business contact information rather than personal data in most cases. It does not guess at private mailboxes and it does not use breach data.

Where an address identifies a named person, UK GDPR applies and you are the data controller for what you do next. You need a lawful basis, typically legitimate interest for B2B contact, and you must honour opt outs. Apify's ethical scraping guide covers the wider picture.

👍 Your feedback

Found a bug, or want a field that is not here yet? Open an issue on the Actor's Issues tab. Requests that make the data more useful get built, and problems get fixed quickly.

🔎 You might also like

ActorWhat it does
Website Contact ScraperEmails, phones, socials and addresses from company websites, one record per domain
UK Food Hygiene RatingsFood hygiene ratings for every UK food business, straight from the FSA
UK Planning ApplicationsPlanning applications from every UK council in one feed, with applicant and agent details