Search people
Stage people by role, seniority, employer, geo, or recent job change.
Tool: search_people
The call returns named rows plus search_id and creates no people or lead group. Review the rows, then use continue_search with search_id, the returned search_version for another bounded turn only after the user explicitly asks for more. Never loop continuation turns automatically or broaden the filters while this search remains active without user agreement. Use save_search(search_id) once to create or append to a people group. For company-first sourcing, pass within_lead_group_id to freeze the eligible saved company roster, or pass all reviewed current_employer_domain values with per_company_limit in one call. The server advances as many company scopes as fit within the turn's request and execution-time budgets. Never issue one search_people call per company. When a saved company group grows, start a new search with the same within_lead_group_id and exclude the existing linked people group; the save recommendation appends approved rows back to that group. Skip known people with exclude_lead_group, exclude_sequence, exclude_crm, or exclude_profiles. exclude_crm is best-effort and capped; global eligibility is checked again before enrollment. A plain persona search defaults to people located in the US (location_country='United States') when you pass no location; set location or location_country to search elsewhere. NOT for: a known person's profile → get_person_profile; company discovery → search_companies.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
title | string or string[] | no | Current job title (fuzzy) - NOT the headline. |
headline_keyword | string | no | Matches the LinkedIn headline line only (recall opt-in). |
past_title | string | no | A title held in a previous role. |
seniority | string[] | no | Closed enum - a bad value returns a named validation_error. |
function | string[] | no | Closed enum (department) - a bad value returns a named validation_error. |
current_employer | string | no | Employer name (fuzzy) - prefer current_employer_id when known. |
current_employer_domain | string or string[] | no | Validated current-employer website domain(s), exact. |
current_employer_id | string or string[] | no | company_id slug(s) for everyone-at-a-company; resolved to the provider id internally. |
past_employer | string | no | A previous employer name (fuzzy). |
industry | string | no | Employer industry (fuzzy). |
headcount_band | string[] | no | Employer size bucket, e.g. 201-500 (enum). |
location | string | no | Substring match on the person's full location (city/state/country). |
location_country | string | no | Country full name (exact) - a near-miss like USA silently returns 0. |
school | string | no | School attended (fuzzy), e.g. IIT, Stanford. |
years_experience_min | integer | no | Minimum total years of experience (gte). |
recently_changed_jobs | boolean | no | Pair with job_changed_after to bound the window. |
job_changed_after | string | no | ISO date or 90d_ago/6m_ago - current role started on/after. |
within_lead_group_id | string (slug or UUID) | no | Qualified company scaffold for company-first search. It freezes the company roster; the people destination is selected on the first save_search. |
per_company_limit | integer | no | Valid people per company, 1-10. Optional with within_lead_group_id (default 3); required to turn reviewed domains into independent scopes. |
limit | integer | no | Maximum rows for this staged turn, 1-1000. Default: 25. |
exclude_lead_group | string (slug or UUID) | no | Skip people already in this lead group - provider-side, so you don't re-fetch or re-pay for them. |
exclude_sequence | string (slug or UUID) | no | Skip people already enrolled in this sequence. |
Returns named staged rows and a durable
search_id; it does not create people or a lead group.Company-first: pass a saved company group as
within_lead_group_id, or pass every reviewedcurrent_employer_domainwithper_company_limitin one call. The search freezes its eligible roster and owns independent per-company progress. If the company group later grows, start a new search with the samewithin_lead_group_idplusexclude_lead_group=<existing people group>; the returned save recommendation appends approved rows to that same linked people group.Every durable response returns
search_version; pass that value tocontinue_search(search_id, search_version)for one bounded turn.On the first save, use
save_search(search_id, group_name=...)orsave_search(search_id, lead_group_id=...)to commit approved rows.Changing the persona, scope, or filters starts a new typed search.
Unknown named params are rejected with
validation_error(a typo'd filter must never silently broaden the search) - unlike most operations, which ignore extras.
Sample request — success
{
"title": "CEO",
"limit": 25
}Sample request — draft default
{
"title": "CEO",
"limit": 25
}Sample request — named params
{
"title": "CEO",
"location": "United States",
"limit": 25
}Sample request — company scoped
{
"within_lead_group_id": "software-companies-0013",
"title": "CEO",
"per_company_limit": 1,
"limit": 1
}