Skip to main content
HTTPS destinations receive a signed JSON envelope; Slack and Teams destinations get a formatted chat card instead; see Slack and Teams. Register events with POST /webhooks/create/ (events array). Verify X-Praxicraft-Signature before parsing. SDK helpers. Setup overview: Webhooks.

Envelope

Every HTTPS delivery looks like this:
Header on every HTTPS delivery:
Live destinations only receive live events. Use a Test-mode destination (or ct_test_ key) while debugging.

Correlation fields

Assessment completion / pass-fail payloads include:

Assessment

assessment.started

Candidate begins a session.

assessment.completed

Candidate submitted (or timer finalized) the assessment. Scores may still be calculating. use candidate.passed / candidate.failed for scored outcomes.
external_id is omitted when not set on the invitation.

candidate.passed

Score meets or exceeds the assessment passing threshold (after grading).

candidate.failed

Same data shape as candidate.passed, with passed: false and a failing score.

candidate.violation

Proctoring signal recorded (fullscreen exit, copy/paste, screen share, webcam, or focus loss).

Invitation

invitation.created

A new assessment invitation was created (email may or may not have been sent).
enrollment_id / pipeline_enrollment_id appear only when the invite was created through a pipeline enrollment.

invitation.expired

Pending invitation expired before the candidate started.

Pipeline

Shared enrollment fields (pipeline.enrolled, pipeline.completed, pipeline.rejected, pipeline.held, pipeline.unheld):

pipeline.enrolled

pipeline.advanced

Enrollment moved to a later stage. Includes from_stage, to_stage, and next_stage_type.

pipeline.completed

Enrollment status became passed.

pipeline.rejected

pipeline.held / pipeline.unheld

Same shared enrollment fields. On hold, status is on_hold. After unhold, status returns to active (or another terminal status if catch-up applied).

Interview

Shared interview room fields:

interview.scheduled

interview.started

Same shape; status reflects in-progress, started_at set.

interview.completed

Same shape; ended_at set after a normal finish.

interview.cancelled

Same shape; room cancelled by recruiter or API.

interview.no_show

Same shape; interview expired without completion.

interview.analysis_ready

Room fields plus analysis summary:

Jobs

Shared job fields:

job.created / job.published / job.closed

Applications

Shared application fields (plus event-specific extras):

application.submitted

Emitted when an application is accepted (careers or Public API create).

application.knockout_failed

L1 knockout failed. Same shared fields; status reflects knockout failure.

application.screened

L2/L3 finished (optional L4 brief). Nested screening summary:

application.held / application.unheld

Hold pauses recruiter auto-advance for that application. Shared application fields; status becomes on_hold when held.

application.advanced / application.rejected / application.withdrawn

Advance / reject / withdraw. application.rejected may include reject_reason.

Candidate CRM

These events are for org candidate profiles (profiles:*), not assessment pass/fail.

candidate.updated

candidate.note_added

Same profile fields plus note metadata when a note is created.

candidate.merged

Fired when a duplicate profile is merged into a survivor. Payload includes survivor identity (and merge extras when present).

System

webhook.test

Connectivity ping from POST /webhooks/{id}/test/ (or health probes).
HTTP 2xx on this ping sets is_verified and activates the destination.

Quick reference

Next

Webhooks setup · Jobs & applications · Screening · Verify signatures · Connect ATS via webhooks
Last modified on September 5, 2026