---
title: "Search LinkedIn by URL"
method: POST
path: "/search/linkedin/url"
tags: ["search"]
---

# Search LinkedIn by URL

`POST /search/linkedin/url`

# Search LinkedIn by URL

Paste any LinkedIn search URL and the endpoint will automatically extract the category, keywords, and all filters from it, then execute the search and return structured results.

## When to use this endpoint
- A user gives you a LinkedIn search URL and you want to get the results programmatically
- You want to replicate a search the user performed in their browser
- You want to automate searches based on bookmarked LinkedIn search URLs

## Supported URL formats
The endpoint supports all standard LinkedIn search URLs:
- `https://www.linkedin.com/search/results/people/?keywords=engineer`
- `https://www.linkedin.com/search/results/content/?keywords=AI&sortBy=%22date_posted%22`
- `https://www.linkedin.com/search/results/companies/?keywords=startup&companyHqGeo=%5B%22103644278%22%5D`
- `https://www.linkedin.com/jobs/search/?keywords=frontend&location=Paris`
- `https://www.linkedin.com/search/results/all/?keywords=test` (treated as people search)

## URL path → Category mapping
| URL path segment | Category |
|------------------|----------|
| `/results/content/` | posts |
| `/results/people/` | people |
| `/results/companies/` | companies |
| `/results/all/` | people |
| `/jobs/search/` | jobs |

## What is read from the URL
Keywords and every filter the vertical can actually apply, under LinkedIn's own spellings as its filter bar writes them (`titleFreeText`, `schoolFilter`, `companySizeV2`, `companyHQBingGeo`, `industryCompanyVertical`) with the bare names accepted as a fallback for a hand-written URL. A company's HEADQUARTERS is kept as its own filter and never folded into the person's location: they are different questions and return different people. Jobs facets are comma-separated in LinkedIn's URLs and each value is read on its own.

A facet the URL carries that this search cannot apply comes back as a `URL_FACET` entry in `warnings`, naming the facet. That matters because a dropped filter means the search ran WIDER than the one on the person's screen, so a result set with URL_FACET warnings is a bigger cohort than they asked for and should be described that way.

## Pagination override
You can optionally pass `start` and `count` to override the pagination embedded in the URL.

## Credits

## Request body

- object
  - `url` string, required — A LinkedIn search URL. The endpoint automatically extracts the category, keywords, and all filters from the URL. Example: 'https://www.linkedin.com/search/results/people/?keywords=engineer&network=%5B%22S%22%5D'
  - `start` integer — Override pagination offset. If not provided, uses the page from the URL (or defaults to 0).
  - `count` integer — Override results per page (default 10, max 50).

## Response `200`

Search results parsed from the LinkedIn URL

- 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_engagers).
      - `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.
      - `repostedFromName` string — On a repost, the ORIGINAL author's name when it differs from the resharer.
      - `reactionTypeCounts` object[] — Per-reaction-type breakdown, when LinkedIn exposes it.
        - `reactionType` string, required
        - `count` integer, required
      - `numImpressions` integer, nullable — Total impressions, exposed only on Creator-mode posts.
      - `highlightedReactorName` string, nullable — Social-proof attribution, when LinkedIn surfaces one in the feed.
      - `viewerLiked` boolean, nullable — Whether the authenticated account has reacted to this post.
      - `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 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.
    - 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
  - `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)
