Skip to main content
The Job Candidates API allows you to manage candidates that are associated with specific jobs. This includes bulk fetching job candidates and uploading resumes directly to jobs.
Understanding Job Criteria and Candidate Matching: When you upload resumes to a job or add candidates, TapTalent’s AI automatically evaluates each candidate against the job’s criterionDetails (job requirements). The AI generates a profile match score and detailed matching information based on how well candidates meet your “Must Have”, “Nice to Have”, and “Bonus” criteria. See the Job Criteria section in the Jobs API documentation for details on how to set up effective job criteria.

Bulk Fetch Job Candidates

Fetch multiple job candidates by their IDs in a single request. This returns candidates with their job-specific information including AI matching scores and evaluation status.

POST /job-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

Job Candidate Object Fields

How Profile Match Scores Work

The profileMatchScore is calculated by evaluating the candidate’s resume against the job’s criterionDetails:
  • “Must Have” criteria are weighted most heavily - candidates missing these will have significantly lower scores
  • “Nice to Have” criteria contribute to the score but won’t disqualify candidates
  • “Bonus” criteria add points for exceptional candidates but don’t penalize those without them
For example:
  • A candidate meeting all “Must Have” criteria and most “Nice to Have” criteria might score 85-95
  • A candidate missing a “Must Have” criterion might score 40-60, even if they meet other criteria
  • A candidate meeting all criteria including “Bonus” items might score 95-100

Validation Rules

  • jobCandidateIds must be provided and cannot be empty
  • jobCandidateIds must be an array
  • Maximum 100 job candidate IDs per request
  • Each job candidate ID must be a valid non-empty string or number

Error Responses

Missing jobCandidateIds:
Exceeded maximum:

Rescore Job Candidates

Rescore existing job candidates against the job’s current criteria. Use this when you have updated a job’s requirements and want to refresh profile match scores for candidates who have already applied.
  • Maximum 250 candidates per request.
  • The endpoint returns immediately. You receive a webhook when rescoring completes or fails (e.g. insufficient credits when the job runs).

POST /job-candidates/rescore

Authentication

Requires API key authentication via Authorization: Bearer YOUR_API_KEY header.

Request Body

Request Body Example

Request Body Example (by stage)

Request Body Example (specific candidates)

Example Request

Example Response (202 Accepted)

When the number of candidates accepted is limited by your credit balance, the response may include creditsAvailable.

Response Fields

Validation Rules

  • jobId is required and must belong to your company.
  • jobCandidateIds must not exceed 250 items.
  • Request fails with 402 if you have no scoring credits.

Error: Insufficient credits (402)

Webhook: job.candidates.rescored

When rescoring completes or fails, a webhook is sent to your configured URL with event job.candidates.rescored. If there are no credits at that time, the rescore is marked failed and you receive a webhook with status: "failed" and an error reason (e.g. “Insufficient scoring credits”). Payload:

After receiving the webhook

Scores are stored on each job candidate. See the API reference for endpoints to fetch candidates by rescoreId or by job/list; use the webhook payload to know when rescoring finished and which IDs were included. Example webhook payload (success):

Get candidates by rescoreId

Return candidates from a rescore with their updated scores. Use the rescoreId from the API response or webhook.

GET /job-candidates/rescore/:rescoreId/candidates

Authentication

Requires API key authentication via Authorization: Bearer YOUR_API_KEY header.

Path Parameters

Example Request

Example Response

Same structure as Bulk Fetch Job Candidates: { "status": "success", "data": [ ... ] } with updated scores. Max 250 per rescore.

Error Responses

Rescore not found (404):

Get rescore status by rescoreId

Fetch status and summary for a rescore using its rescoreId.

GET /job-candidates/rescore/:rescoreId

Authentication

Requires API key authentication via Authorization: Bearer YOUR_API_KEY header.

Path Parameters

Example Request

Example Response

The response includes only partner-facing fields (no internal IDs or timestamps).

Response Fields

Error Responses

Rescore not found (404):
(Returned when the rescoreId does not exist or belongs to another company.)

