---
title: "Unified LinkedIn Search — posts, people, companies, jobs"
method: POST
path: "/search/linkedin"
tags: ["search"]
---

# Unified LinkedIn Search — posts, people, companies, jobs

`POST /search/linkedin`

# Unified LinkedIn Search

This is the **all-in-one** search endpoint. It accepts any of the 4 categories (posts, people, companies, jobs) and returns structured results.

## When to use this endpoint
Use this endpoint when you need to search across categories dynamically (e.g. the user chooses the category at runtime). For a simpler interface with category-specific documentation, use the dedicated endpoints:
- `POST /search/linkedin/posts` — search posts
- `POST /search/linkedin/people` — search people
- `POST /search/linkedin/companies` — search companies
- `POST /search/linkedin/jobs` — search jobs
- `POST /search/linkedin/url` — search by pasting a LinkedIn search URL

## Two ways to search
1. **Structured**: pass `category` + `keywords` + optional filters
2. **URL-based**: pass a LinkedIn search `url` — the endpoint parses it automatically

Explicit parameters always override URL-derived values.

## Keyword syntax (Boolean operators)
Keywords support LinkedIn Boolean search syntax for precise matching:
- **Exact phrase**: wrap in double quotes — `"outreach automation"` matches only that exact phrase
- **AND**: both terms required — `outreach AND linkedin` (default when terms are space-separated)
- **OR**: either term — `CEO OR founder OR owner`
- **NOT**: exclude — `manager NOT assistant`
- **Parentheses**: group — `(CEO OR CTO) AND SaaS`

Operators must be **UPPERCASE** (`AND`, `OR`, `NOT`). Lowercase is treated as plain text. Wildcards (`*`) and `+`/`-` are not supported. Precedence: Quotes → Parentheses → NOT → AND → OR.

Without quotes, a multi-word query like `outreach automation` is treated as `outreach AND automation`, which may return broad results. Use `"outreach automation"` for exact matching.

## Resolving filter IDs
Many filters (location, industry, company, school) require LinkedIn numeric IDs. Use `GET /search/linkedin/parameters` to convert text (e.g. "San Francisco") into IDs (e.g. "103644278").

## Pagination
Use `start` (offset, default 0) and `count` (page size, default 10, max 50). The response includes `paging.total` and `hasMore` to control iteration.

## Credits

## Request body

- object
  - `category` 'posts' | 'people' | 'companies' | 'jobs' — Type of search to perform (required unless url is provided)
  - `url` string — LinkedIn search URL — category and filters are extracted automatically. Explicit params override URL-derived ones.
  - `keywords` string — Search keywords. Supports LinkedIn Boolean syntax: use double quotes for exact phrases (e.g. "outreach automation"), AND to require both terms, OR for alternatives (e.g. CEO OR founder), NOT to exclude (e.g. manager NOT assistant), and parentheses to group (e.g. (CEO OR CTO) AND SaaS). Operators must be UPPERCASE. Without quotes, multi-word queries are treated as AND by default which may return overly broad results — use exact phrases with quotes for precise matching.
  - `sortBy` string — Sort order — 'relevance' or 'date' (or natural 'newest'/'recent'); normalized server-side (posts & jobs)
  - `datePosted` string — Time filter — 'past-24h'/'past-week'/'past-month' or natural ('last week','this month','24 hours'); normalized server-side (posts & jobs)
  - `contentType` string — Media type — 'images'/'videos'/'documents' or natural ('video','photo','pdf'); normalized server-side (posts only)
  - `authorIndustry` string[] — Author industry IDs (posts only, resolve via /search/parameters)
  - `authorCompany` string[] — Author company IDs (posts only, resolve via /search/parameters)
  - `connectionDegree` string[] — Connection degree: F=1st, S=2nd, O=3rd+. Human forms ('2nd','3rd','second','2') are normalized for you (people only).
  - `firstName` string — First name filter (people only)
  - `lastName` string — Last name filter (people only)
  - `title` string — Job title filter (people only). Supports LinkedIn Boolean OR syntax: 'CEO OR CTO OR CMO'. Pipe separators are auto-converted: 'CEO|CTO|CMO' becomes 'CEO OR CTO OR CMO'. Use quotes for exact multi-word titles: '"Head of Marketing"'.
  - `connectionOf` string — Profile URN to find connections of (people only)
  - `followersOf` string[] — Profile URNs whose followers to search — find a creator's audience (people only)
  - `openToVolunteering` boolean — Only people open to volunteering (people only)
  - `serviceCategories` string[] — LinkedIn Service-Marketplace category names — for freelancer/consultant discovery, resolved to IDs server-side (people only)
  - `profileLanguage` string[] — Profile language codes e.g. ['en','fr'] (people only)
  - `school` string[] — School IDs (people only, resolve via /search/parameters)
  - `location` string[] — Geo labels e.g. ['Paris','France'] (people, companies, jobs) — server resolves, numeric IDs also accepted
  - `industry` string[] — Industry labels e.g. ['Software Development'] (people, companies) — server resolves, numeric IDs also accepted
  - `currentCompany` string[] — Current company labels e.g. ['Stripe'] (people only) — server resolves, numeric IDs also accepted
  - `pastCompany` string[] — Past company labels (people only) — server resolves, numeric IDs also accepted
  - `companySize` string[] — Company size — pass a human range ('51-200') or a code A=1-10/B=11-50/C=51-200/D=201-500/E=501-1K/F=1K-5K/G=5K-10K/H=10K+/I=self; labels are normalized server-side (companies only)
  - `jobType` string[] — Job type — pass a natural label (full-time, part-time, contract, temporary, internship, volunteer, other) OR a code F/P/C/T/I/V/O; normalized server-side (jobs only)
  - `experienceLevel` string[] — Experience level — pass a natural label (internship, entry, associate, mid-senior, director, executive) OR a code 1-6; normalized server-side (jobs only)
  - `workplaceType` string[] — Workplace type — pass 'onsite'/'remote'/'hybrid' or a code 1/2/3; labels are normalized server-side (jobs only)
  - `company` string[] — Hiring company names, resolved to IDs server-side (jobs only)
  - `jobFunction` string[] — Job function names: Information Technology, Engineering, Consulting, Sales, Marketing, Finance, Business Development, Management, Project Management, Quality Assurance, Analyst, Research, Manufacturing, Other (jobs only)
  - `easyApply` boolean — Only LinkedIn Easy Apply jobs (jobs only)
  - `under10Applicants` boolean — Only jobs with fewer than 10 applicants (jobs only)
  - `inYourNetwork` boolean — Only jobs at companies where you have a connection (jobs only)
  - `hasVerifications` boolean — Only jobs from verified posters (jobs only)
  - `fairChanceEmployer` boolean — Only jobs from Fair Chance employers (jobs only)
  - `benefits` string[] — Advertised benefit names e.g. ['Medical insurance','401(k)'] (jobs only)
  - `commitments` string[] — Employer commitment names e.g. ['Work-life balance'] (jobs only)
  - `start` integer — Pagination offset (default 0)
  - `count` integer — Results per page (default 10, max 50)
  - `campaignSlug` string — Campaign ID. Auto-adds discovered contacts to this campaign in background.

