Overview
Webhooks allow you to receive real-time notifications when events occur in the Gather API. Configure webhooks to be notified when interviews are completed, statuses change, or audio generation finishes.Webhook Events
The following events are available:question.audio_generated- Question audio generation completedcandidate_interview.completed- Candidate completed interviewcandidate_interview.status_changed- Status changedinterview.created- Interview createdinterview.updated- Interview updated
Webhook Delivery Format
Each webhook is delivered as an HTTPPOST to your configured URL.
Request Headers
| Header | Description |
|---|---|
Content-Type | application/json |
X-Qualifi-Event | Event type (e.g., candidate_interview.completed) |
X-Qualifi-Signature | HMAC-SHA256 hex digest of the raw JSON body |
Request Body
The request body is a flat JSON object containing event-specific fields. The event type is not included in the body — read it from theX-Qualifi-Event header.
Example for candidate_interview.completed:
Webhook Configuration
Webhooks can be configured per organization/team via the Gather API’s webhook configuration endpoints (
/qsi/gather/webhooks — create, list, get, update, delete). Use the Webhook Delivery Logs endpoint to retrieve delivery history.Deleting a configuration that has delivery history is rejected with a
400 to prevent accidental loss of that history. To delete the configuration and its deliveries, send DELETE /qsi/gather/webhooks/:id?deleteDeliveries=true.Configuration Options
- Multiple URLs: Supports multiple webhook URLs per organization
- Event Filtering: Configure which events to receive
- Retry Logic: Automatic retries with exponential backoff (3 attempts)
- Signature Verification: HMAC-SHA256 signature for security
Webhook Delivery Logs
Retrieve a paginated history of webhook delivery attempts for the authenticated organization, sorted newest-first. Useful for debugging failed deliveries and reconciling expected vs. received events.Webhook secrets are never returned in delivery logs.
Endpoint
GET /qsi/gather/webhook-deliveries
Query Parameters
Override team scope (must be allowed for the API key).
Filter to a single webhook configuration.
Filter by event type, e.g.
candidate_interview.completed.One of
pending, processing, completed, failed.Filter to deliveries whose payload contains this candidate interview ID. Useful for tracing the events emitted for a specific interview.
Inclusive lower bound on
createdAt (ISO 8601).Inclusive upper bound on
createdAt (ISO 8601).Page number, 1-indexed. Default
1.Records per page, max
200. Default 50.Response
Status State Machine
| Status | Meaning |
|---|---|
pending | Queued, not yet attempted |
processing | In flight (first or retry attempt) |
completed | Delivered successfully (downstream returned 2xx) |
failed | Exhausted retries; errorResponse populated with downstream status/body |
Webhook Signature Verification
All webhooks include anX-Qualifi-Signature header containing the HMAC-SHA256 hex digest of the raw JSON request body (the same bytes sent in the POST).
Verification Process
- Read the raw request body as a string (before parsing JSON, if possible)
- Compute HMAC-SHA256 using your webhook secret and the raw body string
- Compare the computed hex digest with the
X-Qualifi-Signatureheader value
Signature verification must use the exact raw JSON string from the request body. Re-serializing a parsed JSON object can change key order or whitespace and cause verification to fail.
Example Verification
- JavaScript
- Python
Event Details
question.audio_generated
Triggered when question audio generation completes. Header:X-Qualifi-Event: question.audio_generated
candidate_interview.completed
Triggered when a candidate completes an interview. May fire when status changes tonew_response or when the interview completion worker processes the interview.
Header: X-Qualifi-Event: candidate_interview.completed
candidate_interview.status_changed
Triggered when candidate interview status changes. Header:X-Qualifi-Event: candidate_interview.status_changed
| Field | Type | Description |
|---|---|---|
candidateInterviewId | string | Candidate interview ID |
candidateId | string | Candidate ID |
interviewId | string | Interview ID |
status | string | New status after the change |
previousStatus | string | null | Previous status; may be null if not available |
updatedAt | string | ISO 8601 timestamp when the status was updated |
Retry Logic
Webhooks use exponential backoff for failed deliveries:- First attempt: Immediate
- Second attempt: After 1 minute
- Third attempt: After 5 minutes
If all retry attempts fail, the webhook delivery is marked as failed. Check your webhook endpoint availability and error handling.
Best Practices
- Verify Signatures: Always verify webhook signatures to ensure authenticity
- Idempotency: Handle duplicate webhook deliveries gracefully
- Quick Response: Respond to webhooks quickly (within 5 seconds)
- Error Handling: Return appropriate HTTP status codes
- Logging: Log all webhook events for debugging
Related Resources
Handling Webhooks
Step-by-step guide for handling webhooks
Candidate Interviews
Learn about candidate interview events

