---
title: "Search LinkedIn People"
method: POST
path: "/search/linkedin/people"
tags: ["search"]
---

# Search LinkedIn People

`POST /search/linkedin/people`

# Search LinkedIn People

Find professionals on LinkedIn by name, title, company, location, industry, and more. Returns structured profile data including name, headline, current positions, connection degree, profile picture, **plus 2026-06-03 enrichments**: `nameMatch` (true when the result matched on literal name — strong personhood signal), `badgeText` (Top Voice / Premium / Verified / Influencer — qualifier weight), `ringStatus` (OPEN_TO_WORK / HIRING — open intent signals you can directly target), `summary` (additional snippet beyond headline), `actorInsights` (LinkedIn-curated context like 'X mutual connections', 'Follows {company}' — use directly in personalised outreach openers).

## Parameters
- **keywords** (optional): Search terms matched against name, headline, company, skills, and bio
- You can search by filters alone (no keywords) — e.g. find all 2nd-degree connections in Paris

## Keyword syntax (Boolean operators)
Keywords support LinkedIn Boolean search syntax:
- **Exact phrase**: `"product manager"` — matches only that exact title
- **AND**: `engineer AND startup` — both terms required (spaces default to AND)
- **OR**: `CEO OR founder OR CTO` — any of the terms
- **NOT**: `manager NOT assistant` — exclude unwanted terms
- **Parentheses**: `(CEO OR CTO) AND SaaS` — group logic

Operators must be **UPPERCASE**. Precedence: Quotes > Parentheses > NOT > AND > OR.

## Available filters
Pass HUMAN LABELS for location / industry / currentCompany / pastCompany / school — the server resolves them to LinkedIn IDs via typeahead. Numeric IDs pass through unchanged if you already have them.

| Filter | Type | Description |
|--------|------|-------------|
| `connectionDegree` | `["F"\|"S"\|"O"]` | Connection level: F=1st, S=2nd, O=3rd+ |
| `firstName` | string | Exact first name match |
| `lastName` | string | Exact last name match |
| `title` | string | Current job title (supports `\|` OR syntax: `"CEO\|CTO"`) |
| `connectionOf` | string | Profile URN — find their connections |
| `followersOf` | string[] | Profile URNs — find a creator's followers |
| `openToVolunteering` | boolean | Only people open to volunteering |
| `serviceCategories` | string[] | Service-Marketplace category names |
| `profileLanguage` | string[] | ISO 639-1 codes: `["en","fr"]` |
| `location` | string[] | Geo labels (e.g. `["Paris","France"]`) — resolved server-side |
| `industry` | string[] | Industry labels (e.g. `["Software Development"]`) — resolved server-side |
| `currentCompany` | string[] | Company labels (e.g. `["Stripe","Datadog"]`) — resolved server-side |
| `pastCompany` | string[] | Company labels — resolved server-side |
| `school` | string[] | School/university labels — resolved server-side |

## Response fields (per item)
| Field | Type | Description |
|-------|------|-------------|
| `name` | string | Full display name |
| `profileUrl` | string | LinkedIn profile URL |
| `headline` | string\|null | Professional headline |
| `location` | string\|null | Geographic location |
| `profilePicture` | string\|null | Profile photo URL |
| `networkDistance` | string\|null | `DISTANCE_1`, `DISTANCE_2`, `DISTANCE_3`, or `OUT_OF_NETWORK` |
| `currentPositions` | array | Current job positions with `company` and `role` |

## Pagination
- Default page size: 10, max: 50
- Use `start` + `count` to paginate. Check `hasMore` for more pages.
- Paginate via `start` + `count`; check `hasMore` for more pages.

## Example workflows
1. **Prospect list building**: Search by title + location + industry → build a targeted outreach list
2. **Recruiting**: Search by title + company + school → find people who match
3. **Network mapping**: Search `connectionOf` + filters → explore someone's network

## Workflow — pass labels directly
```
POST /search/linkedin/people {
  keywords: 'product manager',
  location: ['San Francisco'],
  currentCompany: ['Google']
}
→ server resolves labels → matching people
```
Only call `/search/linkedin/parameters` when you need to EXPLORE available values ("what are the canonical industry buckets?"), never as a prerequisite to a search.

## Credits

## Request body

