Webhooks
Subscribe to real-time event notifications from Celper AI. Webhooks deliver HTTP POST requests to your endpoint when key events occur, such as interview analysis completion or candidate status changes.
Each company can register up to 5 webhooks. All webhook URLs must use HTTPS and cannot point to private or reserved IP ranges.
/v1/webhooksReturns all webhooks registered for your company.
Scope: manage:webhooks | Role: owner or admin | Rate limit: webhooks (20 requests / 60s)
curl https://api.celper.ai/v1/webhooks -H "X-API-Key: celp_your_api_key_here"/v1/webhooksRegister a new webhook endpoint. You must specify at least one event to subscribe to. The response includes a secret for verifying webhook signatures — store it securely, as it will not be returned again.
Scope: manage:webhooks | Role: owner or admin | Rate limit: webhooks (20 requests / 60s)
Valid events:
analysis_ready— fired when interview analysis is completecandidate_status_changed— fired when a candidate’s status changescv_analysis_complete— fired when CV analysis finishesbulk_import_complete— fired when a bulk import job finishes
Valid status filters: new, invited, interviewed, selected, rejected, expired, failed, unevaluable
URL restrictions: Must be HTTPS. The following are blocked: localhost, private IPs (10.*, 172.16-31.*, 192.168.*), and metadata endpoints (169.254.*).
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | Required | The HTTPS endpoint URL to receive webhook events. Max 2048 characters. No private IPs. |
events | array | Required | Array of event types to subscribe to. Min 1 item. |
statusFilters | array | Optional | Optional array of candidate statuses to filter `candidate_status_changed` events. |
curl -X POST https://api.celper.ai/v1/webhooks -H "X-API-Key: celp_your_api_key_here" -H "Content-Type: application/json" -d '{
"url": "https://hooks.example.com/celper",
"events": ["analysis_ready", "candidate_status_changed"],
"statusFilters": ["interviewed", "selected", "rejected"]
}'/v1/webhooks/{webhookId}Returns details for a specific webhook. The signing secret is not included in the response.
Scope: manage:webhooks | Role: owner or admin | Rate limit: webhooks (20 requests / 60s)
| Parameter | Type | Required | Description |
|---|---|---|---|
webhookId | string | Required | The unique identifier of the webhook. |
curl https://api.celper.ai/v1/webhooks/wh_abc123 -H "X-API-Key: celp_your_api_key_here"/v1/webhooks/{webhookId}Update an existing webhook’s URL, subscribed events, status filters, or active state. Only include the fields you want to change.
Scope: manage:webhooks | Role: owner or admin | Rate limit: webhooks (20 requests / 60s)
| Parameter | Type | Required | Description |
|---|---|---|---|
webhookId | string | Required | The unique identifier of the webhook. |
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | Optional | Updated HTTPS endpoint URL. Max 2048 characters. |
events | array | Optional | Updated array of event types to subscribe to. |
statusFilters | array | Optional | Updated array of status filters. Pass an empty array to clear filters. |
isActive | boolean | Optional | Set to `false` to pause delivery, `true` to resume. |
curl -X PATCH https://api.celper.ai/v1/webhooks/wh_abc123 -H "X-API-Key: celp_your_api_key_here" -H "Content-Type: application/json" -d '{
"events": ["analysis_ready", "candidate_status_changed", "cv_analysis_complete"],
"isActive": true
}'/v1/webhooks/{webhookId}Permanently delete a webhook. All pending deliveries will be cancelled.
Scope: manage:webhooks | Role: owner or admin | Rate limit: webhooks (20 requests / 60s)
| Parameter | Type | Required | Description |
|---|---|---|---|
webhookId | string | Required | The unique identifier of the webhook. |
curl -X DELETE https://api.celper.ai/v1/webhooks/wh_abc123 -H "X-API-Key: celp_your_api_key_here"/v1/webhooks/{webhookId}/testSend a test ping event to the webhook URL to verify connectivity. The test payload uses the same signature mechanism as real events.
Scope: manage:webhooks | Role: owner or admin | Rate limit: webhooks (20 requests / 60s)
| Parameter | Type | Required | Description |
|---|---|---|---|
webhookId | string | Required | The unique identifier of the webhook. |
curl -X POST https://api.celper.ai/v1/webhooks/wh_abc123/test -H "X-API-Key: celp_your_api_key_here"The test delivery uses the event type ping with the following payload:
{
"test": true,
"timestamp": "2026-04-11T12:00:00.000Z",
"webhookId": "wh_abc123",
"api_version": "v1"
}/v1/webhooks/{webhookId}/rotate-secretGenerate a new signing secret for a webhook. The previous secret is immediately invalidated. Store the new secret securely — it will not be returned again.
Scope: manage:webhooks | Role: owner or admin | Rate limit: webhooks (20 requests / 60s)
| Parameter | Type | Required | Description |
|---|---|---|---|
webhookId | string | Required | The unique identifier of the webhook. |
curl -X POST https://api.celper.ai/v1/webhooks/wh_abc123/rotate-secret -H "X-API-Key: celp_your_api_key_here"/v1/webhooks/{webhookId}/deliveriesReturns a paginated list of delivery attempts for a specific webhook. Use this to debug delivery failures and monitor webhook health.
Scope: manage:webhooks | Role: owner or admin | Rate limit: webhooks (20 requests / 60s)
| Parameter | Type | Required | Description |
|---|---|---|---|
webhookId | string | Required | The unique identifier of the webhook. |
| Parameter | Type | Required | Description |
|---|---|---|---|
limit | number | Optional | Number of results to return. Min 1, max 50. Default: 20. |
cursor | string | Optional | Pagination cursor from a previous response. |
status | string | Optional | Filter by delivery status. Valid values: `"delivered"`, `"failed"`, `"exhausted"`. |
curl "https://api.celper.ai/v1/webhooks/wh_abc123/deliveries?limit=10&status=failed" -H "X-API-Key: celp_your_api_key_here"