Skip to content

Webhook Events ​

Available events ​

EventDescription
call.endedFired when an AI call finishes (completed, failed, or cancelled)

More events coming soon

Future events will include appointment.created, appointment.cancelled, sms.received, contact.created, and more.


call.ended ​

Sent when an AI call finishes, regardless of outcome.

Payload ​

json
{
  "id": "evt-delivery-uuid",
  "event": "call.ended",
  "timestamp": "2026-04-05T14:04:00Z",
  "data": {
    "callId": "clx-call-001",
    "organizationId": "clx-org-001",
    "agentId": "clx-agent-001",
    "agentName": "Sales Agent",
    "customerName": "John Doe",
    "customerPhone": "+1234567890",
    "fromNumber": "+0987654321",
    "direction": "OUTBOUND",
    "status": "completed",
    "duration": 240,
    "disconnectionReason": "agent_hangup",
    "sentiment": "positive",
    "summary": "Discussed enterprise pricing. Customer interested in annual plan.",
    "transcript": "Agent: Hello John, this is...\nJohn: Hi, yes I was...",
    "callSuccessful": true,
    "tokenCost": 12.50,
    "startedAt": "2026-04-05T14:00:00Z",
    "endedAt": "2026-04-05T14:04:00Z",
    "metadata": {
      "campaign_id": "summer_2026"
    }
  }
}

Fields ​

FieldTypeDescription
callIdstringUnique call identifier
organizationIdstringYour organization ID
agentIdstringAgent that handled the call
agentNamestringDisplay name of the agent
customerNamestring | nullName of the person called
customerPhonestringDestination phone number
fromNumberstringCaller ID used
directionstringINBOUND or OUTBOUND
statusstringFinal call status
durationintegerCall duration in seconds
disconnectionReasonstring | nullWhy the call ended
sentimentstring | nullAI-detected sentiment
summarystring | nullAI-generated call summary
transcriptstring | nullFull call transcript
callSuccessfulboolean | nullWhether the call achieved its objective
tokenCostnumberCost in tokens/credits
startedAtstring | nullISO 8601 call start time
endedAtstring | nullISO 8601 call end time
metadataobject | nullCustom metadata set at call creation

Example handler (Node.js) ​

javascript
app.post('/webhook', (req, res) => {
  const { event, data } = req.body

  if (event === 'call.ended') {
    console.log(`Call ${data.callId} ended`)
    console.log(`Status: ${data.status}, Duration: ${data.duration}s`)
    console.log(`Sentiment: ${data.sentiment}`)
    
    // Save to your CRM, notify your team, etc.
    if (data.callSuccessful) {
      notifyTeam(`Successful call with ${data.customerName}`)
    }
  }

  // Always respond 2xx
  res.status(200).json({ received: true })
})

Replicer API Documentation