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:
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).
is_verified and activates the destination.