100+ Services
Send notifications to Slack, Discord, Telegram, Teams, email, SMS, and more
Apprise API is a lightweight REST API that wraps the powerful Apprise notification library. It provides a unified gateway to send push notifications to over 100+ services including Slack, Discord, Telegram, Microsoft Teams, email, SMS, and many more—all through a single, consistent API.
Apprise API is ideal for:
100+ Services
Send notifications to Slack, Discord, Telegram, Teams, email, SMS, and more
Unified API
One consistent API to rule all notification services
Configuration Manager
Built-in web UI for managing notification configurations
Stateless & Stateful
Use on-demand notifications or save configurations for reuse
Deploying Apprise API on Klutch.sh provides several advantages:
Before deploying Apprise API on Klutch.sh, ensure you have:
Apprise supports a vast array of notification services. Here are some popular ones:
| Category | Services |
|---|---|
| Chat & Messaging | Slack, Discord, Microsoft Teams, Telegram, Matrix, Mattermost, Rocket.Chat |
| SMTP, Gmail, Outlook, SendGrid, Mailgun, AWS SES | |
| SMS | Twilio, AWS SNS, Vonage, Clickatell, BulkSMS |
| Push Notifications | Pushover, Pushbullet, Gotify, ntfy, Join |
| DevOps | PagerDuty, Opsgenie, Splunk, Prometheus Alertmanager |
| Social | Twitter, Reddit, Mastodon |
For a complete list, visit the Apprise Wiki.
Create a new directory for your Apprise API deployment:
apprise-server/├── Dockerfile├── config/│ └── (saved configurations)├── plugin/│ └── (custom plugins)└── attach/ └── (file attachments)Klutch.sh automatically detects Dockerfiles in your repository’s root directory. You can use the official Apprise image directly or create a custom Dockerfile:
FROM caronc/apprise:latest
# Set labelsLABEL name="apprise-api" \ description="Apprise Push Notification API Gateway" \ maintainer="Your Name"
# Configure environment variablesENV APPRISE_STATEFUL_MODE=simpleENV APPRISE_WORKER_COUNT=2ENV APPRISE_DEFAULT_THEME=light
# Create directories for persistent dataRUN mkdir -p /config /plugin /attach
# Expose the API portEXPOSE 8000
# The base image handles the CMDFROM caronc/apprise:latest
# Set labelsLABEL name="apprise-api" \ description="Apprise Push Notification API Gateway" \ maintainer="Your Name"
# Environment configurationENV APPRISE_STATEFUL_MODE=simpleENV APPRISE_WORKER_COUNT=2ENV APPRISE_DEFAULT_THEME=lightENV APPRISE_ATTACH_SIZE=50ENV APPRISE_CONFIG_LOCK=noENV LOG_LEVEL=INFO
# Create directoriesRUN mkdir -p /config /plugin /attach
# Set proper permissionsRUN chown -R 1000:1000 /config /plugin /attach
# Expose the API portEXPOSE 8000Apprise API supports extensive configuration through environment variables:
| Variable | Description | Default |
|---|---|---|
APPRISE_STATEFUL_MODE | Storage mode: simple, hash, or disabled | hash |
APPRISE_WORKER_COUNT | Number of Gunicorn workers | (2 * CPUs) + 1 |
APPRISE_DEFAULT_THEME | Web UI theme: light or dark | light |
APPRISE_DEFAULT_CONFIG_ID | Default configuration key | apprise |
| Variable | Description | Default |
|---|---|---|
APPRISE_CONFIG_DIR | Configuration storage path | /config |
APPRISE_ATTACH_DIR | Attachment storage path | /attach |
APPRISE_ATTACH_SIZE | Max attachment size in MB | 200 |
APPRISE_PLUGIN_PATHS | Custom plugin directories | /plugin |
| Variable | Description | Default |
|---|---|---|
APPRISE_CONFIG_LOCK | Lock configuration (read-only mode) | no |
SECRET_KEY | Django secret key for hashing | Auto-generated |
ALLOWED_HOSTS | Allowed host headers | * |
APPRISE_DENY_SERVICES | Comma-separated services to block | windows,dbus,gnome,macosx,syslog |
| Variable | Description | Default |
|---|---|---|
APPRISE_STATELESS_URLS | Default URLs for stateless /notify calls | None |
Test your Apprise API setup locally before deploying to Klutch.sh:
Create a docker-compose.yml for local development:
version: '3.8'
services: apprise: image: caronc/apprise:latest container_name: apprise ports: - "8000:8000" environment: - APPRISE_STATEFUL_MODE=simple - APPRISE_WORKER_COUNT=1 - APPRISE_DEFAULT_THEME=light volumes: - ./config:/config - ./plugin:/plugin - ./attach:/attach restart: unless-stopped# Create directoriesmkdir -p config plugin attach
# Start the containerdocker compose up -d
# Check the logsdocker compose logs -f apprise
# Test the APIcurl http://localhost:8000/statusVisit http://localhost:8000 to access the web-based Configuration Manager.
Push your code to GitHub
Initialize a Git repository and push to GitHub:
cd apprise-servergit initgit add .git commit -m "Initial Apprise API setup"git remote add origin https://github.com/yourusername/apprise-server.gitgit push -u origin mainCreate a new project on Klutch.sh
Navigate to klutch.sh/app and create a new project. Give your project a descriptive name like “apprise-api” or “notification-gateway”.
Connect your GitHub repository
Select GitHub as your git source and authorize Klutch.sh to access your repositories. Select the repository containing your Apprise API project.
Configure the deployment
Klutch.sh will automatically detect your Dockerfile. Configure the following settings:
Configure environment variables
Add the following environment variables in the Klutch.sh dashboard:
| Variable | Value |
|---|---|
APPRISE_STATEFUL_MODE | simple |
APPRISE_WORKER_COUNT | 2 |
APPRISE_DEFAULT_THEME | light |
Optional: Add APPRISE_STATELESS_URLS if you want default notification targets:
APPRISE_STATELESS_URLS=slack://tokenA/tokenB/tokenC,discord://webhook_id/webhook_tokenAdd persistent volumes
To persist your notification configurations across deployments, add a persistent volume:
/configOptionally, add another volume for attachments:
/attachDeploy your application
Click the deploy button to start the build process. Klutch.sh will:
Access your Apprise API
Once deployed, your Apprise API will be available at:
https://your-app-name.klutch.shThe Configuration Manager web UI is accessible at the root URL. The API endpoints are:
GET /status - Health checkPOST /notify/ - Stateless notificationsPOST /notify/{KEY} - Stateful notificationsPOST /add/{KEY} - Save configurationGET /get/{KEY} - Retrieve configurationPOST /del/{KEY} - Delete configuration# Check API statuscurl https://your-app-name.klutch.sh/status
# JSON responsecurl -H "Accept: application/json" https://your-app-name.klutch.sh/statusSend notifications without saving configuration:
# Send to Slackcurl -X POST \ -d "urls=slack://tokenA/tokenB/tokenC" \ -d "title=Server Alert" \ -d "body=CPU usage is at 95%" \ -d "type=warning" \ https://your-app-name.klutch.sh/notify/
# Send to multiple servicescurl -X POST \ -d "urls=slack://tokenA/tokenB/tokenC,discord://webhook_id/webhook_token" \ -d "body=Deployment completed successfully" \ -d "type=success" \ https://your-app-name.klutch.sh/notify/
# Using JSONcurl -X POST \ -H "Content-Type: application/json" \ -d '{"urls":"tgram://bot_token/chat_id","title":"Alert","body":"Test message"}' \ https://your-app-name.klutch.sh/notify/Save configurations and reuse them:
# Save a configurationcurl -X POST \ -d "urls=slack://tokenA/tokenB/tokenC,discord://webhook_id/webhook_token" \ https://your-app-name.klutch.sh/add/devteam
# Send notification using saved configcurl -X POST \ -d "title=Build Failed" \ -d "body=Pipeline #1234 failed on staging" \ -d "type=failure" \ https://your-app-name.klutch.sh/notify/devteam
# Retrieve configurationcurl https://your-app-name.klutch.sh/get/devteam
# Delete configurationcurl -X POST https://your-app-name.klutch.sh/del/devteamTags allow you to target specific notification services:
# Save configuration with tags (YAML format)curl -X POST \ -d 'config=urls: - slack://tokenA/tokenB/tokenC: - tag: devops - tag: urgent - discord://webhook_id/webhook_token: - tag: devops - mailto://user:pass@gmail.com: - tag: management' \ -d "format=yaml" \ https://your-app-name.klutch.sh/add/myconfig
# Notify only devops tagcurl -X POST \ -d "tag=devops" \ -d "body=Server maintenance starting" \ https://your-app-name.klutch.sh/notify/myconfig
# Notify devops AND urgent (space = AND)curl -X POST \ -d "tag=devops urgent" \ -d "body=Critical issue detected!" \ https://your-app-name.klutch.sh/notify/myconfig# Send notification with attachmentcurl -X POST \ -F "urls=mailto://user:pass@gmail.com" \ -F "body=Please see the attached report" \ -F "attach=@/path/to/report.pdf" \ https://your-app-name.klutch.sh/notify/
# Multiple attachmentscurl -X POST \ -F "urls=slack://tokenA/tokenB/tokenC" \ -F "body=Latest screenshots" \ -F "attach1=@screenshot1.png" \ -F "attach2=@screenshot2.png" \ https://your-app-name.klutch.sh/notify/Here are some common notification URL formats:
# Slackslack://tokenA/tokenB/tokenCslack://botname@tokenA/tokenB/tokenC/#channel
# Discorddiscord://webhook_id/webhook_token
# Microsoft Teamsmsteams://TokenA/TokenB/TokenC
# Telegramtgram://bot_token/chat_id
# Matrixmatrixs://user:pass@hostname/#room# Generic SMTPmailto://user:pass@smtp.example.commailtos://user:pass@smtp.example.com:587
# Gmailmailto://user:app_password@gmail.com
# SendGridsendgrid://apikey:from_email/to_email# Pushoverpover://user_key@api_token
# Gotifygotify://hostname/token
# ntfyntfy://topicntfys://ntfy.sh/mytopic
# Pushbulletpbul://access_token# PagerDutypagerduty://integration_key@api_key
# Opsgenieopsgenie://api_key
# Apprise (recursive to another Apprise server)apprise://hostname/config_keyApprise API includes a built-in web UI for managing configurations:
Navigate to https://your-app-name.klutch.sh in your browser.
import requests
APPRISE_URL = "https://your-app-name.klutch.sh"
def send_notification(title, body, notification_type="info"): response = requests.post( f"{APPRISE_URL}/notify/devteam", json={ "title": title, "body": body, "type": notification_type # info, success, warning, failure } ) return response.status_code == 200
# Usagesend_notification("Deployment", "v2.0.0 deployed to production", "success")const axios = require('axios');
const APPRISE_URL = 'https://your-app-name.klutch.sh';
async function sendNotification(title, body, type = 'info') { try { const response = await axios.post(`${APPRISE_URL}/notify/devteam`, { title, body, type }); return response.status === 200; } catch (error) { console.error('Notification failed:', error.message); return false; }}
// UsagesendNotification('Alert', 'Database backup completed', 'success');#!/bin/bash
APPRISE_URL="https://your-app-name.klutch.sh"
send_alert() { local title="$1" local body="$2" local type="${3:-info}"
curl -s -X POST \ -d "title=${title}" \ -d "body=${body}" \ -d "type=${type}" \ "${APPRISE_URL}/notify/devteam"}
# Usage in scriptssend_alert "Backup Complete" "Daily backup finished successfully" "success"Use Apprise API as a webhook endpoint for other services:
# Generic webhook URLhttps://your-app-name.klutch.sh/notify/alerts?:payload=body&:subject=title
# The :param syntax remaps incoming fields to Apprise expected fieldsTo use a custom domain with your Apprise API:
Navigate to your project settings in the Klutch.sh dashboard
Add your custom domain (e.g., notify.yourdomain.com)
Configure DNS by adding a CNAME record pointing to your Klutch.sh app URL
Wait for SSL provisioning - Klutch.sh automatically provisions SSL certificates
Update your integrations to use the new domain:
curl -X POST \ -d "body=Test notification" \ https://notify.yourdomain.com/notify/devteamFor production, consider locking configurations to prevent modifications:
APPRISE_CONFIG_LOCK=yesThis makes all saved configurations read-only through the API.
Block potentially dangerous local services:
APPRISE_DENY_SERVICES=windows,dbus,gnome,macosx,syslog,fileRestrict which hosts can access the API:
ALLOWED_HOSTS=your-app-name.klutch.sh,notify.yourdomain.comProblem: Cannot connect to the Apprise API.
Solution: Verify the deployment is running and check the internal port is set to 8000:
# Test health endpointcurl https://your-app-name.klutch.sh/statusProblem: Notifications are not being delivered.
Solution:
curl -v -X POST \ -d "urls=slack://invalid/token" \ -d "body=test" \ https://your-app-name.klutch.sh/notify/Problem: Configurations are lost after redeployment.
Solution: Ensure you have a persistent volume mounted at /config:
/configProblem: Cannot write to config or attach directories.
Solution: Check the status endpoint for permission issues:
curl -H "Accept: application/json" https://your-app-name.klutch.sh/statusLook for CONFIG_PERMISSION_ISSUE or ATTACH_PERMISSION_ISSUE in the response.
Apprise API provides a /metrics endpoint for Prometheus:
scrape_configs: - job_name: 'apprise' static_configs: - targets: ['your-app-name.klutch.sh'] metrics_path: /metrics scheme: httpsYou’ve successfully deployed Apprise API on Klutch.sh! Your notification gateway now provides:
Apprise API simplifies notification management by providing a single, consistent interface to send alerts across all your communication channels—from Slack and Discord to email and SMS.