Channels
The non-email delivery paths: Discord, Telegram and ntfy.sh.
The channel object
{
"id": "…",
"name": "Ops alerts",
"type": "discord",
"is_active": true,
"created_at": "…"
}Credentials are stored encrypted and never returned.
Create
POST /v1/channels| Field | Required | Notes |
|---|---|---|
name | yes | Up to 255 characters. |
type | yes | discord, telegram or ntfy. |
credentials | yes | An object; its shape depends on type. |
Discord
{ "name": "Ops alerts", "type": "discord",
"credentials": { "webhook_url": "https://discord.com/api/webhooks/…" } }Telegram
{ "name": "Ops alerts", "type": "telegram",
"credentials": { "bot_token": "123456:ABC-DEF…", "chat_id": "-1001234567890" } }chat_id may be sent as a string or a number.
ntfy.sh
{ "name": "Ops alerts", "type": "ntfy",
"credentials": {
"topic": "my_alerts_topic",
"server_url": "https://ntfy.example.com",
"auth_token": "tk_…"
} }Only topic is required. Omit server_url for the public ntfy.sh; auth_token is for a protected topic.
Anything missing or malformed is 422 notifyzr.channel.error.invalid, and the message names the field.
List and delete
GET /v1/channels
DELETE /v1/channels/{id}There is no update. Credentials cannot be rotated in place — delete the channel and create it again.
Send to a channel
POST /v1/channels/{id}/messagescurl -X POST http://api.localhost/v1/channels/$CHANNEL_ID/messages \
-H "X-API-Key: $NOTIFYZR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "content": "Deploy finished ✅" }'content is 1–4,000 characters. Returns 202 like an email send, is recorded in /v1/messages — filterable by channel_id — and emits channel_message.sent or channel_message.failed.
Channel messages have no sending domain
domain_id is always null on a channel message, and the per-domain breakdown in message metrics excludes them entirely rather than filing them under "unattributed".