Skip to content

Channels ​

The non-email delivery paths: Discord, Telegram and ntfy.sh.

The channel object ​

json
{
  "id": "…",
  "name": "Ops alerts",
  "type": "discord",
  "is_active": true,
  "created_at": "…"
}

Credentials are stored encrypted and never returned.

Create ​

POST /v1/channels
FieldRequiredNotes
nameyesUp to 255 characters.
typeyesdiscord, telegram or ntfy.
credentialsyesAn object; its shape depends on type.

Discord ​

json
{ "name": "Ops alerts", "type": "discord",
  "credentials": { "webhook_url": "https://discord.com/api/webhooks/…" } }

Telegram ​

json
{ "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 ​

json
{ "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}/messages
bash
curl -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".

Released under the Apache 2.0 License.