Skip to main content
TapTalent sends webhook events for various operations. All webhook payloads follow a consistent structure.

Payload structure

Every webhook body looks like:

Headers

All webhook requests include:
  • Content-Type: application/json
  • X-Webhook-Event: The event type (e.g. resume.bulk_upload_parse.started)
  • X-Webhook-Timestamp: ISO 8601 timestamp of when the event occurred
  • X-Webhook-Key: Your webhook verification secret. When you have generated a webhook key in the dashboard, TapTalent sends it in this header. Compare it to your stored key to verify the request came from TapTalent. If no key has been set, the header may be empty.

Resume events

resume.bulk_upload_parse.started

Triggered when a bulk resume upload batch starts processing.

resume.bulk_upload_parse.completed

Triggered when a bulk resume upload batch completes processing.

resume.bulk_upload_parse.failed

Triggered when a bulk resume upload batch fails before processing begins (e.g. validation errors, invalid URLs).

Job events (recruiter actions)

job.created

Triggered when a recruiter creates a new job from the dashboard.

job.updated

Triggered when a recruiter updates a job’s basic details (e.g. title, description, location) from the dashboard. Does not fire when only the job status is changed.

job.status_changed

Triggered when a recruiter changes a job’s status (e.g. Draft → Active, Active → Inactive/Closed).

Candidate events (recruiter actions)

candidate.added_to_job

Triggered when a recruiter adds one or more candidates to a job (e.g. from company list, AI search, or moving from another job).

candidate.stage_changed

Triggered when a recruiter moves one or more candidates to a different pipeline stage (e.g. kanban drag-and-drop).

candidate.hired

Triggered when a recruiter moves one or more candidates to the Hired stage.

candidate.rejected

Triggered when a recruiter rejects or disqualifies one or more candidates, or when an automated screening flow disqualifies a candidate.

candidate.removed_from_job

Triggered when one or more candidates are removed from a job. This is sent when:
  • A recruiter uses the bulk “Remove from job” / “Delete” action on candidates in that job (move-job-candidates with delete), or
  • A recruiter deletes one or more candidates from the company (DELETE /candidates), in which case one event is sent per job those candidates were in.

candidate.updated

Triggered when a recruiter updates a candidate’s profile or job-application details from the dashboard.
  • Profile (scope: "profile"): Company-level profile (e.g. name, email, phone, resume, skills) via Update company candidate details or Update job candidate details (email/phone).
  • Application (scope: "application"): Application for a specific job (e.g. expected CTC, notice period, hired date) via Update job candidate application.
Profile update example:
Application update example (includes jobCandidateId and jobId):

Job candidate scoring events

job.candidate.score.completed

Triggered when AI scoring is completed for a candidate’s application to a job. This event is sent after the candidate’s resume has been analyzed and matched against the job requirements, and a score has been calculated.

job.candidate.score.failed

Triggered when AI scoring fails for a candidate’s application to a job. This event is sent when the scoring process encounters an error (e.g. insufficient candidate data, processing error, or service unavailability).

Assessment events

assessment.ready

Triggered when questions have been generated for an assessment (e.g. after Auto-Generate Assessment or Generate Questions). You can then fetch the assessment or invite candidates.

interview.started

Triggered when a candidate has started an assessment interview (e.g. opened the interview and it has begun). Use this to track when invited candidates begin their assessment.

interview.scoring_completed

Triggered when scoring has finished for an interview submission. Use this to sync results to your system or notify recruiters.

interview.ended

Triggered when a candidate has finished or left the interview (e.g. completed all questions, timed out, or ended the session). Use this to track completion and optionally wait for interview.scoring_completed for the final score.

interview.error

Triggered when an error occurs during the interview flow (e.g. failed to start, scoring failure, or permission issues). Use this to monitor failures and alert or retry as needed.

interview.complete_later

Triggered when a candidate clicks “Complete later (not recommended)” on the pre-interview setup screen. The candidate has chosen to save their link and finish the assessment later instead of starting now.

More event types may be added in future releases. Check this page for updates.