Links & Stats
👉 https://github.com/caronc/apprise
![]()
![]()
![]()
Every service you touch has its own way of pinging you. Telegram has a bot API, Discord has webhooks, Slack has incoming hooks, Gotify has its own thing, and ntfy — the one you actually like — has a REST endpoint. Wiring each one into your scripts, cron jobs, and monitoring means learning N different APIs and maintaining N different code paths.
Apprise (Python, 17k★) collapses all of that into a single library and CLI. One notification syntax, one call, and it fans out to almost every notification service that exists — Telegram, Discord, Slack, Gotify, ntfy, Amazon SNS, email, and 140+ more.
What it actually does
# Send a message to ntfy
apprise -b "Backup complete" "ntfy://my-topic"
# Fan out to multiple services at once
apprise -b "Deploy finished" \
"ntfy://my-topic" \
"tgram://bottoken/chatid" \
"slack://token/#channel"
What makes it genuinely good
- One library to rule them all — you never research a notification API again; Apprise wraps them.
- A common, intuitive URL syntax — each service is just a URL scheme (
tgram://,discord://,ntfy://, …). - CLI + Python API — drop it into a cron job or a script with equal ease.
- Config files — define your targets once, reference them by name everywhere.
- Attachments and images — where the destination service accepts them.
- Async and lightweight — fast, non-blocking sends.
- Apprise URL Builder — a web tool that constructs service URLs for you so you don’t have to remember the syntax.
The service catalog (140+ targets, one syntax)
Apprise supports 140+ notification services, grouped into productivity, SMS, desktop, email, and custom. A curated sample of the most useful:
Productivity & team chat
| Service | Service ID |
|---|---|
| Telegram | tgram:// |
| Discord | discord:// |
| Slack | slack:// |
| Mattermost | mmost:// |
| Matrix | matrix:// |
| Rocket.Chat | rocket:// |
| Zulip | zulip:// |
| Google Chat | gchat:// |
| Microsoft Teams (Workflows) | workflows:// |
| ntfy | ntfy:// |
| Gotify | gotify:// |
| Pushover | pover:// |
| PushBullet | pbul:// |
| PagerDuty | pagerduty:// |
| Opsgenie | opsgenie:// |
| Splunk | splunk:// |
| Jira | jira:// |
Messaging & push
| Service | Service ID |
|---|---|
whatsapp:// |
|
| Signal API | signal:// |
| Viber | viber:// |
| WeChat (WeCom) | wechat:// |
| Feishu | feishu:// |
| Kook | kook:// |
| Line | line:// |
| Bluesky | bluesky:// |
| Twitter/X | twitter:// |
| Mastodon | mastodon:// |
| IRC | irc:// |
| XMPP | xmpp:// |
| MQTT | mqtt:// |
| Custom GET/POST/JSON/XML | custom_*:// |
SMS / phone
| Service | Service ID |
|---|---|
| Twilio | twilio:// |
| Amazon SNS | sns:// |
| AWS SES (email) | ses:// |
| Vonage (Nexmo) | vonage:// |
| MessageBird | msgbird:// |
| ClickSend | clicksend:// |
| RingCentral | ringc:// |
| Signal API | signal:// |
| Service | Service ID |
|---|---|
| SMTP (mailto) | mailto:// / mailtos:// |
| Mailgun | mailgun:// |
| SendGrid | sendgrid:// |
| Postmark | postmark:// |
| Resend | resend:// |
| Brevo | brevo:// |
| Amazon SES | ses:// |
| Office 365 | o365:// |
| SMTP2Go | smtp2go:// |
Smart home & misc
| Service | Service ID |
|---|---|
| Home Assistant | hassio:// |
| Webex Teams | wxteams:// |
| LaMetric Time | lametric:// |
| KODI / XBMC | kodi:// / xbmc:// |
| Emby / Jellyfin | emby:// / jellyfin:// |
| Linux/macOS/Windows desktop | dbus:// / macosx:// / windows:// |
| Syslog | syslog:// |
That’s a sample — the full catalog spans 140+ services. Every one uses the same scheme://token/... URL convention, so once you know the syntax, they all behave the same way.
Why it matters
If you’re event-driven (and you are — webhooks over polling, alerts to ntfy), Apprise is the natural abstraction layer. You already use ntfy for alerts; Apprise doesn’t replace it — it sits on top of it. One notification call from any script or cron job can now reach ntfy and Telegram and email without wiring each channel separately.
The one-line pitch
Apprise turns “send a notification to every platform” into a single CLI command and a single Python import.
Install
pip install apprise
Next step
Point it at your existing ntfy topic first — apprise -b "test" "ntfy://my-topic" — then add a second channel to the same command. You’ll never hand-roll a per-service notification script again.