# Decision Maker Email Finder - Owners, CEOs & Founders (`sandy_yclept/decision-maker-email-finder`) Actor

Decision maker email finder for any list of company websites: the key decision makers each company names on its own site - owner, CEO, founders, the leadership team - with job title, LinkedIn, the source page and a work email the company published or its mail server confirmed. Pay only per email.

- **URL**: https://apify.com/sandy\_yclept/decision-maker-email-finder.md
- **Developed by:** [Rafal Sav](https://apify.com/sandy_yclept) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $24.00 / 1,000 decision maker emails

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Decision Maker Email Finder do?

**Decision Maker Email Finder** takes a list of **company websites** and returns **the people who own or run each company** — owner, founder, CEO, managing director, partner, the chief officers, vice presidents, directors and heads of departments — each with the **job title the company prints**, the **page that names them**, their **LinkedIn profile** when the site links it, and a **work email** that is either **published on the company's website** or **confirmed by the company's mail server**.

Every person comes from the company's own website: its team and about pages, its legal notice, its structured data, the sentences in which it says who founded it. Nothing is looked up in a database, so nothing is out of date, and every row says where it was read.

You **pay only for a decision maker with an email**. A person without one, a company that names nobody and a website that cannot be reached are returned and cost nothing. An address is never guessed.

It runs on the [Apify platform](https://apify.com): API access, scheduling, integrations (Make, Zapier, n8n, Google Sheets) and run monitoring included.

### Why use it?

- **The people are the company's own.** A customer quoted on the front page, an investor on the board, the photographer credited under a picture and a heading that reads like a name are told apart from the people who run the company. On 60 company websites picked at random and labelled by reading their pages before the engine was run on them, **97.7% of the decision makers it returned were the company's own people** (85 of 87; details below).
- **Every row has its source.** `source_url` is the page that names the person; `email_source` is the page that prints the email, or the mail server that confirmed it. You can check a lead in one click before you write to it.
- **An email is published or confirmed — never guessed.** Most companies name the people who run them and do not print their addresses. For those the usual mailboxes of the name (`jane@`, `jane.doe@`, `jdoe@` …) are asked of the company's own mail server, the likeliest first. A server that accepts every address proves nothing: each domain is first asked for a mailbox that cannot exist, and only a server that refuses it is believed.
- **You do not pay for names.** Tools that charge per domain or per person charge for the ones without an email too. Here a person without a published or confirmed email is free, and so is the company's general inbox and phone number in every row.
- **German companies by their legal notice.** The Impressum names who represents a company; it is read first, with the owner of a sole trader's business and the partners of a partnership.
- **Small companies, not only large ones.** Databases know the executives of companies with a LinkedIn page. A law firm, a veterinary practice or an architect's office names its partners on its own website, and nowhere else.

### Use cases

- **B2B outreach** — write to the person who decides, not to `info@`.
- **Agency prospecting** — the owner of every local business on your list, with the page that names them.
- **Enriching a CRM** — add the managing director and their email to the companies you already have.
- **After a Google Maps or Shopify scrape** — feed the websites of the places or stores you found.

### How to use it

1. Paste your **Company websites**, one per line — full URLs or bare domains.
2. Choose **Who to return**: decision makers (default), owners only, or everyone the company names.
3. Set **People per company** (default 3): owners come first, and people with a published email before people without.
4. Leave **Confirm unpublished emails** on to have mail servers asked, or turn it off to get published emails only.
5. Click **Start**. Download the results as JSON, CSV, Excel or HTML.

### Input

| Field | What it does |
|---|---|
| Company websites | The companies to find decision makers for: URLs or bare domains. |
| Who to return | `decision_makers` (default): owners, founders, partners, managing directors, CEOs, chief officers, vice presidents, directors, heads of departments. `owners`: the people who own or lead the whole company. `everyone`: every person the company names as its own. |
| People per company | The most people returned for one company (default 3, up to 25). |
| Confirm unpublished emails | Ask the company's mail server which of a person's usual mailboxes exists (default on). Runs [bounceverify's email verifier](https://apify.com/bounceverify/bounceverify-email-verifier) in a separate run on your account, which bills $0.00089 per address it checks. |
| Max contact and about subpages | How many contact-like pages to read per website (default 5). Up to 4 team pages and 8 pages of single people are read on top. |
| JavaScript rendering | Off by default. `auto` re-reads a website in a browser when it names nobody who decides without one; needs 2048 MB of memory. |
| Proxy configuration, Retry refused sites | As in our other Actors: websites that refuse a cloud address are retried through Apify Proxy. |

### Output

One row per person; a company that names nobody gets one row that says so. The values below are invented:

```json
{
  "website": "https://www.example-roofing.com/",
  "domain": "example-roofing.com",
  "company": "Example Roofing LLC",
  "name": "Jane Doe",
  "first_name": "Jane",
  "last_name": "Doe",
  "honorific": null,
  "title": "Founder & CEO",
  "seniority": "owner",
  "email": "jane@example-roofing.com",
  "email_status": "confirmed",
  "email_source": "mail server of example-roofing.com",
  "linkedin": "https://www.linkedin.com/in/jane-doe-example",
  "source_url": "https://www.example-roofing.com/about-us",
  "company_email": "office@example-roofing.com",
  "company_phones": ["+13035550142"],
  "status": "ok",
  "billed": true
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

| Field | Meaning |
|---|---|
| `name`, `first_name`, `last_name`, `honorific` | The person as the website names them; academic titles apart in `honorific`. |
| `title` | The job title as printed. Empty when the legal notice names the person without one. |
| `seniority` | `owner` (owner, founder, partner, CEO, president, managing director, Geschäftsführer, Inhaber), `executive` (chief officers, VPs, directors, heads of departments, Prokurist), `staff`, `adviser` (board members, advisers). |
| `email` | The person's work email, or `null`. |
| `email_status` | `published` — printed on the company's website; `confirmed` — the company's mail server says the mailbox exists; `null` — no email. |
| `email_source` | The page that prints the email, or `mail server of <domain>`. |
| `linkedin` | The personal LinkedIn profile the website links beside the person. |
| `source_url` | The page that names the person. |
| `company`, `company_email`, `company_phones` | The company's name from its legal notice, its general inbox and phone numbers — in every row, free. |
| `status` | `ok`, `no_people` (the website names nobody of the rank asked for), `unreachable`. |
| `billed` | Whether this row was charged. |

### Accuracy

On **September 27, 2026** we drew **60 company websites at random** — 20 local businesses found on Google Maps in the US, Canada, the UK, Ireland, Australia and New Zealand, 20 Y Combinator companies of 2012–21, and 20 German businesses found on Google Maps — and had the people each website names written down from the text of its pages by two different AI models working apart; where they disagreed, the page decided. Only then was the engine run on those pages, for the first time.

| The first run on 60 websites it had not seen | |
|---|---|
| Websites that name a decision maker at all | 35 of 60 |
| Decision makers returned | 87 |
| … who are the company's own people | **85 (97.7%)** |
| Decision makers the websites name, found | **82 of 102 (80%)** |

The two strangers were a customer whose words stand under his name on a front page, and a salon's name read as its owner's in a legal notice. Both errors, and the misses we could explain, were fixed afterwards and are tested for; the numbers above are from before the fixes, because those are the ones you can expect on your own list.

Then the Actor itself was run in the cloud on the same 60 websites, with **Confirm unpublished emails** on and three people per company. By then the errors of the first run had been fixed, so for naming people these websites were no longer unseen (the first run had returned a decision maker for 27 of them); their mail servers were asked for the first time.

| Of 60 websites | local | startups | German | all |
|---|---|---|---|---|
| A decision maker returned | 6 of 20 | 7 of 20 | 18 of 20 | **31 (52%)** |
| … with a published or confirmed email | 1 | 2 | 8 | **11 (18%)** |

55 people were returned, 19 of them with an email — 1 published on the website, 18 confirmed by the company's mail server — and those 19 were charged. Of the 31 mail servers asked, 18 refuse a mailbox that cannot exist and could be believed; 13 accept every address, and no address was returned for their people.

What to expect, then: a decision maker for **about half of the websites** — for most German ones, whose legal notice must name who runs the company; for fewer local businesses and startups — and a decision maker's email for about **one website in five**. The rest costs nothing.

### How much does it cost?

- **Decision maker email — $0.03** ($30 per 1,000), charged for each person of the rank you asked for who has a **published or confirmed** email. Once per address in a run.
- **Free:** a person without an email, a company that names nobody, an unreachable website, the company's inbox and phones, LinkedIn profiles.
- **Confirming emails** is done by [bounceverify's email verifier](https://apify.com/bounceverify/bounceverify-email-verifier) in a separate run on your account: **$0.00089 per address checked**. In the test above 133 addresses were checked for $0.12: about 7 checks, or $0.007, per email confirmed. Turn **Confirm unpublished emails** off and nothing but published emails is returned and paid for.

The 60 websites of the test cost **$0.57** for 19 decision makers with an email plus **$0.12** for the mail-server checks: **$0.036 per email, all in** — and nothing for the 29 websites that named nobody who decides.

### Tips

- **Give the homepage**, not a deep link: the team page and the legal notice are found from there.
- **Allow about 12 seconds per website**: a company's pages are read one after another, as slowly as its `robots.txt` asks. 1,000 websites take about three and a half hours; for a longer list raise the run's timeout above the default 4 hours. A run that comes close to its timeout stops reading, returns what it has and says how many websites are left.
- **Owners only** for small businesses; **decision makers** for companies with departments.
- **People per company = 1** returns the person at the top and keeps a list of law firms or clinics cheap.
- **Check `email_status`**: a `published` address is the one the company chose to show; a `confirmed` one exists, and its owner did not publish it — write accordingly.

### FAQ

#### Where do the people come from?

From the company's own website, read at the moment of the run: team, about and leadership pages, the pages of single people, the legal notice (Impressum), structured data, and sentences such as "founded by …". No LinkedIn scraping, no third-party database.

#### Why does a company come back without anybody?

Because its website names nobody: about half of the company websites in our test name a decision maker, fewer among startups that show only their product and local businesses that show only their trade. `status` says `no_people`, the row carries the company's inbox and costs nothing.

#### Does it read websites built with JavaScript?

With **JavaScript rendering** set to `auto` and 2048 MB of memory, a website that names nobody who decides is read again in a real browser. In our test the browser was started for 29 of the 60 websites and named a decision maker for 2 more of them, both small German businesses; it added no email. It is off by default: most websites that name their people print them in the page itself.

#### Why does a person have no email?

The company did not publish one, and its mail server either accepts every address (13 of the 31 asked in our test), does not answer, or knows none of the usual mailboxes for that name. We return the person and do not make an address up. A mail server that is busy is asked once more; one that stays silent may answer on another day — the same 60 websites gave 19 emails in one run and 17 half an hour later.

#### What is the difference between `published` and `confirmed`?

`published`: the address is printed on the company's website and is this person's. `confirmed`: the address is one of the usual mailboxes of the person's name, and the company's mail server said it exists — after refusing a mailbox that cannot exist.

#### Is this legal?

The Actor reads public company websites, respecting `robots.txt`. The names and work emails of people are personal data: under the GDPR you need a legal basis to process them and must inform the people concerned; in Germany §7 UWG requires prior consent for advertising emails in most cases, and other countries have rules of their own (CAN-SPAM, CASL, PECR). You are responsible for how you use the data.

### Related Actors

- [Website Contact & Email Scraper](https://apify.com/sandy_yclept/website-contact-email-scraper) — emails, phone numbers and social profiles from any list of websites, priced per contact.
- [Google Maps Email Extractor](https://apify.com/sandy_yclept/google-maps-email-extractor) — local businesses from a Google Maps search, each with the email from its own website.
- [Shopify Store Leads & Emails](https://apify.com/sandy_yclept/shopify-store-leads) — Shopify stores by product keyword and country, with each store's email.
- [No Website Leads](https://apify.com/sandy_yclept/no-website-leads) — local businesses on Google Maps without a real website.
- [Impressum Email Scraper](https://apify.com/sandy_yclept/impressum-email-scraper) — German company websites: the company, its representatives and contacts from the Impressum.

### Disclaimer

This Actor is a **tool**. You are responsible for complying with the GDPR and local marketing law, the target sites' Terms of Service, and `robots.txt`. It does not build or sell contact databases.

### Support

Found a person who is not the company's, or a decision maker we missed? Open an issue on the **Issues** tab with the website — accuracy reports shape the roadmap directly.

# Actor input Schema

## `startUrls` (type: `array`):

The companies to find decision makers for, as websites or bare domains ("acme.com"), one per line. Each website is read for the people the company itself names: its team and about pages, its legal notice, the pages of single people.

## `seniority` (type: `string`):

Decision makers (default): owners, founders, partners, managing directors, CEOs, presidents, every chief officer, vice presidents, directors and heads of departments. Owners only: the people who own or lead the whole company. Everyone: every person the company names as its own, staff and advisers too. The rank is read from the job title the website prints.

## `maxPeoplePerCompany` (type: `integer`):

The most people to return for one company. Owners come before executives, and people with a published email before people without - so 1 returns the person at the top. A law firm may name forty attorneys; this is what caps the cost of one company.

## `confirmEmails` (type: `boolean`):

Most companies name the people who run them and do not print their addresses. For a person without a published email, the usual mailboxes of the name (jane@, jane.doe@, jdoe@ ...) are asked of the company's mail server, the likeliest first, and the first that exists is returned as `confirmed`. A server that accepts every address proves nothing and is never believed. The question goes through the bounceverify/bounceverify-email-verifier Actor in a separate run on your account, which bills each address it checks ($0.00089) - in our test 133 checks, $0.12, for 60 websites. Off: only emails published on the website are returned.

## `maxContactPages` (type: `integer`):

How many contact-like subpages (/about, /contact, /team, /impressum) to read on each site, on top of its homepage. Up to 4 more team pages and 8 pages of single people are read on top of these, where the site has them.

## `renderJs` (type: `string`):

Load pages in a real browser to read team pages that are built by JavaScript. Off (default) is the fastest and cheapest. Auto reads without a browser first and only re-reads a site in the browser when it named nobody who decides. On always uses the browser. Auto and On require the run memory to be at least 2048 MB. Below 1024 MB the browser is not started and the run says so.

## `proxyConfiguration` (type: `object`):

Optional proxy for fetching pages. Apify Proxy's datacenter IPs are included in every Apify plan, the Free plan too; residential proxies are billed separately. Left disabled, the Actor connects directly, and retries sites that refuse it through Apify Proxy (see below).

## `proxyFallback` (type: `boolean`):

Every cloud run has a datacenter IP address, and some sites turn those away. A site that refuses or drops the direct connection is retried once through Apify Proxy's datacenter IPs (included in every Apify plan, the Free plan too), then once more directly. Sites that answer directly never go through the proxy, and robots.txt is respected either way. Has no effect when a proxy is configured above.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.andersongallagher.ie/"
    },
    {
      "url": "https://partner-ag.de/"
    },
    {
      "url": "https://www.barefootphysiotherapy.com.au/"
    }
  ],
  "seniority": "decision_makers",
  "maxPeoplePerCompany": 2,
  "confirmEmails": true,
  "maxContactPages": 5,
  "renderJs": "off",
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "proxyFallback": true
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.andersongallagher.ie/"
        },
        {
            "url": "https://partner-ag.de/"
        },
        {
            "url": "https://www.barefootphysiotherapy.com.au/"
        }
    ],
    "maxPeoplePerCompany": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("sandy_yclept/decision-maker-email-finder").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [
        { "url": "https://www.andersongallagher.ie/" },
        { "url": "https://partner-ag.de/" },
        { "url": "https://www.barefootphysiotherapy.com.au/" },
    ],
    "maxPeoplePerCompany": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("sandy_yclept/decision-maker-email-finder").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.andersongallagher.ie/"
    },
    {
      "url": "https://partner-ag.de/"
    },
    {
      "url": "https://www.barefootphysiotherapy.com.au/"
    }
  ],
  "maxPeoplePerCompany": 2
}' |
apify call sandy_yclept/decision-maker-email-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sandy_yclept/decision-maker-email-finder"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/TFHo9MbNfgikoHxcn/builds/exyWhBlGg5rgZ48gS/openapi.json
