# Leads Finder - B2B List Building (`scalelist/leads-finder`) Actor

Build a targeted B2B lead list with filters for job title, seniority, company size, industry, keyword and location. Full profiles with company details and LinkedIn URL.

- **URL**: https://apify.com/scalelist/leads-finder.md
- **Developed by:** [Scalelist](https://apify.com/scalelist) (community)
- **Categories:** Lead generation
- **Features:** Limited permissions
- **Stats:** 27 total users, 5 monthly users, 95.7% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $50.00 / 1,000 leads founds

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

## Leads Finder by Scalelist

Find targeted B2B lead profiles matching job titles, departments, career levels, past roles, skills, locations, industries, and company criteria — powered by Scalelist without leaving your Apify workflow.

Search over millions of B2B profiles and export clean, verified firmographic and professional profile data directly to the Apify Dataset.

***

### How it works

1. Set **Number of leads to extract** — how many leads you want back.
2. Narrow your audience using any combination of the 46 filter fields, grouped on the input form into **Job Title & Role**, **Experience**, **Past Roles**, **Company**, **Company Size**, **Industry**, **Skills & Background**, **Keywords**, **Signals** and **Person Location**. Most filters have an **Exclude** twin that drops anyone who matches.

The Actor fetches matching profiles progressively and writes them straight to your Apify dataset.

You are charged per lead delivered, via Apify Pay-Per-Event (PPE). If fewer leads match than you asked for, you are only charged for the leads actually delivered — asking for 10,000 when only 100 match costs you 100.

***

### Input

| Field | Form label | Section | Type | Description |
| --- | --- | --- | --- | --- |
| `maxResults` | Number of leads to extract | — | `integer` | How many leads to return (default: `100`, max: `10,000`) |
| `jobTitles` | Job Titles | Job Title & Role | `string[]` | Job titles to match (OR logic), e.g. `["VP Sales", "Chief Technology Officer"]` |
| `excludeJobTitles` | Exclude Job Titles | Job Title & Role | `string[]` | Job titles to exclude from results |
| `jobFunctions` | Job Functions | Job Title & Role | `string[]` | Functional departments, e.g. `["Sales", "Engineering", "Marketing"]` |
| `excludeJobFunctions` | Exclude Job Functions | Job Title & Role | `string[]` | Functions to exclude (current role) |
| `seniority` | Seniority Levels | Job Title & Role | `string[]` | Career levels, e.g. `["CXO", "Vice President", "Director"]` |
| `excludeSeniority` | Exclude Seniority Levels | Job Title & Role | `string[]` | Career levels to exclude (current role) |
| `yearsOfExperienceMin` / `Max` | Years of Experience Min / Max | Experience | `integer` | Total years of work experience |
| `yearsInCurrentRoleMin` / `Max` | Years in Current Role Min / Max | Experience | `integer` | Years at the current employer |
| `recentlyChangedJobs` | Recently Changed Jobs | Experience | `boolean` | Only people who started their current role in about the last 3 months |
| `pastCompanies` | Past Companies | Past Roles | `string[]` | Companies the person worked at before, e.g. `["Google"]` |
| `excludePastCompanies` | Exclude Past Companies | Past Roles | `string[]` | Drop anyone who worked at these companies before |
| `pastJobTitles` | Past Job Titles | Past Roles | `string[]` | Job titles held in a past role, e.g. `["Founder"]` |
| `excludePastJobTitles` | Exclude Past Job Titles | Past Roles | `string[]` | Drop anyone who held these titles in a past role |
| `pastSeniority` | Past Seniority Levels | Past Roles | `string[]` | Career level of a past role |
| `excludePastSeniority` | Exclude Past Seniority Levels | Past Roles | `string[]` | Drop anyone who held these levels in a past role |
| `companies` | Company Name | Company | `string[]` | Names of companies to include (OR logic), e.g. `["Google", "Stripe"]` |
| `excludeCompanies` | Exclude Company Name | Company | `string[]` | Names of companies to exclude from results |
| `companyDomains` | Company Domains | Company | `string[]` | Company website domains to include, e.g. `["stripe.com"]` |
| `excludeCompanyDomains` | Exclude Company Domains | Company | `string[]` | Company website domains to exclude |
| `companyHqCountries` | Company HQ Countries | Company | `string[]` | Where the current employer has its headquarters, e.g. `["Germany", "USA"]` |
| `excludeCompanyHqCountries` | Exclude Company HQ Countries | Company | `string[]` | HQ countries to exclude |
| `companyTypes` | Company Types | Company | `string[]` | Employer type, e.g. `["Public Company", "Privately Held"]` |
| `companySizeMin` | Company Size Min | Company Size | `integer` | Minimum employee count (optional) |
| `companySizeMax` | Company Size Max | Company Size | `integer` | Maximum employee count (optional) |
| `industries` | Industries | Industry | `string[]` | Industries to match, e.g. `["Computer Software", "Financial Services"]` |
| `excludeIndustries` | Exclude Industries | Industry | `string[]` | Industries to exclude (current employer) |
| `skills` / `excludeSkills` | Skills / Exclude Skills | Skills & Background | `string[]` | Skills listed on the profile, e.g. `["Salesforce", "Python"]` |
| `languages` / `excludeLanguages` | Languages / Exclude Languages | Skills & Background | `string[]` | Languages the person speaks, e.g. `["French"]` |
| `schools` / `excludeSchools` | Schools / Exclude Schools | Skills & Background | `string[]` | Schools or universities attended, e.g. `["Stanford"]` |
| `certifications` / `excludeCertifications` | Certifications / Exclude Certifications | Skills & Background | `string[]` | Certifications held, e.g. `["PMP"]` |
| `keywords` | Keywords | Keywords | `string[]` | Free-text keywords (OR logic) matched on headline, bio or company name |
| `excludeKeywords` | Exclude Keywords | Keywords | `string[]` | Drop anyone whose profile contains these words |
| `openTo` | Open To | Signals | `string[]` | Profile signals: `hiring`, `open_to_work`, `volunteering` |
| `minFollowers` | Minimum LinkedIn Followers | Signals | `integer` | Only people with at least this many followers |
| `countries` | Countries | Person Location | `string[]` | Countries to match, e.g. `["United States", "United Kingdom"]` |
| `states` | States / Regions | Person Location | `string[]` | States / provinces to match, e.g. `["California", "Ontario"]` |
| `cities` | Cities | Person Location | `string[]` | Cities to match, e.g. `["San Francisco", "London", "Singapore"]` |
| `excludeCountries` / `excludeStates` / `excludeCities` | Exclude Countries / States / Cities | Person Location | `string[]` | Locations to exclude, e.g. United States except California |

`companies` matches on the company's **name**; use `companyDomains` to match on its website instead.

**Past roles go together.** `pastCompanies`, `pastJobTitles` and `pastSeniority` must all match the **same** past role: `pastCompanies: ["Google"]` + `pastSeniority: ["Vice President"]` = people who were a VP at Google.

**Exclusions are strict.** An exclusion drops anyone with any match, e.g. `excludeSkills: ["Java"]` drops everyone who lists Java, even with other skills.

**Bad values stop the run at once.** If the search engine cannot read a filter (for example an industry name that matches no industry), the run fails with the reason in the log. You are not charged.

`keyword` (one free-text word) is still accepted from saved inputs and the API, but the form now uses `keywords`.

#### Example input: Search for Software Engineering VPs & Directors

```json
{
  "maxResults": 100,
  "jobTitles": ["VP Engineering", "Director of Engineering"],
  "jobFunctions": ["Engineering"],
  "seniority": ["Vice President", "Director"],
  "industries": ["Computer Software", "Internet"],
  "companySizeMin": 50,
  "companySizeMax": 500,
  "countries": ["United States"]
}
```

#### Example input: Target named accounts

```json
{
  "maxResults": 500,
  "companies": ["Stripe", "Ramp", "Brex"],
  "seniority": ["CXO", "Vice President"],
  "countries": ["United States"]
}
```

#### Example input: Ex-founders now in sales, outside staffing

```json
{
  "maxResults": 200,
  "jobFunctions": ["Sales"],
  "pastJobTitles": ["Founder", "Co-Founder"],
  "excludeIndustries": ["Staffing & Recruiting"],
  "yearsInCurrentRoleMax": 2,
  "countries": ["United States"],
  "excludeStates": ["California"]
}
```

***

### Output

Every delivered lead is written to the Apify Dataset with the following fields:

| Field | Type | Description |
| --- | --- | --- |
| `full_name` | `string` | Lead's full name |
| `first_name` | `string` | First name |
| `last_name` | `string` | Last name |
| `job_title` | `string` | Current job title |
| `seniority` | `string` | Seniority level (`CXO`, `Vice President`, `Director`, `Experienced Manager`, etc.) |
| `job_function` | `string` | Functional department |
| `company_name` | `string` | Current employer |
| `company_domain` | `string` | Company website domain |
| `company_size` | `string` | Company employee count range |
| `industry` | `string` | Industry category |
| `city` | `string` | City |
| `state` | `string` | State or region |
| `country` | `string` | Country |
| `linkedin_url` | `string` | Public LinkedIn profile URL |
| `company_linkedin_url` | `string` | Company LinkedIn page URL |
| `profile_picture_url` | `string` | Profile image URL (if available) |

#### Example output row

```json
{
  "full_name": "Jane Doe",
  "first_name": "Jane",
  "last_name": "Doe",
  "job_title": "VP of Engineering",
  "seniority": "Vice President",
  "job_function": "Engineering",
  "company_name": "Acme Cloud Inc.",
  "company_domain": "acmecloud.com",
  "company_linkedin_url": "https://www.linkedin.com/company/acme-cloud",
  "company_size": "51-200",
  "industry": "Computer Software",
  "city": "San Francisco",
  "state": "California",
  "country": "United States",
  "linkedin_url": "https://www.linkedin.com/in/janedoe",
  "profile_picture_url": "https://media.licdn.com/dms/image/..."
}
```

***

### Enriching your leads

This Actor finds and extracts lead profiles. It does not return emails or phone numbers — run the results through the enrichment Actors for those:

- **Email Finder** — verified business emails
- **Phone Finder** — mobile numbers
- **Domain Finder** — all emails at a company, from its domain

Output is `snake_case` (`first_name`, `company_domain`, `linkedin_url`) so it maps directly onto what those Actors expect.

### Error handling

| Situation | Behaviour |
| --- | --- |
| Rate limit (429) | Exponential backoff, up to 5 automatic retries |
| Invalid filter (400 / 422) | The run fails at once with the reason in the log; no retries, no charge |
| Fewer matches than requested | Search ends when results are exhausted; you are charged only for leads delivered |
| Spend cap reached | Only the leads that could be charged are delivered, then the Actor stops cleanly and flushes all saved dataset rows |
| Duplicate profiles | Deduplicated within the run by LinkedIn URL; duplicates are never charged |

***

### Other Scalelist Actors

- [Email Finder](https://apify.com/scalelist/email-finder): find your leads' verified email
- [LinkedIn Email Finder](https://apify.com/scalelist/linkedin-email-finder): find work emails from LinkedIn profile URLs
- [Phone Finder](https://apify.com/scalelist/phone-finder): find your leads' mobile number
- [Domain Finder](https://apify.com/scalelist/domain-email-finder): find leads and their emails from a company domain

***

### Support

- [Scalelist Website](https://scalelist.com)
- Scalelist Support: hello@scalelist.com

# Actor input Schema

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

How many leads to return (1 to 10,000). You are charged per lead delivered to the dataset.

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

Job titles to match (OR logic), e.g. 'CEO', 'Head of Sales'.

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

Job titles to exclude. Applied after the filters above.

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

Functional departments to match (OR logic).

## `excludeJobFunctions` (type: `array`):

Drop anyone whose current role is in one of these functions.

## `seniority` (type: `array`):

Seniority / career levels to match (OR logic).

## `excludeSeniority` (type: `array`):

Drop anyone whose current role is at one of these levels.

## `yearsOfExperienceMin` (type: `integer`):

Minimum total years of work experience (inclusive).

## `yearsOfExperienceMax` (type: `integer`):

Maximum total years of work experience (inclusive).

## `yearsInCurrentRoleMin` (type: `integer`):

Minimum years at the current employer (inclusive).

## `yearsInCurrentRoleMax` (type: `integer`):

Maximum years at the current employer (inclusive).

## `recentlyChangedJobs` (type: `boolean`):

Only people who started their current role in about the last 3 months. New leaders often buy new tools.

## `pastCompanies` (type: `array`):

Companies the person worked at before, by name (OR logic), e.g. 'Google'.

## `excludePastCompanies` (type: `array`):

Drop anyone who worked at any of these companies before.

## `pastJobTitles` (type: `array`):

Job titles held in a past role (OR logic), e.g. 'Founder'.

## `excludePastJobTitles` (type: `array`):

Drop anyone who held any of these job titles in a past role.

## `pastSeniority` (type: `array`):

Career level of a past role (OR logic).

## `excludePastSeniority` (type: `array`):

Drop anyone who held any of these levels in a past role.

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

Names of companies to include (OR logic), e.g. 'Google', 'Stripe'. Match on the company's name, not its website — use Company Domains for that.

## `excludeCompanies` (type: `array`):

Names of companies to exclude from results.

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

Company website domains to include, e.g. 'google.com', 'stripe.com'.

## `excludeCompanyDomains` (type: `array`):

Company website domains to exclude, e.g. 'stripe.com'. More exact than names when you upload an account list from your CRM.

## `companyHqCountries` (type: `array`):

Country where the current employer has its headquarters (OR logic), e.g. 'Germany' or 'DEU'. This is where the company is based, not the person.

## `excludeCompanyHqCountries` (type: `array`):

Drop people whose current employer has its headquarters in any of these countries.

## `companyTypes` (type: `array`):

Type of current employer (OR logic).

## `companySizeMin` (type: `integer`):

Minimum employee count (inclusive).

## `companySizeMax` (type: `integer`):

Maximum employee count (inclusive).

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

Industries to match, e.g. 'Computer Software', 'Financial Services'.

## `excludeIndustries` (type: `array`):

Industries to exclude (current employer), e.g. 'Staffing & Recruiting'. A word that matches no industry stops the run before any charge.

## `skills` (type: `array`):

Skills listed on the profile (OR logic), e.g. 'Salesforce', 'Python'.

## `excludeSkills` (type: `array`):

Drop anyone who lists any of these skills.

## `languages` (type: `array`):

Languages the person speaks (OR logic), e.g. 'French', 'German'.

## `excludeLanguages` (type: `array`):

Drop anyone who lists any of these languages.

## `schools` (type: `array`):

Schools or universities attended (OR logic), e.g. 'Stanford', 'HEC Paris'.

## `excludeSchools` (type: `array`):

Drop anyone who attended any of these schools.

## `certifications` (type: `array`):

Certifications held (OR logic), e.g. 'PMP', 'AWS Certified'.

## `excludeCertifications` (type: `array`):

Drop anyone who holds any of these certifications.

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

Free-text keywords (OR logic). A lead matches if ANY entry appears on their profile (headline, bio or company name), e.g. 'cold calling', 'appointment setting'.

## `excludeKeywords` (type: `array`):

Drop anyone whose profile contains any of these words.

## `openTo` (type: `array`):

Signals the person shows on their own profile (OR logic). "Hiring" is the strongest outbound signal.

## `minFollowers` (type: `integer`):

Only people with at least this many LinkedIn followers, e.g. 5000.

## `countries` (type: `array`):

Countries to match, e.g. 'United States', 'United Kingdom', 'France'.

## `states` (type: `array`):

States or provinces to match, e.g. 'California', 'Texas', 'Ontario'.

## `cities` (type: `array`):

Cities to match, e.g. 'San Francisco', 'London', 'Singapore'.

## `excludeCountries` (type: `array`):

Countries to exclude, e.g. "United States except California" = Countries: United States + Exclude States: California.

## `excludeStates` (type: `array`):

States or provinces to exclude.

## `excludeCities` (type: `array`):

Cities to exclude.

## Actor input object example

```json
{
  "maxResults": 100,
  "jobTitles": [
    "Chief Executive Officer",
    "VP of Sales",
    "Head of Growth"
  ],
  "jobFunctions": [
    "Sales",
    "Marketing"
  ],
  "seniority": [
    "CXO",
    "Vice President",
    "Director"
  ],
  "companySizeMin": 10,
  "companySizeMax": 500,
  "industries": [
    "Computer Software",
    "Information Technology & Services"
  ],
  "countries": [
    "United States"
  ]
}
```

# Actor output Schema

## `overview` (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 = {
    "maxResults": 100,
    "jobTitles": [
        "Chief Executive Officer",
        "VP of Sales",
        "Head of Growth"
    ],
    "jobFunctions": [
        "Sales",
        "Marketing"
    ],
    "seniority": [
        "CXO",
        "Vice President",
        "Director"
    ],
    "companySizeMin": 10,
    "companySizeMax": 500,
    "industries": [
        "Computer Software",
        "Information Technology & Services"
    ],
    "countries": [
        "United States"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scalelist/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 = {
    "maxResults": 100,
    "jobTitles": [
        "Chief Executive Officer",
        "VP of Sales",
        "Head of Growth",
    ],
    "jobFunctions": [
        "Sales",
        "Marketing",
    ],
    "seniority": [
        "CXO",
        "Vice President",
        "Director",
    ],
    "companySizeMin": 10,
    "companySizeMax": 500,
    "industries": [
        "Computer Software",
        "Information Technology & Services",
    ],
    "countries": ["United States"],
}

# Run the Actor and wait for it to finish
run = client.actor("scalelist/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 '{
  "maxResults": 100,
  "jobTitles": [
    "Chief Executive Officer",
    "VP of Sales",
    "Head of Growth"
  ],
  "jobFunctions": [
    "Sales",
    "Marketing"
  ],
  "seniority": [
    "CXO",
    "Vice President",
    "Director"
  ],
  "companySizeMin": 10,
  "companySizeMax": 500,
  "industries": [
    "Computer Software",
    "Information Technology & Services"
  ],
  "countries": [
    "United States"
  ]
}' |
apify call scalelist/leads-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scalelist/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/MLSOlBl4iXfdQmSID/builds/d4JBACkAPdmrRKtL1/openapi.json
