> ## Documentation Index
> Fetch the complete documentation index at: https://docs.happyuptime.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Alert channels

Manage Slack, Discord, Teams, webhook, email, Telegram, PagerDuty, and Opsgenie destinations.

# Alert channels

Alert channels are destinations Happy Uptime sends alerts to. Pair them with [alert rules](/api/alerts/rules) (for monitor events) or [project channels](#project-channels) (for incident / vendor events).

Supported `type` values: `slack`, `slack_app`, `discord`, `webhook`, `email`, `telegram`, `teams`, `pagerduty`, `opsgenie`.

**Auth:** Bearer API key.

## List channels

GET `/alerts/channels`

```bash
curl -H "Authorization: Bearer $HU_API_KEY" \
  https://happyuptime.com/api/v1/alerts/channels
```

Response items include: `id`, `organization_id`, `name`, `type`, `config`, `is_default`, `signing_secret` (webhook only), `consecutive_failures`, `paused_at`, `created_at`.

## Create a channel

POST `/alerts/channels` — **scope:** `write`

### Config by type

```bash Slack
curl -X POST -H "Authorization: Bearer $HU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Ops Slack",
    "type": "slack",
    "config": { "webhookUrl": "https://hooks.slack.com/services/..." }
  }' \
  https://happyuptime.com/api/v1/alerts/channels
```

```bash Discord
-d '{
  "name": "Alerts",
  "type": "discord",
  "config": { "webhookUrl": "https://discord.com/api/webhooks/..." }
}'
```

```bash Teams
-d '{
  "name": "Teams — Ops",
  "type": "teams",
  "config": { "webhookUrl": "https://prod-.../workflows/..." }
}'
```

```bash Webhook
-d '{
  "name": "Ops bus",
  "type": "webhook",
  "config": {
    "url": "https://hooks.example.com/happyuptime",
    "method": "POST",
    "headers": { "X-Internal-Tag": "prod" }
  }
}'
```

```bash PagerDuty
-d '{
  "name": "PagerDuty",
  "type": "pagerduty",
  "config": { "integrationKey": "R01..." }
}'
```

```bash Opsgenie
-d '{
  "name": "Opsgenie",
  "type": "opsgenie",
  "config": { "apiKey": "...", "region": "us" }
}'
```

```bash Telegram
-d '{
  "name": "Telegram",
  "type": "telegram",
  "config": { "botToken": "...", "chatId": "..." }
}'
```

```bash Email
-d '{
  "name": "Oncall email",
  "type": "email",
  "config": { "email": "oncall@example.com" }
}'
```

Webhook channels auto-generate a `signing_secret` (prefix `whsec_`) on create. Save it from the response — it's the only way to verify HMAC signatures downstream. See [Webhook payloads](/api/webhooks).

## Rotate a webhook signing secret

POST `/alerts/channels/:id/rotate-secret` — **scope:** `write`

Returns a new `signing_secret`. The old secret is invalidated immediately — update your verifier before rotating.

## Resume a paused channel

POST `/alerts/channels/:id/resume` — **scope:** `write`

Channels are auto-paused after 50 consecutive failed deliveries. Call this after fixing your endpoint to clear `paused_at` and reset the failure counter.

## Delete a channel

DELETE `/alerts/channels/:id` — **scope:** `write`

## Project channels (org-level subscriptions)

For events that aren't tied to a monitor (incident.*, vendor.*), attach a channel at the org level:

POST `/alerts/project-channels`

```json
{ "alert_channel_id": "ch_xxx", "alert_type": "incident" }
```

Valid `alert_type`: `incident`, `dependency_incident`.