---
title: "Sales Navigator People/Lead Search"
method: POST
path: "/search/linkedin/sales-nav/people"
tags: ["salesNav"]
---

# Sales Navigator People/Lead Search

`POST /search/linkedin/sales-nav/people`

# Sales Navigator People Search

Search for leads in LinkedIn Sales Navigator with advanced filters. Returns enriched profile data including tenure, premium status, and open profile flag.

## Available filters
| Filter | Type | Description |
|--------|------|-------------|
| `keywords` | string | Search terms |
| `title` | string | Job title keywords |
| `company` | {include?, exclude?} | Company IDs with include/exclude |
| `industry` | {include?, exclude?} | Industry IDs with include/exclude |
| `location` | string[] | Geography IDs |
| `seniority` | string[] | Seniority levels (1-10) |
| `function` | string[] | Job function IDs |
| `tenure` | {min?, max?}[] | Years at current company |
| `profileLanguage` | string[] | Profile language codes |
| `connectionDegree` | string[] | Network distance (1, 2, 3) |
| `school` | string[] | School IDs |
| `yearsOfExperience` | string[] | Experience ranges |

## Response fields (per item)
| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Sales Navigator lead ID |
| `name`, `firstName`, `lastName` | string | Name |
| `memberUrn` | string | LinkedIn member URN |
| `profileUrn` | string | Canonical profile URN (`urn:li:fsd_profile:ACoA...` or `urn:li:fsd_profile:ACwA...`) — use directly with visit/connect/message endpoints |
| `profileUrl` | string | Public LinkedIn profile URL `https://www.linkedin.com/in/<encrypted-id>`. Sales Nav does not expose canonical vanity slugs — open in a browser and LinkedIn redirects to `/in/<vanity-name>`. To resolve programmatically, call `POST /resolve/linkedin/profiles`. |
| `salesNavUrl` | string | Sales Navigator lead URL |
| `networkDistance` | string | Connection degree |
| `premium` | boolean | LinkedIn Premium subscriber |
| `openProfile` | boolean | Accepts free InMail |
| `pendingInvitation` | boolean | Connection request already sent |
| `currentPositions` | array | With company, role, tenure details |

## Credits


## JSON validity (critical)
Every array field (seniority, function, location, companyHeadcount, companyType, annualRevenue, connectionDegree, yearsOfExperience, profileLanguage, school) MUST be a valid JSON array of double-quoted strings, e.g. `["Director","Vice President"]`. Never pipe-separated prose (`Director | Vice President`), never unquoted values (`United States`), never merge multiple options into one element. Malformed JSON means the filter is dropped and the search runs unfiltered.

## Request body