Bulk Upload Resumes to Job

Upload multiple resumes for parsing and associate them with a specific job.

POST /job-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

  • jobId must be provided and must be a valid integer
  • 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
  • The job must exist and belong to your company

Webhook Events

When you upload resumes to a job, webhook events are triggered:
  • resume.bulk_upload_parse.started: Sent when batch processing starts
  • resume.bulk_upload_parse.completed: Sent when batch processing completes
  • resume.bulk_upload_parse.failed: Sent if batch processing fails

Error Responses

Missing jobId:
Job not found:
Permission denied:
Exceeded maximum resume URLs:
Invalid URL format:

Get Candidates for a Job

Retrieve all candidates associated with a specific job with pagination, filtering, and sorting options.

GET /job-candidates/job/:jobId/candidates

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

Filtering Examples

Get candidates with high match scores:
Get candidates in a specific pipeline stage:
Get candidates with score between 70 and 90:
Get active candidates (exclude rejected):
Sort by candidate first name:

Error Responses

Job not found:
Permission denied:
Invalid perPage value:

Get Candidates by Stage Type

Retrieve all candidates in pipeline stages matching a specific stage type with pagination, filtering by job ID and date range. This endpoint finds all stages of the given type in your company’s pipelines and returns candidates from those stages.

GET /job-candidates/stage

Authentication

Requires API key authentication via Authorization: Bearer YOUR_API_KEY header.

Query Parameters

Example Request

Example Response

Each candidate in the response has candidate_details (the candidate’s profile), jobCandidateDetails (application data for the job), and onboardingFormDetails (onboarding form submissions, each with the jobId the flow is attached to).

Response Fields

Candidate Object Fields

The candidate_details object contains the candidate’s profile (from the candidate_details table):

Job Candidate Details

The jobCandidateDetails object contains everything specific to the candidate’s application to the job:

Onboarding Form Details

Each item in onboardingFormDetails (at the candidate level) represents one onboarding form submission:

Filtering Examples

Get all candidates in “APPLIED” stages:
Get candidates in “SCREENING” stages for a specific job:
Get candidates in “INTERVIEW” stages added in a date range:
Get candidates in “HIRED” stages with pagination:

Error Responses

Missing stage type:
No stages found for type: When no stages match the specified type, the API returns an empty candidates array:
Invalid perPage:

Valid Stage Types

The following stage types are valid for filtering candidates: Notes:
  • Stage types are case-insensitive and will be converted to uppercase automatically

Notes

  • Stage Type Matching: The endpoint finds all pipeline stages in your company that match the specified type (case-insensitive). Candidates from all matching stages are returned.
  • Multiple Stages: If you have multiple pipelines with stages of the same type, candidates from all those stages will be included in the results.
  • Date Filtering: The startDate and endDate filters apply to the candidate’s creation date (createdAt field in job_candidate_details). If hiredAt is provided, it takes precedence over startDate.
  • Maximum perPage: The maximum number of candidates returned per request is 100.
  • Response Structure: Each candidate has candidate_details (profile), jobCandidateDetails (application data), and onboardingFormDetails (onboarding form submissions with jobId per item).
  • Stage Ownership: Only stages from pipelines in your company are considered.

Get Candidates by Stage ID

Retrieve all candidates in a specific pipeline stage with pagination, filtering by job ID and date range. This endpoint returns complete candidate details from both the candidate_details and job_candidate_details tables.

GET /job-candidates/stage/:stageId/candidates

Authentication

Requires API key authentication via Authorization: Bearer YOUR_API_KEY header.

Path Parameters

Query Parameters

Example Request

Example Response

The response structure is identical to Get Candidates by Stage Type, with candidates from the specific stage:

Response Fields

The response structure matches Get Candidates by Stage Type. See that section for detailed field descriptions.

Filtering Examples

Get candidates in a stage for a specific job:
Get candidates added in a date range:
Get candidates with pagination:
Get candidates sorted by first name:

Error Responses

