The Candidates API allows you to add candidates, bulk upload resumes, retrieve parsed candidate information, list candidates with filters, and fetch individual candidate details.
Add Candidate
Create a new candidate in your company. If a candidate with the same email already exists, the existing candidate will be returned along with a flag indicating it’s an existing candidate.
POST /candidates
Authentication
Requires API key authentication via Authorization: Bearer YOUR_API_KEY header.
Request Body
Request Body Example
Example Request
Example Response
Response Fields
Candidate Object Fields
The candidate object includes all standard candidate fields with flattened structure (miscellaneous fields are extracted to the top level):
- Basic info:
id, firstName, lastName, email, phone
- Professional info:
currentJobTitle, currentCompany, city, country, skills
- Resume:
resume (URL)
- Extended info:
majors, summary, languages, educations, workExperiences, projectExperiences, certifications
- Social:
githubUrl, linkedin
- Additional:
coverLetter, gender, dateOfBirth, nationality, industry, category
Notes
- Duplicate Email Handling: If a candidate with the same email already exists, the existing candidate will be returned with
isExisting: true
- Job Association: If
jobId is provided:
- The candidate will be associated with that job and
jobCandidateId will be returned
- Resume scoring will be automatically enabled
- If the candidate is already in the job, in response,
isAlreadyInJob will be true
- Resume Parsing:
- By default (
shouldParseResume: true), if a resume URL is provided, it will be downloaded, stored, and parsed asynchronously
- Webhook events will be sent when parsing completes or fails
- Resume Scoring:
- Automatically enabled when
jobId is provided
- If
shouldParseResume is false and jobId is provided, you must include city, country, educations, and workExperiences for scoring to work.
- Skills Format: Skills can be provided as an array or comma-separated string.
- Response Structure: All miscellaneous fields (educations, workExperiences, etc.) are flattened to the top level in the response
- Validation: All fields are validated using schema. Invalid requests will return detailed error messages with field-specific errors
Webhook Events
When you add a candidate with a resume URL, webhook events are triggered for resume parsing:
-
resume.single_parse.completed: Sent when the resume parsing completes successfully
-
resume.single_parse.failed: Sent when the resume parsing fails
When you add a candidate without resume but with a jobId, webhook events are triggered for scoring:
-
job.candidate.score.completed: Sent when AI scoring is completed for a candidate’s application to a job
-
job.candidate.score.failed: Sent when AI scoring fails for a candidate’s application to a job
Error Responses
Missing firstName:
Missing lastName:
Missing email:
Invalid request (validation errors):
Insufficient credits for resume parsing:
Insufficient credits for resume scoring:
Missing scoring fields (when scoring without parsing):
Object Schemas
Education Object
Work Experience Object
Project Experience Object
Certification Object
List Candidates
Retrieve a paginated list of candidates in your company with advanced filtering options.
GET /candidates/list
Authentication
Requires API key authentication via Authorization: Bearer YOUR_API_KEY header.
Query Parameters
createdAtMin / createdAtMax filter on when the candidate record was created in TapTalent.appliedAtMin / appliedAtMax filter on when the candidate applied or was added to a job. Candidates match if they have at least one application in that range. When includeJobApplicationDetails=true, the response returns their current job applications (not only the in-range application).
Example Request
Basic list with skills and title filters:
Filter by candidate created date range:
Filter by job application date range and include job application details:
Combine job filter, applied date range, and job application details:
Example Response
jobCandidateDetails is only present when includeJobApplicationDetails=true.
Response Fields
Candidate Object Fields
The candidate objects include all standard candidate fields:
- Basic info:
id, firstName, lastName, email, phone
- Professional info:
currentJobTitle, currentCompany, city, country, skills
- Resume:
resume (URL)
- Extended info:
majors, summary, languages, educations, workExperiences, projectExperiences, certifications
- Social:
githubUrl, linkedin
- Timestamps:
createdAt, updatedAt
- Optional (when
includeJobApplicationDetails=true): jobCandidateDetails
jobCandidateDetails Object Fields
Returned only when includeJobApplicationDetails=true.
Error Responses
Invalid perPage value:
Invalid date:
Invalid date range (min after max):
Get Candidate Details
Retrieve detailed information about a specific candidate, including their associated jobs.
GET /candidates/:candidateId
Authentication
Requires API key authentication via Authorization: Bearer YOUR_API_KEY header.
Path Parameters
Example Request
Example Response
Response Fields
The response includes all candidate fields with flattened structure (miscellaneous fields are extracted to the top level):
Error Responses
Missing candidateId:
Candidate not found:
Update Candidate
Update a candidate’s profile. This is a partial update: send only the fields you want to change. All request body fields are optional, but at least one must be provided.
PATCH /candidates/:candidateId
Authentication
Requires API key authentication via Authorization: Bearer YOUR_API_KEY header.
Path Parameters
Request Body (all optional; at least one required)
Same fields as Add Candidate are supported, except jobId and shouldParseResume. Include only the fields you want to update.
Example Request
Example Response
Notes
- Partial update: Only included fields are updated; others are left unchanged.
- Email uniqueness: If you change
email, it must not already exist for another candidate in your company.
- Resume: Updating resume URL is not supported via this endpoint.
Error Responses
Invalid candidateId:
Candidate not found:
Duplicate email:
Validation errors:
Bulk Upload Resumes
Upload multiple resumes for parsing and candidate creation.
POST /candidates/bulk/resume
Authentication
Requires API key authentication via Authorization: Bearer YOUR_API_KEY header.
Request Body
Request Body Example
Example Request
Example Response
Response Fields
Validation Rules
resumeURLs must be provided and cannot be empty
resumeURLs must be an array
- Each URL must be a non-empty string (whitespace-only strings are invalid)
- URLs must be publicly accessible
- Maximum 5,000 resume URLs per request
Webhook Events
When you upload resumes, webhook events are triggered:
-
resume.bulk_upload_parse.started: Sent when batch processing starts
-
resume.bulk_upload_parse.completed: Sent when batch processing completes
Note: If there are insufficient credits, the error and errorCode fields will be populated:
-
resume.bulk_upload_parse.failed: Sent if batch processing fails
Error Responses
Missing resumeURLs:
Invalid resumeURLs format:
Exceeded maximum resume URLs:
Invalid URL format (non-empty string validation):
Empty resumeURLs array:
Company not found:
Subscription not active:
Get Batch Candidates
Retrieve parsed candidates from a batch with pagination.
GET /candidates/batch/:batchId
Authentication
Requires API key authentication via Authorization: Bearer YOUR_API_KEY header.
Path Parameters
Query Parameters
Example Request
Example Response
Response Fields
Candidate Object Fields
Error Responses
Invalid batchId:
Batch not found:
Unauthorized access:
Invalid perPage value:
Use Cases
Candidate Search and Filtering
Use the list endpoint to search and filter candidates:
- Search by Skills: Filter candidates by specific skills (e.g.,
skills=javascript,react,node.js)
- Filter by Job: Find candidates associated with specific jobs (
jobIds=12345,12346)
- Filter by Stage: Get candidates in specific pipeline stages (
stageIds=789,790)
- Search by Contact Info: Find candidates by email or phone (
candidateEmail=john@example.com)
- Filter by Current Role: Find candidates with specific job titles or companies (
currentJobTitle=Software Engineer)
- Filter by Created Date: Find candidates created in the system in a date range (
createdAtMin / createdAtMax)
- Filter by Application Date: Find candidates who applied to a job in a date range (
appliedAtMin / appliedAtMax)
- Include Job Applications: Return current job application details with
includeJobApplicationDetails=true
Candidate Detail Retrieval
Get comprehensive candidate information:
- Retrieve full candidate profile including work experience, education, and certifications
- Access candidate’s resume and cover letter
- View candidate’s social profiles (LinkedIn, GitHub)
- Get complete candidate history and details
Bulk Candidate Ingestion
Upload multiple resumes at once to quickly build your candidate database:
- Collect resume URLs from your ATS or other sources
- Upload them in batches (up to 5,000 per batch)
- Receive webhook notifications when processing starts/completes
- Retrieve parsed candidates using the batch ID
Resume Parsing Pipeline
Integrate TapTalent’s resume parsing into your workflow:
- Upload resumes as they come in
- Receive real-time webhook notifications
- Retrieve parsed candidate data programmatically
- Sync with your internal systems
Best Practices
Filtering and Search
- Use Specific Filters: Combine multiple filters for precise results (e.g.,
skills + currentJobTitle)
- Pagination: Use appropriate
perPage values (10, 20, 40, 80, or 100) based on your needs
- Search Terms: Use
searchTerm for broad text searches across multiple fields
- Comma-Separated Lists: For array filters (
jobIds, stageIds, skills, groupIds), use comma-separated values
- Case Sensitivity: Skill searches are case-insensitive, but other text filters may be case-sensitive
- Date Ranges: Use ISO 8601 datetimes for
createdAtMin/createdAtMax and appliedAtMin/appliedAtMax; ensure min ≤ max
- Job Application Details: Only request
includeJobApplicationDetails=true when you need application/job context — responses are larger
Candidate Details
- Cache Results: Cache candidate details to reduce API calls for frequently accessed candidates
- Error Handling: Always handle 404 errors for candidates that may have been deleted
- Field Access: All miscellaneous fields (educations, workExperiences, etc.) are flattened to the top level
Batch Size
- You can upload up to 5,000 resume URLs in a single request
- For very large uploads (1,000+ resumes), consider splitting into multiple requests to better track progress
- Use batches of 50-500 resumes for optimal balance between speed and tracking
Error Handling
- Handle webhook events for batch status updates
- Implement retry logic for failed uploads
- Monitor batch status and handle failures gracefully
- Use appropriate
perPage values (10, 20, 40, 80, or 100)
- Check
hasNextPage to determine if more data is available
- Implement pagination loops to retrieve all candidates
- Note that list endpoint uses 0-indexed pages (
pageNumber=0 for first page)
Webhook Integration
- Set up webhook URL to receive batch status updates
- Handle both success and failure webhook events
- Use webhooks to trigger downstream processing
Bulk Fetch Candidates
Fetch multiple candidates by their IDs in a single request.
POST /candidates/bulk-fetch
Authentication
Requires API key authentication via Authorization: Bearer YOUR_API_KEY header.
Request Body
Request Body Example
Example Request
Example Response
Response Fields
Validation Rules
candidateIds must be provided and cannot be empty
candidateIds must be an array
- Maximum 100 candidate IDs per request
- Each candidate ID must be a valid non-empty string or number
Error Responses
Missing candidateIds:
Invalid candidateIds format:
Exceeded maximum:
Next Steps