Manage Recruiter projects & pipelines
Create hiring projects, browse candidates, and save candidates to a Recruiter pipeline.
These methods require LinkedIn Recruiter access and operate within the selected contract. Use List Available Contracts and Select a Contract when the account has multiple contracts.
Find or create a project
Use List Projects, then Get a Project to inspect a project's details. The list supports keyword, status, sorting, and offset-based pagination options.
To create a project, call Create a New Project with a name and visibility (PRIVATE or PUBLIC). Optional fields include a description and company information. Use Edit a Project for later changes; keep the returned project ID for subsequent operations.
List projects
const { data } = await linkedInApi.getRecruiterHiringProjectList({
path: {
account_id: "acc_123456789",
},
query: {
limit: 20,
offset: 0,
},
});data = linked_in_api.get_recruiter_hiring_project_list(
account_id='acc_123456789',
limit=20,
offset=0,
)curl --request GET \
--url "https://api.unipile.com/v2/acc_123456789/linkedin/recruiter/projects?limit=20&offset=0" \
--header 'X-API-KEY: YOUR_API_KEY'Create a project
const { data } = await linkedInApi.createRecruiterHiringProject({
path: {
account_id: "acc_123456789",
},
body: {
name: "Backend engineers",
visibility: "PRIVATE",
},
});data = linked_in_api.create_recruiter_hiring_project(
account_id='acc_123456789',
create_recruiter_hiring_project_request={
"name": 'Backend engineers',
"visibility": 'PRIVATE'
},
)curl --request POST \
--url "https://api.unipile.com/v2/acc_123456789/linkedin/recruiter/projects" \
--header 'X-API-KEY: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"name": "Backend engineers",
"visibility": "PRIVATE"
}'Edit a project
const { data } = await linkedInApi.editRecruiterHiringProject({
path: {
account_id: "acc_123456789",
project_id: "123456",
},
body: {
description: "Hiring for the platform team",
},
});data = linked_in_api.edit_recruiter_hiring_project(
account_id='acc_123456789',
project_id='123456',
edit_recruiter_hiring_project_request={
"description": 'Hiring for the platform team'
},
)curl --request PATCH \
--url "https://api.unipile.com/v2/acc_123456789/linkedin/recruiter/projects/123456" \
--header 'X-API-KEY: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"description": "Hiring for the platform team"
}'Browse a pipeline
Call List Pipeline Candidates with project_id. Use the request body to filter by keywords or stage_id, or to select a supported sorting option. Omit stage_id to retrieve candidates across stages. Follow the operation's pagination parameters for subsequent pages.
Use Save a Candidate to a Pipeline to add a candidate to the selected project's pipeline, with project_id in the path and candidate_id (a candidate ID or user profile ID) and stage_id in the body. Browse the pipeline again to retrieve its updated contents.
const { data } = await linkedInApi.getRecruiterPipelineCandidates({
path: {
account_id: "acc_123456789",
project_id: "123456",
},
query: {
limit: 25,
},
body: {
stage_id: "stage_id",
},
});data = linked_in_api.get_recruiter_pipeline_candidates(
account_id='acc_123456789',
project_id='123456',
limit=25,
get_recruiter_pipeline_candidates_request={
"stage_id": 'stage_id'
},
)curl --request POST \
--url "https://api.unipile.com/v2/acc_123456789/linkedin/recruiter/projects/123456/pipeline?limit=25" \
--header 'X-API-KEY: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"stage_id": "stage_id"
}'Save a candidate
const { data } = await linkedInApi.saveRecruiterCandidateToPipeline({
path: {
account_id: "acc_123456789",
project_id: "123456",
},
body: {
candidate_id: "candidate_id",
stage_id: "stage_id",
},
});data = linked_in_api.save_recruiter_candidate_to_pipeline(
account_id='acc_123456789',
project_id='123456',
save_recruiter_candidate_to_pipeline_request={
"candidate_id": 'candidate_id',
"stage_id": 'stage_id'
},
)curl --request POST \
--url "https://api.unipile.com/v2/acc_123456789/linkedin/recruiter/projects/123456/pipeline/candidate/save" \
--header 'X-API-KEY: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"candidate_id": "candidate_id",
"stage_id": "stage_id"
}'Distinguish the talent pool from the pipeline
List Talent Pool Applicants retrieves applicants from a project's talent pool. Perform People Search from a Talent Pool searches a talent pool channel and requires its channel_id. Neither is a substitute for listing saved pipeline candidates.
const { data } = await linkedInApi.getRecruiterTalentPoolApplicants({
path: {
account_id: "acc_123456789",
project_id: "123456",
},
query: {
limit: 25,
},
body: {},
});data = linked_in_api.get_recruiter_talent_pool_applicants(
account_id='acc_123456789',
project_id='123456',
limit=25,
get_recruiter_talent_pool_applicants_request={},
)curl --request POST \
--url "https://api.unipile.com/v2/acc_123456789/linkedin/recruiter/projects/123456/talent-pool/applicants?limit=25" \
--header 'X-API-KEY: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{}'Search a talent pool channel
const { data } = await linkedInApi.performRecruiterPeopleSearchFromTalentPool({
path: {
account_id: "acc_123456789",
project_id: "123456",
},
query: {
limit: 25,
},
body: {
channel_id: "channel_id",
keywords: "engineer",
},
});data = linked_in_api.perform_recruiter_people_search_from_talent_pool(
account_id='acc_123456789',
project_id='123456',
limit=25,
perform_recruiter_people_search_from_talent_pool_request={
"channel_id": 'channel_id',
"keywords": 'engineer'
},
)curl --request POST \
--url "https://api.unipile.com/v2/acc_123456789/linkedin/recruiter/projects/123456/talent-pool/search?limit=25" \
--header 'X-API-KEY: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"channel_id": "channel_id",
"keywords": "engineer"
}'Check job slots
Before planning job publication, use Get Job Slots Credits to inspect the current contract's job slot credits. Job slots belong to the selected Recruiter contract. Classic job postings and Recruiter job postings remain separate workflows.
const response = await fetch(
"https://api.unipile.com/v2/acc_123456789/linkedin/recruiter/job-slots-credits",
{
method: "GET",
headers: {
"X-API-KEY": "YOUR_API_KEY",
},
},
);
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.get(
"https://api.unipile.com/v2/acc_123456789/linkedin/recruiter/job-slots-credits",
headers={"X-API-KEY": "YOUR_API_KEY"},
timeout=30,
)
response.raise_for_status()
data = response.json()curl --request GET \
--url "https://api.unipile.com/v2/acc_123456789/linkedin/recruiter/job-slots-credits" \
--header 'X-API-KEY: YOUR_API_KEY'Updated 8 days ago