---
title: "LinkedIn Search Posts API"
method: GET
path: "/v1/linkedin/search-posts"
tags: ["LinkedIn"]
---

# LinkedIn Search Posts API

`GET /v1/linkedin/search-posts`

## Request

- Base URL: `https://api.captapi.com`
- URL: `https://api.captapi.com/v1/linkedin/search-posts`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Keyword search of public LinkedIn posts — offset cursor, ceiling 50.

Search public LinkedIn posts by keyword. LinkedIn's own content search needs a login and Captapi never signs in, so results come from public search-engine results for LinkedIn post pages, each read and kept only when the post contains every keyword — not LinkedIn's full index. Broad queries fill pages; niche queries can return few or no results. When nothing public matches, the call is 200 with an empty list, truncatedReason=no_public_matches, a note, and 0 credits. If the search sources cannot be reached at all, the call is 502 UPSTREAM_UNAVAILABLE, retryable, 0 credits. Each row is the same post card as post-details minus media. author.id is the /in or /company vanity (or ACoAA… urn); author.headline is the job title when the post page exposes it. engagement.likes / comments are read locale-proof from the post page's DOM counters (guest pages arrive in random languages — "9 réactions" used to null likes on a post with 9 reactions) and always carry their *IsApproximate pair (null flag when the count is null — the key never disappears row to row); reposts is omitted when LinkedIn hides shares. Cursor pagination via nextCursor + hasMore (numeric offset, same as company-posts); hasMore is true only when nextCursor is present. A null nextCursor means the end of this SERP window (max 50), not that LinkedIn has no more posts. sort=relevance (default) is the search-engine rank — publishedAt can span years; sort=date sorts the found posts newest first. The envelope names query / sort / requested / listingHits / totalReturned / truncatedReason=serp-window plus serpMs / hydrateMs / totalMs. Billing is ~0.8/result (10 posts → 8, 20 → 16); an empty result is 0 credits.

Docs: https://captapi.com/apis/linkedin-search-posts

## Query parameters

- `q` string, required
- `sort` string
- `limit` integer
- `cursor` string
- `cache` boolean

## Response `200`

Success. The data object for this endpoint.

- object
  - `success` unknown, required
  - `data` object, required
    - `query` string: Keyword that was searched (echo).
    - `sort` string: relevance (default, search-engine rank) or date (recency). Echo of the request.
    - `totalReturned` integer: Number of items returned in this response.
    - `posts` object[]
      - `platform` string: Platform identifier for this response (matches the endpoint's platform).
      - `type` string: Content type of the item.
      - `url` string: Canonical URL of the item.
      - `text` string: Text content.
      - `publishedAt` string: Publish date (ISO 8601) when the platform exposes an absolute timestamp.
      - `author` object: Author name or handle.
        - `name` string
        - `url` string: Canonical URL of the item.
      - `engagement` object: Engagement metrics for the item.
        - `likes` integer
        - `comments` integer
      - `id` string: Id of this posts item.

## Other responses

- `400`: Bad request: wrong platform URL, unknown endpoint, or an invalid parameter value. Not billed.
- `401`: Missing, invalid or revoked API key. Not billed.
- `402`: Not enough credits for this request. Not billed.
- `404`: The resource does not exist or is not public. Not billed.
- `422`: A required parameter is missing or has the wrong type. Not billed.
- `429`: Rate limit reached. Wait for Retry-After seconds. Not billed.
- `502`: The platform could not be reached or returned nothing usable. Retryable, not billed. 503 and 504 use the same envelope.

---

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