Docs / Search
search_linkedin_recruiter_people
Search candidates in Recruiter on your own seat, with each Recruiter filter as its own typed input.
This action only reads. It changes nothing, so it is safe to try.
What you give it
| Input | What it is | Where to get it |
|---|---|---|
keywordsoptional | Text. Words to search for. AND, OR and NOT may be used, e.g. developers AND product owners NOT managers. | You write it. |
localeoptional | One of: arabic, bangla, czech, danish, german, greek, english, spanish, persian, finnish, french, hindi, hungarian, indonesian, italian, hebrew, japanese, korean, marathi, malay, dutch, norwegian, punjabi, polish, portuguese, romanian, russian, swedish, telugu, thai, tagalog, turkish, ukrainian, vietnamese, chinese_simplified, chinese_traditional. The language your Recruiter is set to, when results look inconsistent. | You write it. |
savedSearchoptional | A search filter id. Run one of your saved searches; it replaces every other filter.What goes inside
| id: run lookup_search_ids with type SAVED_SEARCHES, and use matches[].id from its answer.projectId: run lookup_search_ids with type SAVED_SEARCHES, and use matches[].id from its answer. |
savedFilteroptional | A search filter id. One of your saved filters: an id from lookup_search_ids type SAVED_FILTERS, service RECRUITER. | run lookup_search_ids with type SAVED_FILTERS, and use matches[].id from its answer. |
locationoptional | A search filter id. Places. DOESNT_HAVE cannot be combined with locationWithinArea.What goes inside
| id: run lookup_search_ids with type LOCATION, and use matches[].id from its answer. |
locationWithinAreaoptional | A number. Miles around the location. | You write it. |
industryoptional | A search filter id. Industries to include and to leave out.What goes inside
| include: run lookup_search_ids with type INDUSTRY, and use matches[].id from its answer.exclude: run lookup_search_ids with type INDUSTRY, and use matches[].id from its answer. |
roleoptional | A search filter id. Job titles: each one by id or by keywords.What goes inside
| id: run lookup_search_ids with type JOB_TITLE, and use matches[].id from its answer. |
skillsoptional | A search filter id. Skills: each one by id or by keywords.What goes inside
| id: run lookup_search_ids with type SKILL, and use matches[].id from its answer. |
companyoptional | A search filter id. Companies: each one by id or by keywords.What goes inside
| id: run lookup_search_ids with type COMPANY, and use matches[].id from its answer. |
companyHeadcountoptional | A list (a group of fields). Company sizes, as LinkedIn's own bands, e.g. { min: 51, max: 200 }.What goes inside
| You write it. |
currentCompanyoptional | A search filter id. Current companies.What goes inside
| id: run lookup_search_ids with type COMPANY, and use matches[].id from its answer. |
pastCompanyoptional | A search filter id. Past companies.What goes inside
| id: run lookup_search_ids with type COMPANY, and use matches[].id from its answer. |
schooloptional | A search filter id. Schools.What goes inside
| id: run lookup_search_ids with type SCHOOL, and use matches[].id from its answer. |
degreeoptional | A search filter id. Degrees to include and to leave out.What goes inside
| include: run lookup_search_ids with type DEGREE, and use matches[].id from its answer.exclude: run lookup_search_ids with type DEGREE, and use matches[].id from its answer. |
employmentTypeoptional | A list (one of: FULL_TIME, PART_TIME, CONTRACT, INTERNSHIP). Employment types. Recruiter PRO contracts only. | You write it. |
groupsoptional | A search filter id. LinkedIn groups: ids from lookup_search_ids type GROUPS, service RECRUITER. | run lookup_search_ids with type GROUPS, and use matches[].id from its answer. |
graduationYearoptional | A group of fields. Graduation years, from and to.What goes inside
| You write it. |
tenureoptional | A group of fields. Years of experience, from and to.What goes inside
| You write it. |
tenureInCompanyoptional | A group of fields. Years in the current company, from and to.What goes inside
| You write it. |
tenureInPositionoptional | A group of fields. Years in the current position, from and to.What goes inside
| You write it. |
seniorityoptional | A group of fields. Seniority levels to include and to leave out.What goes inside
| You write it. |
functionoptional | A search filter id. Job functions: ids from lookup_search_ids type DEPARTMENT, service RECRUITER. | run lookup_search_ids with type DEPARTMENT, and use matches[].id from its answer. |
networkDistanceoptional | A list (one of: 1, 2, 3, or exactly: GROUP). Connection degrees from you (1, 2, 3) or "GROUP" for people in your groups. | You write it. |
spokenLanguagesoptional | A list (a group of fields). Spoken languages and how well. Recruiter PRO contracts only.What goes inside
| You write it. |
hidePreviouslyViewedoptional | A group of fields. Leave out people you viewed within this many days.What goes inside
| You write it. |
profileLanguageoptional | A list (text, up to 2 characters). Profile languages, as two-letter codes such as "en". | You write it. |
recentlyJoinedoptional | A list (a group of fields). Joined LinkedIn this many days ago, as LinkedIn's own bands.What goes inside
| You write it. |
spotlightsoptional | A list (one of: OPEN_TO_WORK, ACTIVE_TALENT, REDISCOVERED_CANDIDATES, INTERNAL_CANDIDATES, INTERESTED_IN_YOUR_COMPANY, HAVE_COMPANY_CONNECTIONS). Spotlights. Advanced Recruiter subscriptions only. | You write it. |
firstNameoptional | A list (text). First names. | You write it. |
lastNameoptional | A list (text). Last names. | You write it. |
hasMilitaryBackgroundoptional | True or false. Only people with a US military background. | You write it. |
pastApplicantsoptional | True or false. Only past applicants. | You write it. |
hiringProjectsoptional | A search filter id. Your hiring projects to include and to leave out.What goes inside
| include: run lookup_search_ids with type HIRING_PROJECTS, and use matches[].id from its answer.exclude: run lookup_search_ids with type HIRING_PROJECTS, and use matches[].id from its answer. |
recruitingActivityoptional | A list (a group of fields). People with, or without, this kind of activity from your team.What goes inside
| You write it. |
notesoptional | A list (text). Words in your team's notes on the person. | You write it. |
limitoptional | A number, 1 to 100. How many to return (1–100, default 10). | You write it. |
cursoroptional | A cursor. nextCursor from the previous call, to get the next page. Keep the other arguments the same. | The nextCursor from the last answer of search_linkedin_recruiter_people. |
connectionIdoptional | A connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one. | Run list_linkedin_accounts and use accounts[].id from its answer.15 more places to get it
|
Call it
curl -X POST https://api.heyreagent.com/v1/actions/search_linkedin_recruiter_people \
-H "Authorization: Bearer YOUR_KEY" \
-H "content-type: application/json" \
-d '{"keywords":"software engineer"}'The same call in JavaScript
const response = await fetch("https://api.heyreagent.com/v1/actions/search_linkedin_recruiter_people", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_KEY",
"content-type": "application/json",
},
body: JSON.stringify({
"keywords": "software engineer"
}),
});
const answer = await response.json();
console.log(answer);The same call in Python
import requests
response = requests.post(
"https://api.heyreagent.com/v1/actions/search_linkedin_recruiter_people",
headers={"Authorization": "Bearer YOUR_KEY"},
json={
"keywords": "software engineer",
},
)
print(response.json())The same call in n8n
Add an HTTP Request node and fill it in like this:
| Method | POST |
| URL | https://api.heyreagent.com/v1/actions/search_linkedin_recruiter_people |
| Send Headers | On. Name Authorization, Value Bearer YOUR_KEY |
| Send Body | On. Body Content Type JSON, Specify Body Using JSON, then paste the body below |
{
"keywords": "software engineer"
}Put your own key where it says YOUR_KEY. New here? Start with your first call.
What you get back
When it worked, the answer is { "ok": true, "result": { … } }. Inside result:
returned | number |
nextCursor | A cursor. Other actions take it. |
results[].type | PEOPLE |
results[].id | A Recruiter id. Other actions take it. |
results[].publicIdentifier | string or null |
results[].publicProfileUrl | string or null |
results[].profileUrl | string or null |
results[].profilePictureUrl | string or null |
results[].profilePictureUrlLarge | string or null |
results[].memberUrn | string or null |
results[].name | string or null |
results[].firstName | string |
results[].lastName | string |
results[].networkDistance | SELF | DISTANCE_1 | DISTANCE_2 | DISTANCE_3 | OUT_OF_NETWORK |
results[].location | string or null |
results[].industry | string or null |
results[].keywordsMatch | string |
results[].headline | string |
results[].connectionsCount | number |
results[].followersCount | number |
results[].pendingInvitation | boolean |
results[].canSendInmail | boolean |
results[].hiddenCandidate | boolean |
results[].interestLikelihood | string |
results[].recruiterCandidateId | string |
results[].recruiterPipelineCategory | string |
results[].premium | boolean |
results[].verified | boolean |
results[].sharedConnectionsCount | number |
results[].recentPostsCount | number |
results[].recentlyHired | boolean |
results[].mentionedInTheNews | boolean |
results[].interests | string |
A field that does not apply to an answer is left out, or is null. There are 82 more fields nested inside these.
An example answer
A sample from the documentation of the API underneath, put in the shape this action returns it. Lists are cut to their first entry.
{
"returned": 1,
"nextCursor": "eyJhY2NvdW50X2lkIjoiOXE3bDFVZExUZGkwcEFod2xPUEVNdyIsImxpbWl0IjozLCJzdGFydCI6MywicGFyYW1zIjp7ImFwaSI6InJlY3J1aXRlciIsImNhdGVnb3J5IjoicGVvcGxlIiwibmV0d29ya19kaXN0YW5jZSI6WzEsMiwzLCJHUk9VUCJdLCJpbmR1c3RyeSI6eyJpbmNsdWRlIjpbIjQiXX0sInJvbGUiOlt7ImtleXdvcmRzIjoiZGV2ZWxvcGVyIE9SIGVuZ2luZWVyIiwicHJpb3JpdHkiOiJNVVNUX0hBVkUiLCJzY29wZSI6IkNVUlJFTlRfT1JfUEFTVCJ9XSwic2tpbGxzIjpbeyJpZCI6IjI2MSIsInByaW9yaXR5IjoiRE9FU05UX0hBVkUifSx7ImlkIjoiNTA1MTciLCJwcmlvcml0eSI6Ik1VU1RfSEFWRSJ9XX19",
"total": 4433432,
"results": [
{
"type": "PEOPLE",
"id": "AEMAAAQMevMBKmy0KNdlNZA1bV_xR06DjBJ47bY",
"headline": "Software Engineer at LinkedIn",
"location": "New York, New York, United States",
"memberUrn": null,
"networkDistance": "OUT_OF_NETWORK",
"canSendInmail": true,
"recruiterCandidateId": "67926771",
"name": null,
"publicIdentifier": null,
"publicProfileUrl": null,
"profileUrl": null,
"profilePictureUrl": null,
"industry": null,
"currentPositions": [
{
"company": "LinkedIn",
"companyId": "1337",
"description": "Sponsored Content",
"location": null,
"role": "Software Engineer",
"start": {
"month": 4,
"year": 2019
}
}
]
}
]
}When it did not work, the answer is { "ok": false, "error": "…", "message": "…" }. What each error means.
Good to know
- At most 100 rows per call: LinkedIn's page size for this search.
- LinkedIn returns at most 2,500 rows for one search; narrow the filters to reach the rest.
- Needs a Recruiter seat on your own LinkedIn account.
- Look filter ids up with lookup_search_ids service RECRUITER: that input selects which product's list is searched.
- networkDistance in a row is defined as DISTANCE_1 / DISTANCE_2 / DISTANCE_3 (a published sample row also shows OUT_OF_NETWORK), while a profile reports FIRST_DEGREE / SECOND_DEGREE / THIRD_DEGREE for the same thing: do not compare the two as text.
- A Recruiter row often has no publicIdentifier and no profile link: its id is the only handle, and only Recruiter actions take it.
In Claude or ChatGPT
Once connected, ask in your own words. The assistant sees this action as a tool with the same name, search_linkedin_recruiter_people, and the same inputs.