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'

Did this page help you?