Skip to main content

Live Call Monitoring

Live call monitoring lets you watch conversations as they happen, intervene when needed, and ensure your AI agents maintain quality standards with every customer interaction.

Why Monitor Live Calls?

Real-time monitoring helps you:
  • Catch issues immediately - Fix problems before they escalate
  • Provide instant support - Help agents when they get stuck
  • Ensure compliance - Verify agents follow required procedures
  • Learn quickly - See how agents handle unexpected situations
Example: You notice an agent struggling with a complex refund request. You can transfer the call to a human agent immediately, preventing customer frustration.

What You See

Each live call displays:

Call Information

  • From/To phone numbers
  • Call duration (live timer)
  • Agent handling the call
  • Customer scenario/context

Real-Time Data

  • Live transcription
  • Current quality score
  • Active alerts
  • Agent actions/tools used

Viewing Live Calls

Navigate to Live Calls to see:
  • List of all active calls
  • Filter by agent, alert status, or duration
  • Click any call for detailed real-time view
  • See transcription updating live

Live Call Sources

Calls come from two sources:

Real Customer Calls

Production calls from actual customers:
  • Connected via VAPI, Bland, or other providers
  • Appear with "isSimulation": false
  • Can have immediate business impact
  • Require faster intervention

Test Simulations

Automated test calls from scenarios:
  • Appear with "isSimulation": true
  • Running as part of scheduled testing
  • Lower priority for monitoring
  • Good for training and practice

Available Actions

Monitor & Observe

Watch without intervening:
# Get live transcription updates
curl https://api.chanl.ai/v1/live-calls/call_abc123/transcript \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "callId": "call_abc123",
  "transcript": [
    {
      "speaker": "agent",
      "timestamp": 0,
      "text": "Thank you for calling. How can I help?"
    },
    {
      "speaker": "customer",
      "timestamp": 3.2,
      "text": "I need to return a product."
    }
  ],
  "lastUpdate": "2024-01-15T10:30:42Z"
}

Transfer to Human

Hand off to a live agent when needed:
curl -X POST https://api.chanl.ai/v1/live-calls/call_abc123/transfer \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "transferTo": "human-agent-queue",
    "reason": "Complex issue requiring human judgment",
    "context": "Customer requesting exception to return policy"
  }'
When to transfer:
  • Agent is clearly failing to resolve issue
  • Customer is extremely frustrated
  • Compliance or legal concerns arise
  • Request falls outside agent’s capabilities

End Call

Terminate the call if necessary:
curl -X POST https://api.chanl.ai/v1/live-calls/call_abc123/end \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "reason": "Abusive customer",
    "note": "Customer using inappropriate language"
  }'
Use this sparingly. Ending calls abruptly creates poor customer experience.

Add Notes

Document observations during the call:
curl -X POST https://api.chanl.ai/v1/live-calls/call_abc123/notes \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "note": "Agent handled objection well, good empathy shown",
    "timestamp": 145,
    "category": "positive"
  }'

Alert-Triggered Calls

Calls that trigger alerts need immediate attention:

Alert Types

Real-time score falls below threshold (e.g., below 70)Action: Review conversation and consider intervention
Agent misses required disclosure or violates policyAction: Intervene immediately if legally required
Sentiment analysis detects anger or dissatisfactionAction: Monitor closely, prepare to transfer
Agent repeating same responses or making no progressAction: Transfer to human or provide guidance

Viewing Alert Calls

Filter to see only calls with active alerts:
curl https://api.chanl.ai/v1/live-calls?hasAlerts=true \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "activeCalls": [
    {
      "id": "call_xyz789",
      "from": "+1234567890",
      "agent": "agent-v1",
      "duration": 287,
      "currentScore": 68,
      "alerts": [
        {
          "type": "quality_drop",
          "severity": "high",
          "message": "Score dropped below 70",
          "triggeredAt": 245
        },
        {
          "type": "customer_frustration",
          "severity": "medium",
          "message": "Customer expressing dissatisfaction",
          "triggeredAt": 267
        }
      ]
    }
  ]
}

Real-Time Streaming

Subscribe to live updates via WebSocket:
const chanl = require('@chanl/sdk');

// Connect to live call stream
const stream = chanl.liveCalls.stream({
  agents: ['agent-v1', 'agent-v2'],
  includeTranscript: true,
  alertsOnly: false
});

stream.on('call_started', (call) => {
  console.log(`📞 New call started: ${call.id}`);
  console.log(`Agent: ${call.agent}, From: ${call.from}`);
});

stream.on('call_updated', (update) => {
  console.log(`Call ${update.id} - Score: ${update.currentScore}`);
  if (update.transcript) {
    console.log(`Latest: ${update.transcript.text}`);
  }
});

stream.on('alert_triggered', (alert) => {
  console.log(`🚨 Alert on call ${alert.callId}: ${alert.message}`);

  // Auto-notify team
  if (alert.severity === 'high') {
    notifyTeam(alert);
  }
});

stream.on('call_ended', (call) => {
  console.log(`Call ended: ${call.id}, Final score: ${call.finalScore}`);
});

Monitoring Multiple Agents

Track all agents from a single dashboard:
const chanl = require('@chanl/sdk');

// Get overview of all active calls
const overview = await chanl.liveCalls.overview({
  groupBy: 'agent'
});

console.log(overview);
/*
{
  agents: [
    {
      id: "agent-v1",
      activeCalls: 3,
      avgScore: 88.2,
      activeAlerts: 1
    },
    {
      id: "agent-v2",
      activeCalls: 5,
      avgScore: 91.7,
      activeAlerts: 0
    }
  ],
  totalActiveCalls: 8,
  avgScoreAcrossAll: 90.3
}
*/

Performance Tracking

Monitor how calls are progressing:

Call Duration Tracking

curl https://api.chanl.ai/v1/live-calls/stats \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "activeCalls": 12,
  "avgDuration": 4.2,
  "longestCall": {
    "id": "call_long123",
    "duration": 847,
    "agent": "agent-v1"
  },
  "callsWithAlerts": 3,
  "callsOverThreshold": 2
}

Best Practices

1

Set Up Alerts First

Configure automated alerts so you only need to monitor flagged calls, not every single one.
2

Define Intervention Rules

Create clear guidelines for when to transfer vs when to let the agent continue.
3

Document Interventions

Always add notes when you take action so you can analyze patterns later.
4

Use for Training

Watch live calls to understand how agents handle real situations and identify training needs.
5

Monitor Peak Hours

Pay extra attention during high-volume periods when issues are more likely.

Troubleshooting

Problem: Live calls list is emptySolutions:
  • Verify agents are actually receiving calls
  • Check agent connection status
  • Confirm you have permission to view live calls
  • Try refreshing the page
Problem: Text updates delayed from actual conversationSolutions:
  • This is normal - expect 2-5 second delay
  • Check your internet connection
  • Try refreshing if delay exceeds 10 seconds
  • Contact support if issue persists
Problem: Transfer action failsSolutions:
  • Verify human agent queue is available
  • Check if transfer is configured for this agent
  • Ensure call is still active
  • Try again or end call if critical
Problem: Expected alerts not showing on live callsSolutions:
  • Verify alert rules are configured and active
  • Check if alert thresholds are set correctly
  • Confirm agents are linked to alert rules
  • Review alert configuration in settings

What’s Next?