public

Find people from public data

Search for people through an anonymous public web search; no connected account is needed. Results are public data, never signed-in LinkedIn details (connection degree, who engaged with a post, whether someone is reachable by message). Found profiles are saved as contacts and render as a people list; narrate a one-line count. limit (1-300, default 15) is how many profiles ONE call targets: a specific number sets it, a volume word with no ceiling raises it toward 100-300. Pass every plausible title, seniority, or city as an array on the SAME filter field in ONE call. more:true continues the SAME filters past people already found, on whichever lane answered the first call: the public sweep, or the connected account when one ran. moreAvailable:false after a continuation means that lane is walked out: say so plainly and do not call more:true again. exhaustionNote, when present, says which wall was hit: relay it. duplicates counts people a continuation re-reached and dropped without re-charging; that is normal bookkeeping, never a failure. exhaustion:"axes-exhausted" means every angle was tried: suggest a real change, do not call more:true again. exhaustion:"batch-failed" is a temporary vendor hiccup. A signal that would show in a headline (years in role, a school, a tool, freelance) belongs in filters.keywords, not a visit-first pass. When they asked for somebody in particular rather than describing a crowd, pass their words as sentence ALONGSIDE the facets: that is what answers a named question directly instead of slicing a market. A result returns everybody it found, including people already in the contact list, marked completeness "already-a-contact": that is an ANSWER, never a reason to search again with other words. To REFINE a previous result (a second turn shaped like 'not these'), repeat the SAME filters with excludeWords or excludeProfiles rather than writing a new search: the refinement drops them before any per-person cost and reports excludedCount. Asked who somebody is, name them and say they are already saved.

post/public/search

Request body

limitinteger

Target number of NEW profiles to fetch. People already in your contacts that the search also finds are listed additionally, marked already-a-contact, at no fetch cost: the contacts array can therefore exceed this number, which is the answer being complete rather than the limit being ignored.

save'keep' | 'skip' | 'ask'

What happens to the people found. "skip" ONLY when you are certain this search is a step on the way somewhere else: one person or one company you need in order to then work on their posts or their audience, or a check of who somebody is. "ask" when you are not certain, and the person gets the choice. Otherwise "keep", which is the default: a search for people to reach is the list they are building. When they want only PART of what a search would return, narrow first and keep the narrow result; keeping everyone and then removing the unwanted writes people nobody asked for. The answer reports what was actually written: say that, never what you intended.

moreboolean

Continue past the people an earlier search on these same filters already returned, instead of returning them again. What counts as already returned is the position the last search reached, kept server side.

sentencestring

What the person actually asked, in their own words, when they asked for somebody in particular rather than describing a crowd: a named person, a role at a named organisation, everyone at one, or people who used to work there. Send it ALONGSIDE the facets, never instead of them. It is what lets the search answer a named question directly instead of slicing a market that has no such answer.

verifiedboolean

Verified-identity constraint. Not searchable here: echoed under notSearched.

approveLinkedInSpendboolean

Approval to run this search through the user's connected LinkedIn account when a facet needs it. Never pass true on your own: the result's needs quote is relayed to the user first, and their agreement in their next message is what this flag carries.

Response

Found and enriched people

source'public' required
providerstring required

The search provider that answered.

querystring required

The exact query sent, so a thin result set can be read rather than guessed at.

existingCountinteger

How many of the people returned were already in your contacts. They ARE in contacts like everyone else, marked completeness "already-a-contact", and were not re-fetched because their profile was already read once. Absent when there were none. Not a reason to search again: the search already answered.

askedForinteger

How many results carry the words YOU typed, rather than the words the search expanded them into. Zero on a full result set that otherwise looks healthy is a strong caveat worth telling the reader about, most often meaning the job title or company named was not found. It is a caveat and not a verdict: a partial result, or a title nobody writes in a headline, can also read zero. Corroborate before saying the person or company does not exist.

exhaustionNotestring

Why this result is thinner than its count suggests, in words ready to relay. Three causes: the ask itself matched nobody and these people are the closest the wider search reached (a continuation continues that wider search, not the original ask); a continuation reached the end of this search's or this company's list, so there is genuinely nobody further; or the connected account hit LinkedIn's monthly search cap, so the set is truncated rather than complete. Relay it rather than presenting the rows as the whole answer.

laneNotestring

Present when the answer had to run on a different lane than the ask deserved, in product words: for example a company roster built from public mentions because no usable LinkedIn account was connected. Relay it verbatim; it already says what to do next.

refused'nothing-to-search' | 'wants-companies'

Set when the request could not be searched at all. 'nothing-to-search' means nothing in it named anybody. 'wants-companies' means it asked for organisations, which this operation does not find: use the company search instead. Neither is a retry: say what happened and change the request.

notFoundstring[]

People you named by name that the search could not find. When this is set, no result is that person: say so rather than presenting the people returned as them.

urlsFoundinteger required

Total profile URLs found.

newUrlsinteger required

Profiles fetched on this call. People already in your contacts are returned too, from the search result, without being fetched again.

hydratedinteger required

Profiles fetched and enriched in this call.

searchesinteger

How many searches it took to find these people.

searchesFailedinteger

Searches that did not reach the provider. When this is high the result says nothing about the market.

moreAvailableboolean

Whether asking again with more can still reach people you have not seen. Set on every lane, including a run through the connected account. False after a continuation means that lane is walked out, not that the search failed.

exhaustion'more-available' | 'axes-exhausted' | 'batch-failed'

Finer than moreAvailable: 'axes-exhausted' means every search angle for this audience has genuinely been tried, calling again with more will not find anybody new. 'batch-failed' means this attempt could not reach the search provider, worth retrying. 'more-available' is the ordinary case.

rateLimitedinteger

Profiles found but deferred because the scraping pool is busy.

notestring

Explanation when part of the result set was deferred.

stillRunningboolean

The search outlived this request's watch window and is still working server side. Everything in this response is real and already found. Ask the SAME filters again shortly to collect more: that joins the running search rather than starting or paying for a new one.

partialboolean

The search stopped before finishing, so this is what it found, not the whole answer. Asking again starts a fresh search. Never present a partial result as everybody there is.

creditsExhaustedinteger

Profiles found but not read because the workspace credit pool emptied part way through. Real matches, not the full result set.

creditsUsedinteger

Credits this call spent from the workspace pool: search pages plus profile fetches that succeeded.

duplicatesinteger

People this continuation found again that an earlier call on the same filters already returned. They were filtered out without being re-fetched or re-charged.

queriesstring[]

Every query this call actually executed, so a multi-part ask can be read rather than guessed at. query above stays the single representative one.

pooledinteger

How many of these people were linked into the target list or conversation. Zero alongside non-empty results means found but not saved to a list.

poolTargetedboolean

Whether a target list existed for this call at all; gives pooled its meaning.

honouredstring[]

On an approved account-lane run: the exact facets that were genuinely applied.

approvedBy'user' | 'premium'

Who approved the account-lane run: the user's explicit yes, or the account's LinkedIn Premium (no monthly search cap, so exact runs directly). Relay which.

linkedinSearchesinteger

On an approved account-lane run: LinkedIn searches this call spent from the account's monthly allowance.

excludedCountinteger

Rows dropped by excludeProfiles/excludeWords before fetching, so a refinement is visible and never re-paid.

Changes