/v1/calls and /v1/sms-conversations events. A webhookUrl on an individual create request overrides only that conversation’s destination; event subscriptions and signing still come from your webhook registration.
Register a webhook with the event types you want to receive:
Event Types
| Event | Description |
|---|---|
call.started | Voice call connected or started ringing. |
call.ended | Voice call disconnected before analysis is complete. |
call.analyzed | Post-call analysis is available. |
call.failed | Could not place voice call. |
sms.message_sent | Outbound SMS sent to a contact and persisted. |
sms.message_received | Inbound SMS received from a contact and persisted. |
sms.message_delivery_updated | Canonical delivery status changed for an outbound SMS. |
sms.tool_call_invocation | SMS agent invoked a tool during the conversation loop. |
sms.tool_call_result | Tool result was persisted for an SMS conversation. |
Payload Shape
Webhook payloads share a common envelope:clientOrgId and event type. A conversation event is delivered only to webhook subscriptions for the conversation’s client organization.
If the create request included externalReferenceId, PAM includes it as top-level externalReferenceId next to conversationId on every webhook for that conversation. For pre-conversation call.failed events, PAM includes it when the original create-call request provided one. The value is an optional caller-owned reference. PAM does not interpret it, does not require it to be globally unique, and does not use it as an idempotency key.
If the create request included externalReferenceId, PAM includes it as top-level externalReferenceId next to conversationId on every webhook for that conversation. For pre-conversation call.failed events, PAM includes it when the original create-call request provided one. The value is an optional caller-owned reference. PAM does not interpret it, does not require it to be globally unique, and does not use it as an idempotency key.
Lifecycle and Delivery
PAM emits webhook events after it persists the related conversation, call, or message state. For example,sms.message_received means the inbound message is already stored by PAM, and call.ended means the call end state has been recorded.
Webhook delivery is asynchronous and at least once. Your endpoint may receive duplicate events, and retries can arrive after newer events. Verify the signature, enqueue your own work, and return a 2xx response quickly.
Use the event payload to deduplicate and reconcile state in your system.
SMS delivery updates are canonical PAM states. They are not raw carrier events. PAM normalizes duplicate and out-of-order provider signals before emitting sms.message_delivery_updated.
Voice Event Examples
call.started fires when the call has started:
call.ended includes the final transcript and call timing:
call.analyzed arrives after post-call analysis is complete:
call.failed fires when PAM accepted a voice call request but could not place the call.
PAM tries to place the call before sending this event. You can retry the call with a new request, handle it manually, or treat the attempt as failed in your system.
data.dispatchRequestId, data.idempotencyKey, top-level externalReferenceId, or your own request metadata to reconcile the failed call attempt.
SMS Event Examples
sms.message_sent fires for the opening SMS and each later assistant SMS:
sms.message_delivery_updated is a canonical delivery projection. It is not a raw carrier event:
Signature Verification
Every delivery includes headers for the event type and payload signature:secret as the key.
Delivery Notes
- Webhook URLs must use HTTPS.
- The webhook secret is returned only when the endpoint is created.
- Delivery is at least once, so deduplicate events by delivery id and event body.
- Failed deliveries are retried with exponential backoff.
- Delivery times out after 10 seconds.
- Return a
2xxresponse quickly after verifying and enqueueing the event.