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 (for monitor events) or 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
bashcurl -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
bashcurl -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-d '{ "name": "Alerts", "type": "discord", "config": { "webhookUrl": "https://discord.com/api/webhooks/..." }}'
bash-d '{ "name": "Teams — Ops", "type": "teams", "config": { "webhookUrl": "https://prod-.../workflows/..." }}'
bash-d '{ "name": "Ops bus", "type": "webhook", "config": { "url": "https://hooks.example.com/happyuptime", "method": "POST", "headers": { "X-Internal-Tag": "prod" } }}'
bash-d '{ "name": "PagerDuty", "type": "pagerduty", "config": { "integrationKey": "R01..." }}'
bash-d '{ "name": "Opsgenie", "type": "opsgenie", "config": { "apiKey": "...", "region": "us" }}'
bash-d '{ "name": "Telegram", "type": "telegram", "config": { "botToken": "...", "chatId": "..." }}'
bash-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.
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.