Recruiter
Requires the Recruiter add-on. These commands call Recruiter-specific endpoints on the account. If the account does not have the add-on active, the platform returns a
TIER_NOT_ACTIVEerror (exit 5). The CLI does not pre-check — the error comes back from the API on the first call.
The recruiter commands are a project-centric rebuild in 0.15.0: messaging, profile lookup, people search, hiring-project management, pipeline tracking, project-scoped job postings, talent-pool search, candidate saving, and applicant/résumé lookup all key off a Recruiter project (a hiring project — proj_…), not a bare job id. All commands are account-scoped and require --account.
Changed in 0.15.0:
recruiter sync,recruiter add-applicant,recruiter reject-applicant, andrecruiter job checkpointare removed with no replacement.recruiter add-candidateis replaced byrecruiter save-candidate <project_id> --stage-id <id> --candidate-id <id>(full body reshape).recruiter job applicantsis replaced by the project-scopedrecruiter applicants <project_id> --channel-id <id>. Applicant detail/résumé (recruiter applicant) is now project-scoped:<project_id> <applicant_id>, not a bare applicant id.recruiter message newis now a JSON-only request (attachments ride as base64, no multipart) and requires--subjectand--signature. New:recruiter search <url>,recruiter projects,recruiter project(get/update),recruiter pipeline,recruiter project-job(get/create/budget/update),recruiter talent-search,recruiter job close.
recruiter message new
Start a new Recruiter conversation. --to takes a verbatim provider ID (AE… format) — it is not resolved via URL or slug normalization. --subject and --signature are both required. --voice and --video are unique to Recruiter and Sales Navigator messaging (max 7 MiB each).
# Start a new Recruiter conversation (write, --preview accepted)
curviate recruiter message new \
--to <recruiter_provider_id> \
--subject "<subject>" \
--signature "<sender signature>" \
"<message text>" \
[--attach <file>…] \
[--voice <audio-file>] \
[--video <video-file>] \
--account <account_id>recruiter profile
The <identifier> argument accepts a LinkedIn profile URL, a public slug, or a native id — the CLI normalizes automatically.
# Get a Recruiter profile (read)
curviate recruiter profile <identifier> --account <account_id>recruiter search
# Run a pasted Recruiter search, talent-pool, or applicant URL directly (POST, paginated)
curviate recruiter search "<url>" [--limit <n>] [--cursor <token>] [--all] [--max-pages <n>] --account <account_id># Search Recruiter members (POST, paginated)
# Named flags: --keywords, --locale, --employment-type, --function, --profile-language
# Escape hatch: --filters '<json>' | --filters-file <path> | --filters -
curviate recruiter search people \
[--keywords <k>] \
[--locale <code>] \
[--employment-type <ids>] \
[--function <ids>] \
[--profile-language <codes>] \
[--filters '<json>'] \
[--filters-file <path>] \
[--limit <n>] [--cursor <token>] [--all] [--max-pages <n>] \
--account <account_id>For the full Recruiter filter surface, pass a JSON body via --filters. See the API reference for the complete filter field set. Named flags merge over the --filters base body. There is no recruiter search companies command.
# Resolve Recruiter filter parameter IDs (POST — source-scoped)
# --source: APPLICANTS | PIPELINE (both require --project-id) | SEARCH | JOB_POSTING | JOBS
# --type's valid set depends on --source (e.g. SKILL/LOCATION/JOB_TITLE for APPLICANTS, CONTRACT/SEAT/LOCATION for JOBS)
curviate recruiter search parameters \
--source <SOURCE> \
--type <TYPE> \
[--keywords <k>] \
[--project-id <project_id>] \
[--stage-id <stage_id>] \
--account <account_id>--project-id is required when --source is APPLICANTS or PIPELINE. --stage-id is only meaningful with --source PIPELINE.
recruiter projects and project
# List Recruiter hiring projects (paginated read)
curviate recruiter projects [--limit <n>] [--cursor <token>] [--all] [--max-pages <n>] --account <account_id># Get a single hiring project by ID (read)
curviate recruiter project <project_id> --account <account_id># Edit a hiring project's config (write, --preview accepted). All fields optional — omitted fields are left unchanged.
curviate recruiter project update <project_id> \
[--name <name>] \
[--visibility <PRIVATE|PUBLIC>] \
[--description <text>] \
[--company-id <id>|--company-name <name>] \
[--job-title-id <id>|--job-title <name>] \
[--location <location_parameter_id>] \
[--seniority-level <INTERNSHIP|ENTRY_LEVEL|ASSOCIATE|MID_SENIOR_LEVEL|DIRECTOR|EXECUTIVE|NOT_APPLICABLE>] \
--account <account_id>recruiter pipeline
List the candidates in a project's pipeline.
# List candidates in a project's pipeline (paginated read, POST-as-list)
# --sort-by: LAST_MODIFIED | ALPHABETICAL
# --spotlights: comma-separated — OPEN_TO_WORK, ACTIVE_TALENT, MISSED_CANDIDATES
curviate recruiter pipeline <project_id> \
[--keywords <k>] \
[--stage-id <stage_id>] \
[--sort-by <LAST_MODIFIED|ALPHABETICAL>] \
[--spotlights <tags>] \
[--limit <n>] [--cursor <token>] [--all] [--max-pages <n>] \
--account <account_id>recruiter project-job
The job posting attached to a hiring project — at most one per project. This is distinct from recruiter job below, which operates outside any specific project (creating one, or reading any public posting).
# Get the single job posting attached to a project (read; 404 when none is attached)
curviate recruiter project-job get <project_id> --account <account_id># Create a job-posting draft attached to an existing project (write, --preview accepted)
# Same body-flag set as `recruiter job create` below, minus --project-name
curviate recruiter project-job create <project_id> \
--job-title <title>|--job-title-id <id> \
--company-id <id>|--company-name <name> \
--workplace-type <ON_SITE|HYBRID|REMOTE> \
--location <location_parameter_id> \
--employment-status <FULL_TIME|PART_TIME|CONTRACT|TEMPORARY|OTHER|VOLUNTEER|INTERNSHIP> \
--seniority-level <level> \
--description "<full job description, min 200 chars>" \
--apply-method <linkedin|external> \
[--industry <ids, 1-3>] \
[--job-function <ids, 1-3>] \
[--notification-email <email>] \
[--website-url <url>] \
--account <account_id>
# Or supply the full body as JSON, optionally overriding scalar fields
curviate recruiter project-job create <project_id> --body-file job.json --account <account_id>
cat job.json | curviate recruiter project-job create <project_id> --body - --account <account_id># Get pricing to publish a project's job posting (read)
curviate recruiter project-job budget <project_id> <job_id> --account <account_id># Apply a partial update to a project's job posting (write, --preview accepted)
# Same flag set as project-job create — every flag optional
curviate recruiter project-job update <project_id> <job_id> [--job-title <t>] [--description <d>] […] --account <account_id>recruiter talent-search
Search a project's talent pool. --channel-id (the project's RECRUITER_SEARCH talent-pool channel ID) is required.
# Search a project's talent pool (paginated read)
curviate recruiter talent-search <project_id> --channel-id <channel_id> [--keywords <k>] [--filters '<json>'] [--filters-file <path>] [--limit <n>] [--cursor <token>] [--all] [--max-pages <n>] --account <account_id>recruiter save-candidate
Save a candidate to a project's pipeline at a given stage. Replaces the pre-0.15.0 recruiter add-candidate.
# Save a candidate into a project's pipeline (write, bodyless-style, --preview accepted)
curviate recruiter save-candidate <project_id> --stage-id <stage_id> --candidate-id <candidate_id> --account <account_id>recruiter applicants and applicant
recruiter applicants lists applicants in a project's talent pool — project-scoped, not job-scoped. --channel-id (the project's JOB_POSTING talent-pool channel ID) is required.
# List applicants in a project's talent pool (paginated read)
curviate recruiter applicants <project_id> --channel-id <channel_id> [--limit <n>] [--cursor <token>] [--all] [--max-pages <n>] --account <account_id># Get a single applicant by ID (read, project-scoped)
curviate recruiter applicant <project_id> <applicant_id> --account <account_id># Download an applicant's résumé as binary (--preview not accepted)
# -o writes the bytes to a file; omit to stream to stdout
curviate recruiter applicant resume <project_id> <applicant_id> [-o <output-file>] --account <account_id>recruiter jobs and job
recruiter jobs lists your Recruiter job postings across projects. recruiter job operates outside any specific project — create opens a brand-new hiring project for the job; get reads any public posting via the Recruiter lens (not only your own); publish and close are project-scoped (they take both <project_id> and <job_id>).
# List Recruiter job postings (paginated read)
curviate recruiter jobs [--limit <n>] [--cursor <token>] [--all] [--max-pages <n>] --account <account_id># Create a Recruiter job-posting draft, opening a brand-new hiring project (write, --preview accepted)
# --project-name is required; same body flags as `recruiter project-job create`
curviate recruiter job create \
--project-name "<hiring project name>" \
--job-title <title>|--job-title-id <id> \
--company-id <id>|--company-name <name> \
--workplace-type <ON_SITE|HYBRID|REMOTE> \
--location <location_parameter_id> \
--employment-status <FULL_TIME|PART_TIME|CONTRACT|TEMPORARY|OTHER|VOLUNTEER|INTERNSHIP> \
--seniority-level <level> \
--description "<full job description, min 200 chars>" \
--apply-method <linkedin|external> \
[--industry <ids, 1-3>] \
[--job-function <ids, 1-3>] \
[--notification-email <email>] \
[--website-url <url>] \
--account <account_id># Get a job posting via the Recruiter lens — any public posting, not only your own (read)
curviate recruiter job get <job_id> --account <account_id># Publish a project's job-posting draft (write, --preview accepted)
# --mode is required; PROMOTED/PROMOTED_PLUS spend real money and require the full --budget-* triple
curviate recruiter job publish <project_id> <job_id> --mode <FREE|PROMOTED|PROMOTED_PLUS> [--budget-currency <ISO-4217>] [--budget-amount <n>] [--budget-scope <DAILY|TOTAL>] --account <account_id># Stop a project's job posting from accepting applications (write, bodyless, --preview accepted)
# Irreversible once the posting is LISTED
curviate recruiter job close <project_id> <job_id> --account <account_id>Examples
Search for Recruiter candidates
curviate recruiter search people \
--keywords "machine learning" \
--employment-type FULL_TIME \
--account acc_YOUR_ACCOUNT_IDCreate a hiring project and its job in one step
curviate recruiter job create \
--project-name "Senior ML Engineer Hire" \
--job-title "Senior ML Engineer" \
--company-id 1234567 \
--workplace-type REMOTE \
--location 106967730 \
--employment-status FULL_TIME \
--seniority-level MID_SENIOR_LEVEL \
--description "We're looking for a Senior ML Engineer to join our platform team..." \
--apply-method linkedin \
--notification-email hiring@acme.com \
--account acc_YOUR_ACCOUNT_ID
# => { "object": "recruiter_job_posting_created", "project_id": "proj_YOUR_PROJECT_ID", "job_id": "job_YOUR_JOB_ID" }Publish the project's job
curviate recruiter job publish proj_YOUR_PROJECT_ID job_YOUR_JOB_ID --mode FREE --account acc_YOUR_ACCOUNT_IDSave a candidate to the pipeline
curviate recruiter save-candidate proj_YOUR_PROJECT_ID \
--stage-id stage_UNCONTACTED \
--candidate-id RECRUITER_USER_ID \
--account acc_YOUR_ACCOUNT_IDList and browse the pipeline
curviate recruiter pipeline proj_YOUR_PROJECT_ID --sort-by LAST_MODIFIED --account acc_YOUR_ACCOUNT_IDList applicants and download a résumé
curviate recruiter applicants proj_YOUR_PROJECT_ID --channel-id ch_YOUR_CHANNEL_ID --account acc_YOUR_ACCOUNT_ID
curviate recruiter applicant resume proj_YOUR_PROJECT_ID app_YOUR_APPLICANT_ID -o resume.pdf --account acc_YOUR_ACCOUNT_IDSend a Recruiter message with a video
curviate recruiter message new \
--to RECRUITER_PROVIDER_ID \
--subject "Quick intro" \
--signature "Alex, Talent Team" \
"Hi, I wanted to share a quick video introduction." \
--video ./intro.mp4 \
--account acc_YOUR_ACCOUNT_ID