---
title: "Collect people on a post"
method: POST
path: "/collect/linkedin/engagers"
tags: ["scrapers"]
---

# Collect people on a post

`POST /collect/linkedin/engagers`

One verb for people on a post. One page per call, likes then comments, paced. With a connected account, skips the public preview and starts a collect run that saves visitable reactors and full commenters as contacts, returning a run id. People land in the list as each page finishes. Another page exists when moreAvailable is true; call again with more true only if the user asked or tapped Load more. Each page uses the connected account's action budget. People who need extra lookup we don't do yet are skipped and counted as hiddenSkipped. Without a connected account, returns a public preview of top commenters only (reactor identities are not public). Preview people are not saved. Connecting does not auto-start a run; call this again after connecting.

## Request body

- object
  - `postUrls` string[], required — LinkedIn feed/update or /posts/ URLs only. Not Pulse, Sales Navigator, company pages, or lnkd.in short links.
  - `more` boolean — Next page of the same posts. Set only when the user asked for more people or tapped Load more. Each page uses the connected account's action budget. If likes plus comments is 500 or more, wait for them to ask again.
  - `untilCount` integer — Target list size they named (100+ means 100), at most 500. Only when they named a target size. One call; the run pages itself. Unasked drain is still one page.
  - `surface` 'likes' | 'comments' | 'both' — Which engagement to read: only the people who reacted, only the people who commented, or both. Defaults to both. Ask for one when the request names one, so the result is not padded with the other kind of engagement.
  - `campaignSlug` string — Optional campaign to pin saved contacts onto. Ignored on the public preview path.

## Response `200`

Collect-run id, or a public commenter preview when no account is connected

- object
  - `success` true, required
  - `runId` string — Present when a connected account started a collect run. People are saved as contacts as the run proceeds, and they appear in the list rather than in the reply. A run id means the connected account was used: never explain this result as needing a connection.
  - `status` string — Where the run is. While it is running the list is the count, so do not state one. Once it is completed the saved number is final.
  - `coverage` 'preview' — Present when no account is connected. Top visible commenters only; reactor identities are not public.
  - `needs_linkedin` boolean
  - `people` object[]
    - `name` string, nullable, required
    - `headline` string, nullable
    - `profileUrl` string, nullable, required
    - `publicIdentifier` string, nullable
    - `profileUrn` string, nullable
    - `imageUrl` string, nullable
    - `commentText` string, nullable
    - `type` 'like' | 'comment'
  - `postText` string, nullable
  - `totals` object — The post's own engagement badges, summed across the posts read. A sum, so it can never answer how many came from one post: `perPost` answers that. Absent while `count` is above 0 means the badge could not be read, never that nobody engaged. Both zero or absent WITH count 0 is the only shape that means no visible engagement on this page.
    - `likes` number, nullable
    - `comments` number, nullable
  - `count` integer — People saved by this call. The number to narrate. Zero is only an empty post when `unreadable` is 0; above 0 those people were not shown rather than absent.
  - `hiddenSkipped` integer — People skipped because they need extra lookup we don't do yet. Not saved. Omit or 0 when none.
  - `unreadable` integer — Posts whose asked-for engagement could not be read. DISTINCT posts, not a sum of the two counters below: a post that lost both its lists is one post. Above 0 means the answer is incomplete, and those posts must never be reported as having no engagement.
  - `likesUnavailable` integer — Posts where the reaction list could not be read. On a run that read both surfaces those posts contributed commenters only; on a run scoped with `surface` they contributed nobody. Say so when above 0; it does not mean nobody reacted.
  - `commentsUnavailable` integer — Posts where the comment list could not be read. The comment half of the field above, and the same rule: it does not mean nobody commented.
  - `perPost` object — People SAVED per post, keyed by post id, split into likes and comments. Someone who engaged with several of the posts is counted once, under the first post they were saved from, so these are saved counts and not that post's engagement count: say saved, never say the post had only this many engagers. They add up to count. totals is a sum across posts, not a per-post figure.
  - `hasMore` boolean
  - `moreAvailable` boolean — True when another page of people exists. Do not fetch it unless the user asked or tapped Load more.
  - `remainder` string — When more pages exist: this page only — do not say fully collected, all pages, or no more remain.
  - `commentersTruncated` integer — Preview only: posts whose page showed more commenters than the public view exposes. Above 0 means the people listed are the top slice, never everyone who engaged; the full thread needs a connected account.
  - `note` string — A caveat about this result in words ready to relay, when one applies.
  - `_displayLinkedInConnect` object — Chat-only connect card marker on the public preview path. autoRetry false means connecting does not start a collect run.
    - `reason` string, required
    - `autoRetry` boolean
  - `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

## 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.

## Changes

> 11 revisions in range; 1 not diffed, 4 could not be searched.

- **2026-08-20** `a1e86af2406d` — 3 info
  - added the new optional request property `surface`
  - added the optional property `commentsUnavailable` to the response with the `200` status
  - added the optional property `unreadable` to the response with the `200` status
- **2026-08-20** `9217eedacbb8` — 2 info
  - added the optional property `likesUnavailable` to the response with the `200` status
  - added the optional property `perPost` to the response with the `200` status

[Change history](https://skmtc.dev/berea/apis/bereach-api/changes/collect/linkedin/engagers/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-service-production.skmtc.workers.dev/v1/apis/berea/bereach-api/revisions/ee1b63eb6645/schema)
