# LinkedIn People Search Scraper + Email | Lead Generation (`crawlkite/linkedin-profile-search`) Actor

Find LinkedIn people by title, company, location, industry and more. Export short results or full profiles, with optional email search, segmentation and deduplication.

- **URL**: https://apify.com/crawlkite/linkedin-profile-search.md
- **Developed by:** [CrawlKite](https://apify.com/crawlkite) (community)
- **Categories:** Lead generation, Social media
- **Stats:** 1 total users, 1 monthly users, 66.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 full profiles

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

## LinkedIn People Search Scraper + Email | Lead Generation

Find LinkedIn people using job-title, company, location, industry and other supported filters. Export short results for prospect research or enrich full profiles for recruiting and CRM workflows. Optional email search, segmented searches and MongoDB deduplication support more focused exports.

**Search-page charges are additional to the advertised full-profile rate.** Short mode charges per successful search page only. Full adds a charge for each enriched profile; Full + email search uses its own enrichment rate instead. Successful empty pages and segmentation probes are also billable. See the billing example and complete pricing below.

### Key Benefits

- **No customer cookies or LinkedIn login:** provide targets or search filters without uploading session credentials.
- **Usage-based pricing:** from $3.00 per 1,000 profiles on Business. Search-page charges are additional.
- **Structured exports:** keep nested fields in JSON or select columns for CSV and Excel.
- **Use case:** Build prospect lists using company, location and role filters.
- **Use case:** Research candidates by experience, skills and professional background.
- **Use case:** Avoid previously exported profiles with your own MongoDB deduplication store.

### How It Works

1. Provide `searchQuery` or people filters such as current titles, companies and locations. If every search filter is empty, the actor returns an empty dataset without fetching or charging search pages. Use the example input to start a targeted search.
2. Choose `Short` for search-result details only. Every successful search page is charged, including empty pages and segmentation probes.
3. Choose `Full` to enrich the returned profiles, or `Full + email search` to request email enrichment. Each enriched profile adds its selected mode’s charge to the search-page cost.
4. Set `takePages`, `maxItems` and a spending limit. Run the actor, then inspect the dataset and SUMMARY before expanding the search.

#### Example input

```json
{
  "searchQuery": "Software Engineer",
  "profileScraperMode": "Short",
  "maxItems": 20
}
```

#### Key input options

| Input | How to use it |
|---|---|
| `searchQuery` | Search keywords. Supply a query or at least one filter. An entirely empty search returns no records and incurs no search-page charge. |
| `currentJobTitles / currentCompanies / locations` | Arrays of supported title, company or location filters; see Input for accepted fields. |
| `profileScraperMode` | Short, Full or Full + email search. Choose Short explicitly for search-only results. |
| `maxItems` | Maximum returned profiles across the run. |
| `takePages` | Maximum fetched search pages, per segment when segmentation is enabled. Each successful page is billable. |

Use the **Input** tab for the full list of controls, defaults and accepted values.

#### Larger searches and repeat exports

- Enable autoQuerySegmentation to split broad queries into country, region, seniority or industry segments. takePages applies to each segment; maxItems applies to the run. Extra probe pages are billable, even when empty. Coverage is bounded by source availability and run limits.
- Use profileDeduplicationMode with your own encrypted MongoDB connection for insert_ids, insert_profiles or read_only operation. The compatibility default database is harvestapi; explicitly set mongoDbDatabaseName to crawlkite to use a separate CrawlKite database. Provide a database you control and allow the actor to connect to it.
- Apply postFilteringMongoDbQuery or a per-profile postFilteringMongoDbAggregation pipeline to the fetched records. Set a positive takePages limit. Scripts, cross-collection operations and database-write pipeline stages are unavailable.
- High coverage requires a supported capacity configuration. Regional source coverage and total-result counts may vary.

### Data You'll Receive

| Fields | What they contain |
|---|---|
| id, linkedinUrl, firstName, lastName | Available search-result identity fields |
| summary, currentPositions, location | Short search-result details |
| experience, education, skills, emails | Available enriched fields in the selected mode |
| \_meta.pagination, \_meta.scrapedAt, profileIdInSearch | Search pagination, collection time and source search identity |

Available fields retain their nested structure. Values can be absent or empty. The optional `_crawlkite` metadata object is disabled by default. Media links and source data can change after collection.

### Sample output

Results are stored as individual records in the run's **dataset**. A JSON export wraps those records in an array. The example below is illustrative, shortened and uses fictional names and IDs; it shows the output structure, not a real person or a guaranteed set of populated fields.

```json
[
  {
    "id": "example-profile-id",
    "linkedinUrl": "https://www.linkedin.com/in/jane-example",
    "firstName": "Jane",
    "lastName": "Example",
    "summary": "Software Engineer at Example Company",
    "profileIdInSearch": "example-profile-id",
    "_meta": {
      "pagination": {
        "pageNumber": 1
      },
      "scrapedAt": "2026-11-01T10:00:00.000Z"
    }
  }
]
```

This example uses **Short** mode. **Full** adds available profile details such as experience, education and skills. **Full + email search** also requests email enrichment. Both enriched modes add a per-profile charge on top of the search-page charge.

### CrawlKite pricing

The actor's Apify Pricing tab is authoritative. The table below shows actor usage rates by Apify plan. Platform subscriptions are separate from actor usage.

| Operation / billing unit | Free | Starter | Scale | Business |
|---|---:|---:|---:|---:|
| People-search pages / 1 page | $0.09 | $0.09 | $0.072 | $0.045 |
| Full profiles / 1,000 profiles | $3.60 | $3.60 | $3.24 | $3.00 |
| Full profile + email search / 1,000 profiles | $9.00 | $9.00 | $8.10 | $7.20 |

#### Pricing comparison with HarvestAPI

The rates below are 10% below the corresponding HarvestAPI rates for the operations shown below, except Business full profiles (6.25% lower) and Business main profiles (6.67% lower), where applicable. This compares individual billing events, not the total cost of every possible run or a guarantee of identical data coverage.

| Operation / billing unit | Apify plan | CrawlKite | HarvestAPI | Lower by |
|---|---|---:|---:|---:|
| People-search pages / 1 page | Free | $0.09 | $0.10 | 10% |
| People-search pages / 1 page | Starter | $0.09 | $0.10 | 10% |
| People-search pages / 1 page | Scale | $0.072 | $0.08 | 10% |
| People-search pages / 1 page | Business | $0.045 | $0.05 | 10% |
| Full profiles / 1,000 profiles | Free | $3.60 | $4.00 | 10% |
| Full profiles / 1,000 profiles | Starter | $3.60 | $4.00 | 10% |
| Full profiles / 1,000 profiles | Scale | $3.24 | $3.60 | 10% |
| Full profiles / 1,000 profiles | Business | $3.00 | $3.20 | 6.25% |
| Full profile + email search / 1,000 profiles | Free | $9.00 | $10.00 | 10% |
| Full profile + email search / 1,000 profiles | Starter | $9.00 | $10.00 | 10% |
| Full profile + email search / 1,000 profiles | Scale | $8.10 | $9.00 | 10% |
| Full profile + email search / 1,000 profiles | Business | $7.20 | $8.00 | 10% |

Comparison checked on 1 November 2026 against [HarvestAPI's corresponding actor pricing](https://apify.com/harvestapi/linkedin-profile-search/pricing). Rates can change. Full-profile prices in post enrichment use the [profile actor comparison](https://apify.com/harvestapi/linkedin-profile-scraper/pricing). This table covers Free, Starter, Scale and Business. Optional enrichment and engagement are separately priced; short people-search results are billed per search page, not per profile. There is no separate actor-start charge. Free-plan trials have stricter request and result caps.

Email search is charged for the requested enrichment operation and does not guarantee a found email. Additional search/probe pages, filters and requested add-ons can affect total usage. CrawlKite and HarvestAPI are independent services; CrawlKite is not affiliated with HarvestAPI.

#### Billing example

On Starter, two successful search pages in Short mode cost **2 × $0.09 = $0.18**, regardless of how many usable profiles those pages contain. If 40 profiles are enriched in Full mode, add **40 × $0.0036 = $0.144**, for **$0.324 total**. Full + email search uses its own enrichment rate instead of the Full rate. Empty successful pages and segmentation probes are also billable.

These examples use the Starter actor rates below and exclude your Apify subscription. Check the **Pricing** tab and set a run spending limit. Free-plan runs have stricter request and result caps; they cannot be used to reproduce these larger examples.

### LinkedIn People Search Scraper + Email API

Use the **API** tab for your actor's generated integration examples. You can run the same input from an application and retrieve dataset items through the Apify API.

For a small synchronous request, the following Bash example returns dataset items as JSON. Replace the placeholder with your Apify token and keep it out of public code:

```bash
curl --request POST \
  'https://api.apify.com/v2/acts/crawlkite~linkedin-profile-search/run-sync-get-dataset-items' \
  --header 'Authorization: Bearer YOUR_APIFY_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{"searchQuery":"Software Engineer","profileScraperMode":"Short","maxItems":20}'
```

For longer jobs, use the asynchronous run endpoint shown in the API tab, wait for the run to finish, and retrieve its dataset. Set a spending limit before running at scale. You can also schedule exports or connect Apify to n8n, Make or Zapier.

### Frequently Asked Questions

#### How are search pages and full profiles charged?

Each successful search page is charged separately, including empty segmentation probes. Full-profile or email enrichment adds its corresponding profile charge. Post-filtering does not refund profiles already fetched or enriched.

#### Why are there fewer results than requested?

Requested counts are maximums. Source availability, filters, duplicate removal, pagination and spending/request limits can reduce the export. Check the run's SUMMARY for results, errors and its stopping reason. Free-plan runs also have stricter request and result caps.

#### How do I export the results?

Open the completed run's dataset and choose JSON, CSV or Excel. JSON preserves nested objects and arrays. Select or flatten the fields you need for a CRM or spreadsheet workflow.

### Support and Feedback

Create an issue in this actor's **Issues** tab with the run ID, what you expected, and a redacted input example. Review the SUMMARY and ERRORS records first. Do not include passwords, API tokens or MongoDB connection strings. If a run crashes, inspect its existing dataset and billing events before retrying; output and charges are not guaranteed to occur exactly once across a crash.

### More LinkedIn Tools from CrawlKite

- [LinkedIn Profile Scraper + Email](https://apify.com/crawlkite/linkedin-profile-scraper) — Enrich CRM contacts with current roles, work history and education.
- [LinkedIn Company Scraper](https://apify.com/crawlkite/linkedin-company) — Enrich company records with websites, industries and employee counts.
- [LinkedIn Profile & Company Posts Scraper](https://apify.com/crawlkite/linkedin-profile-posts) — Track the content published by target profiles and company pages.
- [LinkedIn Post Search Scraper](https://apify.com/crawlkite/linkedin-post-search) — Find relevant conversations around a product, topic or market.

Explore [CrawlKite's LinkedIn API collection](https://apify.com/crawlkite) for connected profile, company, content and people-search workflows.

Collect and use data only for authorized purposes and follow applicable privacy requirements.

# Actor input Schema

## `profileScraperMode` (type: `string`):

Choose profile detail and optional email-search modes. Email search is separately priced and does not guarantee an email will be found.

## `searchQuery` (type: `string`):

Search keywords. Provide a query or at least one filter; an entirely empty search returns no records without fetching or charging search pages.

## `maxItems` (type: `integer`):

Maximum profiles across the run. 0 uses the 100,000-record safety limit.

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

locations. Optional control for your CrawlKite run.

## `currentCompanies` (type: `array`):

currentCompanies. Optional control for your CrawlKite run.

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

pastCompanies. Optional control for your CrawlKite run.

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

schools. Optional control for your CrawlKite run.

## `currentJobTitles` (type: `array`):

currentJobTitles. Optional control for your CrawlKite run.

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

pastJobTitles. Optional control for your CrawlKite run.

## `yearsOfExperienceIds` (type: `array`):

yearsOfExperienceIds. Optional control for your CrawlKite run.

## `yearsAtCurrentCompanyIds` (type: `array`):

yearsAtCurrentCompanyIds. Optional control for your CrawlKite run.

## `seniorityLevelIds` (type: `array`):

seniorityLevelIds. Optional control for your CrawlKite run.

## `functionIds` (type: `array`):

functionIds. Optional control for your CrawlKite run.

## `industryIds` (type: `array`):

industryIds. Optional control for your CrawlKite run.

## `firstNames` (type: `array`):

firstNames. Optional control for your CrawlKite run.

## `lastNames` (type: `array`):

lastNames. Optional control for your CrawlKite run.

## `profileLanguages` (type: `array`):

profileLanguages. Optional control for your CrawlKite run.

## `companyHeadcount` (type: `array`):

companyHeadcount. Optional control for your CrawlKite run.

## `companyHeadquarterLocations` (type: `array`):

companyHeadquarterLocations. Optional control for your CrawlKite run.

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

recentlyChangedJobs. Optional control for your CrawlKite run.

## `recentlyPostedOnLinkedIn` (type: `boolean`):

recentlyPostedOnLinkedIn. Optional control for your CrawlKite run.

## `excludeLocations` (type: `array`):

excludeLocations. Optional control for your CrawlKite run.

## `excludeCurrentCompanies` (type: `array`):

excludeCurrentCompanies. Optional control for your CrawlKite run.

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

excludePastCompanies. Optional control for your CrawlKite run.

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

excludeSchools. Optional control for your CrawlKite run.

## `excludeCurrentJobTitles` (type: `array`):

excludeCurrentJobTitles. Optional control for your CrawlKite run.

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

excludePastJobTitles. Optional control for your CrawlKite run.

## `excludeIndustryIds` (type: `array`):

excludeIndustryIds. Optional control for your CrawlKite run.

## `excludeSeniorityLevelIds` (type: `array`):

excludeSeniorityLevelIds. Optional control for your CrawlKite run.

## `excludeFunctionIds` (type: `array`):

excludeFunctionIds. Optional control for your CrawlKite run.

## `excludeCompanyHeadquarterLocations` (type: `array`):

excludeCompanyHeadquarterLocations. Optional control for your CrawlKite run.

## `startPage` (type: `integer`):

startPage. Optional control for your CrawlKite run.

## `takePages` (type: `integer`):

Maximum pages. 0 uses the 100-page safety limit.

## `autoQuerySegmentation` (type: `boolean`):

Split searches above 2,500 results into smaller country, region, seniority or industry segments. Every probe/result page is billed; request and spending limits still apply.

## `autoQuerySegmentationLevels` (type: `array`):

autoQuerySegmentationLevels. Optional control for your CrawlKite run.

## `autoQuerySegmentationTargetCountries` (type: `array`):

autoQuerySegmentationTargetCountries. Optional control for your CrawlKite run.

## `profileDeduplicationMode` (type: `string`):

profileDeduplicationMode. Optional control for your CrawlKite run.

## `mongoDbConnectionString` (type: `string`):

Encrypted MongoDB connection string for cross-run profile deduplication. Never post it in an issue or support message.

## `mongoDbDatabaseName` (type: `string`):

Database used for profile deduplication. The compatibility default is harvestapi; set another name for a separate database.

## `postFilteringMongoDbQuery` (type: `object`):

MongoDB-style per-profile filtering or aggregation before dataset output. Requires positive takePages. Fetched/enriched profiles remain billable even when filtered out. Script and cross-collection operators are unavailable.

## `postFilteringMongoDbAggregation` (type: `array`):

MongoDB-style per-profile filtering or aggregation before dataset output. Requires positive takePages. Fetched/enriched profiles remain billable even when filtered out. Script and cross-collection operators are unavailable.

## `searchCoverage` (type: `string`):

Medium coverage is available. High coverage requires an enabled upstream capacity configuration and otherwise stops before billing.

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

Optional total result safety cap across every input.

## `maxRequests` (type: `integer`):

Optional total supplier request safety cap; default 10,000.

## `maxPages` (type: `integer`):

Optional page safety cap per input; up to 100 pages.

## `filters` (type: `object`):

Legacy CrawlKite input name; still accepted.

## `profileMode` (type: `string`):

Legacy CrawlKite input name; still accepted.

## `includeCrawlKiteMetadata` (type: `boolean`):

Opt in to the extra \_crawlkite object. Leave disabled for source-shaped output.

## Actor input object example

```json
{
  "profileScraperMode": "Short",
  "searchQuery": "Software Engineer",
  "maxItems": 20,
  "startPage": 1,
  "includeCrawlKiteMetadata": false
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "profileScraperMode": "Short",
    "searchQuery": "Software Engineer",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlkite/linkedin-profile-search").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 = {
    "profileScraperMode": "Short",
    "searchQuery": "Software Engineer",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlkite/linkedin-profile-search").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 '{
  "profileScraperMode": "Short",
  "searchQuery": "Software Engineer",
  "maxItems": 20
}' |
apify call crawlkite/linkedin-profile-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlkite/linkedin-profile-search"
        }
    }
}
```

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/GjRQClTy8EBfLawTf/builds/ZuSoyn8G35GPclce8/openapi.json