- object
  - `keywords` string — Search keywords. Matches against name, headline, company, skills, and bio. Optional — you can search by filters alone (e.g. all 2nd-degree connections in Paris). Supports LinkedIn Boolean syntax: use double quotes for exact phrases (e.g. "product manager"), AND to require both terms, OR for alternatives (e.g. CEO OR founder OR CTO), NOT to exclude (e.g. manager NOT assistant), and parentheses to group (e.g. (CEO OR CTO) AND SaaS). Operators must be UPPERCASE.
  - `url` string — Optional LinkedIn search URL. If provided, keywords and filters are extracted from the URL. Explicit params override URL-derived values.
  - `maxSearches` integer — Spend up to this many LinkedIn searches on one ask, cutting it along independent angles so the result reaches people a single search cannot. One search returns about ten people; the angles do not overlap much, so the total grows close to linearly with what you spend. Leave it out to run exactly one search.
  - `connectionDegree` string[] — Filter by connection degree. 'F' = 1st degree (your direct connections), 'S' = 2nd degree (connections of connections), 'O' = 3rd+ degree and out of network. Accepts multiple values, e.g. ['F','S'] for 1st and 2nd degree.
  - `firstName` string — Filter by first name. Exact match (case-insensitive).
  - `lastName` string — Filter by last name. Exact match (case-insensitive).
  - `title` string — Filter by current job title. Matches against the person's current position title. Supports LinkedIn Boolean OR: 'CEO OR CTO OR Founder'. Pipe separators are auto-converted: 'CEO|CTO|Founder' becomes 'CEO OR CTO OR Founder'. Use double quotes for exact multi-word titles: '"Head of Marketing" OR "VP Sales"'.
  - `connectionOf` string — Find connections of a specific person. Pass the person's LinkedIn profile URN (e.g. 'urn:li:fsd_profile:ACoAABZ0Qo4B...'). Returns people who are connected to this person.
  - `profileLanguage` string[] — Filter by LinkedIn profile language. Array of ISO 639-1 codes (e.g. ['en','fr']); the server resolves any code.
  - `school` string[] — Filter by school/university. Pass human names (e.g. ['Harvard','Stanford']) — server resolves to LinkedIn IDs via typeahead. Numeric IDs pass through if you already have them.
  - `location` string[] — Filter by geographic location. Pass human names (e.g. ['Paris','France']) — server resolves to LinkedIn geo IDs via typeahead. Numeric IDs pass through if you already have them.
  - `industry` string[] — Filter by industry. Pass human names (e.g. ['Software Development','Marketing']) — server resolves to LinkedIn industry IDs via typeahead. Numeric IDs pass through if you already have them.
  - `currentCompany` string[] — Filter by current employer. Pass company names (e.g. ['Stripe','Datadog']) — server resolves to LinkedIn company IDs via typeahead. Numeric IDs pass through if you already have them.
  - `pastCompany` string[] — Filter by past employer. Pass company names — server resolves to LinkedIn company IDs via typeahead. Numeric IDs pass through if you already have them. Finds people who previously worked at these companies.
  - `followersOf` string[] — Find people who follow a specific creator/thought-leader. Array of LinkedIn profile URNs (e.g. 'urn:li:fsd_profile:ACoAAB...'). A warm-discovery vector: the audience of an influential voice in your space. Get URNs from a prior search_people / visit_profile result.
  - `openToVolunteering` boolean — When true, only return people who marked themselves open to volunteering.
  - `serviceCategories` string[] — Filter by LinkedIn Service-Marketplace category — for finding freelancers/consultants. Pass category NAMES (e.g. ['Digital Marketing','Web Development','Management Consulting']) — resolved to IDs server-side.
  - `start` integer — Pagination offset (default 0). Use multiples of `count` to page through results.
  - `count` integer — Results per page (default 10, max 50).

## Response `200`

List of LinkedIn people matching the search criteria

- object
  - `success` true, required
  - `category` 'people', required
  - `items` object[], required
    - `type` 'PEOPLE', required
    - `name` string, required
    - `profileUrl` string, nullable, required
    - `headline` string, nullable, required
    - `location` string, nullable, required
    - `profilePicture` 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.
    - `currentPositions` object[], required — Current work positions for this profile.
      - `company` string, nullable, required
      - `role` string, nullable, required
    - `profileUrn` string, nullable, required — LinkedIn profile URN (e.g. urn:li:fsd_profile:ACoAAA...) when available
    - `publicIdentifier` string, nullable, required — Vanity slug from profile URL (e.g. john-doe) when not URN-based
    - `nameMatch` boolean, nullable — True when the search ranker matched the literal name (vs headline/skills). When picking between two same-named people, the one with nameMatch=true is the one the user typed.
    - `badgeText` string, nullable — Profile badge surfaced by LinkedIn (Top Voice / Premium / Verified / Influencer). Indicates investment in the platform and is a useful qualifier weight.
    - `ringStatus` string, nullable — Profile ring status visualised on LinkedIn (OPEN_TO_WORK, HIRING, OPEN_FOR_BUSINESS, etc.). Open intent signal — directly relevant for recruiters, vendors, and sales.
    - `summary` string, nullable — Additional profile snippet returned by the search ranker, distinct from headline. Sometimes contains mutual-connection context or topic affinity (e.g. 'Writes about B2B sales').
    - `actorInsights` string[] — LinkedIn-curated context strings — typical entries: 'X mutual connections', 'Follows {company}', 'Worked at {company}'. Use these directly in personalised outreach openers.
  - `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: LinkedIn capped this account for the month, so the set is TRUNCATED and not the whole market. PARSE_EMPTY: the page answered and no rows could be read, and LinkedIn did not say the market is 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 came from the public lane, which fills 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.
  - `creditsUsed` integer, required — Credits consumed by this call. 0 for free endpoints, cached results, duplicates, and for every query that does not touch LinkedIn.
  - `retryAfter` integer, required — Seconds to wait before another call of the same type. 0 means no wait is needed.
  - `_meta` object — Credit balance carried on every response so a caller never has to ask for it separately. Absent when the caller has no connected account.
    - `credits` object, required
      - `current` number, required — Credits spent this period.
      - `limit` number, nullable, required — Period allowance, or null when unlimited.
      - `remaining` number, nullable, required — Allowance left, or null when unlimited.
      - `percentage` number, required — Share of the allowance spent, 0 to 100.
      - `isUnlimited` boolean, required
      - `accountPlan` string, required — The credential's plan.

## 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/revisions/a1e86af2406d/schema)
