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 notifiedCreating 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
}
}
}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
}