> ## 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.

# Slack channels

List and add Slack channels for alerts.

# Slack channels

After Slack is installed, manage which channels Happy Uptime can post to without re-running OAuth.

## List channels

GET `/slack/installations/{installation_id}/channels`

Lists channels the bot can post to. Searchable; auto-refreshed every 5s in the dashboard picker.

Substring filter on channel name.

Slack pagination cursor.

```json
{
  "data": [
    { "id": "C01ABCD", "name": "incidents", "is_private": false, "is_member": true },
    { "id": "C01EFGH", "name": "ops", "is_private": false, "is_member": false }
  ],
  "next_cursor": "..."
}
```

## Add channel as alert target

POST `/alerts/channels`

```json
{
  "type": "slack_app",
  "name": "Slack: #incidents",
  "config": {
    "installation_id": "ins_abc",
    "channel_id": "C01ABCD",
    "channel_name": "incidents"
  }
}
```

Channel names are stored without leading `#`. Duplicate `(installation_id, channel_id)` pairs are rejected.

## Test channel

POST `/alerts/channels/{id}/test`

Posts a test message. Returns Slack message timestamp on success or the Slack API error.

```json
{ "data": { "ok": true, "ts": "1734567890.123456" } }
```

## Common errors

| Slack error | Cause | Fix |
| --- | --- | --- |
| `not_in_channel` | Bot isn't a member | `/invite @happyuptime` in the channel |
| `channel_not_found` | Channel was archived/renamed | Re-pick channel from list |
| `missing_scope` | App missing scope (e.g. `im:write`) | Reinstall via [OAuth](/api/slack/oauth) |