Skip to content

Post.findEngagers

List who reacted to or commented on one post, with what they said and where they work, priced per post, not per person.

Price
0.3¢ a post
Success rate
99.95% of 44,205 calls
Freshness
Fresh for 6 hours
Emits
Post.engagersFound
POST https://api.sb/{your-domain}/posts/find-engagers

Inputs

NameTypeMeaningPrice
poststringThe post’s link, as Post.find returns it or as you copy it from the Venue. Required.Included
venue'linkedin' | 'reddit' | 'x' | 'youtube' | 'tiktok' | 'instagram' | 'facebook'Where the post lives. Read from the link; send it only to override. Default read from post``.Included
venue: 'linkedin'OptionEngagers on LinkedInAbout 0.3¢ a post; works 99.95% of 44,205 calls
venue: 'reddit'OptionEngagers on RedditAbout 0.19¢ a post; works 99.7% of 115,835 calls
venue: 'x'OptionEngagers on XAbout 0.05¢ a post; works 99.98% of 52,058 calls
venue: 'youtube'OptionEngagers on YouTubeAbout 0.09¢ a post; works 100% of 12,899 calls
venue: 'tiktok'OptionEngagers on TikTokAbout 0.1¢ a post; works 99.98% of 25,958 calls
venue: 'instagram'OptionEngagers on InstagramAbout 0.1¢ a post; works 94.4% of 10,480 calls
venue: 'facebook'OptionEngagers on FacebookAbout 0.19¢ a post; works 99.96% of 16,093 calls
as'both' | 'comments' | 'reactions'Which engagers to read. Where a Venue shows only one kind, the other comes back empty, never refused. Default 'both'.Included
afterCursorThe cursor from the last page.Included
savenumberSave the first n engagers as Prospects, each with the post as where you found them; free, and it follows the call’s Mode. Default 0.Included
maxCostnumberThe most this call may spend, in USD. Over it, the call is refused before it spends, or stops early with what it has. Default 0.05.Included

Outputs

FieldTypeWhat null means
post{ url: string; venue: VenueId; engagement: { reactions?: number; comments?: number } }Never null: the post read, with its totals.
engagersEngager[]Never null: empty when no one engaged yet. What it means comment that names the problem: The warmest row on the list: the person said it in public. Write to them first, quoting their own words back. Planning estimate.
Fewer than 1 in 5 rows match your buyer’s titles: The post’s audience is the author’s peers, not your buyers. Score the rows with ICP.score before any send, and pick posts aimed at buyers next time. Source: reviews of the LinkedIn engagement read, 2026.
engagers[].handlestringNever null: the account’s handle on the Venue.
engagers[].namestring | nullThe Venue shows a handle only: Reddit, X and TikTok often do.
engagers[].headlinestring | nullThe Venue has no headline; LinkedIn is the one that does.
engagers[].profileUrlstring | nullThe account is hidden from people who are signed out, as some X and Instagram accounts are.
engagers[].as'reaction' | 'comment'Never null.
engagers[].reactionstring | nullA comment, or a Venue with one kind of reaction.
engagers[].textstring | nullA reaction: only a comment has text.
engagers[].atstring | null, in ISO 8601The Venue shows no time for a reaction.
engagers[].organization{ name: string; hostname: Hostname | null } | nullNo employer could be read from the profile. Contact.enrich fills it later.
engagers[]ObservedEach row also carries observedAt, method and venue.
afterCursorThe last page: there are no more rows.
costCost, in USDNever null. In try mode usd is 0 and maxUsd is what the call would have cost.

On each Venue

VenueWhat comes backLimitsPrice
LinkedInComments and reactions in one read: name, headline and profile; reaction is the type (like, insightful, support).The first 100 reactions a page; a post with more pages through after.About 0.3¢ a post
RedditCommenters only, with their text; Reddit shows no voters.Every comment in the thread, replies included, 100 a page.About 0.19¢ a post
XRepliers, with their text. Likers come back only for a post on your own connected X account.Likers are billed by X on your own account; replies are not.About 0.05¢ a post
YouTubeCommenters, with their text and likes.Top-level comments; replies on request through as: comments and after.About 0.09¢ a post
TikTokCommenters, with their text.Comments only; TikTok shows no likers.About 0.1¢ a post
InstagramCommenters, with their text.Comments only, and the least reliable read here.About 0.1¢ a post
FacebookCommenters on a public post; reactions only on a post from your own page.Public posts only.About 0.19¢ a post
Hacker NewsNothing: no route reads Hacker News commenters yet.Refuses with venue-unsupported; read the thread’s authors with Post.find and kinds: ['comment'].None.

