# B2B Leads Finder + Verified Emails (Apollo Alternative) (`peoplesearch/b2b-leads-finder`) Actor

Build B2B lead lists by job title, location, industry, company size and keywords: name, title, company, location and LinkedIn URL, up to 1,000 leads a run, plus verified work emails on request. No login or cookies. $1.50 per 1,000 leads.

- **URL**: https://apify.com/peoplesearch/b2b-leads-finder.md
- **Developed by:** [PeopleSearch.im](https://apify.com/peoplesearch) (community)
- **Categories:** Lead generation, AI, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 leads

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?

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

## B2B Leads Finder + Verified Emails (Apollo Alternative)

Build a B2B lead list from filters: job titles, locations, industries, company size and keywords. You get clean rows with name, job title, company, company website, industry, company size, location and LinkedIn profile URL, up to 1,000 leads a run, with a verified work email for each lead when you ask for one.

There is no LinkedIn login, no cookie and no browser session involved. The leads come from a licensed B2B people database, so nothing can get an account restricted and nothing waits on a browser.

### What it does

- **Filters like a sales database**: job titles ("Head of Marketing", "CFO"), titles to leave out, locations (countries, states, cities, regions such as DACH), industries, company size, words in the company's description ("SaaS", "HVAC", "dental clinic"), specific company websites and keywords anywhere in the profile.
- **Reads titles the way people write them.** Each title is also searched in its other spellings ("VP Sales", "VP of Sales", "Vice President of Sales"; "CEO", "Chief Executive Officer"), and a bare "President" or "Owner" means the top job, not every vice president or product owner.
- **Counts before it charges.** The run first counts how many people match. A target that matches nobody ends at once and costs nothing beyond its start.
- **Never pads the list.** Every lead matches every filter you set. When nobody does, the run delivers nobody and says which filter to widen, instead of handing you people outside your target.
- **Finds verified work emails** on request. Each address is looked up live, not guessed from a pattern or copied from an old export, and you pay only for an email that is found.

### How to use it

1. Fill in the filters that describe your target. At least one of job titles, locations, industries, company keywords, company websites or keywords.
2. Set **Number of leads** (up to 1,000 per run).
3. Switch on **Find verified work emails** if you want them.
4. Run it, then download the dataset as CSV, Excel or JSON, or read it through the Apify API.

### Input

| Field | What it is |
|---|---|
| `jobTitles` | Current job titles, matched anywhere in the title ("Sales" also finds "Head of Sales"). |
| `excludeJobTitles` | Titles to leave out, such as Intern, Assistant or Recruiter. |
| `locations` | Countries, states, regions or cities. |
| `industries` | Industries of the people's companies, picked from the list. |
| `companySizes` | Company size ranges by employees; the search covers from the smallest to the largest picked. |
| `companyKeywords` | Words the company's own description contains. |
| `companyDomains` | Only these companies, by website, up to 50. |
| `keywords` | Words anywhere in a person's profile. |
| `maxResults` | How many leads, 1 to 1,000. Default 100. |
| `includeEmails` | Also look up each lead's verified work email. Default off. |

```json
{
    "jobTitles": ["Head of Marketing", "Marketing Director", "CMO"],
    "excludeJobTitles": ["Assistant", "Intern"],
    "locations": ["United States"],
    "industries": ["Software Development"],
    "companySizes": ["51-200", "201-500"],
    "maxResults": 500,
    "includeEmails": true
}
```

### Output

One row per lead. The values below are placeholders that show the shape.

```json
{
    "name": "Jane Doe",
    "firstName": "Jane",
    "lastName": "Doe",
    "title": "Head of Marketing",
    "headline": "B2B marketing leader",
    "company": "Example Software",
    "companyWebsite": "https://example.com",
    "companyLinkedin": "https://www.linkedin.com/company/example",
    "companyIndustry": "Software Development",
    "companySize": 180,
    "companyLocation": "Austin, Texas, United States",
    "location": "Austin, Texas, United States",
    "linkedinUrl": "https://www.linkedin.com/in/jane-doe-example",
    "email": "jane.doe@example.com",
    "emailStatus": "found",
    "emailCertainty": "ultra_sure",
    "about": null,
    "roleStartDate": "2023-04"
}
```

`emailStatus` is `found`, `not_found` (no verified address exists; not charged), or empty when emails were not requested. The run's `OUTPUT` record holds the filters searched, how many people match them, how many leads were delivered and why a run delivered fewer than asked.

### What it costs

You pay per result, nothing per month:

| What | Price |
|---|---|
| One lead delivered as a full profile | $0.0015 |
| One verified work email found | $0.02 |
| An email lookup that finds nothing | Free |
| A target where nobody matches | Free |
| The run start | $0.00005 |

So 1,000 leads cost $1.50, and 100 leads with their verified emails cost at most $2.15. Set a maximum cost per run in the run options and the Actor stops delivering at that amount.

**On Apify's free plan** a run delivers up to 25 leads and does not look up emails. Paid plans get up to 1,000 leads per run and verified emails.

### Use it from an AI agent

Every Apify Actor can be called as a tool through Apify's MCP server, so an AI agent can pass a target to this Actor and read the leads back.

### Questions

**Does this scrape LinkedIn or Apollo?**
No. It never opens LinkedIn or any other site and needs no account of yours. The profiles come from a licensed B2B people database (Icypeas), and a person's public LinkedIn URL is part of the profile you receive.

**Why did a run deliver nobody?**
Nobody matches every filter together. The status message and the `OUTPUT` record say which filter to widen.

**Why did I get fewer leads than I asked for?**
Fewer people may match, your maximum cost per run may cover fewer, or you are on the free plan (25 per run). The status message and the `OUTPUT` record say which.

**I need the people at specific companies.**
Put their websites in **Only these company websites**, or use the Company Employees Finder by the same publisher, which takes up to 25 companies by website, LinkedIn page or name.

**Can a person be removed from results?**
Yes. Anyone can ask to be left out at peoplesearch.im/opt-out, and the request applies to every search and lookup.

### Using the data

The results are business contact data about real people. You are responsible for having a lawful basis for how you use them, including the rules on unsolicited email where your recipients live (for example GDPR and the ePrivacy rules in Europe, CAN-SPAM in the United States and CASL in Canada).

# Actor input Schema

## `jobTitles` (type: `array`):

People whose current title contains one of these, for example Head of Marketing, Marketing Director, CMO. Each is also searched in its other spellings (VP Sales, VP of Sales, Vice President of Sales). A bare President or Owner means the top job, not vice presidents or product owners.

## `excludeJobTitles` (type: `array`):

Titles to leave out, for example Intern, Assistant or Recruiter.

## `locations` (type: `array`):

Countries, states, regions or cities, for example United States, California, London, DACH.

## `industries` (type: `array`):

The industries the people's companies are in.

## `companySizes` (type: `array`):

Pick one or more; the search covers from the smallest to the largest you pick.

## `companyKeywords` (type: `array`):

Words the company's own description contains, for a kind of company no industry names exactly: SaaS, HVAC, dental clinic, Shopify agency.

## `companyDomains` (type: `array`):

Limit the leads to these companies, by website (stripe.com), up to 50.

## `keywords` (type: `array`):

Words anywhere in a person's profile, such as a skill or a product they work with: Salesforce, Kubernetes.

## `maxResults` (type: `integer`):

How many leads to deliver, up to 1,000 per run (25 on Apify's free plan). You pay per lead delivered.

## `includeEmails` (type: `boolean`):

Also look up each lead's verified work email. Charged only for emails that are found. Available on Apify paid plans.

## Actor input object example

```json
{
  "jobTitles": [
    "Head of Marketing",
    "Marketing Director"
  ],
  "locations": [
    "United States"
  ],
  "maxResults": 100,
  "includeEmails": false
}
```

# Actor output Schema

## `leads` (type: `string`):

One row per lead: name, job title, company, company website, industry, size, location, LinkedIn URL and, when asked for, the verified work email.

## `summary` (type: `string`):

The filters searched, how many people match, how many leads were delivered and why a run delivered fewer.

# 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 = {
    "jobTitles": [
        "Head of Marketing",
        "Marketing Director"
    ],
    "locations": [
        "United States"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("peoplesearch/b2b-leads-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 = {
    "jobTitles": [
        "Head of Marketing",
        "Marketing Director",
    ],
    "locations": ["United States"],
}

# Run the Actor and wait for it to finish
run = client.actor("peoplesearch/b2b-leads-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 '{
  "jobTitles": [
    "Head of Marketing",
    "Marketing Director"
  ],
  "locations": [
    "United States"
  ]
}' |
apify call peoplesearch/b2b-leads-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,peoplesearch/b2b-leads-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/5i8EUgcmR4QRzzvXm/builds/uosiPfJdvEZ2qtHPn/openapi.json
