# Decision Maker Finder — Companies to C-Suite + Emails (`memo23/decision-maker-finder`) Actor

Turn a list of companies into their decision makers — founders, C-suite, VPs and directors — with name, title, LinkedIn profile URL, location and a verified company contact email. No LinkedIn login or cookie needed, zero ban risk. Clean JSON/CSV for outreach.

- **URL**: https://apify.com/memo23/decision-maker-finder.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Lead generation, AI, Social media
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Decision Maker Finder — Companies to C-Suite Contacts + Emails

Paste a list of companies. Get back the people who sign the checks — founders, CEOs, CTOs, VPs and directors — each with their LinkedIn profile URL, seniority, location and a verified company contact email. No LinkedIn login, no cookie, zero ban risk.

![How it works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-decision-maker.png)

### What it does

One input row = one company, by name (`Notion`) or website (`stripe.com`). For each company the actor:

1. **Searches public LinkedIn** with role-targeted queries — `"CEO" "Stripe"`, `"founder" "Stripe"`, `"director" "Stripe"` — top of the org chart first. No LinkedIn session anywhere in the pipeline.
2. **Reads each public profile page** and its structured data (current employer, location, schools, languages, about).
3. **Keeps current employees only.** Three guards run on every candidate before anything is delivered or billed:
   - people whose profile says another company is their current employer are dropped;
   - "Ex Stripe", "former CFO at…", "previously at…" are dropped;
   - namesake companies are dropped — the CEO of *Stripe Media Inc.* is not a Stripe decision maker.
4. **Finds the company's contact email** on the company's own website (optional, on by default) and stamps it on every row.

Delivered rows are guaranteed to match your seniority selection — the level is derived from each person's title and headline, and non-matching profiles are never delivered.

### Sample output

Real rows from a run over `stripe.com` and `Notion`:

```json
[
  {
    "company": "Stripe",
    "name": "Patrick Collison",
    "summary": "Patrick Collison - Stripe",
    "currentCompany": "Stripe",
    "seniorityLevel": "CXO",
    "profileUrl": "https://www.linkedin.com/in/patrickcollison",
    "contactEmail": "support@stripe.com",
    "contactWebsite": "https://stripe.com",
    "partial": false
  },
  {
    "company": "Stripe",
    "name": "Ricardo Davis",
    "summary": "Managing Director at Stripe",
    "seniorityLevel": "Director",
    "profileUrl": "https://www.linkedin.com/in/ricardo-davis-b71b07236",
    "contactEmail": "support@stripe.com",
    "partial": true
  }
]
```

Full rows also carry `location`, `schools`, `languages`, `about`, `jobFunction` and `imageUrl`. Export as JSON, CSV, Excel or straight into your CRM through the API.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `companies` | array | — | Company names or websites, one per entry. Websites work best — the search is more precise and the email lookup goes straight to that site. |
| `seniorityLevels` | array | `CXO, Owner, VP, Director` | Who counts as a decision maker. Also accepts `Partner`, `Manager`, `Senior`, `Entry`, `Intern`. |
| `jobFunctions` | array | all | Narrow to functions — `Marketing` finds CMOs, VPs of Marketing, Marketing Directors. |
| `title` | string | — | A custom title searched first at every company, e.g. `Head of Partnerships`. |
| `location` | string | — | Location keyword, useful for multi-office companies. |
| `maxResultsPerCompany` | integer | `5` | Cap per company (max 50). |
| `enrichEmails` | boolean | `true` | Look up each company's contact email on its own website. |

### Pricing

| Event | Price | When |
|---|---|---|
| Actor start | $0.005 | Per run (per GB of memory) |
| Decision maker — full profile | $0.015 | Complete public profile: employer, location, schools, languages, about |
| Decision maker — basic | $0.005 | LinkedIn blocked the profile page; the row carries name, headline and profile URL recovered from the search result |
| Company contact email | $0.05 | Once per company, only when an email is actually found |

Worked example: 20 companies × 5 decision makers with emails ≈ 100 rows. If ~40 parse full, ~60 basic and 12 companies yield an email: `0.005 + 40×0.015 + 60×0.005 + 12×0.05 = $1.51`. The same list on a per-contact tool at $0.06–0.14 per row runs $6–14.