Effects

Action class

None: no approval rule names it, so it runs within its seat’s Permissions and Limits

Modes
  • try: Runs the read and returns real rows; nothing is saved and nothing is billed.
  • send: Returns a pending Action at once; its Event carries the rows when the read finishes.
  • do: Waits for the read and returns the rows, billed per result.
Idempotency

The same Idempotency-Key with the same input replays the first answer at $0; with other input it returns 409.

Saved or shared

Rows are returned, not saved, unless you pass save. Readings about people are never shared across startups.

Emits

Post.engagersFound with { post, engagers }

Performed by

Prospector

Price

About 0.3¢ a post. At most 0.8¢ a post. Free: a post that is gone or private, saving rows as Prospects. maxCost defaults to 5¢. The engagers on 20 posts about your problem: 20 × 0.3¢ a post is about 6¢.

Reliability

The first route succeeds 99.95% of 44,205 calls. If it fails, the call refuses with sources-busy and nothing is spent.

Freshness

A reading younger than 6 hours returns at $0. Readings about people are never shared across startups.

Batch and pages

Up to 100 comments and 100 reactions a page. Pages of 25 rows by default, 100 at most; pass after for the next page. It answers in one response.

Rate

The shared rate rules: 10 calls a second per key, and an array input counts as one call.

Capability

Enrichment

Refuses when

CheckErrorFixThen call
A search engine, answer engine or network the call does not read, such as ChatGPT sent to Keyword.measurevenue-unsupportedPick one the call’s venue input lists; AI answers are Keyword.ask, posts are Keyword.search.Keyword.ask

Every data call can also meet the shared data-call refusals: filter-unsupported, input-missing, limit-exceeded, max-cost, rate-limited, sources-busy.

The venue-unsupported payload
JSON
{
  "type": "https://startupbuilder.dev/errors/venue-unsupported",
  "title": "The call does not read that search engine or network",
  "status": 422,
  "detail": "A search engine, answer engine or network the call does not read, such as ChatGPT sent to `Keyword.measure`.",
  "fix": "Pick one the call’s `venue` input lists; AI answers are `Keyword.ask`, posts are `Keyword.search`.",
  "next": {
    "verb": "Keyword.ask",
    "input": {
      "keyword": "best rent tracking software for a 40-unit property manager",
      "venues": [
        "chatgpt"
      ]
    }
  },
  "instance": "https://api.sb/leaseline.app/actions/action_1"
}

When it waits

Returns in one response; nothing waits.

Example

A refusal: Hacker News has no engager read yet, so the call refuses before it spends and next names the read that does.

You, to your agent
Who commented on this Hacker News thread about rent tracking?
Response, in try mode
{
  "type": "https://startupbuilder.dev/errors/venue-unsupported",
  "title": "The call does not read that search engine or network",
  "status": 422,
  "detail": "Post.findEngagers does not read Hacker News.",
  "fix": "Read the thread’s comments with Post.find and kinds: ['comment'], then take their authors.",
  "next": {
    "verb": "Post.find",
    "input": {
      "term": "rent tracking landlord",
      "venue": "hacker-news",
      "kinds": [
        "comment"
      ]
    }
  },
  "instance": "https://api.sb/leaseline.app/actions/action_Hn4vQ8"
}

To retry, send the same Idempotency-Key: the retry returns the first answer for $0. A new key reads again.

Test values, and watching it

A sk_test_ key answers these the same way every time, at $0 (every test value).

Test valueAlways returnsWhat it is for
https://www.linkedin.com/posts/test-engagers{"engagers":5,"comments":2,"reactions":3}Returns the same five engagers, two comments and three reactions, so a harvest Workflow’s dedupe and save steps run.
maxCost: 0.0001Refuses with max-costAny priced call with a maxCost of 0.0001 is refused before it spends: the price is above the cap.
rate-limited.testRefuses with rate-limitedAny call naming this hostname answers 429 with Retry-After, so your retry logic runs.
sources-busy.testRefuses with sources-busyAny call naming this hostname answers 503 as if every route were busy, and nothing is spent.

Watch it on a schedule: a Monitor runs this call and records an Event only when the reading changes.

TypeScript
await $.Monitor.create({
  verb: 'Post.findEngagers',
  input: {
    post: 'https://www.linkedin.com/posts/rentrival_rent-roll-chaos-7134'
  },
  change: 'new-engager',
  every: '6h',
})

Used by