Skip to content

Handle.find

List the accounts on one Venue that hold your buyers’ attention, by followers, engagement and topic, before a sponsorship or a guest spot.

Price
60¢ per 100 accounts
Success rate
99.91% of 12,814 calls
Freshness
Fresh for 7 days
Emits
Handle.found
POST https://api.sb/{your-domain}/handles/find

Inputs

NameTypeMeaningPrice
venue'instagram' | 'tiktok' | 'youtube' | 'x'Where the accounts are. Each Venue fills the same row; On each Venue says what each one adds. Required.Included
venue: 'youtube'OptionYouTube channels that match a termAbout 10¢ per 100 searches; works 100% of 7,600 calls
topicstringThe accounts in one sentence: creators who explain rental-property finances to small landlords. Each row says whether it matched the topic, the filters or both. Selects accounts that post about a topic, described in a sentence.About 7¢ per 100 accounts; works 100% of 3,251 calls
keywordsstring[]Short words that must appear in the bio, in the account’s own language: landlord, not property management software.Included
followersRangeFollowers or subscribers, such as { min: 10000, max: 100000 }: big enough to matter, small enough to answer.Included
followers.min: 10000OptionAccounts by follower range, engagement and countryAbout 60¢ per 100 accounts; works 99.91% of 12,814 calls
engagementRateRangeReactions and comments a post as a share of followers, 0 to 1: { min: 0.02 } drops bought audiences.Included
countriesstring[]Where the account is, by country, as ISO 3166-1 codes such as US. Default your home Market.Included
limitnumberAccounts a page, at most 50. You pay for accounts returned, so keep it small while you tune filters. Default 10.Included
afterCursorThe cursor from the last page.Included
strictbooleanRefuse with filter-unsupported, at $0, instead of listing an unapplied filter in ignored. Default false.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.25.Included

Outputs

FieldTypeWhat null means
handlesFoundHandle[]Never null: empty when nothing matched, at $0. What it means Under 0.01 at 50,000 followers or more: Most of the audience does not see or answer the posts. Skip it for a paid spot; measure the posts first with Handle.measure. Planning estimate.
topic only: The account talks about your problem but missed a hard filter, usually the follower range. Read why with Handle.measure before you drop it: a small account on topic often converts better than a large one off it. Planning estimate.
handles[].handlestringNever null: @smalllandlordmath.
handles[].namestring | nullThe account shows no display name.
handles[].urlstringNever null.
handles[].followersnumber, in followers or subscribersNever null.
handles[].engagementRatenumber | null, in 0 to 1Fewer than 10 recent posts to average over.
handles[].countrystring | nullThe account names no country.
handles[].biostring | nullThe account has no bio.
handles[].match'filters' | 'topic' | 'both'Never null: which read found it. both is the strongest row.
handles[]ObservedEach row also carries observedAt, method and venue.
afterCursorThe last page: there are no more rows.
totalnumber | null, in accountsThe topic read reports no total.
ignoredstring[]Never null: a filter the Venue does not take, such as keywords on a described search.
costCost, in USDNever null. In try mode usd is 0 and maxUsd is what the call would have cost.

On each Venue

VenueWhat comes backLimits
InstagramAccounts with followers, engagement rate and country; over 10,000 followers, the audience’s countries and ages too.country is the country only: a city matches nothing.
TikTokAccounts with followers and engagement rate.Words in the bio filter; words in captions are not read, so put topic words in keywords.
YouTubeChannels with subscribers as followers, and engagement rate from recent videos.Engagement rate is null for a channel with fewer than 10 recent videos. Price About 10¢ per 100 searches
XAccounts with followers and engagement rate.The weakest Venue for a niche: reviews found mostly off-topic accounts for software topics; pair it with topic.
LinkedInNothing: no route lists LinkedIn members by audience.Refuses with venue-unsupported; find the people who post on a topic with Post.find and take their authors.
RedditNothing: Reddit accounts hold no follower audience to list.Refuses with venue-unsupported; read a community with Post.find.
Hacker NewsNothing: Hacker News accounts hold karma, not an audience.Refuses with venue-unsupported.
FacebookNothing: no route lists pages by audience.Refuses with venue-unsupported; measure a page you already know with Handle.measure.

Effects

Action class

None: it reads, so no approval rule names it

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

Nothing is written to your records. A list is shared across startups for the same filters and Venue for 7 days; it reads public accounts only.

Emits

Handle.found with { venue, handles, total }

Performed by

Partner Manager

Price

About 60¢ per 100 accounts. Free: a page with no accounts, a refused filter. maxCost defaults to 25¢. Ten accounts on each of 3 Venues: 30 × 0.6¢ an account is about 18¢.

Reliability

The first route succeeds 99.91% of 12,814 calls. If it fails, the call refuses with sources-busy and nothing is spent.

Freshness

A reading younger than 7 days returns at $0. Readings are shared across startups for the same subject and locale.

Batch and pages

Up to 50 accounts 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

Market data

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
A call sent with strict: true and a filter no route can applyfilter-unsupportedDrop that filter, or send without strict and read what comes back in ignored.Organization.count

Every data call can also meet the shared data-call refusals: 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: LinkedIn lists no members by audience, so the call refuses at $0 and next names the read that finds who posts on the topic there.

You, to your agent
Which LinkedIn creators post about property management software?
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": "Handle.find does not list LinkedIn members by audience.",
  "fix": "Find who posts on the topic with Post.find on LinkedIn, then measure each author with Handle.measure.",
  "next": {
    "verb": "Post.find",
    "input": {
      "term": "property management software",
      "venue": "linkedin"
    }
  },
  "instance": "https://api.sb/leaseline.app/actions/action_Li7wK2"
}

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

Test values

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

Test valueAlways returnsWhat it is for
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.

Used by

None.