What you never pay for: ex-employees, namesake-company people, wrong-seniority profiles (all dropped before delivery), companies where no email was found, and failed lookups.

### Honest notes — read before running

- **LinkedIn shows full public profiles for only a subset of members.** The rest answer with a block from every IP address, permanently — no scraper can fetch those pages without a login. For blocked members you still get the person (name, headline, profile URL) as a `partial: true` row at the lower basic price.
- **Emails are company contact emails** (`support@`, `hello@`, `info@`) verified on the company's own website — not guessed personal inboxes. Big SaaS companies often publish none; small and mid-size businesses usually do.
- **Yield varies by company.** A 10-person startup may have 2 findable decision makers, not 5. You pay per delivered row, so thin companies cost less.
- Generic one-word company names ("Apple", "Notion") attract namesakes; the guards drop them, but a website input (`notion.so`) always beats a bare name.

### FAQ

**Do I need a LinkedIn account or cookie?** No. The actor only reads public profile pages and search results. There is nothing to ban.

**Is this legal?** The actor collects publicly available business information — the same pages any logged-out visitor sees. You are responsible for using the data in compliance with local regulations (GDPR/CCPA) for your outreach.

**Can I get people's personal email addresses?** No — this actor deliberately ships company contact emails found on company websites. Pair the LinkedIn profile URL with your enrichment provider if you need personal inboxes.

**How is this different from a LinkedIn people search scraper?** A people search takes one query. This actor takes a company *list*, runs the role ladder per company, applies the current-employee guards, dedupes, and attaches company emails — the lead-gen loop, packaged.

### Related actors

- [LinkedIn People Search Scraper](https://apify.com/memo23/linkedin-people-search) — free-form people search by keyword, title, company or school
- [LinkedIn Jobs Scraper](https://apify.com/memo23/linkedin-search-results-scraper) — job postings by search URL
- [Instahyre Jobs Scraper](https://apify.com/memo23/instahyre-jobs-scraper) — tech hiring signals from Instahyre

### Support

Issues and feature requests via the actor's **Issues** tab — answered within a day.

# Actor input Schema

## `companies` (type: `array`):

One entry per company — a name (`Notion`) or a website (`stripe.com`). Websites work best: the search is more precise and the contact-email lookup goes straight to that site.

## `seniorityLevels` (type: `array`):

Which seniority buckets to deliver. Default: CXO, Owner/Founder, VP and Director — the buying committee.

## `jobFunctions` (type: `array`):

Optional: narrow to these functions. Example: `Marketing` finds CMOs, VPs of Marketing and Marketing Directors.

## `title` (type: `string`):

A specific title searched FIRST at every company, e.g. `Head of Partnerships`.

## `location` (type: `string`):

Narrow the search to a location keyword, e.g. `Berlin`. Useful for companies with many offices.

## `maxResultsPerCompany` (type: `integer`):

Cap per company. Default `5`, maximum `50`.

## `enrichEmails` (type: `boolean`):

For each company, discover its website and scrape it for a verified contact email — added to every row as `contactEmail`/`contactWebsite`. Billed once per company, only when an email is actually found. Turn off for profiles only.

## `proxy` (type: `object`):

Leave empty — the actor routes through its own residential proxy. Only set to use your own proxies.

## Actor input object example

```json
{
  "companies": [
    "stripe.com",
    "notion.so",
    "Airtable"
  ],
  "seniorityLevels": [
    "CXO",
    "Owner",
    "VP",
    "Director"
  ],
  "maxResultsPerCompany": 5,
  "enrichEmails": 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 = {
    "companies": [
        "stripe.com",
        "notion.so",
        "Airtable"
    ],
    "seniorityLevels": [
        "CXO",
        "Owner",
        "VP",
        "Director"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/decision-maker-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 = {
    "companies": [
        "stripe.com",
        "notion.so",
        "Airtable",
    ],
    "seniorityLevels": [
        "CXO",
        "Owner",
        "VP",
        "Director",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/decision-maker-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 '{
  "companies": [
    "stripe.com",
    "notion.so",
    "Airtable"
  ],
  "seniorityLevels": [
    "CXO",
    "Owner",
    "VP",
    "Director"
  ]
}' |
apify call memo23/decision-maker-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/decision-maker-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/INN1nYwaYlH6xRXaC/builds/4mZlGsvtPrNggw0i6/openapi.json
