Create Candidate
Creates a new candidate (optionally associated with one or more jobs) in the API key’s company.
Overview
The create candidate endpoint allows you to add candidates to your recruitment pipeline. Candidates can optionally be associated with one or more jobs, or exist in your candidate pool without job assignments. Job association can be added at creation time or later. Candidates can be scheduled for interviews using AI agents.Use Cases
- Application Processing: Create candidates from job applications with job association
- ATS Integration: Sync candidates from external ATS systems
- Manual Entry: Add candidates discovered through other channels (career fairs, referrals)
- Candidate Pool: Build a candidate database without immediate job assignments
- Bulk Import: Import multiple candidates for a job posting or general talent pool
Job Association (Optional)
jobId field.- With Job: Associate candidate with a specific position at creation time
- Without Job: Create candidate in your talent pool and assign to jobs later via the update endpoint
- If provided, the job must exist and belong to your API key’s company
Basic Candidate Creation
With Job Association
Without Job Association (Candidate Pool)
Comprehensive Candidate Profile
resumeUrl and linkedinUrl are not built-in fields.
You can store them in the flexible metadata object for your custom use
cases.Company Scoping
Candidates are scoped to your API key’s company. When created with a job association, the job must belong to your company. Candidates created without jobs are automatically associated with your company and can only be accessed via your company’s API keys. This ensures complete data isolation between companies.Required Fields
Optional Fields
- jobId: UUID of job to associate candidate with (job must exist and belong to your company)
- email: Valid email address (required if phoneNumber not provided)
- phoneNumber: Must be in E.164 format (e.g.,
+1234567890) (required if email not provided) - metadata: Custom key-value pairs (max 10KB, max 5 levels deep, max 50 keys) for storing additional candidate information
Field Validation
The API enforces the following validation rules:- firstName/lastName: 1-100 characters (required)
- gdprExpiryDate: Must be a valid ISO 8601 date string in the future (required)
- email: Must be a valid email format (at least email or phoneNumber required)
- phoneNumber: Must start with
+and follow E.164 format (at least email or phoneNumber required) - jobId: Must be a valid UUID and reference an existing job in your company (optional)
- metadata: Maximum size of 10KB, maximum depth of 5 levels, maximum 50 keys (optional)
Response Format
The response includes bothjobId (singular) and jobIds (array) fields:
Related Resources
Candidates Resource Guide
Jobs Resource Guide
Interviews Resource Guide
API Reference
Authorizations
API key for authentication using Bearer scheme
Query Parameters
Required for ATS API keys to specify which company to access. Ignored for standard company API keys.
Body
Candidate's first name
1 - 100"John"
Candidate's last name
1 - 100"Doe"
GDPR expiry date in ISO 8601 format (must be in the future)
"2026-11-16"
Candidate's email address
"john.doe@example.com"
Candidate's phone number in E.164 format
^\+[1-9]\d{1,14}$"+421915123456"
[Deprecated - use jobIds] Optional single job ID to associate.
"123e4567-e89b-12d3-a456-426614174000"
Optional array of job IDs to associate the candidate with. If both jobId and jobIds are provided, jobIds takes precedence.
1 - 50 elementsCustom metadata for extensibility (key-value pairs, max 10KB, 5 levels deep, 50 keys)
{
"source": "LinkedIn",
"referredBy": "Jane Smith",
"tags": ["senior", "remote-preferred"],
"externalId": "CAND-12345"
}Candidate's gender. Used for gender-aware addressing in interviews. If not provided, gender is auto-detected from the candidate's name.
male, female "female"
The candidate's CV in plain text. This will be automatically anonymized.
50000"Jane Doe\nSoftware Engineer\nExperience: ..."
Response
Candidate created successfully
Candidate ID
"123e4567-e89b-12d3-a456-426614174000"
Candidate's first name
"John"
Candidate's last name
"Doe"
Candidate status
UNDEFINED, APPLIED, IN_PROCESS, REJECTED, ACCEPTED "APPLIED"
Created timestamp (UTC)
"2025-11-20T10:30:00Z"
Updated timestamp (UTC)
"2025-11-20T10:30:00Z"
[Deprecated] Single job ID; use jobIds instead.
"987e6543-e21b-12d3-a456-426614174000"
Jobs the candidate is assigned to.
50Candidate's email address
"john.doe@example.com"
Candidate's phone number
"+421915123456"
GDPR expiry date. Currently returned as a date (no time). NOTE: We plan to migrate to a timestamp with timezone (timestamptz) for global correctness.
"2026-11-16"
Overall rating/match score (0-100)
0 <= x <= 10085
Custom metadata
{
"source": "LinkedIn",
"externalId": "CAND-12345"
}Number of analyses for this candidate (for quick overview)
2
Number of interviews for this candidate (for quick overview)
3
Convenience links to related collections. Endpoints may be added incrementally.
{
"analyses": "/v1/public/candidates/123e4567-e89b-12d3-a456-426614174000/analyses",
"interviews": "/v1/public/candidates/123e4567-e89b-12d3-a456-426614174000/interviews"
}Candidate's gender. Used for gender-aware addressing in interviews. Null if not explicitly set (auto-detected from name).
male, female "female"
The candidate's anonymized CV in plain text.
"[NAME]\nSoftware Engineer\nExperience: ..."