Chanl

Alerts

Get notified the way you work — Slack, email, SMS, or webhooks when agents need attention

Get Notified the Way You Work

You can't watch every conversation. You shouldn't have to. Chanl alerts monitor every call for the conditions you care about — quality drops, compliance violations, tool failures, frustrated customers — and notify you through Slack, email, SMS, or webhooks the moment something needs attention.

Define the rule once, and Chanl watches every conversation for you.

Call happens → Alert rules evaluate → Condition met → You're notified

Creating an Alert

Tell Chanl what to watch for, how serious it is, and where to send the notification.

curl -X POST https://api.chanl.ai/v1/alerts \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Low Quality Score",
    "condition": {
      "type": "score_threshold",
      "threshold": 70,
      "operator": "less_than"
    },
    "severity": "high",
    "notifications": {
      "email": ["team@company.com"],
      "slack": {
        "webhook": "https://hooks.slack.com/...",
        "channel": "#ai-alerts"
      }
    },
    "agents": ["agent-v1", "agent-v2"],
    "active": true
  }'
import Chanl from "@chanl/sdk";

const chanl = new Chanl({ apiKey: "YOUR_API_KEY" });

const alert = await chanl.alerts.create({
  name: "Low Quality Score",
  condition: {
    type: "score_threshold",
    threshold: 70,
    operator: "less_than",
  },
  severity: "high",
  notifications: {
    email: ["team@company.com"],
    slack: {
      webhook: "https://hooks.slack.com/...",
      channel: "#ai-alerts",
    },
  },
  agents: ["agent-v1", "agent-v2"],
  active: true,
});

console.log(`Alert created: ${alert.id}`);
from chanl import Chanl

chanl = Chanl(api_key="YOUR_API_KEY")

alert = chanl.alerts.create(
    name="Low Quality Score",
    condition={
        "type": "score_threshold",
        "threshold": 70,
        "operator": "less_than"
    },
    severity="high",
    notifications={
        "email": ["team@company.com"],
        "slack": {
            "webhook": "https://hooks.slack.com/...",
            "channel": "#ai-alerts"
        }
    },
    agents=["agent-v1", "agent-v2"],
    active=True
)

print(f"Alert created: {alert.id}")

What You Can Monitor

Quality Alerts

These catch conversations that aren't meeting your standards.

Compliance Alerts

These are the alerts you can't ignore. Missing a required disclosure or mishandling customer data has real consequences.

Technical Alerts

These catch infrastructure problems that affect your agents.

Quality Gates

Alerts aren't just for monitoring — they're for prevention. Use quality gates to block bad deployments from reaching customers.

Set up alerts that fire when a new agent version's test scores drop below your baseline. If the gate fails, you know not to promote that version to production. Your agents don't go live until they pass.

Notification Channels

Slack

The most popular option for teams. You get alert details, call context, and quick action buttons (View Call, Transfer, Dismiss) right in your channel.

{
  "notifications": {
    "slack": {
      "webhook": "https://hooks.slack.com/services/YOUR/WEBHOOK/URL",
      "channel": "#ai-agent-alerts",
      "mentionOnCritical": "@oncall",
      "includeActions": true
    }
  }
}

Email

Good for audit trails and teams that don't live in Slack.

{
  "notifications": {
    "email": {
      "recipients": ["team@company.com", "oncall@company.com"],
      "subject": "Alert: {{alert_name}}",
      "includeCallLink": true,
      "includeTranscript": true
    }
  }
}

SMS

Reserve this for critical alerts only. Nobody wants a text message for every minor quality dip.

{
  "notifications": {
    "sms": {
      "numbers": ["+1234567890"],
      "onlyForSeverity": ["critical"],
      "message": "Alert: {{alert_name}} - Call: {{call_id}}"
    }
  }
}

SMS notifications should be reserved for critical alerts only to avoid alert fatigue.

Webhooks

Send alert data to any system — your incident management tool, a custom dashboard, or a Zapier workflow.

{
  "notifications": {
    "webhook": {
      "url": "https://your-system.com/chanl-alerts",
      "method": "POST",
      "headers": {
        "Authorization": "Bearer YOUR_TOKEN",
        "X-Source": "chanl"
      },
      "payload": {
        "alertId": "{{alert_id}}",
        "callId": "{{call_id}}",
        "severity": "{{severity}}",
        "timestamp": "{{timestamp}}"
      }
    }
  }
}

Smart Alert Routing

Not every alert should go to the same place. Route by severity so your team gets the right signal at the right urgency:

Low

Minor issues. Review when convenient. Dashboard only.

Medium

Should be addressed within hours. Email + Slack.

High

Needs attention within minutes. Slack with @mention.

Critical

Act now. SMS + Slack + email + webhook.

Deduplication and Throttling

Without guardrails, alerts create noise instead of signal. Chanl handles this with built-in deduplication.

Throttling

Prevent the same alert from firing over and over:

{
  "throttling": {
    "enabled": true,
    "cooldownMinutes": 15,
    "maxAlertsPerHour": 10
  }
}

This means the same alert won't fire more than once every 15 minutes, and you'll never get more than 10 per hour.

Grouping

When multiple calls trip the same alert in a short window, Chanl batches them into a single notification:

{
  "grouping": {
    "enabled": true,
    "timeWindow": "5m",
    "maxGroupSize": 5,
    "notificationFormat": "{{count}} calls triggered '{{alert_name}}' in last 5 minutes"
  }
}

Instead of 5 separate pings, you get one: "5 calls triggered 'Low Quality Score' in last 5 minutes."

Scheduled Silence

Disable alerts during known quiet periods (weekends, maintenance windows):

{
  "silenceSchedule": {
    "enabled": true,
    "windows": [
      {
        "days": ["saturday", "sunday"],
        "startTime": "00:00",
        "endTime": "23:59"
      }
    ]
  }
}

Viewing Triggered Alerts

curl https://api.chanl.ai/v1/alerts/triggered \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d '{
    "timeRange": "24h",
    "severity": ["high", "critical"]
  }'
const triggered = await chanl.alerts.listTriggered({
  timeRange: "24h",
  severity: ["high", "critical"],
});

for (const alert of triggered.alerts) {
  console.log(`${alert.alertName} — ${alert.severity} — ${alert.triggeredAt}`);
}
triggered = chanl.alerts.list_triggered(
    time_range="24h",
    severity=["high", "critical"]
)

for alert in triggered.alerts:
    print(f"{alert.alert_name}{alert.severity}{alert.triggered_at}")
{
  "alerts": [
    {
      "id": "alert_trigger_123",
      "alertId": "alert_abc",
      "alertName": "Low Quality Score",
      "callId": "call_xyz",
      "triggeredAt": "2024-01-15T10:30:00Z",
      "severity": "high",
      "resolved": false,
      "details": {
        "score": 68,
        "threshold": 70,
        "agent": "agent-v1"
      }
    }
  ],
  "total": 23
}

Troubleshooting

What's Next?

Live Calls

Monitor the calls that trigger alerts in real time

Call Logs

Review historical alert patterns across interactions

Analytics

Track alert trends and frequency over time

Agents

Fix the root causes behind repeated alerts

On this page