Candidates

Create and update candidates with the same fields as Dashboard → Candidates → Edit. POST deduplicates by email ( 201 new, 200 existing). Numbers use JSON number type; booleans use true / false.

List query parameters (GET)

GET /api/v1/candidates
FieldTypeRequiredDescription
searchstringNoName or email
job_idstring (uuid)NoOnly candidates linked to this job (candidate_jobs)
limitintegerNoPage size (1–100, default 50)
offsetintegerNoSkip N records (default 0)

Request body (POST / PUT)

Candidate object
FieldTypeRequiredDescription
full_namestringPOSTCandidate full name
emailstringPOSTUnique per organization
phone_numberstring | nullNoPhone number
whatsapp_numberstring | nullNoWhatsApp number
locationstring | nullNoCurrent location
preferred_locationstring | nullNoPreferred work location
primary_skillsstring[]NoPrimary skill tags
secondary_skillsstring[]NoSecondary skill tags
total_experience_yearsnumber | nullNoTotal experience (decimal years)
current_companystring | nullNoCurrent employer
current_designationstring | nullNoCurrent job title
current_ctcnumber | nullNoCurrent CTC in LPA
expected_ctcnumber | nullNoExpected CTC in LPA
notice_period_daysinteger | nullNoNotice period (days)
in_notice_periodboolean | nullNoCurrently serving notice
last_working_daystring (YYYY-MM-DD)NoLast working day if in notice
resume_urlstring | nullNoPublic resume URL
resume_pathstring | nullNoInternal resume storage path (create)
sourcestringNoSource label (default api)
metadataobjectNoCustom JSON (e.g. ATS id)
applicationobjectNoApply candidate to a job (nested fields)
application.job_idstring (uuid)If applicationTarget job id
application.statusstringNoPipeline status (must match org settings; default Applied)
application.notesstring | nullNoApplication notes

Response body

Candidate resource (data)
FieldTypeRequiredDescription
idstring (uuid)Candidate id
full_namestringFull name
emailstringEmail (may be empty when talent pool masked)
phone_numberstring | nullPhone
whatsapp_numberstring | nullWhatsApp
locationstring | nullCurrent location
preferred_locationstring | nullPreferred location
primary_skillsstring[]Primary skills
secondary_skillsstring[]Secondary skills
skill_arraystring[]Combined skill list
total_experience_yearsnumber | nullExperience years
current_companystring | nullCurrent company
current_designationstring | nullCurrent designation
current_ctcnumber | nullCurrent CTC (LPA); null if masked
expected_ctcnumber | nullExpected CTC (LPA); null if masked
notice_period_daysinteger | nullNotice period days
in_notice_periodboolean | nullIn notice period
last_working_daystring (YYYY-MM-DD)Last working day
resume_urlstring | nullResume URL (resume_text never returned)
sourcestring | nullCandidate source
screening_scorenumber | nullAggregate screening score
talent_pool_status"not_linked" | "masked" | "revealed"Talent pool reveal state
metadataobject | nullCustom metadata
created_atstring (ISO 8601 date-time)Created timestamp
updated_atstring (ISO 8601 date-time)Updated timestamp
applications[] item (GET /api/v1/candidates/{id} only)
FieldTypeRequiredDescription
idstring (uuid)candidate_jobs row id
candidate_idstring (uuid)Candidate id
job_idstring (uuid)Job id
organization_idstring (uuid)Organization id
statusstringPipeline status for this job
screening_scorenumber | nullScreening score
match_scorenumber | nullMatch score
notesstring | nullRecruiter notes
shortlisted_atstring (ISO 8601 date-time)When shortlisted
screening_started_atstring (ISO 8601 date-time)Screening started
screening_completed_atstring (ISO 8601 date-time)Screening completed
status_datestring (ISO 8601 date-time)Entered current status
outreach_sent_atstring (ISO 8601 date-time)Outreach email sent
interest_clicked_atstring (ISO 8601 date-time)Interest page click
video_interview_invite_sent_atstring (ISO 8601 date-time)Video invite sent
metadataobject | nullApplication metadata
created_atstring (ISO 8601 date-time)Created
updated_atstring (ISO 8601 date-time)Updated
List meta object
FieldTypeRequiredDescription
meta.totalintegerTotal matching records
meta.limitintegerPage size used
meta.offsetintegerOffset used

Talent pool: talent_pool_status may be masked; contact and CTC fields can be empty until revealed. Updating locked fields returns talent_pool_reveal_required (403).

GET/api/v1/candidates

List candidates.

GET/api/v1/candidates/{id}

Get candidate with applications[].

POST/api/v1/candidates

Create or match by email.

Example
{
  "full_name": "Jane Doe",
  "email": "[email protected]",
  "phone_number": "+91 90000 12345",
  "whatsapp_number": "+91 90000 12345",
  "location": "Bangalore",
  "preferred_location": "Remote",
  "primary_skills": ["React", "TypeScript"],
  "secondary_skills": ["Docker"],
  "total_experience_years": 6,
  "current_company": "Acme Inc",
  "current_designation": "Senior Engineer",
  "current_ctc": 18,
  "expected_ctc": 24,
  "notice_period_days": 30,
  "in_notice_period": false,
  "resume_url": "https://example.com/resume.pdf",
  "metadata": { "external_id": "ATS-9912" },
  "application": {
    "job_id": "550e8400-e29b-41d4-a716-446655440000",
    "status": "Applied",
    "notes": "Imported from ATS"
  }
}
Apply to job only (PUT)
{
  "application": {
    "job_id": "550e8400-e29b-41d4-a716-446655440000",
    "status": "shortlisted",
    "notes": "Strong React background"
  }
}
PUT/api/v1/candidates/{id}

Partial update.