# LinkedIn Sales Navigator Scraper (`khadinakbar/linkedin-sales-navigator-scraper`) Actor

Turn a LinkedIn Sales Navigator search URL into enriched public leads. Cookieless, no SN seat. Decodes SN filters + enriches profiles. MCP/API-ready.

- **URL**: https://apify.com/khadinakbar/linkedin-sales-navigator-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Lead generation, MCP servers, Social media
- **Stats:** 28 total users, 25 monthly users, 95.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 lead founds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

## LinkedIn Sales Navigator Scraper

LinkedIn Sales Navigator Scraper turns a LinkedIn Sales Navigator people-search URL into enriched public leads. It is built for people who want a clean lead list from a Sales Navigator query, direct enrichment from LinkedIn profile URLs, or manual filters for public profile discovery. Each output record represents one public LinkedIn profile and can include name fields, headline, company, location, profile URL, public identifier, snippet, rank, about, experience, education, skills, connection and follower counts, enrichment status, and scrape timestamp. The result is a structured dataset of public leads that can be used in Apify runs, API workflows, and through Apify MCP.

### Best fit and connected workflows

This Actor fits workflows where LinkedIn sourcing starts with a Sales Navigator people search and ends with structured public lead data.

Use it when you want to:

- Convert a Sales Navigator search URL into public-profile leads with decoded filters.
- Enrich a list of LinkedIn personal profile URLs into a consistent dataset.
- Add public LinkedIn lead discovery to an Apify workflow, automation, or AI agent.
- Use Combine upstream discovery from [LinkedIn People Search Scraper](https://apify.com/khadinakbar/linkedin-people-search-scraper) or [LinkedIn Company Search Scraper](https://apify.com/khadinakbar/linkedin-company-search-scraper) with this Actor for profile-level detail.

For connected workflows, the usual pattern is:

1. Discover a company or people set in an upstream Actor.
2. Pass verified public profile URLs into this Actor.
3. Read the enriched dataset from Apify and hand it to CRM, research, or agent logic.

### Practical scenario

Maya is building a prospect list for a growth team. She starts with a Sales Navigator people-search URL that targets a job title, region, and keyword set. After the run, she reviews fields such as `fullName`, `headline`, `currentCompany`, `location`, `profileUrl`, and `isEnriched`. She sees which profiles were enriched and which returned search-level public data only. Based on the `headline`, `company`, and `profileUrl`, she decides which leads belong in outreach and then sends the selected URLs to a follow-up enrichment or export step.

### Input fields

Provide a Sales Navigator URL, direct profile URLs, or manual filters.

| Field | Type | Purpose |
|---|---|---|
| `salesNavigatorUrl` | string | Full LinkedIn Sales Navigator people-search URL. The Actor decodes title, company, location, school, industry, and keyword filters from the URL. |
| `jobTitle` | string | Manual job-title filter used when no Sales Navigator URL is supplied. |
| `location` | string | Manual city, region, or country filter. |
| `currentCompany` | string | Manual company filter for public profile matching. |
| `school` | string | Manual school or university filter for alumni sourcing. |
| `keywords` | string | Free-text keywords added to the Google query. |
| `profileUrls` | array of strings | Direct LinkedIn personal profile URLs for enrichment. |
| `enrichProfiles` | boolean | Enables deep public profile enrichment. Default: `true`. |
| `maxResults` | integer | Maximum leads to return, from 1 to 500. Default: 50. |
| `resultsRegion` | string | Google region country code such as `US`, `GB`, or `DE`. Default: `US`. |
| `preferProvider` | string | Primary provider to try first: `scrapecreators` or `sociavault`. Default: `scrapecreators`. |

#### Focused input example

```json
{
  "salesNavigatorUrl": "https://www.linkedin.com/sales/search/people?query=(filters:List((type:CURRENT_TITLE,values:List((text:Head%20of%20Growth,selectionType:INCLUDED))),(type:REGION,values:List((text:San%20Francisco%20Bay%20Area,selectionType:INCLUDED)))))",
  "maxResults": 25,
  "enrichProfiles": true,
  "resultsRegion": "US",
  "preferProvider": "scrapecreators"
}
```

### Output fields

The dataset contains one record per public LinkedIn lead.

| Field | Type | Meaning |
|---|---|---|
| `fullName` | string or null | Full name from the public profile. |
| `firstName` | string or null | First name. |
| `lastName` | string or null | Last name. |
| `headline` | string or null | Public headline. |
| `currentCompany` | string or null | Current company when visible on the public profile. |
| `location` | string or null | Public location text. |
| `profileUrl` | string or null | Canonical LinkedIn personal profile URL. |
| `publicIdentifier` | string or null | LinkedIn profile slug. |
| `snippet` | string or null | Search snippet captured during discovery. |
| `rank` | integer or null | Result rank in the search flow. |
| `about` | string or null | Public About section from enrichment. |
| `experience` | array or null | Public experience entries from enrichment. |
| `education` | array or null | Public education entries from enrichment. |
| `skills` | array or null | Public skills from enrichment. |
| `connectionsCount` | integer or null | Public connection count when available. |
| `followerCount` | integer or null | Public follower count when available. |
| `enrichmentSource` | string or null | Provider that returned the profile data. |
| `isEnriched` | boolean or null | Whether deep enrichment was applied. |
| `scrapedAt` | string or null | Timestamp recorded for the record. |

#### Illustrative output record

```json
{
  "fullName": "Maya Chen",
  "firstName": "Maya",
  "lastName": "Chen",
  "headline": "Head of Growth at ExampleCo",
  "currentCompany": "ExampleCo",
  "location": "San Francisco Bay Area",
  "profileUrl": "https://www.linkedin.com/in/maya-chen/",
  "publicIdentifier": "maya-chen",
  "snippet": "Head of Growth at ExampleCo",
  "rank": 1,
  "about": "Growth leader focused on acquisition and lifecycle marketing.",
  "experience": [
    {
      "title": "Head of Growth",
      "company": "ExampleCo"
    }
  ],
  "education": [
    {
      "school": "Stanford University"
    }
  ],
  "skills": [
    "Growth Strategy",
    "Lifecycle Marketing"
  ],
  "connectionsCount": 500,
  "followerCount": 1200,
  "enrichmentSource": "scrapecreators",
  "isEnriched": true,
  "scrapedAt": "2026-01-01T12:00:00.000Z"
}
```

### How it works

This Actor uses public-data workflows and is cookieless.

1. It reads your input in one of three modes:
   - Sales Navigator URL
   - direct LinkedIn profile URLs
   - manual filters
2. When a Sales Navigator URL is provided, it decodes the visible people-search filters such as title, company, location, school, industry, and keywords.
3. It finds matching public LinkedIn profiles through Google-based discovery.
4. It enriches public profiles with full public data when `enrichProfiles` is enabled.
5. It uses `scrapecreators` first by default, with `sociavault` available as the alternate provider.
6. It writes one dataset item per lead and also exposes a dataset link in the run output.

The run output includes a `leads` dataset URL that points to the cleaned JSON items for the run.

### Pricing

This Actor uses Apify Pay per event pricing plus Apify platform usage.

Charged events include:

- Actor start
- Lead found
- Lead enriched

A run that finds several leads and enriches each one is billed by event count, so total cost depends on how many leads are discovered and how many are enriched. For example, a run that finds fifty leads and enriches each of them will include fifty Lead found events and fifty Lead enriched events, plus one Actor start event. For current pricing details, open the live Pricing tab on the Apify store page.

### Use with AI agents (MCP)

This Actor is available through Apify MCP as a tool for sourcing public LinkedIn lead records from a Sales Navigator search URL, a profile-URL list, or manual filters.

Exact Actor identity: `khadinakbar/linkedin-sales-navigator-scraper`

A practical agent prompt:

> Find public LinkedIn leads from this Sales Navigator people search URL, enrich the profiles, and return the dataset items with name, headline, company, location, profile URL, and enrichment status.

How to interpret the output:

- `fullName`, `headline`, `currentCompany`, and `location` help an agent summarize each lead.
- `profileUrl` provides the provenance link back to the public profile.
- `isEnriched` shows whether the record includes deeper public profile data.
- `about`, `experience`, `education`, `skills`, `connectionsCount`, and `followerCount` are the enriched fields when present.

Scope and provenance:

- The Actor works from public LinkedIn profile data.
- It does not rely on a LinkedIn login session.
- If the Sales Navigator URL includes filters that live only inside Sales Navigator, the Actor decodes the public-search-relevant parts and continues from there.

Pagination and cost guidance:

- Set `maxResults` to control how many leads the Actor returns.
- Each additional discovered lead adds event-based cost.
- Turning off `enrichProfiles` returns faster search-level records at the lower lead-found event rate.

### Apify API example

#### JavaScript

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({
  token: process.env.APIFY_TOKEN,
});

const run = await client.actor('khadinakbar/linkedin-sales-navigator-scraper').call({
  jobTitle: 'Head of Growth',
  location: 'San Francisco',
  maxResults: 10,
  enrichProfiles: true,
});

const datasetId = run.defaultDatasetId;
const { items } = await client.dataset(datasetId).listItems({ clean: true });
console.log(items);
```

### Best results and outcome guidance

Use a Sales Navigator people-search URL when you already have a structured query in LinkedIn Sales Navigator. Use direct `profileUrls` when you already have a lead list and want enrichment. Use manual filters when you are building a public search from scratch.

A few practical guidelines:

- Keep `maxResults` aligned with the size of the list you need.
- Use `resultsRegion` to localize Google discovery.
- Keep `preferProvider` on the default unless you have a reason to route through the alternate provider first.
- Use `enrichProfiles: false` when you only need fast search-level records.
- Use the enriched fields when you want profile context for research, routing, or qualification.

### Design note

I found the output contract includes a single dataset link named `leads`, which makes the run result easy to hand off to another Apify step or an AI agent without guessing where the records live.

### FAQ

#### When should I use the Sales Navigator URL field?

Use `salesNavigatorUrl` when you already have a LinkedIn Sales Navigator people search and want this Actor to decode that query into public lead discovery.

#### When should I use `profileUrls`?

Use `profileUrls` when you already have LinkedIn personal profile links and want direct enrichment instead of search.

#### How does this connect to other Apify Actors?

A common workflow is to discover leads with [LinkedIn People Search Scraper](https://apify.com/khadinakbar/linkedin-people-search-scraper) or discover company records with [LinkedIn Company Search Scraper](https://apify.com/khadinakbar/linkedin-company-search-scraper), then pass verified public profile URLs into this Actor for enrichment.

#### What fields are most useful for routing leads?

`fullName`, `headline`, `currentCompany`, `location`, and `profileUrl` are the core routing fields. `isEnriched` helps you see whether deeper public profile details were added.

#### How does the pricing model work?

LinkedIn Sales Navigator Scraper uses Pay per event on Apify. Lead discovery and profile enrichment are billed as separate events, and platform usage is part of the Apify run. Check the live Pricing tab for the current billing details.

### Related Actors

- [LinkedIn Company Search Scraper](https://apify.com/khadinakbar/linkedin-company-search-scraper) - upstream company discovery that can feed verified public URLs into this Actor
- [LinkedIn People Search Scraper](https://apify.com/khadinakbar/linkedin-people-search-scraper) - upstream people discovery that can feed verified public URLs into this Actor

### Responsible use

This Actor works with public LinkedIn profile data surfaced through public search and profile pages. Use the output in a way that respects applicable laws, platform terms, and privacy obligations. Review your internal policies for lawful basis, retention, access controls, and deletion handling before using lead data in downstream systems.

# Actor input Schema

## `salesNavigatorUrl` (type: `string`):

Paste the full URL from the address bar of your LinkedIn Sales Navigator people search (e.g. 'https://www.linkedin.com/sales/search/people?query=...'). The actor decodes the title, company, location, school, industry and keyword filters from the URL and finds matching PUBLIC profiles via Google — no LinkedIn login or Sales Navigator seat is used. SN-only filters (headcount, seniority, function, intent) cannot be honored by public search and are skipped with a notice. NOT a profile URL — for that use 'profileUrls'.

## `jobTitle` (type: `string`):

Manual filter used when you are NOT pasting a Sales Navigator URL. Job title quoted as a phrase on Google (e.g. 'Head of Growth'). Combine with location/company/school to narrow. If a salesNavigatorUrl is provided, that URL's filters take precedence. NOT a free-text bio search — use the keywords field for that.

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

Manual filter: city, region, or country to filter people by (e.g. 'San Francisco' or 'United Kingdom'). Matched against the public profile's location text. Leave empty for worldwide. Overridden by a salesNavigatorUrl when one is supplied. NOT a postal code.

## `currentCompany` (type: `string`):

Manual filter: company name to filter people by (e.g. 'Stripe'). Quoted as a phrase so Google matches it exactly. Best-effort — public LinkedIn pages do not always expose the current employer. Overridden by a salesNavigatorUrl. NOT a company LinkedIn URL.

## `school` (type: `string`):

Manual filter: school or university name to filter alumni (e.g. 'Stanford University'). Quoted as a phrase on Google. Useful for alumni sourcing. Overridden by a salesNavigatorUrl. NOT a degree or field of study.

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

Manual filter: extra free-text keywords added to the Google query (e.g. 'fintech founder'). Supports Google boolean operators. Use alongside or instead of the structured filters. Merged with a salesNavigatorUrl's decoded keywords. NOT a LinkedIn profile URL.

## `profileUrls` (type: `array`):

Optional list of LinkedIn personal-profile URLs (https://www.linkedin.com/in/<slug>) — for example a lead list exported from Sales Navigator. When provided (and no salesNavigatorUrl is set), search is skipped and these profiles are enriched directly. Use when you already have URLs and just want full public data. NOT company or post URLs.

## `enrichProfiles` (type: `boolean`):

When true (default), each lead is fetched for full public data: about, experience, education, skills, follower/connection counts. When false, only fast search-level fields (name, headline, location, URL) are returned at the lower price. Enrichment is billed per lead.

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

Maximum number of leads to return (1-500). Caps both search depth and total cost. Defaults to 50. In direct-URL mode it caps how many of the supplied URLs are processed.

## `resultsRegion` (type: `string`):

Two-letter country code for the Google search region (e.g. 'US', 'GB', 'DE'). Affects which localized results surface. Defaults to 'US'. NOT the person's location filter — use the location field or Sales Navigator URL for that.

## `preferProvider` (type: `string`):

Which data provider to try first for discovery and enrichment; the other is the automatic fallback if it errors or returns nothing. 'scrapecreators' (default) is broader and usually cheaper; 'sociavault' is the alternative. Leave on default unless you specifically want to route through SociaVault first. Both run cookieless with the same public data.

## Actor input object example

```json
{
  "salesNavigatorUrl": "https://www.linkedin.com/sales/search/people?query=(filters:List((type:CURRENT_TITLE,values:List((text:Head%20of%20Growth,selectionType:INCLUDED)))))",
  "jobTitle": "VP of Sales",
  "location": "London",
  "currentCompany": "Stripe",
  "school": "Stanford University",
  "keywords": "fintech founder",
  "profileUrls": [
    "https://www.linkedin.com/in/williamhgates"
  ],
  "enrichProfiles": true,
  "maxResults": 50,
  "resultsRegion": "GB",
  "preferProvider": "scrapecreators"
}
```

# Actor output Schema

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

Public LinkedIn leads matched from the Sales Navigator filters in this run.

# 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 = {
    "jobTitle": "Head of Growth",
    "location": "San Francisco"
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/linkedin-sales-navigator-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 = {
    "jobTitle": "Head of Growth",
    "location": "San Francisco",
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/linkedin-sales-navigator-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 '{
  "jobTitle": "Head of Growth",
  "location": "San Francisco"
}' |
apify call khadinakbar/linkedin-sales-navigator-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,khadinakbar/linkedin-sales-navigator-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/VsSYUBBqsszsxMntS/builds/DNDsd4JR6Bd9cmyEU/openapi.json
