# Replace example resource IDs and ownerId with values from your workspace.
: "${POWERDIALER_API_KEY:?Set POWERDIALER_API_KEY to your scoped API key}"
# Set this once per operation; reuse it with the same request after a timeout.
: "${POWERDIALER_REQUEST_ID:?Set POWERDIALER_REQUEST_ID to a new UUID for this operation}"
curl --request PUT \
--url 'https://api.migration.powerdialer.ai/api/public/v2/webhooks/00000000-0000-4000-8000-000000000001' \
--header "Authorization: Bearer $POWERDIALER_API_KEY" \
--header "Idempotency-Key: $POWERDIALER_REQUEST_ID" \
--header 'Content-Type: application/json' \
--data '{
"name": "CRM updates",
"url": "https://receiver.example.com/powerdialer",
"events": [
"call.completed",
"call.disposition_updated"
]
}'{
"name": "CRM updates",
"url": "https://receiver.example.com/powerdialer",
"events": [
"call.completed",
"call.disposition_updated"
],
"id": "00000000-0000-4000-8000-000000000001",
"active": false,
"verifiedAt": null,
"createdAt": "2026-10-08T12:00:00.000Z"
}{
"name": "CRM updates",
"url": "https://receiver.example.com/powerdialer",
"events": [
"call.completed",
"call.disposition_updated"
],
"id": "00000000-0000-4000-8000-000000000001",
"active": false,
"verifiedAt": null,
"createdAt": "2026-10-08T12:00:00.000Z"
}{
"error": {
"code": "invalid_api_key",
"message": "API key is invalid, expired or revoked",
"requestId": "00000000-0000-4000-8000-000000000004"
}
}Create or update a webhook
Register a public HTTPS receiver or replace an existing subscription’s configuration. Requires webhooks:manage plus the read scope for every selected event’s resource. Choose and persist the subscription UUID before sending. At most 100 subscriptions can belong to one key.
The response never includes a signing secret. New subscriptions start inactive; rotate the secret once, configure your receiver, then verify it. Any new configuration write also pauses the receiver, cancels queued deliveries and requires verification again. New subscriptions start after the latest published workspace cursor; earlier pending events may arrive later. Include call.updated for a broad call lifecycle: call.completed only marks the stored Completed status, not every unsuccessful terminal outcome.
Persist an Idempotency-Key; an identical retry recovers the original response without repeating the configuration change. 400 invalid_webhook_url requires HTTPS on port 443 without credentials/fragments. 403 insufficient_scope requires the missing resource-read permission. 409 subscription_limit requires using an existing subscription; 404 not_found means the UUID belongs outside this credential.
# Replace example resource IDs and ownerId with values from your workspace.
: "${POWERDIALER_API_KEY:?Set POWERDIALER_API_KEY to your scoped API key}"
# Set this once per operation; reuse it with the same request after a timeout.
: "${POWERDIALER_REQUEST_ID:?Set POWERDIALER_REQUEST_ID to a new UUID for this operation}"
curl --request PUT \
--url 'https://api.migration.powerdialer.ai/api/public/v2/webhooks/00000000-0000-4000-8000-000000000001' \
--header "Authorization: Bearer $POWERDIALER_API_KEY" \
--header "Idempotency-Key: $POWERDIALER_REQUEST_ID" \
--header 'Content-Type: application/json' \
--data '{
"name": "CRM updates",
"url": "https://receiver.example.com/powerdialer",
"events": [
"call.completed",
"call.disposition_updated"
]
}'{
"name": "CRM updates",
"url": "https://receiver.example.com/powerdialer",
"events": [
"call.completed",
"call.disposition_updated"
],
"id": "00000000-0000-4000-8000-000000000001",
"active": false,
"verifiedAt": null,
"createdAt": "2026-10-08T12:00:00.000Z"
}{
"name": "CRM updates",
"url": "https://receiver.example.com/powerdialer",
"events": [
"call.completed",
"call.disposition_updated"
],
"id": "00000000-0000-4000-8000-000000000001",
"active": false,
"verifiedAt": null,
"createdAt": "2026-10-08T12:00:00.000Z"
}{
"error": {
"code": "invalid_api_key",
"message": "API key is invalid, expired or revoked",
"requestId": "00000000-0000-4000-8000-000000000004"
}
}Authorizations
Issued in Developers. Workspace/owner/scopes come from credential, never acting-user headers. API keys cannot manage API credentials.
Headers
Persist one key for this logical operation before sending it. Reuse the same value only with the same method, path and body after a timeout. A changed request returns 409 idempotency_conflict; a matching retry returns the original response.
^[A-Za-z0-9._:-]{1,200}$Path Parameters
Subscription UUID that you generate and persist before registration. Reuse this ID to manage the same receiver.
Body
A label that helps you identify the integration.
1 - 100HTTPS receiver on port 443, without URL credentials or fragments. On verification and delivery, it must resolve exclusively to public IP addresses; redirects are not followed. Saving an inactive configuration does not establish reachability.
2000Event types to deliver. The key must also have the read permission for every selected resource type.
1 - 16 elementscontact.created, contact.updated, contact.deleted, list.created, list.updated, list.deleted, list.membership_updated, call.created, call.updated, call.deleted, call.completed, call.disposition_updated, recording.available, transcript.available, contact.access_revoked, list.access_revoked Response
Existing subscription configuration was replaced and paused, or that response was replayed.
Subscription UUID chosen by the client when creating it.
Integration label.
HTTPS receiver URL.
Subscribed event types.
contact.created, contact.updated, contact.deleted, list.created, list.updated, list.deleted, list.membership_updated, call.created, call.updated, call.deleted, call.completed, call.disposition_updated, recording.available, transcript.available, contact.access_revoked, list.access_revoked Whether delivery is enabled. Creating or replacing configuration pauses delivery until verification.
Time of the most recent successful verification, or null.
Subscription creation time in UTC.