# Alert channel matrix

Every alert channel receives the standard monitor alerts - **Down**, **Up** and **Repeatedly down**. Most also
receive the **rich sub-check alerts** (SSL certificate expiry, domain expiry, DNSBL blacklist and Web Risk), rendered
for that channel. **Scheduled reports** go to email only. This table is the quick reference; each channel has its own
setup page under [Alert channels](/alerts/channels/).

| Channel | Addressed by | Set up | Rich sub-check alerts | Reports | API contact type |
|---|---|---|---|---|---|
| Email | Email address | App or API; confirmed with a code | yes | **yes** (the only report channel) | `email` |
| SMS | Phone number | App or API; confirmed with a code; paid per message | yes | no | `sms` |
| Voice call | Phone number | App or API; confirmed with a code; paid per call | no - calls are for up/down only | no | `voiceCall` |
| Webhook (generic HTTP) | Your URL | App or API; no confirmation | no | no | `http` |
| Slack | Incoming webhook URL | App | yes | no | `http` (recognised as Slack) |
| Microsoft Teams | Teams Workflows webhook URL | App | yes | no | `http` (Teams gateway) |
| Mattermost | Incoming webhook URL | App | yes (Slack-style message) | no | `http` (Mattermost gateway) |
| PagerDuty | Integration (routing) key | App | yes; incidents resolve on recovery | no | `http` (PagerDuty gateway) |
| Pushover | User key | App | yes | no | `http` (Pushover gateway) |
| Pushbullet | Access token | App | yes | no | `http` (Pushbullet gateway) |
| Telegram | Bot chat | App, by connecting the HostTracker bot | yes | no | `telegram` (created by the bot) |
| Viber | Bot chat | App, by connecting the bot | yes | no | `viber` (created by the bot) |
| Discord | Server channel via the bot | App, by adding the bot | yes | no | `discord` (created by the bot) |
| Web push | Browser subscription | App, by allowing notifications in the browser | yes | no | `webPush` |

Not available for new contacts today: **Opsgenie** and **WhatsApp** (built, not yet offered), **Google Chat** and
**Facebook Messenger** (not offered for new contacts), and **Skype** (retired).

## How channels differ

- **Address channels** (email, SMS, voice call) use something the recipient owns and need a **confirmation code**
  before they receive anything. SMS and voice calls are paid from your message balance - see
  [SMS billing](/alerts/sms-billing/).
- **Webhook-shaped channels** (generic webhook, Slack, Teams, Mattermost) are addressed by a URL. In the API they are
  all contact type `http`; Slack is recognised from its `hooks.slack.com` URL, the others by the gateway chosen when
  the contact is created. A URL that is not recognised is a generic webhook: it gets the standard JSON or form payload
  (or your own template) and no rich sub-check alerts.
- **Key-addressed channels** (PagerDuty, Pushover, Pushbullet) are addressed by a key or token issued by that
  service. PagerDuty and Opsgenie alerts are sent immediately, never merged into a grouped alert.
- **Bot channels** (Telegram, Viber, Discord) are created by connecting the HostTracker bot in that messenger; the API
  can read them but not create them.
- **Web push** is created by the browser that grants notification permission.

A generic webhook contact is different from a signed v2 [webhook](/integrations/webhooks/) - see
[Webhooks vs webhook contacts](/integrations/webhooks/#webhooks-vs-webhook-contacts).

## In the API

`GET /contact/type` (no token needed) returns the live catalogue: for each type whether it can be created through the
API, whether it needs registration in another app, whether it takes scheduled reports, whether it needs confirming,
the alert delays it accepts and its gateways. Report subscriptions to a non-email contact are refused with
`422 unsupported_report_channel`.

## Related

- [Alert channels](/alerts/channels/)
- [Contacts](/alerts/contacts/)
- [Webhook events reference](/reference/webhook-events/)
- [An alert arrived late](/troubleshooting/notification-late/)