- object
  - `category` 'people' | 'companies' — Type of Sales Navigator search: 'people' (leads) or 'companies' (accounts). Required unless url is provided.
  - `url` string — Sales Navigator search URL — paste directly from your browser. Category and filters are extracted automatically. Explicit params override URL-derived values. Example: https://www.linkedin.com/sales/search/people?query=...
  - `keywords` string — Search keywords. Supports LinkedIn Boolean syntax: use double quotes for exact phrases, AND/OR/NOT operators (UPPERCASE), and parentheses for grouping.
  - `title` string — Job title keywords (people only). Supports Boolean OR: 'CEO OR CTO OR Founder'.
  - `company` object — Current-employer filter (people only). Accepts company names ('Stripe', 'Datadog') OR LinkedIn numeric ids. Server resolves names via typeahead.
    - `include` string[] — Labels OR numeric IDs to include. Labels are resolved server-side (no need to call /parameters first).
    - `exclude` string[] — Labels OR numeric IDs to exclude. Labels are resolved server-side (no need to call /parameters first).
  - `industry` object — Industry filter. Accepts industry names ('Software Development', 'Hospitals and Health Care') OR LinkedIn numeric ids. Server resolves.
    - `include` string[] — Labels OR numeric IDs to include. Labels are resolved server-side (no need to call /parameters first).
    - `exclude` string[] — Labels OR numeric IDs to exclude. Labels are resolved server-side (no need to call /parameters first).
  - `location` string[] — Geography filter (people & companies). Accepts location names ('France', 'San Francisco Bay Area', 'EMEA') OR LinkedIn geo ids. Server resolves via typeahead.
  - `locationExclude` string[] — Geography filter to EXCLUDE. Same accepted shapes as `location`. Useful for 'all of Europe except Switzerland' patterns.
  - `seniority` string[] — Seniority levels (people only). Accepts labels ('CXO', 'VP', 'Director', 'Owner / Partner', 'Senior', 'Entry Level', etc.) OR LinkedIn numeric ids. Server resolves labels to LinkedIn's 3-digit ids (CXO=310, etc.) — do NOT guess the ids.
  - `function` string[] — Job function (people only). Accepts function names ('Sales', 'Engineering', 'Marketing', 'Finance', etc. — 26 canonical) OR LinkedIn numeric ids.
  - `tenure` object[] — Years at current company (people only). Array of ranges, e.g. [{min:3}, {max:10}].
    - `min` integer — Minimum years
    - `max` integer — Maximum years
  - `profileLanguage` string[] — Profile language (people only). Accepts ISO 639-1 codes (e.g. 'en') or full language names; the server resolves either.
  - `connectionDegree` string[] — Network distance: 'F' (1st-degree), 'S' (2nd-degree), 'O' (3rd-degree and beyond), or 'GROUP'. The labels '1st degree', '2nd degree', '3rd degree' are also accepted.
  - `school` string[] — School filter (people only). Accepts school names ('Stanford', 'HEC Paris') OR LinkedIn numeric ids. Server resolves via typeahead.
  - `yearsOfExperience` string[] — Overall years of experience (people only). Accepts labels ('Less than 1 year', '1 to 2 years', '3 to 5 years', '6 to 10 years', 'More than 10 years') OR LinkedIn numeric ids 1-5.
  - `persona` string[] — Buyer Persona IDs the user has configured on sales.linkedin.com home (combos of function+seniority+title+geo). Match the IDs from the URL filter ((type:PERSONA,values:List((id:<id>,…)))).
  - `recentlyChangedJobs` boolean — Filter to leads who changed jobs in the last 90 days (LinkedIn buying-intent flag). True = include only job-changers; omit/false = no constraint.
  - `postedOnLinkedin` boolean — Filter to leads who recently posted on LinkedIn (engagement signal — active posters reply more often). True = include only recent posters; omit/false = no constraint.
  - `sharedExperiences` boolean — Filter to leads with shared experience with the searcher (same school / past employer / group). True = include only shared-experience matches; omit/false = no constraint.
  - `viewedYourProfile` boolean — Filter to leads who recently viewed YOUR profile (LinkedIn flag VYP). Highest-intent engagement signal — they already showed interest. Requires Sales Nav seat that captures profile views.
  - `followsYourCompany` boolean — Filter to leads who follow YOUR company page (LinkedIn flag CF). Warm-touch signal — they opted into your brand.
  - `connectionOf` string[] — Filter to leads connected to a specific person. Values are LinkedIn ENCRYPTED member URN ids (e.g. 'ACwAAAim9ZcB…'), not numeric ids. Useful for 'find people connected to my champion at X' warm-intro patterns.
  - `pastCompany` object — Past-employer filter (people only). Accepts company names ('Stripe') OR LinkedIn numeric ids. The server wraps numeric ids as 'urn:li:organization:<id>' (the wire shape Sales Nav requires) — callers can pass the bare id or the URN.
    - `include` string[] — Labels OR numeric IDs to include. Labels are resolved server-side (no need to call /parameters first).
    - `exclude` string[] — Labels OR numeric IDs to exclude. Labels are resolved server-side (no need to call /parameters first).
  - `companyHeadquarters` object — Where the lead's CURRENT employer is HQ'd (people only). Accepts location names ('France', 'United States') OR LinkedIn geo ids. Distinct from `location` which is the lead's own location — useful for 'sell to UK-headquartered companies regardless of where the buyer lives'.
    - `include` string[] — Labels OR numeric IDs to include. Labels are resolved server-side (no need to call /parameters first).
    - `exclude` string[] — Labels OR numeric IDs to exclude. Labels are resolved server-side (no need to call /parameters first).
  - `yearsInCurrentPosition` string[] — Years in current ROLE/POSITION (people only). Same accepted labels as `yearsOfExperience` ('Less than 1 year', '1 to 2 years', etc.). Distinct from `tenure` which counts years at current COMPANY.
  - `pastTitle` string — Past job title keywords (people only). Free-text, supports Boolean OR. Finds leads who previously held a matching title.
  - `firstName` string — First name (people only). Exact name filter.
  - `lastName` string — Last name (people only). Exact name filter.
  - `groups` string[] — LinkedIn Groups membership (people only). Accepts group names ('Digital Marketing') OR numeric group ids. Server resolves names via typeahead.
  - `pastColleague` boolean — Filter to leads who are past colleagues of the searcher (worked at the same company, overlapping dates). True = include only past colleagues; omit/false = no constraint. Warm-intro signal.
  - `leadInteractions` string[] — Filter by your past interaction with the lead (people only). Accepts labels ('Messaged') OR LinkedIn codes.
  - `savedLeadsAndAccounts` string[] — Filter to your saved leads / accounts (people only). Accepts 'All my saved leads' / 'All my saved accounts' OR codes SL/SA.
  - `numOfFollowers` string[] — Company follower-count buckets (companies only). Accepts labels ('1-50', '51-100', '101-1,000', '1,001-5,000', '5,001+') OR ids 1-5.
  - `fortune` string[] — Fortune-list membership (companies only). Accepts 'Fortune 50' / 'Fortune 100' / 'Fortune 250' / 'Fortune 500' OR codes FORTUNE_50/100/250/500.
  - `accountActivities` string[] — Account buying-intent signals (companies only). Accepts labels ('Senior leadership changes in last 3 months', 'Funding events in past 12 months') OR codes SLC/RFE.
  - `jobOpportunities` string[] — Account hiring signals (companies only). Accepts the LinkedIn hiring-signal labels OR codes.
  - `companyHeadcountGrowth` object — Company headcount growth range (companies only), e.g. {min: 10} for companies growing 10%+ YoY.
    - `min` number — Minimum YoY headcount growth %.
    - `max` number — Maximum YoY headcount growth %.
  - `departmentHeadcount` object — Headcount of a specific department (companies only), e.g. {department:'Sales', min:20}.
    - `department` string, required — Department name, e.g. 'Sales', 'Engineering'.
    - `min` number
    - `max` number
  - `start` integer — Pagination offset (default 0).
  - `count` integer — Results per page (default 25, max 25).
  - `campaignSlug` string — Campaign ID. Auto-adds discovered contacts to this campaign in background. Mandatory whenever a campaign is active.