## Response `200`

Search results for the specified category

- object
  - `success` true, required
  - `category` 'posts' | 'people' | 'companies' | 'jobs', required
  - `items` union, required
    - object[]
      - `postUrl` string, required — Public URL of the post.
      - `text` string, required — Post text content.
      - `date` integer, required — Post creation timestamp (Unix milliseconds).
      - `likesCount` integer, required — Total reactions on this post.
      - `commentsCount` integer, required — Total top-level comments on this post.
      - `sharesCount` integer, required — Total shares/reposts of this post.
      - `postUrn` string, required — LinkedIn internal URN for this post. Use with engagement tools (like, comment, collect_likes/comments).
      - `postId` string, required — Numeric post identifier parsed from the URN.
      - `media` object — Media attached to the post (image, video, document, or article). Absent when the post is text-only.
        - `type` 'image' | 'video' | 'document' | 'article', required — Type of media attached to the post.
        - `urls` string[], required — Media URLs (image URLs for carousels, video streaming URL, article link, etc.).
        - `title` string — Title of the article or document, when available.
        - `thumbnailUrl` string — Thumbnail URL for videos, articles, or document covers.
      - `type` 'POST', required
      - `author` object, required
        - `name` string, required
        - `profileUrl` string, nullable, required
        - `headline` string, nullable, required
        - `profilePicture` string, nullable, required
        - `isCompany` boolean, required
        - `publicIdentifier` string, nullable, required — Vanity slug when not URN-based
        - `profileUrn` string, nullable, required — LinkedIn profile URN when available
      - `isRepost` boolean, required
    - object[]
      - `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 LinkedIn's search ranker matched the literal name (vs headline/skills). A strong personhood signal — when picking between two same-named candidates 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.
    - object[]
      - `type` 'COMPANY', required
      - `name` string, required
      - `profileUrl` string, nullable, required
      - `summary` string, nullable, required
      - `industry` string, nullable, required
      - `location` string, nullable, required
      - `followersCount` integer, nullable, required
      - `logoUrl` string, nullable — Company logo URL when LinkedIn surfaces it on the result entity. Display this in the company card.
    - object[]
      - `type` 'JOB', required
      - `title` string, required
      - `company` string, nullable, required
      - `companyUrl` string, nullable, required
      - `companyLogo` string, nullable, required
      - `location` string, nullable, required
      - `workplaceType` string, nullable, required
      - `postedAt` string, nullable, required
      - `jobUrl` string, required
      - `listingId` string, required — LinkedIn job listing id — pass to /visit/linkedin/job to fetch the full posting (applicant count, full description, employment status, listed/expire timestamps, inferred benefits, job functions, industries, apply method).
  - `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/revisions/3caf12036b26/schema)
