Apprise API, Ported to Go
- Go 99.5%
- Makefile 0.5%
| .forgejo/workflows | ||
| .github/workflows | ||
| internal | ||
| testdata | ||
| .gitignore | ||
| go.mod | ||
| go.sum | ||
| goreleaser.yml | ||
| LICENSE | ||
| main.go | ||
| Makefile | ||
| mise.toml | ||
| README.md | ||
| renovate.json | ||
Apprize
A drop-in, single-binary reimplementation of the caronc/apprise-api HTTP API in Go. Speaks the same stateless routes and response shapes as Apprise API swagger.yaml v1.5.0, backed by unraid/apprise-go for delivery — pure Go, no cgo, no Python runtime.
Quick start
Start the server:
docker run --rm -p 8000:8000 fogtype/apprize
Send a notification:
# ntfy - watch it land at https://ntfy.sh/apprize-demo
curl localhost:8000/notify \
-d 'urls=ntfys://apprize-demo' \
-d body=hello
# email - needs real SMTP credentials
curl localhost:8000/notify \
-d 'urls=mailtos://user:pass@gmail.com' \
-d body=hello
Install
# Docker
docker run --rm -p 8000:8000 fogtype/apprize
# Podman
podman run --rm -p 8000:8000 fogtype/apprize
# Go
go install git.fogtype.com/nebel/apprize@latest
apprize --bind :8000
# Build from source
git clone https://git.fogtype.com/nebel/apprize
cd apprize
go build
./apprize --bind :8000
Docker Compose
# compose.yml
services:
apprize:
image: fogtype/apprize
restart: unless-stopped
ports:
- "8000:8000"
docker compose up -d
Configuration
Flags override environment variables. Names use the APPRIZE_ prefix; the
upstream HTTP_PORT is also honoured for the listen port.
| Env | Flag | Default | Purpose |
|---|---|---|---|
APPRIZE_BIND (or HTTP_PORT) |
--bind |
:8000 |
Listen address |
APPRIZE_API_KEY |
--api-key |
(none) | Enables simple auth only when set |
APPRIZE_STATELESS_URLS |
— | (none) | Default URLs for POST /notify |
APPRIZE_RECURSION_MAX |
— | 1 |
Inbound recursion limit |
APPRIZE_DENY_SERVICES |
— | (none) | Schemas to reject (comma/space separated) |
APPRIZE_ALLOW_SERVICES |
— | (none) | Allow-list of schemas (exclusive when set) |
API
| Method & path | Purpose |
|---|---|
GET /status |
Server status |
GET /details |
Version and supported schemas |
POST /notify |
Stateless notification |
Limitations
apprize intentionally diverges from upstream where apprise-go cannot match it, and omits the persistent-configuration half of the API entirely:
- No persistent config endpoints —
/add,/del,/get,/cfg,POST /notify/{key}, andGET /json/urls/{key}are not implemented. There is no storage layer; the server is fully stateless. - Attachments are not delivered — accepted then logged as unsupported;
/statusreportsattach_lock=true. - No recursion-header propagation — inbound
X-Apprise-Recursion-Countis enforced, but it is not injected into outbound requests. /detailsis simplified — returns supported schemas and version, not per-service templates.- No web UI — API only.
License
Acknowledgements
- caronc/apprise-api for the original API design and specification.
- unraid/apprise-go for the Go notification library.