# Apollo Leads Scraper — B2B Leads & Verified Emails Export (`bovi/apollo-leads-scraper`) Actor

Export B2B leads from Apollo.io with verified work emails, phones, and full company data. Use your own Apollo session cookies OR API key. 25+ filters: job title, seniority, department, location, industry, tech stack, revenue, headcount. Auto-paginates and resumes. Pay per lead.

- **URL**: https://apify.com/bovi/apollo-leads-scraper.md
- **Developed by:** [Vitalii Bondarev](https://apify.com/bovi) (community)
- **Categories:** Lead generation, Marketing
- **Stats:** 7 total users, 2 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.85 / 1,000 listings

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?

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

### Apollo Leads Scraper — B2B Leads & Verified Emails Export

Export targeted B2B leads from **Apollo.io** — with verified work emails, phone numbers, and full company firmographics — straight into a clean dataset (JSON, CSV, Excel). You bring your own Apollo account; this actor automates the export your sales team would otherwise click through by hand. Paste an Apollo People search URL or set 25+ structured filters, and the actor paginates Apollo for you, reveals contact data your plan allows, and delivers one row per lead.

This is the lead-gen workhorse: same data the top Apollo exporters return, with a **richer output schema** (person + socials + location + nested company tech stack and keywords), automatic **pagination**, and **resume** so an interrupted run continues instead of restarting.

#### Features

- **Two access modes** — *Session cookies* (replays your logged-in Apollo session; broadest plan coverage) or *API key* (Apollo's official API, cleaner and more stable).
- **Apollo search URL OR structured filters** — paste the URL from your browser after filtering in Apollo, or build the query with fields.
- **25+ filters** — job titles (include/exclude), seniority (Founder/Owner/C-Suite/VP/Director/Head/Manager/Senior/Entry), departments & functions, person location (include/exclude), company HQ location, industries, employee-count ranges, revenue bands, funding stage, company domains, tech stack, and free-text keywords.
- **Verified emails & phones** — extracts `email` + `email_status` and (optionally) reveals work/personal emails and mobile/work phones via enrichment. Reveals consume **your** Apollo credits.
- **Rich company data** — domain, website, LinkedIn, industry, employee count, revenue, HQ location, technologies, and keywords on every lead.
- **Auto-paginate + resume** — fetches up to 50,000 records; an identical re-run resumes from the last scraped page (progress stored in the key-value store).
- **Residential proxy** — routes through Apify Residential so your Apollo account is not IP-flagged; the session IP stays sticky to keep your login valid.

#### How to use

**Option A — Session cookies (default):**

1. Log into [app.apollo.io](https://app.apollo.io) in your browser.
2. Install the **Cookie-Editor** (or **EditThisCookie**) extension, open it on the Apollo tab, and **Export** the cookies (JSON).
3. Paste that JSON into the **Apollo session cookies** field (a raw `name=value; name2=value2` string also works).
4. Paste an Apollo **People search URL** (build it in Apollo, then copy the address bar) *or* fill in the structured filters.
5. Set **Max leads**, keep the Residential proxy on, and run.

**Option B — API key:**

1. In Apollo, go to **Settings → Integrations → API** and copy your master API key.
2. Set **Access mode** to *API key*, paste the key into **Apollo API key**.
3. Add filters (URL or fields) and run. The official API returns no emails by default — keep **Reveal & enrich emails** on to enrich each lead (uses your Apollo credits).

#### Input example

```json
{
  "mode": "cookies",
  "cookies": "[{\"name\":\"remember_token_leads\",\"value\":\"...\"}]",
  "searchUrl": "https://app.apollo.io/#/people?personTitles[]=Founder&personTitles[]=CEO&personLocations[]=United%20States&organizationNumEmployeesRanges[]=1%2C50",
  "maxLeads": 500,
  "revealEmails": true,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

#### Output example

```json
{
  "full_name": "Jane Doe",
  "title": "Chief Executive Officer",
  "seniority": "c_suite",
  "email": "jane.doe@northwindrobotics.com",
  "email_status": "verified",
  "personal_email": "jane.d.personal@gmail.com",
  "mobile_phone": "+1 415-555-0188",
  "work_phone": "+1 415-555-0100",
  "linkedin_url": "https://www.linkedin.com/in/jane-doe-ceo",
  "twitter_url": "https://twitter.com/janedoe",
  "photo_url": "https://media.apollo.io/photos/jane-doe.jpg",
  "city": "San Francisco", "state": "California", "country": "United States",
  "company_name": "Northwind Robotics",
  "company_domain": "northwindrobotics.com",
  "company_linkedin": "https://www.linkedin.com/company/northwind-robotics",
  "industry": "robotics",
  "employee_count": 240,
  "revenue": 48000000,
  "company_city": "San Francisco", "company_country": "United States",
  "technologies": ["Salesforce", "HubSpot", "AWS", "React"],
  "keywords": ["industrial automation", "robotics", "machine vision"],
  "company_funding_stage": "series_b",
  "parse_confidence": 1.0
}
```

Every record also carries `parse_confidence` (0–1) and a `warnings` list so you can filter low-quality rows.

#### Pricing

This actor is **pay-per-lead**: you are charged once per lead delivered to the dataset. Scraping **1,000 leads costs approximately $1.00** at the listed per-lead price. You see the price on the actor page before running. Note: email/phone **reveals consume your own Apollo credits**, billed by Apollo to your account — that is separate from this actor's per-lead charge. Apify platform/proxy usage is billed to you (the run owner) by Apify.

#### How to get the most leads per run

- Add filters: an over-broad search returns the same first pages repeatedly. Narrow by title + seniority + location.
- Keep **Reveal & enrich emails** on only if you have Apollo credits — otherwise locked rows return with `email_status: unavailable`.
- Leave **Resume** on for large pulls so a stopped run picks up where it left off.

#### Verified vs built-to-spec

The parsing, Apollo search-URL handling, filter building, dedup, and the official **API-key** request shape are verified offline against Apollo's documented data model and a realistic response fixture. The **cookies** end-to-end path is built to Apollo's internal search API spec and requires a live Apollo login to validate fully — supply your cookies and run a small `maxLeads` test first.

#### FAQ & legal disclaimer

**Do I need an Apollo subscription?** Yes. This actor automates exports from **your own** Apollo account using **your** cookies or API key. It ships with no Apollo credentials and grants no access you don't already have.

**Will this get my Apollo account flagged?** Keep the Residential proxy on (default) and use reasonable `maxLeads`. The actor keeps one sticky IP per run to mimic a normal session.

**Legal:** You are responsible for your use of Apollo and for complying with Apollo's Terms of Service, your subscription limits, and applicable data-protection laws (GDPR/CCPA) when processing personal data. The actor operator provides automation only and assumes no liability for how exported data is used. Use exported contact data lawfully (legitimate B2B outreach, proper opt-out handling).

**Support:** Hit the Issues tab for bugs or custom-filter requests.

# Actor input Schema

## `mode` (type: `string`):

How to reach Apollo. 'Session cookies' replays your logged-in Apollo browser session (broadest plan coverage). 'API key' calls Apollo's official API (cleaner, needs an Apollo API plan).

## `searchUrl` (type: `string`):

Paste an Apollo People search URL from your browser (the page after you apply filters in app.apollo.io). Its filters are parsed automatically. Leave empty to use the structured filters below instead.

## `maxLeads` (type: `integer`):

Total number of lead records to return across all pages. Each lead is one charged result.

## `revealEmails` (type: `boolean`):

Enrich each lead to reveal verified work email, personal emails and phone numbers. This consumes your own Apollo credits (one credit per revealed contact, billed to your Apollo account). Turn off to only return contacts whose email your plan already exposes.

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

Route requests through Apify Residential proxy so your Apollo account is not IP-flagged. Strongly recommended for cookies mode. The session is kept sticky so your login stays valid.

## `cookies` (type: `string`):

Cookies mode only. Paste your Apollo cookies as a JSON array (export via the EditThisCookie / Cookie-Editor browser extension while logged into app.apollo.io) OR as a raw 'name=value; name2=value2' header string. The actor must see your 'remember\_token\_\*' and CSRF cookies to replay your session.

## `apiKey` (type: `string`):

API-key mode only. Your Apollo master API key (Settings → Integrations → API in Apollo). Used as the X-Api-Key header against Apollo's official API.

## `personTitles` (type: `array`):

Job titles to include, e.g. 'CEO', 'VP of Sales', 'Head of Marketing'. Apollo also matches similar titles unless you disable that below.

## `excludeTitles` (type: `array`):

Job titles to exclude from results, e.g. 'Intern', 'Assistant'.

## `includeSimilarTitles` (type: `boolean`):

Keep on to let Apollo expand each title to similar ones (e.g. 'CEO' also matches 'Chief Executive'). Turn off for exact-title matching only.

## `seniorities` (type: `array`):

Filter by seniority. Pick from: owner, founder, c\_suite, partner, vp, head, director, manager, senior, entry, intern.

## `departments` (type: `array`):

Department or job function, e.g. 'sales', 'engineering', 'marketing', 'finance', 'information\_technology'.

## `personLocations` (type: `array`):

Where the person is based. Use cities, states, regions or countries, e.g. 'United States', 'California', 'London'.

## `excludePersonLocations` (type: `array`):

Locations to exclude, e.g. 'India', 'Pakistan'.

## `keywords` (type: `string`):

Free-text keyword filter applied across the person and company profile, e.g. 'fintech founder'.

## `organizationLocations` (type: `array`):

Company headquarters location, e.g. 'United States', 'Berlin, Germany'.

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

Company industries, e.g. 'information technology & services', 'hospital & health care', 'marketing & advertising'.

## `employeeRanges` (type: `array`):

Company headcount bands as 'min,max' strings, e.g. '1,10', '11,50', '51,200', '201,500', '501,1000', '1001,5000', '5001,10000', '10001,1000000'.

## `revenueMin` (type: `integer`):

Minimum annual company revenue in USD. Leave at 0 to ignore.

## `revenueMax` (type: `integer`):

Maximum annual company revenue in USD. Leave at 0 to ignore.

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

Restrict to specific company domains (no www / no @), e.g. 'stripe.com', 'shopify.com'. Up to 1000.

## `technologies` (type: `array`):

Match companies using any of these technologies, e.g. 'salesforce', 'hubspot', 'shopify', 'react'.

## `fundingStages` (type: `array`):

Company funding stage, e.g. 'seed', 'series\_a', 'series\_b', 'series\_c', 'private\_equity', 'ipo'.

## `maxPagesSafetyCap` (type: `integer`):

Hard ceiling on pages fetched, regardless of Max leads (Apollo serves up to 100 leads per page; 500 pages = 50,000 max). Protects against runaway runs.

## `perPage` (type: `integer`):

Page size for the Apollo search request. 100 is the Apollo maximum and the most efficient.

## `resume` (type: `boolean`):

Continue an identical previous run from the last page it scraped (progress is stored in the key-value store keyed by the search filters). Turn off to always start from page 1.

## Actor input object example

```json
{
  "mode": "cookies",
  "searchUrl": "https://app.apollo.io/#/people?personTitles[]=Founder&personTitles[]=CEO&personLocations[]=United%20States&organizationNumEmployeesRanges[]=1%2C50",
  "maxLeads": 500,
  "revealEmails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "personTitles": [
    "Founder",
    "CEO"
  ],
  "includeSimilarTitles": true,
  "seniorities": [
    "owner",
    "founder",
    "c_suite"
  ],
  "personLocations": [
    "United States"
  ],
  "revenueMin": 0,
  "revenueMax": 0,
  "maxPagesSafetyCap": 500,
  "perPage": 100,
  "resume": true
}
```

# Actor output Schema

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

Dataset containing Apollo Leads Scraper records (full\_name, title, seniority, email, email\_status, mobile\_phone, linkedin\_url, company\_name, company\_domain, industry, employee\_count, city, country).

# 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 = {
    "searchUrl": "https://app.apollo.io/#/people?personTitles[]=Founder&personTitles[]=CEO&personLocations[]=United%20States&organizationNumEmployeesRanges[]=1%2C50",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    },
    "personTitles": [
        "Founder",
        "CEO"
    ],
    "seniorities": [
        "owner",
        "founder",
        "c_suite"
    ],
    "personLocations": [
        "United States"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("bovi/apollo-leads-scraper").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 = {
    "searchUrl": "https://app.apollo.io/#/people?personTitles[]=Founder&personTitles[]=CEO&personLocations[]=United%20States&organizationNumEmployeesRanges[]=1%2C50",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
    "personTitles": [
        "Founder",
        "CEO",
    ],
    "seniorities": [
        "owner",
        "founder",
        "c_suite",
    ],
    "personLocations": ["United States"],
}

# Run the Actor and wait for it to finish
run = client.actor("bovi/apollo-leads-scraper").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 '{
  "searchUrl": "https://app.apollo.io/#/people?personTitles[]=Founder&personTitles[]=CEO&personLocations[]=United%20States&organizationNumEmployeesRanges[]=1%2C50",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "personTitles": [
    "Founder",
    "CEO"
  ],
  "seniorities": [
    "owner",
    "founder",
    "c_suite"
  ],
  "personLocations": [
    "United States"
  ]
}' |
apify call bovi/apollo-leads-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,bovi/apollo-leads-scraper"
        }
    }
}

```

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/Wgp5W9ftHNzUXl32f/builds/wGt5aokSFkg1XULA2/openapi.json
