Skip to main content

Notification Channels

Channels define where alert notifications are delivered. Signal supports multiple channel types to integrate with your existing tools.

Supported Channels

ChannelBest For
SlackTeam notifications, ChatOps
PagerDutyOn-call management, escalations
EmailStakeholder updates, digests
WebhookCustom integrations
DiscordTeam chat
Microsoft TeamsEnterprise teams
OpsgenieIncident management

Slack

POST /api/v1/channels
{
  "channel": {
    "name": "slack-ops",
    "channel_type": "slack",
    "config": {
      "webhook_url": "https://hooks.slack.com/services/xxx/yyy/zzz",
      "channel": "#ops-alerts",
      "username": "Signal Bot",
      "icon_emoji": ":rotating_light:"
    }
  }
}
Features:
  • Rich message formatting
  • Action buttons (acknowledge, mute)
  • Thread replies for updates

PagerDuty

POST /api/v1/channels
{
  "channel": {
    "name": "pagerduty-critical",
    "channel_type": "pagerduty",
    "config": {
      "routing_key": "your-routing-key",
      "severity_map": {
        "critical": "critical",
        "warning": "warning",
        "info": "info"
      }
    }
  }
}
Features:
  • Automatic incident creation
  • Severity mapping
  • Auto-resolve on recovery

Email

POST /api/v1/channels
{
  "channel": {
    "name": "email-team",
    "channel_type": "email",
    "config": {
      "recipients": ["[email protected]", "[email protected]"],
      "from": "[email protected]",
      "subject_prefix": "[ALERT]"
    }
  }
}
Features:
  • Multiple recipients
  • HTML formatting
  • Digest mode (batches alerts)

Webhook

For custom integrations:
POST /api/v1/channels
{
  "channel": {
    "name": "custom-webhook",
    "channel_type": "webhook",
    "config": {
      "url": "https://your-app.com/webhooks/signal",
      "method": "POST",
      "headers": {
        "Authorization": "Bearer secret-token",
        "X-Custom-Header": "value"
      }
    }
  }
}
Webhook Payload:
{
  "event": "alert.firing",
  "alert": {
    "id": "alert_abc123",
    "rule_name": "High Error Rate",
    "severity": "critical",
    "source": "reflex",
    "current_value": 150,
    "threshold": 100,
    "fired_at": "2024-01-15T10:30:00Z"
  },
  "rule": {
    "id": "rule_xyz789",
    "name": "High Error Rate"
  }
}

Discord

POST /api/v1/channels
{
  "channel": {
    "name": "discord-alerts",
    "channel_type": "discord",
    "config": {
      "webhook_url": "https://discord.com/api/webhooks/xxx/yyy",
      "username": "Signal"
    }
  }
}

Microsoft Teams

POST /api/v1/channels
{
  "channel": {
    "name": "teams-ops",
    "channel_type": "teams",
    "config": {
      "webhook_url": "https://outlook.office.com/webhook/xxx"
    }
  }
}

Opsgenie

POST /api/v1/channels
{
  "channel": {
    "name": "opsgenie-critical",
    "channel_type": "opsgenie",
    "config": {
      "api_key": "your-api-key",
      "team": "ops-team",
      "priority_map": {
        "critical": "P1",
        "warning": "P3",
        "info": "P5"
      }
    }
  }
}

Managing Channels

List Channels

GET /api/v1/channels

Test Channel

Send a test notification:
POST /api/v1/channels/:id/test

Update Channel

PATCH /api/v1/channels/:id
{
  "channel": {
    "config": {
      "channel": "#new-channel"
    }
  }
}

Delete Channel

DELETE /api/v1/channels/:id

Channel Routing

Route alerts to different channels based on:

By Severity

{
  "rule": {
    "notify_channels": {
      "critical": ["pagerduty-oncall"],
      "warning": ["slack-ops"],
      "info": ["email-digest"]
    }
  }
}

By Tags

{
  "rule": {
    "routing": {
      "match": { "team": "payments" },
      "channels": ["slack-payments", "pagerduty-payments"]
    }
  }
}

Best Practices

Test Before Use

Always test channels before adding to rules

Route by Severity

Critical to PagerDuty, warnings to Slack

Use Digests

Batch low-priority alerts into email digests

Avoid Alert Fatigue

Don’t send everything everywhere