Missing stage ID:
Stage not found:
Unauthorized access:
Invalid perPage:
Job not found (when jobId filter is provided):

Custom Fields in Response

The response includes a customFields object when custom field values exist for the candidate. The format is:
Where:
  • The key is the customFieldId (as a string)
  • Each value object contains:
    • label: The display name of the custom field
    • value: The actual value (type depends on field type: string, number, date, boolean, or array)
    • parentSection: The section where the field appears in the UI

Notes

  • Maximum perPage: The maximum number of candidates returned per request is 100
  • Date Range Filtering: The startDate and endDate filters apply to the candidate’s creation date (createdAt field in job_candidate_details)
  • Response structure: Each candidate has candidate_details (profile), jobCandidateDetails (application data: stage, status, AI scores, CTC, hiring dates, etc.), and onboardingFormDetails (onboarding form submissions with jobId per item)
  • Stage Ownership: You can only access candidates in stages that belong to pipelines in your company
  • Job Filtering: When jobId is provided, only candidates associated with that specific job are returned
  • Custom Fields Format: Custom fields are fetched from the normalized customFieldValues table and include field labels and parent sections for better usability

Update Job Candidate

Update application-specific fields for a job candidate (e.g. evaluation status, notice period, CTC). Use a partial body: send only the fields you want to change. To move the candidate to another stage, use Move Candidate to Stage instead.

PATCH /job-candidates/:jobCandidateId

Authentication

Requires API key authentication via Authorization: Bearer YOUR_API_KEY header.

Path Parameters

Request Body (all optional; at least one required)

Example Request

Example Response

Error Responses

Invalid jobCandidateId:
Job candidate not found:
No fields to update:

Delete Job Candidate

Remove a candidate from a job. This deletes the job-candidate relationship; the candidate profile remains in your company and can still be associated with other jobs.

DELETE /job-candidates/:jobCandidateId

Authentication

Requires API key authentication via Authorization: Bearer YOUR_API_KEY header.

Path Parameters

Example Request

Example Response

Webhook

A candidate.removed_from_job webhook event is sent when a job candidate is deleted:

Error Responses

Invalid jobCandidateId:
Job candidate not found:

Notes

  • Only the job-candidate link is deleted; the candidate record in your company is not deleted.
  • The candidate can still appear in other jobs they are associated with.

Move Candidate to Stage

Move a candidate to a different pipeline stage within a job. This updates the candidate’s current stage in the hiring pipeline.

PUT /job-candidates/:jobCandidateId/stage

Authentication

Requires API key authentication via Authorization: Bearer YOUR_API_KEY header.

Path Parameters

Request Body

Request Body Example

Example Request

Example Response

Response Fields

Error Responses

Missing stageId:
Invalid jobCandidateId:
Job candidate not found:
Stage not found:
Unauthorized access to stage:

Notes

  • The candidate’s status will be automatically set to “IN_PROGRESS” when moved to a new stage
  • You can only move candidates to stages that belong to pipelines in your company

Use Cases

Fetching Job Candidates

Retrieve job candidates with their AI matching scores and evaluation status:
  • Display candidates for a specific job ranked by match score
  • Filter candidates by match score (e.g., show only candidates with 70+ match)
  • Review how well candidates meet your job criteria
  • Track evaluation status and hiring progress
  • Access AI-generated summaries explaining candidate fit
  • Filter by pipeline stage to see candidates at different hiring stages
  • Exclude rejected candidates to focus on active prospects

Uploading Resumes to Jobs

Upload resumes directly to jobs for parsing and candidate creation:
  • Associate resumes with specific job postings
  • Automatically create job candidates with AI evaluation
  • Receive AI matching scores based on job criteria
  • See which candidates best match your “Must Have” requirements
  • Track candidate progress through the hiring pipeline
Important for Recruiters: The quality of your criterionDetails directly impacts the accuracy of candidate matching. Well-defined, specific criteria will result in more accurate match scores and better candidate recommendations. Vague or generic criteria may lead to less reliable matching results.

Next Steps