Exa Find People
exa_find_peopleUse AFTER companies have been identified (company-find step in the same agent, user named a target, CRM lookup, etc.) to surface specific decision-makers. Results are always LinkedIn URLs.
Before composing a search, call get_skill_guide('exa_find_people') —
it owns the query vs criteria split that decides whether
results come back useful or noisy (exclusions in query backfire;
they belong in criteria).
Every person a search returns is checked against its criteria, one
at a time and whichever provider served it, and results holds only
the matches, most senior first; non-matches come back in rejected as
{name, reason} with no URL. Put exclusions in criteria.
Pass company_domain or company_linkedin_url whenever you have one. A
search carrying either is answered by a people database that filters on
that identifier, so it cannot return someone at a same-named company.
Without one, the search falls to a name-matched provider, and the check
is what keeps a same-named company's staff out, reading each person's
current and past roles against criteria.
Both providers read a profile snapshot refreshed periodically, not live reality, so someone who changed jobs since the last crawl can still pass.
Accepts a list of ExaPeopleSearch — pass one for a single-company
lookup, or N for a batch, fanned out in parallel (max 5 concurrent, since
the name-matched provider has shown 5xx instability under bursty load).
Each search routes on its own, so one batch can be served by both
providers. Each call retries once on 5xx inside the HTTP client.
An identifier-pinned search matching more people than can be returned at
once comes back in its own slot as {error, query} asking you to narrow
by titles (and locations, at a multinational); the rest of the batch
is unaffected. Re-send that one search narrowed.
Costs 0.5 Sliq credits per search that returns without error, whichever
provider served it, so an empty result set still charges (the call was
made). Free on BYO Exa (a connected Exa key). Soft-fails on insufficient
credits: the data is returned and the charge is capped at the remaining
balance.
List of per-search result dicts in input order. Each is either
{results: [...], rejected: [...]} on success, or
{error: '...', query: '...'} on failure (after the in-client
retry). results entries are {name, url, summary, verdict, verdict_reason, seniority_level}, most senior first, with url
always a LinkedIn profile URL, summary holding name, current_title,
current_company, location and tenure, verdict 'qualified', or
'unclear' when the profile says too little to judge, and
seniority_level one of c_level, vp, director, senior_manager,
manager, ic, unknown (both null when the check couldn't run).
rejected entries are {name, reason} only.
On insufficient Sliq credits the batch is refused before running: it
raises InsufficientCreditsError rather than returning per-search slots.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | No | Optional — a specific agent to save the checked people into. Omit it to use the running agent, which is the usual case. Only a throwaway lookup outside any agent returns results without saving. | |
| searches | Yes | List of `ExaPeopleSearch` objects. Each has its own `query` + `criteria`. For a single-company lookup, pass a list of one. | |
| list_name | No | Short kebab slug naming the Output-tab list bucket (e.g. 'acme-execs'). When this runs in an agent, the people the check judged are saved and linked as `agent_search_results` person rows automatically, each with its verdict (the rejected ones hidden from the list's default view) — deduped by profile, re-runs update in place; `list_name` names their list, and absent it they land in the 'default' list. Query them by reference with `query_search_results` instead of re-typing URLs from `results`. The `results` return is unchanged either way. | |
| num_results | No | Candidates Exa retrieves and ranks per search before the check runs. Default 10; max 100. Matches cluster at the top of Exa's ranking, so 10 usually holds the right people for a well-formed query; the returned `results` are shorter after the check. If `results` is thin and `rejected` is long, reword the query (the reject reasons say whether and how) rather than raising this — the tail ranks are lower-relevance anyway. | |
| on_behalf_of | No | An agency client's email, from list_agency_clients, to run this call in that client's account: their agents, settings, connected accounts, and credits. Omit it to act on your own account. |