Webhooks
Results come to you.
Register a URL with POST /v1/webhooks and pick events, or "*" for all of them. Every delivery is signed with your secret and retried if your server doesn't answer.
Sessions
- session.started
- session.ended
Website visitors
- lead.captured
- booking.requested
- handoff.requested
Voices and knowledge
- voice.clone.completed
- knowledge.document.processed
- knowledge.document.failed
Results
- report.produced
- assessment.completed
Hiring (ids and statuses only)
- candidate.invited
- candidate.screened
- candidate.interview_booked
- candidate.reviewed
- candidate.decided
- candidate.erased
Chat handoffs and case links
- escalation.completed
- case_link.opened
A candidate's events never carry names, contact details, answers, scores or transcripts. The reference lists every event.
session.ended.json
// POST to your URL, with X-Zentiq-Event: session.ended{ "id": "evt_…", "type": "session.ended", "apiVersion": "2026-10-01", "organizationId": "org_…", "createdAt": "2026-10-01T14:05:12.000Z", "data": { "sessionId": "sess_…", "personaId": "pa_…", "durationSeconds": 412, "billedMinutes": 7 }}
verify.ts
// Check it came from us (Node)const expected = "sha256=" + crypto .createHmac("sha256", WEBHOOK_SECRET) .update(`${req.headers["x-zentiq-timestamp"]}.${rawBody}`) .digest("hex");// compare with X-Zentiq-Signature, and reject old timestamps