---
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.
  - `status` string
  - `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
    - `likes` number, nullable
    - `comments` number, nullable
  - `count` integer
  - `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.
  - `_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
      - `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)