## Response `200`

Sales Navigator people search results

- object
  - `success` true, required
  - `category` 'people', required
  - `items` object[], required
    - `type` 'PEOPLE', required
    - `id` string, required — Sales Navigator lead ID
    - `name` string, required
    - `firstName` string, nullable, required
    - `lastName` string, nullable, required
    - `memberUrn` string, nullable, required — LinkedIn member URN (e.g. urn:li:member:12345)
    - `profileUrn` string, nullable, required — Canonical profile URN (urn:li:fsd_profile:ACo...) derived from any ACoA id found in the payload. Null only when LinkedIn returns a bare numeric memberUrn with no ACoA trace.
    - `publicIdentifier` string, nullable, required — LinkedIn vanity URL slug
    - `profileUrl` string, nullable, required — Profile URL. 3-tier fallback: (1) real /in/<slug>, (2) synthesized /in/<encrypted-id> when only a URN is known — LinkedIn accepts both ACoA… and ACwA… encrypted ids as the slug (case-sensitive), (3) /sales/lead/<id> as last resort when neither is available. Tier 3 URLs are not persistable in Bereach — call POST /resolve/linkedin/profiles to upgrade them.
    - `salesNavUrl` string, nullable, required — Sales Navigator lead URL
    - `profilePicture` string, nullable, required
    - `headline` string, nullable, required
    - `location` string, nullable, required
    - `networkDistance` 'DISTANCE_1' | 'DISTANCE_2' | 'DISTANCE_3' | 'OUT_OF_NETWORK', nullable, required — LinkedIn network distance: DISTANCE_1=connected, DISTANCE_2=2nd degree, DISTANCE_3=3rd degree, OUT_OF_NETWORK=not connected.
    - `premium` boolean, nullable, required — True if the person has a LinkedIn Premium account.
    - `openProfile` boolean, nullable, required — True if the person has Open Profile — can be messaged without a connection.
    - `pendingInvitation` boolean, nullable, required — True if you have an outstanding connection invitation to this person.
    - `currentPositions` object[], required — Current work positions for this profile.
      - `company` string, nullable, required
      - `companyId` string, nullable, required
      - `role` string, nullable, required
      - `description` string, nullable, required
      - `location` string, nullable, required
      - `tenureAtCompany` object, nullable, required
        - `years` integer
        - `months` integer
      - `tenureAtRole` object, nullable, required
        - `years` integer
        - `months` integer
  - `paging` object, required
    - `start` integer, required
    - `count` integer, required
    - `total` integer, required
  - `hasMore` boolean, required
  - `creditsUsed` integer, required — Credits consumed by this call (0 for free endpoints, cached results, or duplicates).
  - `retryAfter` integer, required — Seconds to wait before making another call of the same type. 0 means no wait needed.

## Other responses

- `400` — The server cannot or will not process the request due to something that is perceived to be a client error.
- `401` — Although HTTP specifies "unauthorized", this response means "unauthenticated". Authenticate to continue. NOTE: 401 is also returned with code "linkedin_not_connected" when the caller IS authenticated but has no connected LinkedIn account — connect LinkedIn (not re-authenticate) to continue.
- `403` — The client does not have access rights to the content.
- `404` — The server cannot find the requested resource.
- `409` — The request conflicts with the current state of the server.
- `410` — The requested content has been permanently deleted from the server.
- `422` — The request was well-formed but was unable to be followed due to semantic errors.
- `429` — Rate limit exceeded. Read error.retryAfter for the wait time in seconds.
- `500` — The server encountered a situation it does not know how to handle.
- `502` — LinkedIn returned a server error or the proxy connection failed. Retry after a few seconds.
- `503` — Proxy capacity temporarily exceeded. Retry after a few seconds.

---

[API](https://skmtc.net/berea/apis/bereach-api.md) · [All operations](https://skmtc.net/berea/apis/bereach-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/berea/bereach-api/versions/3caf12036b26/schema)
