---
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`

## Request

- Base URL: `https://api.bereach.ai`
- URL: `https://api.bereach.ai/search/linkedin/sales-nav/people`
- Auth: HTTP bearer

# 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>`. |
| `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
Cost: 1 credit for every 10 results returned, at least 1 when any come back, nothing when none.

## JSON validity (critical)
Every array field (seniority, function, location, companyHeadcount, companyType, 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. 'ACwAAB1234…'), 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.
  - `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.

## 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.
    - `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
  - `warnings` object[]: Caveats about this result set. Absent or empty means the search ran exactly as asked.
    - `field` string, required: Which part of the request this is about, or `search` when it is about the whole result set.
    - `value` string, required: The value involved: what was dropped, or a code naming the condition.
    - `type` string, required: What kind of caveat this is. SEARCH_QUOTA: this search reached its monthly limit, so the set is TRUNCATED and not the whole market. PARSE_EMPTY: no rows could be read and the market was not reported empty, so treat it as unread rather than as nobody matching. URL_FACET: a pasted search URL carried a filter this search cannot apply, so it ran wider than the one on screen. ENUM: a value was not recognised and that filter was dropped. LANE_FALLBACK: some or all rows carry fewer fields. AND_BLOB / OR_OVERFLOW: the keyword shape over-constrained and was retried or flagged. SEARCH_PLAN: the ask was spread across a search budget rather than paged.
    - `hint` string: One sentence a caller can show a person.
  - `saved` integer, nullable: People from this page written to the contact list. Null or absent means the write has not answered: report nothing saved rather than the number of rows returned.
  - `creditsUsed` integer, required: Credits this call spent, net of anything given back. 0 when nothing was charged: a free read, a cached answer, nothing delivered.
  - `retryAfter` integer, required: Seconds to wait before another call of the same type. 0 means no wait is 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" on an endpoint that acts from your account (invitations, messages, your own network or inbox) when the caller IS authenticated but has no connected LinkedIn account: connect LinkedIn (not re-authenticate) to continue. Every other read never returns it.
- `403`: The caller is authenticated but not allowed. Read error.code: subscription_required (API key or connector whose plan is not active), free_draft_limit (a free-plan limit was reached), sales_nav_seat_inactive (no active Sales Navigator seat), or forbidden (not permitted).
- `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`: An upstream service returned an error. Retry after a few seconds.
- `503`: Capacity is temporarily exceeded. Retry after a few seconds.

## Changes

> 39 revisions in range; 1 not diffed.

- **2026-10-22** `bdaed6984b20`: 1 warning
  - removed the optional property `_meta` from the response with the `200` status
- **2026-09-09** `6dba9bddeef5`: 1 info
  - added the optional property `saved` to the response with the `200` status
- **2026-08-28** `62bf7284843d`: 1 breaking
  - removed the required property `_meta/credits/accountPlan` from the response with the `200` status
- **2026-08-27** `d5f1141f87e3`: 11 warning
  - added the new `pacing` enum value to the `error/quotaKind` response property for the response status `400`
  - added the new `pacing` enum value to the `error/quotaKind` response property for the response status `401`
  - added the new `pacing` enum value to the `error/quotaKind` response property for the response status `403`
  - added the new `pacing` enum value to the `error/quotaKind` response property for the response status `404`
  - …7 more
- **2026-08-20** `a1e86af2406d`: 1 info
  - added the optional property `warnings` to the response with the `200` status

[Operation history](https://skmtc.dev/berea/apis/bereach-api/changes/search/linkedin/sales-nav/people/post.md)

---

[API](https://skmtc.dev/berea/apis/bereach-api.md) · [All operations](https://skmtc.dev/berea/apis/bereach-api/llms.txt) · [OpenAPI document](https://skmtc.dev/berea/apis/bereach-api/revisions/b657f915ce03?raw)
