Skip to content

Prospect.find

List the people in the role you sell to at companies that fit; a search by title is free, and contact details come later.

Price
3.8¢ per 100 rows
Success rate
99.99% of 636,024 calls
Freshness
Fresh for 30 days
Emits
Prospect.found
Capability
Enrichment
POST https://api.sb/{your-domain}/prospects/find

Options and prices

You getInput that selects itPriceSuccess rate
People by title, or at a company domain{"where":{"titles":["property manager"]}}Free99.99% of 636,024 calls
People at companies that match an industry, keywords or size{"where":{"titles":["property manager"],"organizationWhere":{"keywords":["property management"]}}}About 3.8¢ per 100 rows100% of 1,384,179 calls
The person to write to at each company{"organizations":["harborview-pm.com"],"roles":["owner"]}About 5¢ per 100 rows99.95% of 71,697 calls
People who fit a sentence{"question":"…"}About 7¢ per 100 rows99.93% of 200,832 calls
Creators by audience{"kind":"creator","creator":{}}About 60¢ per 100 creators99.9% of 12,654 calls
People who engaged with a post{"kind":"engager","engagedWith":"…"}About 0.3¢ a post99.95% of 43,072 calls

Inputs

NameTypeMeaning
icpstringAn ICP id; its Persona fills where and roles. Pass one of icp, where, question, organizations or engagedWith.
whereProspectFilterTitles, seniority, departments, locations and the company filters.
organizationsHostname[]Up to 100 companies; the rows are the people at each, ranked by roles.
rolesstring[]With organizations: the roles in priority order. Default the ICP’s Persona.
questionstringThe people in one sentence; each row gains a reason.
kind'person' | 'creator' | 'engager'Which people, and so which output shape: people in a role, creators by audience on a site, or the people who engaged with engagedWith. Default 'person'.
creator{ venues: VenueId[]; followers?: Range; engagementRate?: Range; niche?: string }With kind: creator. Sites: Instagram, TikTok, YouTube and X.
engagedWithstringWith kind: engager: a post URL on LinkedIn, X or Reddit; the people who reacted to it or commented on it.
limitnumberRows a page, at most 100. You pay for rows returned, never rows asked for. Default 25.
afterCursorThe cursor from the last page.
savenumberSave the first n rows as Prospects; free, and it follows the call’s Mode. Default 0.
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 1.00.

Outputs

FieldTypeWhat null means
prospectsProspect[]Never null: empty when no one matched, at $0.
prospects[].kind'person' | 'creator' | 'engager'Never null: the shape of the row, as kind asked.
prospects[].namestringNever null.
prospects[].titlestring | nullUnknown.
prospects[].seniority'owner' | 'c-level' | 'vp' | 'director' | 'manager' | 'individual' | nullUnknown.
prospects[].organization{ name: string; hostname: Hostname | null } | nullNo current employer on record.
prospects[].locationstring | nullUnknown.
prospects[].profileUrlstring | nullNo public profile was found.
prospects[].hasEmailboolean | nullThe source does not say. Revealing the address is ContactPoint.findEmail or Prospect.verify.
prospects[].reasonstringAbsent on a plain filter: why this row, from the sentence, the role rank or the comment left.
prospects[].creator{ venue: VenueId; handle: string; followers: number; engagementRate: number | null }Absent unless kind is creator.
prospects[].engaged{ post: string; as: 'reaction' | 'comment'; text: string | null; at: string }Absent unless kind is engager.
prospects[]ObservedEach row also carries observedAt and method, and venue and locale where the reading has them.
afterCursorThe last page: there are no more rows.
totalnumber | null, in peopleThe source does not report a total.
ignoredstring[]Never null: empty when every filter you sent was applied.
costCost, in USDNever null. In try mode usd is 0 and maxUsd is what the call would have cost.

Output shapes

kind picks the shape, and prospects[].kind says which one came back, so your code switches on it.

People in a role

When kind is person. The default: people by title, seniority and company, with whether a work email is on file.

FieldTypeWhat null means
prospects[].titlestring | nullUnknown.
prospects[].organization{ name: string; hostname: Hostname | null } | nullNo current employer on record.
prospects[].hasEmailboolean | nullThe source does not say.

Creators by audience

When kind is creator. People found by the audience they hold on one site, for a sponsorship or a guest spot. Titles and employers are often unknown.

FieldTypeWhat null means
prospects[].creator{ venue: VenueId; handle: string; followers: number; engagementRate: number | null }Never null on a creator row. engagementRate is null under 10 recent posts.
prospects[].organizationnullA creator row names no employer.

People who engaged with a post

When kind is engager. Everyone who reacted to or commented on the post in engagedWith, each with what they did. Priced per post read, not per person.

FieldTypeWhat null means
prospects[].engaged{ post: string; as: 'reaction' | 'comment'; text: string | null; at: string }Never null on an engager row. text is null on a reaction.
prospects[].reasonstringNever null on an engager row: the comment, or the reaction, in a few words.
One row of each shape, as JSON

Loading the samples.

Read the result

FieldValueWhat it meansWhat to do
reasonRanked first of 3 by roleThe person your roles put first at that company.Write to one person a company first; a second only after 2 weeks without a reply. (one to two people a company, from the list rule)
hasEmailfalseNo source holds a work email for this person.Skip them for email; reach them on LinkedIn or through ContactPoint.findPhone later. (the free-miss rule)
titleMatches none of your titlesTitle search widened to similar titles.Pass similarTitles: false in where to keep exact titles only. (the ProspectFilter default)

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

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

Emits

Prospect.found with { prospects, where, total }

Performed by

Prospector

Price

About 3.8¢ per 100 rows. Free: a search by title or company domain alone, saving rows as Prospects. maxCost defaults to $1.00. The person to write to at 100 companies that fit: 100 × 0.05¢ a row is about 5¢.

Reliability

The first route succeeds 99.99% of 636,024 calls. If it fails, the call refuses with sources-busy and nothing is spent.

Freshness

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

Batch and pages

Up to 100 rows a page. Pages with an after cursor, 25 rows a page by default and 100 at most. It answers in one response.

Rate

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

Refuses when

This call has no refusals of its own. Every data call can also meet the shared data-call refusals: filter-unsupported, input-missing, limit-exceeded, max-cost, rate-limited, sources-busy, venue-unsupported.

When it waits

Returns in one response; nothing waits.

Example

Text
Who should I write to at harborview-pm.com: the owner, or the director
of property management? Spend up to 1¢.

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