Introduction
Apprise-compatible Rust library, CLI and HTTP server to send notifications to 150+ services via a single URL. It ships as a single static binary. Installing covers the binaries, the container image and building from source.
Send a notification
Each URL names a service and carries its credentials and options. Find the format of yours in the service list.
mercurio -t "Backup" -b "Finished in 42s" ntfy://my-topic "discord://ID/TOKEN"
# body from stdin
df -h / | mercurio -t "Disk usage" mailto://user:password@example.com
# advanced formatting
mercurio -n failure -i markdown -b "**db-1** is down" tgram://BOT_TOKEN/CHAT_ID
-n sets the type (info, success, warning, failure), which services
turn into colours, icons or priorities. -i declares the body’s markup;
mercurio converts it for each service (Formats).
mercurio check URL... validates URLs without sending. -d lists what
would be notified. The exit code is 0 sent, 1 failed, 2 usage error, 3
nothing matched the tags, 4 partly sent (Command line).
Use a configuration file
Without URLs on the command line, mercurio reads ~/.config/apprise/apprise.conf:
version: 1
urls:
- ntfy://my-topic
- mailto://user:password@example.com:
- to: oncall@example.com
tag: critical
- slack://xoxb-token/#ops:
tag: devops, critical
mercurio -b "untagged entries only" # ntfy
mercurio -g critical -b "page someone" # e-mail and Slack
mercurio -g all -d # list everything
See Configuration files for the TEXT and YAML formats, tags, includes and templates.
Use the library
#![allow(unused)]
fn main() {
use mercurio::{Mercurio, Message, NotifyType};
let mut m = Mercurio::new();
m.add("ntfy://my-topic")?;
m.add("slack://xoxb-token/#alerts")?;
let report = m.notify(&Message::new("Deploy finished").title("ci").kind(NotifyType::Success));
assert!(report.is_success());
Ok::<(), mercurio::Error>(())
}
notify blocks until every service has answered, the
Report lists each URL’s outcome. Services are sans-IO: they return a plan
of requests, so any transport (async, proxy, test double) can run them and
tests need no accounts. See Using the library.
Run the HTTP server
Mercurio ships an Apprise-compatible http server:
mercurio serve --bind 127.0.0.1:8000
curl -X POST -d 'urls=ntfy://my-topic' -d 'body=hello' http://127.0.0.1:8000/notify
See HTTP server.
How this book is organised
- User guide: the command line, URLs, configuration files, messages and the HTTP server. All of it applies to the library as well.
- Library: using mercurio from Rust. The API reference is rustdoc (api/mercurio in the published book).
- Services: one page per service: URL formats, every query parameter with its default, examples and known differences.
- Reference: Differences with Apprise.
Installing
Every GitHub release ships a prebuilt mercurio binary with support for every service.
Cargo
cargo binstall mercurio-cli
Container
In server mode:
docker run --rm -p 8000:8000 ghcr.io/alphajack/mercurio
Any other arguments go to the CLI:
docker run --rm ghcr.io/alphajack/mercurio -t "Backup" -b "Finished" ntfy://my-topic
Installer script
Linux and macOS:
curl -LsSf https://github.com/AlphaJack/mercurio/releases/latest/download/mercurio-cli-installer.sh | sh
Windows (PowerShell):
powershell -ExecutionPolicy Bypass -c "irm https://github.com/AlphaJack/mercurio/releases/latest/download/mercurio-cli-installer.ps1 | iex"
Both put mercurio in $CARGO_HOME/bin (~/.cargo/bin).
Archives and their .sha256 checksums are on the releases page.
AUR
The compiled binary and systemd unit can be installed from the Arch User Repository as mercurio-bin
Command line
mercurio --help:
Apprise-compatible Rust library, CLI and HTTP server to send notifications to 150+ services via a single URL.
Usage: mercurio [OPTIONS] [URL]... [COMMAND]
Commands:
services List the supported services
check Validate URLs or configuration; send nothing
serve Run the HTTP notification server
storage Show (`list`) or clean (`prune`, `clear`) the persistent storage
Arguments:
[URL]... Notification URLs
Options:
-b, --body <TEXT> Message body [default: read stdin]
-t, --title <TEXT> Message title
-n, --notification-type <TYPE> `info`, `success`, `warning` or `failure` [default: info]
-i, --input-format <FORMAT> Markup of the body: `text`, `html` or `markdown`
-a, --attach <PATH|URL> Attach a file: path, `file://`, `http(s)://` or `memory://` (repeatable)
-c, --config <PATH|URL> Load a TEXT or YAML configuration (repeatable)
-g, --tag <TAG> Notify services tagged TAG; `a,b` needs both, repeat for either, `all` notifies everything
--template-var <NAME=VALUE> Value for `${NAME}` in a YAML configuration (`-tv`, repeatable)
-R, --recursion-depth <N> Configuration `include` levels to follow [default: 1]
-e, --interpret-escapes Turn `\n`, `\r`, `\t` and `\\` in the title and body into the characters
-T, --theme <THEME> Image theme, the `{THEME}` of image URLs [default: default]
-j, --interpret-emojis Replace `:shortcode:` emoji in the title and body (a URL's `?emojis=no` still wins)
-d, --dry-run Show what would be notified; send nothing
--disable-async Notify services one after another (`-Da`)
-S, --storage-path <PATH> Persistent storage directory [env: APPRISE_STORAGE_PATH=] [default: ~/.local/share/mercurio/cache]
--storage-prune-days <N> `storage prune` removes files older than N days (`-SPD`) [env: APPRISE_STORAGE_PRUNE_DAYS=] [default: 30]
--storage-uid-length <N> Characters of the URL ids naming persistent storage, at least 2 (`-SUL`) [env: APPRISE_STORAGE_UID_LENGTH=] [default: 8]
--storage-mode <MODE> When persistent storage is written: `auto` (after each send), `flush` (also before each step) or `memory` (never) (`-SM`) [default: auto]
-l, --details Same as `mercurio services`
--json With `services`: print JSON
--bind <ADDR> With `serve`: address to listen on [default: 127.0.0.1:8000]
-v, --verbose... More log output on stderr (repeat for more)
-h, --help Print help
-V, --version Print version
Environment:
APPRISE_URLS URLs to notify when none are given and there is no -c
APPRISE_CONFIG_PATH configuration files instead of the defaults (separated by ; or newlines)
APPRISE_TEMPLATE_<NAME> value for ${NAME} when -tv and the configuration give none
Exit codes:
0 every selected service was notified (or -d, check, services, storage succeeded)
1 every selected service failed, or a source, attachment or stdin could not be read
2 usage error, or no URLs given or configured
3 services were loaded but none matched the tags (-g)
4 some services were notified and some failed
Default configuration files (.yaml instead of .conf for YAML):
~/.config/apprise/apprise.conf
/etc/apprise/apprise.conf
The short flags are the usual ones for notification tools: -t title,
-b body, -n type, -c configuration, -g tag. Compatibility notes are
in the README.
Sending
mercurio -t "Backup" -b "Finished in 42s" ntfy://my-topic "discord://ID/TOKEN"
echo "disk 91% full" | mercurio -n warning tgram://BOT_TOKEN/CHAT_ID
mercurio -c ~/alerts.yml -g devops -b "deploy done"
- Without
-b, the body is read from standard input until end of file. A dry run (-d) does not read it. - The title is optional. Services without a title field get it merged into the body (see Messages).
- All matching services are notified concurrently.
-Dasends one after another. - A word
sendbefore the URLs is accepted and ignored (mercurio send -b hi ntfy://topic).
Verbosity
Without -v only errors are printed; -v adds warnings
(skipped configuration entries, retries), -vv informational messages,
-vvv debug and -vvvv trace output. Log lines look like WARNING - ....
Where services come from
The first of these sources that gives anything is used; the rest are ignored:
- URLs on the command line. When
-cis also given, the URLs win and a warning is logged (visible with-v). -c / --configfiles and URLs.$APPRISE_URLS: URLs separated by commas or whitespace.- The default configuration files. Every one that exists is loaded.
Put a user configuration in ~/.config/apprise/apprise.conf and a
system-wide one in /etc/apprise/apprise.conf (.yaml for YAML), the
locations --help shows. For compatibility with older Apprise setups,
every one of these is read, in this order ({a,b} is each of a and b,
the empty entry meaning no extension):
~/.apprise{,.conf,.yml,.yaml}
~/.config/apprise{,.conf,.yml,.yaml}
~/.apprise/apprise{,.conf,.yml,.yaml}
~/.config/apprise/apprise{,.conf,.yml,.yaml}
/etc/apprise{,.yml,.yaml}
/etc/apprise/apprise{,.conf,.yml,.yaml}
On Windows they are Apprise\apprise{,.conf,.yml,.yaml} under
%APPDATA%, %LOCALAPPDATA%, %ALLUSERSPROFILE%, %PROGRAMFILES% and
%COMMONPROGRAMFILES%.
Directories are skipped. $APPRISE_CONFIG_PATH replaces the whole list
(paths separated by ; or newlines).
The format of each file (TEXT or YAML) is detected; see Configuration files.
Tags and dry run
-g selects configuration entries by tag (Tags); URLs
given on the command line are always notified without -g. With -g
they are filtered by their ?tag= values. -d loads every source, applies the tags
and prints what would be notified, without sending or reading a body:
$ mercurio -c alerts.yml -g all -d
1. json://localhost:9/...
tags: devops
2. ntfys://ntfy.sh/...
tags: critical, devops
3. gotify://${GOTIFY_HOST}/...
uid: - template; unresolved, would not send -
tags: home
template: gotify_host (required)
1 of 3 matched entries could not be resolved and would not be sent.
Sending to an unresolved entry fails it; entries that fail to load are
skipped with a warning (-v shows them). See Templates.
Output is redacted to the scheme and host. For services whose token sits in
the host position (tgram://BOT_TOKEN/...) the token is printed; do not
paste dry-run or storage output of such URLs in public places.
URL check
mercurio check parses every URL or configuration entry and prints one line per service
(ok ntfy:// (ntfy), error: ...), without applying tags. Exit code 1
when any URL or configuration source is invalid.
Available services
mercurio services lists the services compiled into the binary:
$ mercurio services
46elks 46elks:// elks://
800.com eight00com://
Africas Talking atalk://
...
--json prints details for each service.
Exit codes
The exit codes are listed at the end of --help above.
A URL that fails to parse is reported and skipped; the other URLs
are still notified. The exit code only counts them. Use check first
to catch typos.
Environment variables
The ones the command line reads are in --help above. APPRISE_CONFIG_DIR,
APPRISE_STATELESS_URLS and APPRISE_RECURSION_MAX are for
mercurio serve only, see HTTP server.
Notification URLs
Main idea:
scheme://[user[:password]@]host[:port][/path/token/target...][?key=value&...]
Notification URLs are not RFC 3986 URLs: tokens may contain :, / or
@. The path carries API keys and targets. The query string carries
options. Each service page lists the forms it accepts
and its parameters; the common parameters work on
every URL.
| Part | Meaning |
|---|---|
| Scheme | Selects the service, case-insensitive. A scheme ending in s (ntfys, jsons, mailtos) sets the secure flag, which most HTTP services turn into https://. |
user:password@ | Credentials or a token in the user position. Everything up to the first @ is the user part, split at the first :. |
| Host | A hostname or IP address; a token or ID for services that use the host position (discord://webhook_id/webhook_token). Only services that connect to the host check it (an invalid hostname or port was specified). |
| Port | Optional. Services that connect to the host reject a non-numeric port. |
| Path | Split on / (for some services also on spaces, commas and \) into tokens and targets. Repeated slashes collapse. /#name is a literal # (Slack, Discord or IRC channels), not a fragment. |
| Query | Options. Keys are lower-cased and trimmed, values percent-decoded and trimmed. A repeated key keeps the last value. |
Special characters
Percent-encode @ (%40), : (%3A), / (%2F), ? (%3F), &
(%26), # (%23), % (%25) and space (%20) inside a password,
token or target. json://user:p%40ss%2Fword@example.com/hook has the
password p@ss/word. A + in a query value stays a + (%2B works too).
YAML settings written under the URL (user:, password:, to:) need no
encoding; the loader encodes them.
?user= and ?pass= (or ?password=) replace the credentials written
before @. With ?user= alone, the value before @ becomes the password.
Prefixed parameters: +, - and :
Three query prefixes pass free-form data to services that read them (the
custom json://, form:// and xml:// services and some others; their
pages say which):
| Prefix | Example | Meaning for json:// |
|---|---|---|
+ | ?+X-Token=abc | add or replace an HTTP header (case kept) |
- | ?-page=2 | add a query parameter to the request URL |
: | ?:message=text | rename the payload field message to text; an empty value (?:type=) removes it; an unknown key adds it |
mercurio -b "hi" "json://localhost:8080/hook?+X-Token=abc&:message=text&:type="
form:// and xml:// differ in details (xml:// has no - parameters).
Other services use : for template tokens or extra fields. For attachment
URLs, + entries are headers only.
Vendor URLs
31 services accept the URL the vendor gives you, among them Discord, Slack, Power Automate workflows, Mattermost, Google Chat, Matrix, ntfy, Zoom, Splunk, IFTTT and Webex Teams. When the scheme is not a known service, each service’s vendor URL parser is tried in turn. The “Vendor URLs accepted” row of a service page says whether it does.
mercurio -b "hi" "https://discord.com/api/webhooks/1234567890/abcdefghijkl"
Validating URLs and secrets
mercurio check URL... parses URLs without sending; each invalid URL
prints the reason and makes the exit code 1:
$ mercurio check "json://localhost/x" "unknown://x" "discord://only"
error: unknown://x/...: unsupported URL scheme: unknown://
error: discord://only/...: Discord: an invalid Discord Webhook Token was specified
ok json:// (JSON)
Log lines, errors, check and --dry-run output show only the scheme and
host (json://localhost:8080/...); a token in the host position
(tgram://BOT_TOKEN/...) is therefore printed. In the library,
Debug output of parsed URLs is redacted the same way. mercurio::redact_url gives the
redacted form for your own logs.
Common URL parameters
These query parameters work on every URL. Service-specific parameters are on each service page. In YAML configuration they can also be written as settings under the URL.
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
format | Body format the service receives | choice | one of text, html, markdown; default: the service’s own | |
overflow | What to do with messages over the service’s limits | choice | upstream | one of upstream, truncate, split |
verify | Verify TLS certificates | bool | yes | |
redirect | Follow HTTP redirects | bool | yes | |
cto | Connect timeout, in seconds | float | 5 | |
rto | Read timeout, in seconds | float | 30 | |
retry | Extra attempts after a retryable failure | int, 0 to 10 | 0 | |
wait | Pause before each retry, in seconds | float, 0 to 20 | 0.5 | |
store | Use the persistent store on disk | bool | yes | |
tag | Tags for --tag filtering | list | separated by , or space | |
tz | Time zone name | string | an unknown zone rejects the URL; e-mail and syslog dates use it | |
user | User name; replaces the one in the URL | string | ||
password | Password; replaces the one in the URL | string | also pass; secret | |
port | Port; replaces the one in the URL | int, 1 to 65535 | ||
optional | Optional | bool | no | accepted, no effect |
emojis | Replace :shortcode: emoji | bool | no | unless the asset turns them off |
Boolean values accept yes, true, on, 1, enable, allow and their
opposites (no, false, off, 0, disable, deny, never),
case-insensitive.
format
The caller declares the input format (mercurio -i markdown,
Message::format); mercurio converts it to the service format. A service
with one format uses ?format= if given, else its default. A service with
several formats uses ?format= if it supports it, else the input format if
it supports that, else its default (the first one on its page). See
Formats and conversion.
verify, redirect, cto, rto
?verify=no disables certificate checks for that URL (self-signed
servers); attachment URLs and HTTP configuration URLs accept it too. To
trust a private CA instead, point SSL_CERT_FILE (or REQUESTS_CA_BUNDLE)
at a PEM bundle: it replaces the bundled Mozilla roots for every
connection, HTTP and socket services alike. The bundle is read once, at the
first TLS connection; restart mercurio serve (or your program) after
changing it.
Timeouts are decimal seconds (?cto=2.5). A value that is not a number
greater than zero falls back to the default.
retry and wait
mercurio -b "disk full" "ntfy://alerts?retry=3&wait=2"
retry above 10 is capped and wait is clamped to 0–20 s. mercurio only
repeats an attempt when repeating cannot deliver the message twice. Every
error has an ErrorClass (mercurio::Error::class()):
| Class | Comes from | Retried |
|---|---|---|
RateLimited { retry_after } | HTTP 429; HTTP 503 with Retry-After | yes, after max(wait, Retry-After) |
Transient | HTTP 408 and 5xx; DNS and connect failures (nothing was sent) | yes, after wait |
Auth | HTTP 401, 403 | no |
InvalidTarget | other 4xx; URL, configuration and message errors | no |
Unknown | timeouts or resets after the request was sent, failures the service reported, unexpected statuses | no |
- An attempt with several errors (one per target) is retried only when
every error is
RateLimitedorTransient. - Services that make several requests name the failing step first
(
login: HTTP 500: server error); the class is that of the underlying error. Retry-Afteris read as seconds or as an IMF-fixdate HTTP date. Longer thanmercurio::service::MAX_RETRY_AFTER(300 s) ends the retries instead of blocking. A 429 without it waitswait; Discord uses itsX-RateLimit-Resetinstead.- Targets and pieces of a split message that an earlier attempt delivered are skipped and reported as delivered. Some services track finer state (Slack channel ids and uploads, Matrix rooms, HumHub post ids, Opsgenie and Jira batches). This tracking lasts one notification and is not written to disk.
-vlogs each retry (WARNING - ntfy: attempt 1/4 failed; trying again). In the library each attempt is inReportEntry::attempts.
store
?store=no keeps that URL’s state (login tokens, lookups, sessions) in
memory, for as long as the target lives, even when a storage path is set.
tag
?tag=a,b tags a URL given on the command line, in APPRISE_URLS or in
the library, so --tag / TagFilter can select it like a configuration
entry. In a configuration file the values are added to the entry’s tags.
mercurio -g ops -b "on call" "ntfy://ops-alerts?tag=ops" "ntfy://everyone" # only the first
Configuration files
A configuration file lists notification URLs once, with tags, so commands
and programs only say which group to notify. Two formats share tags,
include, groups and (YAML only) ${NAME} templates:
| Format | Use it for |
|---|---|
| TEXT | one URL per line, optional tags |
| YAML | settings per URL, one URL expanded into several services, file-wide tags, asset overrides, templates |
# ~/.config/apprise/apprise.yml
version: 1
urls:
- ntfys://ntfy.example.com/alerts:
tag: devops
- mailtos://user:pass@example.com:
to: oncall@example.com
tag: devops, critical
# the same in TEXT: ~/.config/apprise/apprise.conf
devops=ntfys://ntfy.example.com/alerts
devops, critical=mailtos://user:pass@example.com?to=oncall@example.com
mercurio -g critical -b "Disk full"
The command line reads the default files
when no URL, -c or APPRISE_URLS is given.
Sources
-c (repeatable) and include accept:
| Source | Example | Format |
|---|---|---|
| local path | ~/alerts.yml, ./alerts.conf | YAML when the name ends in .yml or .yaml, TEXT otherwise |
file:// URL | file:///etc/alerts?format=yaml | as above; ?format=text or ?format=yaml forces one |
http://, https:// | https://config.example.com/get/team | YAML for Content-Type text/yaml, text/x-yaml, application/yaml, application/x-yaml, TEXT otherwise; ?format= forces one |
~ is expanded in paths. On a bare path ?format= becomes part of the
file name. HTTP sources are fetched with POST; user:pass@ becomes Basic
authentication, ?+Header=value adds a header and ?verify=no disables
certificate checks.
Checking a configuration
mercurio check -c FILE loads the file and prints one line per service.
The loader keeps the valid entries of a file and drops invalid ones with a
warning, so a service that seems to be missing is explained by -v:
$ mercurio check -v -c alerts.yml
WARNING - Could not load URL discord://only-a-token/... (YAML entry #3, item #1): Discord: an invalid Discord Webhook Token was specified
ok ntfys:// (ntfy) (template: host, topic)
ok json:// (JSON) (template: topic)
mercurio -d -c FILE -g TAG applies the tag filter and template values and
lists what would be notified, with each entry’s tags.
Limits
- A source larger than 128 KiB is rejected, includes too.
- Files must be UTF-8.
- A file that fails to parse as a whole (invalid YAML, a TEXT line that matches no rule) yields no services; the error is logged.
The same loader is mercurio::Config and Mercurio::add_config in the
library.
TEXT format
One entry per line:
# Lines starting with # or ; are comments
; this too
# Untagged: notified when mercurio runs without --tag
json://localhost:8080/untagged
# One or more tags before '=' (separated by commas and/or spaces)
devops=ntfy://ntfy.example.com/alerts
devops, critical=mailtos://user:pass@example.com?to=oncall@example.com
family kitchen=kodi://user:pass@kitchen.local
# Groups: name = tags (a group may contain other groups)
team = devops, family
everyone = team, critical
include /etc/apprise/extra.conf
| Line | Meaning |
|---|---|
empty, # ..., ; ... | ignored |
URL or =URL | a service without tags |
tags=URL | a service with tags, separated by commas and/or spaces |
group = tag, tag | a tag group (no :// on the right-hand side) |
include SOURCE | another configuration source, see Includes |
- A URL starts with a scheme of 1 to 32 letters or digits followed by
://; the rest of the line, trimmed, is the URL. Line endings may be\nor\r\n. - Tags are letters, digits,
_,-and:, lower-cased. A trailing:N(a retry count,ops:3) rejects the tag and its line’s URL with a warning; use?retry=3. A leadingN:(2:ops) is a priority. - One line that matches no rule invalidates the whole file
(
ERROR - Invalid TEXT configuration format found on line 2.). - A URL that does not parse or that its service rejects is skipped with a warning; the other lines still load.
Groups
name = tag1, tag2 gives every entry carrying tag1 or tag2 the extra
tag name. Groups may name groups (expanded recursively). A group listed
twice adds to its members. Group lines can appear anywhere. With the
example above mercurio -d -c alerts.txt -g team selects the ntfy, mailtos
and kodi entries, each with team and everyone among its tags. See
Tags.
What TEXT cannot express
Every service setting fits in the URL’s query string, so TEXT can configure
every service. It lacks YAML’s settings written outside the URL (no
percent-encoding), one URL expanded into several services, file-wide tags,
asset: overrides and ${NAME} templates.
YAML format
YAML adds what one-line URLs cannot express: settings written next to the
URL, several services from one URL, file-wide tags, asset overrides and
${NAME} templates.
version: 1
# Tags added to every URL in this file
tag: home
asset:
app_id: Backup Bot
groups:
oncall: devops, critical
urls:
# A plain URL
- json://localhost:8080/plain
# A URL with settings: each key becomes ?key=value
- ntfys://ntfy.example.com/alerts:
tag: devops
priority: high
format: markdown
# A list under one URL creates one service per entry
- mailtos://user:pass@example.com:
- to: oncall@example.com
tag: critical
- to: boss@example.com
tag: always
name: Backup Bot
# Header and payload groups
- json://localhost:8080/hook:
tag: devops
headers:
X-Token: abc123
payload:
message: text
Top-level keys
| Key | Required | Meaning |
|---|---|---|
version | no | Must be 1 (or 1.0) when present. Any other value rejects the file. |
urls | yes | The list of services. |
tag / tags | no | Tags added to every entry of this file (a string with commas or spaces, or a list). tag wins when both are present. |
groups | no | Tag groups, see below. |
include | no | Other configuration sources, a string or a list. See Includes. |
template | no | ${NAME} variables. See Templates. |
asset | no | Application identity and storage settings. See Asset overrides. |
Other top-level keys are ignored, which makes them a convenient place for YAML anchors (see Anchors).
A file-wide tag: tags every entry, so nothing in that file is notified
when mercurio runs without --tag (only untagged entries are). The example
above prints no URLs matched the given tags (exit code 3) without
-g.
The urls list
Each item is a URL string, a URL with a mapping of settings (one service) or a URL with a list of mappings (one service per item, each with its own settings: one account, several recipients). A URL with nothing after the colon is the plain string form.
How settings are applied
Settings are folded into the URL’s query string, so any parameter of a service page or the common parameters can be written as a setting.
| Setting | Becomes |
|---|---|
key: value | ?key=value (value percent-encoded for you) |
key: true / key: false | ?key=yes / ?key=no |
key: [a, b] | ?key=a,b |
key: ~ (null) | nothing |
tag / tags | the entry’s tags (not a query parameter) |
user, password (or pass), host, port | replace those parts of the URL; special characters are encoded for you |
+Name: value, -name: value, :name: value | the prefixed query parameters (?+Name=value, …) |
headers: {Name: value} | ?+Name=value for each entry |
params: {name: value} | ?-name=value for each entry |
payload: {name: value} | ?:name=value for each entry |
schema | ignored |
asset | ignored (it is a top-level key) |
Rules:
- A setting overrides the same parameter written in the URL.
- Writing any
+setting (orheaders:) replaces all the URL’s own+parameters; the same holds for-(params:) and:(payload:). userandpasswordalso replace?user=/?pass=in the URL.- Keys must start with a letter or digit (or one of the prefixes). Other keys are ignored with a warning. So is a mapping given as the value of an ordinary key.
Because the loader encodes values, credentials with @, / or : need
no escaping. Settings can also complete a URL that does not parse on its own:
urls:
- json://:
host: localhost
port: 8080
user: bob
password: "p@ss/word"
Groups
groups:
oncall: devops, critical
everyone: [oncall, family] # groups can contain groups
A list of single-key mappings works too. Naming a group again adds to it. See Tags.
Anchors, aliases and merge keys
Anchors (&name), aliases (*name) and merge keys (<<) work as in
YAML 1.1. Merged keys come first and the mapping’s own keys override them.
version: 1
defaults: &defaults
tag: ops
format: markdown
urls:
- json://localhost/hook:
<<: *defaults
headers:
X-Token: abc
- ntfy://alerts:
<<: *defaults
priority: high
Scalars
Values are read with YAML 1.1 rules:
yes,no,on,off,true,falseare booleans (and becomeyes/noin the URL). Quote them to keep them as text.- Octal (
0755), hex (0x1F), binary and sexagesimal (1:30) integers are numbers. Quote values such as phone numbers or IDs with leading zeros:to: "0711234567". ~andnullare null.
Tags
| Where | Syntax |
|---|---|
| TEXT file | devops, critical=ntfy://alerts (commas and/or spaces before =) |
| YAML, one entry | tag: devops, critical or tag: [devops, critical] under the URL |
| YAML, every entry | top-level tag: home |
| Groups | TEXT oncall = devops, critical; YAML groups: |
| Any URL | ?tag=devops,critical (mercurio extension) |
| Library | ?tag= or Target::with_tags(...) before Mercurio::push |
Tags are case-insensitive (stored lower-cased), made of letters, digits,
_ and -; duplicates are removed. In a configuration file, ?tag= values
are added to the entry’s tags.
Selecting services on the command line
| Command | Notifies |
|---|---|
no -g | only services without tags; every URL given on the command line |
-g devops | services tagged devops |
-g "devops,critical" or -g "devops critical" | services tagged devops and critical |
-g devops -g critical | services tagged devops or critical |
-g "a,b" -g c | (a and b) or c |
-g all | every service, tagged or not |
allas a filter matches everything; do not use it as a tag name.- Services tagged
alwaysjoin every tagged run (any-g), not the run without-g. - When nothing matches, mercurio prints
no URLs matched the given tagsand exits with code 3. - The library’s
TagFilter::parse("a,b")and the HTTP server’stag=a,bmeanaorb; the server’stag=a bmeans both. See Using the library.
Groups
A group is a tag that stands for other tags (TEXT group = tag1, tag2,
YAML groups:). Every entry with a member tag also gets the group name,
so -g group selects them all. Groups may contain groups (expanded
recursively, loops ignored). Assigning to an existing group adds
members. mercurio -d shows each entry’s expanded tags:
version: 1
groups:
- oncall: devops, critical
- oncall: database
urls:
- json://localhost/a:
tag: database
- json://localhost/c:
tag: always
- json://localhost/d
$ mercurio -d -c tags.yml -g oncall
1. json://localhost/...
tags: database, oncall
2. json://localhost/...
tags: always
Priorities
A tag may carry a priority prefix, 2:ops (no prefix is priority 0, the
most urgent). A plain filter (-g ops) escalates, as in Apprise:
- The services matched through
opsare grouped by the priority of theiropstag. - The most urgent group is sent first. When all of it delivers, the others are not sent at all.
- When one of its services fails, the next group is sent, and so on.
- The call succeeds once a group delivers; the failures before it are
still reported (
ReportEntry::escalatedin the library).
Each single-tag alternative (-g ops -g db, tag=ops, db) is its own
chain: chains escalate independently and their groups go out together.
Services matched otherwise (an AND group such as -g "ops,eu", or
always) share one more chain. A filter with a priority (-g 2:ops)
matches only services whose ops tag has priority 2 and sends them all
at once, without escalation.
A filter’s retry suffix (-g ops:3) sets the number of retries of the
services it matches, instead of their ?retry= (at most 10). In
configuration files a tag with one (ops:3) is rejected.
Includes
A configuration can pull in other sources, to share services between machines or keep secrets in a file with tighter permissions.
include /etc/apprise/shared.yml
include secrets.conf
include https://config.example.com/get/team
critical=json://localhost:9000/local
version: 1
include: # or a single string
- /etc/apprise/shared.yml
- secrets.conf
urls:
- json://localhost:9000/local
Each included source has its own format, detected as for -c
(Sources). The including file’s services load first,
then each include’s, in the order written.
| Include | Resolved as |
|---|---|
relative/path.conf | relative to the including file’s directory (for HTTP sources: the current directory) |
/absolute/path.yml, ~/path | that file |
file:///path?format=yaml | that file, format forced |
http://..., https://... | fetched with POST, like -c |
memory:// and any other scheme are skipped with a warning.
Depth
Includes are followed to a limited depth, so loops end. Includes inside an included file count against the same depth.
| Caller | Default | Change it with |
|---|---|---|
| CLI | 1: the files you name and the files they include | -R N (-R 0 ignores include) |
| HTTP server | 1 | APPRISE_RECURSION_MAX |
| Library | 0: includes ignored | ConfigOptions { recursion: N, .. } |
Which source may include which
Local files may include anything. HTTP sources and in-memory sources
(library Config::from_text, configurations stored on the server) may only
include HTTP(S) sources, so a remote configuration server cannot make the
loader read local files. A forbidden include is skipped with a warning
(Including file:// based configuration is prohibited. Ignoring URL file:///...). The library can lift this with
ConfigOptions::insecure_includes; the CLI cannot.
Every included source has the same 128 KiB limit. Asset overrides from an included YAML file apply to all services of the load.
Templates
A YAML configuration can leave parts of its URLs open as ${NAME}
variables, filled when a notification is sent. In TEXT files ${NAME} is
plain text.
version: 1
template:
- host: ntfy.sh # has a default
- topic # required
urls:
- ntfys://${HOST}/${TOPIC}:
tag: alerts
- json://localhost:8080/${TOPIC}
mercurio -c tmpl.yml -g all -tv topic=backups -b "done"
APPRISE_TEMPLATE_TOPIC=backups mercurio -c tmpl.yml -g alerts -b "done"
Declaring variables
template: is a list (as above) or a mapping (topic: ~ for required,
host: ntfy.sh for a default).
- Names are 1 to 32 letters, digits or
_, case-insensitive:${host},${HOST}and-tv Host=...are the same variable. - A default is text, a number or a boolean.
- A name declared twice, an invalid name or an invalid default rejects the whole file.
- Only declared names are replaced; an undeclared
${OTHER}stays as written.
Where values come from
The first available value wins:
-tv NAME=VALUE(--template-var, repeatable),TemplateVarsin the library or the server request’stemplatefield.- The default in
template:. APPRISE_TEMPLATE_NAMEin the environment (the name in upper case).
An empty value counts as not given. A value may be at most 1,024
characters without control characters; the URL after substitution at most
8,192. -tv without =, with an invalid name or naming a variable twice
ends the command with exit code 2; the error shows the name, never the
value.
Pending entries
An entry with variables is parsed at load time and kept pending until a
notification supplies the values. check marks it
(ok json:// (JSON) (template: topic)). A dry run shows what is
missing:
$ mercurio -d -g all -c tmpl.yml
1. ntfys://${HOST}/...
uid: - template; unresolved, would not send -
tags: alerts
template: host (has default), topic (required)
2. json://localhost:8080/...
uid: - template; unresolved, would not send -
template: topic (required)
2 of 2 matched entries could not be resolved and would not be sent.
At send time an entry whose variables cannot all be resolved fails in the report; the others are sent.
Where variables may appear
Values go into the parsed URL field they were written in, after parsing. A
value in the host cannot add a path or a query. A / or @ in a value
does not change the URL’s structure. A host value may carry a port
(example.com:8080) when the URL has none.
| Position | Allowed |
|---|---|
| user, password, host, port, path, query values, settings under the URL | yes |
the scheme, tag / tags, a part the service’s parser discards | no: the entry is skipped with a warning |
Asset overrides
The asset is the application identity shared by all services: the name
sent as User-Agent and sender, the description and URL some services
show, the per-type images and where persistent state is kept. A YAML
configuration can override it (TEXT files cannot):
version: 1
asset:
app_id: Backup Bot
image_url_mask: https://img.example.com/{THEME}/{TYPE}-{XY}{EXTENSION}
storage_path: ~/.cache/backup-bot
urls:
- json://localhost:8080/hook
| Key | Default | Effect |
|---|---|---|
app_id | Mercurio | User-Agent and sender name for many services |
app_desc | Mercurio Notifications | longer description, used by some services |
app_url | https://github.com/AlphaJack/mercurio | link in footers and buttons |
theme | default | replaces {THEME} in the image masks |
image_url_mask | https://alphajack.github.io/mercurio/assets/icons/logo.png | per-type images: {TYPE}, {XY}, {THEME}, {EXTENSION} are replaced; empty disables them |
image_url_logo | https://alphajack.github.io/mercurio/assets/icons/logo.png | the logo; empty disables it |
default_extension | .png | replaces {EXTENSION} |
default_html_color | #888888 | colour when no type colour applies |
default_ascii_chars | [?] | marker when no type marker applies |
storage_path | none | persistent store directory (~ expanded); the CLI’s default is --storage-path |
image_path_mask | none | icon file for desktop notifiers, same placeholders; empty sends none. Default: the bundled icon |
pgp_autogen | yes | generate a PGP key pair in the storage folder when e-mail encryption needs one; default yes |
timezone (or tz) sets the zone of the dates services write (e-mail
Date:, syslog) for URLs without ?tz=: an IANA name, any case, or the
location alone (paris). An unknown zone is ignored with a warning
(Ignored invalid timezone "...").
Keys without effect
Accepted without effect: image_path_logo, encoding, async_mode, interpret_escapes, abort_on_chain_failure, pem_autogen, secure_logging, http_redirects, lang, language, timezone, tz.
Use -e, -Da or ?redirect=no for what some of them
control. Keys starting or ending with _ are ignored with a warning;
unknown keys (including interpret_emojis, storage_mode, storage_salt,
storage_idlen) and values of the wrong type are rejected with a warning
(WARNING - Invalid asset key "storage_mode"., visible with
mercurio check -v).
Scope
- The overrides apply to every service of that configuration and its includes; when several files of one load set a key, the last one read wins.
- They do not affect other
-csources or URLs on the command line. - They override the CLI’s
--storage-pathand the library’sAssetfor those services. They only take effect when they set at least one key from the table. - In the library,
Config::asset_for(&base)returns the asset a configuration applies on top ofbase.
Messages
A notification is a title, a body, a type, an optional input format and optional attachments. Each selected service gets its own copy shaped to its limits and markup.
| Part | CLI | HTTP server | Library |
|---|---|---|---|
| Body | -b TEXT or stdin | body | Message::new(body) |
| Title | -t TEXT | title | .title(..) |
| Type | -n info|success|warning|failure | type | .kind(NotifyType::..) |
| Input format | -i text|html|markdown | format | .format(NotifyFormat::..) |
| Attachments | -a PATH|URL | attach, multipart files | .attach(..), AttachmentSet |
A message needs a body or at least one attachment; a body-less message fails for services without attachment support.
| Type | Colour | ASCII marker |
|---|---|---|
info (default) | #3AA3E3 | [i] |
success | #3AA337 | [+] |
warning | #CACF29 | [~] |
failure | #A32037 | [!] |
Services use the type where they have a notion of it: embed colour,
icon images, priority or the type field of json://, form:// and
xml://. Colours, markers and image URLs come from the
asset. Services that send images honour ?image=no.
-e turns \n, \r, \t and \\ in the CLI’s title and body into the
characters they stand for (mercurio -e -b 'sda: 91%\nsdb: 40%' ...); other
escapes stay as written. The library does not decode escapes.
:shortcode: emoji (:rocket:, :+1:: GitHub’s gemoji names,
case-insensitive) become the emoji itself when emoji are on for a URL:
-j/--interpret-emojis(CLI),APPRISE_INTERPRET_EMOJIS=yes(server) orAsset::interpret_emojis = Some(true)(library) turn them on for every URL, unless a URL says?emojis=no;- without those, a URL can turn them on with
?emojis=yes; APPRISE_INTERPRET_EMOJIS=noorSome(false)turns them off everywhere.
Unknown names stay as written. The replacement happens before format conversion, in the title and the body.
The pipeline
Every service receives the message through the same steps:
- Format resolution: input format from the message, else
Asset::body_format, else none (passthrough); service format as in?format=. - Conversion of the body to the service format. The title is converted too when the service has no title field. Passthrough messages are not converted.
- Limits: the service’s limits or limits computed for this message (Matrix sizes them from the rendered content).
- Title merge: services without a title field (
title_maxlen0) get the title prepended:<b>title</b><br />for HTML,# titlefor Markdown,title\r\nfor text. - Line cap: services with a line limit keep the first N lines.
- Overflow:
upstream,truncateorsplit(Overflow). - Dialect conversion: services with their own markup convert each piece of a declared-format message; pieces that grow past the limit are split again (Formats).
- Attachments go with the first piece; with
overflow=truncateonly the first attachment is sent.
Services also see the original Message next to each piece (Telegram rich
templates build their payload from it). Target::plan runs the pipeline
for the first piece and returns the plan without sending.
Formats and conversion
The input format is what the caller says the body is written in (-i,
the server’s format field, Message::format). The service format is
what the service renders (its default or ?format=). When they differ,
mercurio converts the body. With no input format declared nothing is
converted: the body passes through as the service’s own format.
| Input | Meaning |
|---|---|
| none | passthrough: no conversion, no Markdown repair |
text | plain text; escaped when a service renders HTML or Markdown |
markdown | CommonMark (with GFM tables); rendered to HTML where needed |
html | HTML; reduced to text or Markdown where needed |
The CLI and the HTTP server declare none unless -i or format is given;
the library uses Message::format, else Asset::body_format.
Conversion table
| From \ To | text | html | markdown |
|---|---|---|---|
| text | unchanged | HTML-escaped, newlines become <br/> | syntax characters backslash-escaped |
| html | tags removed, block elements become line breaks, entities decoded | unchanged | converted to Markdown |
| markdown | unchanged (no converter) | rendered (CommonMark, GFM tables, soft breaks as <br />) | unchanged |
For services without a title field, the title is converted the same way and merged into the body (see the pipeline).
Service formats
Each service declares its formats, the first being its default; the
service pages list them under “Body formats”. Most services are text only;
e-mail and the mail APIs default to HTML; Slack, Google Chat, Webex Teams,
Rocket.Chat and others take Markdown. ?format= picks one
(resolution rules). Markdown input to a
text-only service is sent unchanged.
Dialects
Some services have their own markup and convert each piece after the
generic conversion (Notify::convert):
| Service | Dialect |
|---|---|
| Slack | Slack mrkdwn (*bold*, <url|text> links) |
| Google Chat | Google Chat text formatting |
| Telegram | Telegram HTML (reduced tag set) or MarkdownV1/V2 |
| Matrix | HTML (formatted_body); Slack-style text in Slack mode |
| Pushover | Pushover’s HTML subset |
| Signal API | Signal styled text ranges |
| Evolution API (WhatsApp) | WhatsApp formatting |
| KOOK | KMarkdown |
| Mastodon | Mastodon text |
Dialect conversion only runs for a declared input format. Because the
converted text can be longer, size limits are applied again: with
overflow=split the converted piece is re-split, with truncate it is
cut to fit.
Markdown rendering
Markdown is rendered with pulldown-cmark (CommonMark plus GFM tables);
HTML to text and HTML to Markdown use a small HTML tokenizer. When a split
cuts Markdown, mercurio repairs unclosed emphasis, code fences and link
syntax.
Overflow
Most services limit how long a title or body can be. ?overflow= on a
URL says what to do with a message that does not fit:
| Mode | Behaviour |
|---|---|
upstream (default) | send the whole message; the service enforces (or rejects) its own limit |
truncate | send one message with as much of the body as fits; drop the rest |
split | send the whole body as several messages, each within the limit, in order |
mercurio -b "$(cat build.log)" 'tgram://BOT_TOKEN/CHAT_ID?overflow=split'
mercurio -b "$(cat build.log)" 'ntfy://builds?overflow=truncate'
split can turn one long message into many. On SMS and other paid
channels every piece may be billed.
Limits
Each service has three limits, shown on its page:
| Limit | Meaning |
|---|---|
title_maxlen | longest title in characters; 0 means the service has no title field, so the title is merged into the body |
body_maxlen | longest body in characters |
body_max_line_count | lines kept from the body; 0 means unlimited (desktop notifications keep 2 to 10 lines) |
Limits count Unicode code points, not bytes. A few
services size their limit from the content (Matrix, after rendering HTML).
The line cap applies in every overflow mode, including upstream.
How truncate works
The title is cut to title_maxlen characters. The body is cut the way
split would cut it. Only the first piece is kept. Leading line
breaks and trailing whitespace of the result are removed. For Markdown a
trailing lone backslash, which would escape whatever the service appends,
is dropped. With truncate and several attachments only the first
attachment is sent.
How split works
The body is cut into pieces of at most body_maxlen characters, looking
for the best break before the limit, in this order:
- a newline;
- a space or tab;
- punctuation followed by whitespace;
- a hard cut at the limit.
For HTML it never cuts inside a tag or an entity; for Markdown it does not cut inside a link or an escape and repairs emphasis and code fences that a cut leaves open.
Only the first piece carries the title; the others are sent without one.
No [01/03] counters are added.
Services with a dialect convert each piece and split again if the converted text grew past the limit.
Attachments
Files can go with a notification to services that support them: e-mail,
Discord, Slack, Telegram, Matrix, Pushover, ntfy, the json://,
form:// and xml:// webhooks and many more. The
services index has an “Attachments” column and
every service page says yes or no. A service without attachment support
still gets the text of the message; a message with attachments but no body
fails for such a service.
Sources
| Source | Example |
|---|---|
| Local path | /var/log/backup.log, ./report.pdf |
file:// URL | file:///var/log/backup.log |
http://, https:// | https://example.com/report?id=7, https://user:pass@cam.local/snapshot.jpg |
memory:// | in-memory content (library); a URL only names it |
Remote files are downloaded through the notifier’s transport before
sending, so FakeTransport covers them in tests and a custom
transport applies to them. Credentials in the
URL authenticate the download; treat such URLs as secrets.
URL options
| Option | Meaning |
|---|---|
?name=report.pdf | file name the recipient sees (base name only) |
?mime=image/png | MIME type; must be a known type |
?cache=yes|no|SECONDS | how long a loaded copy is reused (default 600 s); no or 0 reloads every time |
?verify=no | (http) skip TLS certificate verification |
?cto=, ?rto= | (http) connect and read timeouts |
?+Header=value | (http) extra request header |
| anything else | (http) forwarded to the server as a query parameter |
Without ?name=, the name comes from the Content-Disposition header,
then the URL path, then mercurio-attachment.<ext> (the extension
guessed from the MIME type). Without ?mime=, the type comes from the
Content-Type header, then the file extension, then
application/octet-stream.
Size limit
Asset::attachment_max_size caps each attachment: 1000 MiB by default,
0 for no limit. The check uses the file size,
the Content-Length header and the downloaded body.
Command line
mercurio -t 'Nightly backup' -b 'See the log' \
-a /var/log/backup.log \
-a 'https://example.com/report?id=7&name=report.pdf' \
'mailto://user:pass@example.com'
-a is repeatable. A file that cannot be loaded is an error before
anything is sent.
The HTTP server accepts multipart file parts and attach
fields holding http(s):// URLs; a local path or file:// is rejected
with HTTP 400, so clients cannot read files on the server.
Library
Message::attach takes an in-memory Attachment (name, MIME type,
bytes). AttachmentSet parses the sources above and loads them:
#![allow(unused)]
fn main() {
use mercurio::testing::FakeTransport;
use mercurio::{attachment::AttachSource, AttachmentSet, Asset, Attachment, Message, transport::Response};
let fake = FakeTransport::new();
fake.respond_with(Response::new(200, "a,b\n1,2\n").with_header("Content-Type", "text/csv"));
let mut set = AttachmentSet::new();
set.add("https://example.com/export?id=7&name=readings.csv")?;
set.push(AttachSource::text("generated in memory", Some("notes.txt")))?;
let mut msg = Message::new("Nightly export")
.attach(Attachment::new("hello.bin", "application/octet-stream", vec![1, 2, 3]));
msg.attachments.extend(set.load(&fake, &Asset::default())?);
let names: Vec<&str> = msg.attachments.iter().map(|a| a.name.as_str()).collect();
assert_eq!(names, ["hello.bin", "readings.csv", "notes.txt"]);
assert_eq!(msg.attachments[1].mime, "text/csv");
// `name=` is an option, not part of the download URL.
assert_eq!(fake.requests()[0].url, "https://example.com/export?id=7");
Ok::<(), mercurio::Error>(())
}
Loading stops at the first failure.
When a message is split, the attachments go with the first piece; with
overflow=truncate only the first attachment is sent.
Persistent storage
Some services keep state between notifications (an OAuth token, a login session, a channel lookup) in a small key/value store per URL, so the next notification does not log in or look things up again:
| Service | What is stored | Kept for |
|---|---|---|
| Telegram | the bot owner (bot_owner) when no chat id is given | until removed |
| Opsgenie, Jira | request ids of open alerts | 60 days |
| Nextcloud | group member lookups | 1 day |
| SendPulse | access token | expires_in minus 10 s |
| access token | expires_in minus 300 s; dropped on token errors | |
| Office 365 | access token (memory only), sender from/name, rotated refresh token | token lifetime |
| Bluesky | resolved DID and service endpoint, session | session 3590 s |
| Mattermost | channel ids (c:<channel>) | 20 days |
| Vapid (Web Push) | generated key pair, subscriptions.json, retired (expired) endpoints | retired: 30 days |
| Matrix | login session, joined rooms, user lookups, end-to-end encryption keys (?keystore=DIR keeps this URL’s store under DIR) | until removed or expired |
| Reddit, RingCentral, Emby, Jellyfin | session or token | lifetime of the target (memory only) |
Other services write nothing to disk.
Where it lives
The command line uses persistent storage by default:
| Default | |
|---|---|
| Location | ~/.local/share/mercurio/cache (%APPDATA%/Mercurio/cache on Windows) |
| Override | -S PATH / --storage-path PATH, else $APPRISE_STORAGE_PATH |
| Prune age | 30 days; -SPD / --storage-prune-days or $APPRISE_STORAGE_PRUNE_DAYS |
Each URL gets a namespace directory named after its URL id:
<storage path>/<url id>/cache.json the entries of this namespace
<storage path>/<url id>/tmp/ staging area for atomic writes
<storage path>/<url id>/var/ service files (Vapid keys and subscriptions)
cache.json maps each key to {"v": value, "x": expiry} (the expiry
in Unix seconds or null). The file is read before a URL’s first
notification and rewritten when it changed, as the storage mode says
(--storage-mode / -SM, APPRISE_STORAGE_MODE for the server,
Asset::storage_mode in the library):
auto(default): once a notification is over;flush: also before each request or connection of a notification, so a send cut short keeps what it saved (a token from a login step);memory: never; the store lives in memory even with a storage path.
Directories are created
on the first write with mode 0700, files with 0600. Files are written
to tmp/ and renamed into place. A file that is not valid JSON is removed
with a warning. When no saved entry is left, cache.json is deleted.
Services can also keep a value in memory only (an access token, for example): such entries are never written and live as long as the target.
Without a storage path (the library default) every store is in memory.
So are the stores of URLs with ?store=no or of services that opt
out of URL ids.
URL ids
The namespace is named by a URL id: a SHA-256 hash of the parts that identify the account (scheme, user, password, host, port, path and the secure flag), cut to 8 hexadecimal characters by default. Two URLs that differ only in options share a namespace. Some services hash their own parts instead (for example only the bot token for Telegram).
--storage-uid-length N (-SUL, APPRISE_STORAGE_UID_LENGTH, at least
2; the server accepts 2 to 64) keeps N characters instead, which moves
every URL to a new namespace. In the library, Asset::storage_idlen (0
keeps all 64) and Asset::storage_salt (bytes hashed first) work like
Apprise’s storage_idlen and storage_salt, so the ids match Apprise’s
for the same settings.
?store=no keeps a URL’s store in memory even when a storage path is set.
mercurio storage
mercurio storage [list|prune|clear] [UID-prefix...|URL...] [-S PATH] [-c CONFIG] [-g TAG] [-d]
The action may be abbreviated (l, p, c); clean is accepted for
clear. list is the default.
list: URL ids of the configured services (from URLs on the command line,-c,$APPRISE_URLSor the default configuration files) next to what is on disk. Each row shows the size and a state:active(on disk and configured),unused(configured, nothing stored yet),stale(on disk, not configured; only shown when no-gis given).prune: remove store files not modified for-SPDdays (default 30).clear: remove every store file.
Arguments containing :// select URLs; other arguments are URL id
prefixes. -g restricts the action to tagged configuration entries. -d
shows what prune or clear would remove without removing it. Empty
namespace directories are removed after a prune.
$ mercurio storage -S /tmp/demo/store "json://localhost/hook?tag=ci"
1. e058d7a2 0.00B unused
- json://localhost/...
tags: ci
$ mercurio storage prune -d -S /tmp/demo/store
abcdef12: would remove /tmp/demo/store/abcdef12/cache.json
Prune and clear only remove mercurio’s own files; other files in a namespace directory are left alone.
In the library
Mercurio::new() keeps stores in memory. Give the Asset a storage path
to persist them:
#![allow(unused)]
fn main() {
use mercurio::{Asset, Mercurio};
let dir = std::env::temp_dir().join("mercurio-book-storage");
let mut m = Mercurio::new().asset(Asset::default().with_storage(&dir));
m.add("json://example.com/hook")?;
Ok::<(), mercurio::Error>(())
}
A YAML configuration can set the path under asset: (storage_path, a
mercurio extension, see Asset overrides). Each
ReportEntry carries the url_id of its target.
mercurio::store::PersistentStore is usable on its own; services read
their namespace as Context::store.
HTTP server
mercurio serve runs an HTTP notification API in the same binary. Clients
send a message to the URLs in the request (stateless) or to a
configuration stored on the server under a key (stateful). There is no web
UI.
mercurio serve # listens on 127.0.0.1:8000
mercurio serve --bind 0.0.0.0:8000 -v # all interfaces, warnings too
There is no TLS: bind to localhost or put a reverse proxy in front. Turn on authentication before exposing it. The install page has a container image and a systemd unit.
Settings
Every setting is a flag of mercurio serve and an environment variable
(named as in apprise-api); the flag wins. Boolean values are true when they
start with y, t, 1, e, a or +. --bind ADDR (default
127.0.0.1:8000) sets the listen address. From mercurio serve --help:
--config-dir <DIR> Where stored configurations are kept (relative to the working directory) [env: APPRISE_CONFIG_DIR=] [default: mercurio-config]
--stateful-mode <MODE> `hash`, `simple` or `disabled`: layout of stored configurations [env: APPRISE_STATEFUL_MODE=] [default: hash]
--secret-key <KEY> Salt of `hash` file names [default: built-in] [env: SECRET_KEY]
--stateless-mode <YES|NO> `no` refuses stateless `POST /notify` [env: APPRISE_STATELESS_MODE=] [default: yes]
--stateless-urls <URLS> URLs used by `POST /notify` when the request gives none [env: APPRISE_STATELESS_URLS]
--config-lock <YES|NO> Hide configuration content and management from everyone but the administrator [env: APPRISE_CONFIG_LOCK=] [default: no]
--admin <YES|NO> Offer the `GET /cfg` key list (`simple` mode only) [env: APPRISE_ADMIN=] [default: yes]
--config-max-length <KIB> Largest `config` accepted by `/add`, in KiB [env: APPRISE_CONFIG_MAX_LENGTH=] [default: 512]
--upload-max-memory-size <MIB> Upper bound of `--config-max-length`, in MiB [env: APPRISE_UPLOAD_MAX_MEMORY_SIZE=] [default: 3]
--recursion-max <N> `include` levels followed, and the highest `X-Apprise-Recursion-Count` accepted [env: APPRISE_RECURSION_MAX=] [default: 1]
--allow-templates <YES|NO> Honour `template:` sections and `${NAME}` markers [env: APPRISE_ALLOW_TEMPLATES=] [default: yes]
--default-format <FORMAT> `text`, `html` or `markdown` for requests without `format` [env: APPRISE_DEFAULT_FORMAT=]
--deny-services <LIST> Services that can not be used (one scheme names the whole service) [env: APPRISE_DENY_SERVICES=] [default: windows,dbus,gnome,macosx,syslog]
--allow-services <LIST> When set, the only services that can be used (the deny list is ignored) [env: APPRISE_ALLOW_SERVICES=]
--attach-size <MIB> Largest attachment in MiB; `0` turns attachments off [env: APPRISE_ATTACH_SIZE=] [default: 200]
--max-attachments <N> Attachments per request; `0` means no limit [env: APPRISE_MAX_ATTACHMENTS=] [default: 6]
--attach-allow-url <PATTERNS> Attachment URLs that may be downloaded [env: APPRISE_ATTACH_ALLOW_URL=] [default: *]
--attach-reject-url <PATTERNS> Attachment URLs that are always refused (checked first) [env: APPRISE_ATTACH_REJECT_URL=] [default: "127.0.* localhost*"]
--webhook-mapping-max-depth <N> Deepest nested path a `?:a.b=dest` mapping rule may read [env: APPRISE_WEBHOOK_MAPPING_MAX_DEPTH=] [default: 5]
--webhook-url <URL> `http(s)://` URL that receives the result of every notification [env: APPRISE_WEBHOOK_URL]
--storage-dir <DIR> Persistent storage for services (tokens, sessions) [default: CONFIG_DIR/store] [env: APPRISE_STORAGE_DIR=]
--storage-mode <MODE> `auto` or `flush` write to the storage directory; `memory` keeps nothing [env: APPRISE_STORAGE_MODE=] [default: auto]
--stateless-storage <YES|NO> Stateless sends use persistent storage too [env: APPRISE_STATELESS_STORAGE=] [default: no]
--log-level <LEVEL> Default detail of returned logs [env: LOG_LEVEL=] [default: INFO]
--log-format <FORMAT> Server log on stderr: `text`, or `json` for one JSON object per line [env: LOG_FORMAT=] [default: text] [possible values: text, json]
--http-redirects <YES|NO> `no` stops following HTTP redirects for URLs without `?redirect=` [env: APPRISE_HTTP_REDIRECTS=] [default: yes]
--prune-enabled <YES|NO> `no` turns off the daily clean-up of old persistent storage and unused logins [env: APPRISE_PRUNE_ENABLED=] [default: yes]
--prune-interval-seconds <N> Seconds between clean-ups (at least 2; the first runs at start-up) [env: APPRISE_PRUNE_INTERVAL_SECONDS=] [default: 86400]
--prune-timeout-seconds <N> Longest a clean-up may run, in seconds (kept below the interval) [env: APPRISE_PRUNE_TIMEOUT_SECONDS=] [default: 28800]
--auth-prune-seconds <N> Age in seconds after which a login without a configuration is removed [env: APPRISE_AUTH_PRUNE_SECONDS=] [default: 2592000]
--emojis <YES|NO> `yes` replaces `:shortcode:` emoji unless a URL says `?emojis=no` (also `-j`); `no` never does; unset lets each URL decide [env: APPRISE_INTERPRET_EMOJIS=]
--stream-worker-count <N> Live streams sending at the same time [env: APPRISE_STREAM_WORKER_COUNT=] [default: 4]
--worker-count <N> Workers: each takes 128 requests in progress at once, more get `503` [env: APPRISE_WORKER_COUNT=] [default: 4]
--worker-timeout <SECONDS> Seconds a request head, and each piece of its body, may take to arrive [env: APPRISE_WORKER_TIMEOUT=] [default: 30]
--stream-queue-size <N> Further live streams admitted; more get `503` [env: APPRISE_STREAM_QUEUE_SIZE=] [default: 8]
--auth-required <YES|NO> Turn on Basic Auth [env: APPRISE_AUTH_REQUIRED=] [default: no]
--user <NAME> Administrator user name (may be empty) [env: APPRISE_USER=]
--password <PASSWORD> Administrator password; enables the administrator login [env: APPRISE_PASSWORD]
--basic-auth-realm <REALM> Realm shown in login prompts [env: APPRISE_BASIC_AUTH_REALM=] [default: "Mercurio API"]
URL and host rules (APPRISE_ATTACH_*_URL) are separated by spaces or
commas. A rule is a host (*.example.com, cdn.net:8080), a URL with an
optional path prefix (https://example.com/files/, example.com/files/),
or internal for every address that is not public (loopback, private,
link-local). * matches any run of characters, ? one.
Limits: a request body up to APPRISE_ATTACH_SIZE plus 1 MiB (at least 8 MiB; 413
beyond), 256 MiB of request bodies
being read at once (a request is charged its Content-Length, 1 MiB when it
has none; more get 503 with Retry-After: 1), APPRISE_WORKER_COUNT times
128 requests in progress (512 by default; more get 503 with
Retry-After: 1). A request head, and each piece of a body, must arrive
within APPRISE_WORKER_TIMEOUT seconds (30 by default).
Request log
Every request is one line on stderr, with the fields that apply:
2026-10-20T13:53:41.630353Z INFO request: method="POST" route="/notify/{key}" status=424 duration_ms=35.555 remote=127.0.0.1 key="k1" apprise_id="chain-1" bytes_in=41 services=2 failed=1 error="One or more notification could not be sent" detail="skipped bogus://x/...: unsupported URL scheme: bogus://"
route is the matched path (absent for a 404), key the Config ID
used, services and failed count the services notified, error is the
message of an error answer and detail lists problems that did not fail
the request. A live stream logs stream=true; its results are not in the
line. A /status or /metrics request that succeeds (the container’s
health check, a metrics scrape) is not logged. -v adds warnings, -vv
everything at INFO, -vvv debug output.
--log-format json (LOG_FORMAT=json) writes one JSON object per line
instead, with the same fields as keys, for log collectors:
{"timestamp":"2026-10-20T13:53:41.630353Z","level":"INFO","method":"POST","route":"/notify/{key}","status":424,"duration_ms":"35.555","remote":"127.0.0.1","key":"k1","services":2,"failed":1,"error":"One or more notification could not be sent","target":"request"}
Endpoints
/status, /status/{key} GET health check: OK or the problems found (JSON with Accept: application/json)
/details GET supported services as JSON; ?all=yes includes disabled ones
/metrics GET request counters in the Prometheus text format
/notify POST stateless: send to the URLs in the request
/notify/{key} POST send through the stored configuration
/add/{key} POST store a configuration
/get/{key}, /cfg/{key} POST return the stored configuration
/del/{key} POST delete the stored configuration (and its login)
/move/{key} POST move a configuration and its login to the free key `to`
/json/urls/{key} GET the stored URLs, their tags and template names
/cfg GET the stored keys (simple mode)
/auth/{key} GET, POST, DELETE read, set or remove the key's login
Keys are 1 to 128 letters, digits, _ or -; a path with any other key is
404. Paths work with or without a trailing slash. A known path with the
wrong method returns 405 with an Allow header.
/details describes each service as Apprise’s details() does: URL
templates, tokens, args and kwargs, plus a setup_url that links to
its page in this book.
/add, /get, /del, /move, /json/urls and /auth also work without
the key in the path: send it in an X-Apprise-Config-ID header instead,
which keeps it out of access logs. The header wins over a key in the path;
an invalid header is 400.
Requests
Every POST accepts form fields (application/x-www-form-urlencoded), a JSON
object (Content-Type: application/json) or multipart/form-data (text
parts are fields, file parts attachments).
urls /notify, /add URLs separated by commas or whitespace; a JSON list works too
body notify message body; required unless there is an attachment
title notify message title
type notify info (default), success, warning, failure
format notify input format: text, html, markdown
tag, tags notify tag expression
template notify ${NAME} values: a JSON object, template[name]=value fields or NAME=VALUE strings
attach, attachment, attachments notify http(s):// URLs to download; in JSON also {url, filename} or {base64, filename} objects
config /add TEXT or YAML configuration
format /add text, yaml, or empty / auto to detect
to (JSON), from + to (form) /move destination key (form: also the source)
Plain text bodies
A notification can also be the whole request body. The content type sets
its format: text/plain, text/html or text/markdown; ?format= wins.
curl -X POST -H 'Content-Type: text/plain' -H 'X-Apprise-Tag: devops' \
--data-raw 'Deployment completed' http://127.0.0.1:8000/notify/demo
Headers
X-Apprise-Title the title
X-Apprise-Type the type
X-Apprise-Tag the tag expression
X-Apprise-Template template values as URL-encoded pairs (api_key=abc&room=ops)
X-Apprise-Config-ID the key, instead of the path (kept out of access logs)
X-Apprise-Log-Level detail of the returned logs: trace, debug, info, warning, error, critical
X-Apprise-Recursion-Count servers this call already went through; above --recursion-max is 406
X-Apprise-ID id of the call chain, passed on by apprise:// targets
When a field comes from several places, the first found wins: the payload,
then the header, then the query string (?title=, ?type=, ?format=,
?tag=). Header values must be ASCII.
Field mapping
Query parameters starting with : rename payload fields before they are
read, for senders that can not use these names:
| Rule | Effect |
|---|---|
?:subject=title | the subject field becomes title |
?:debug= | the debug field is removed |
?:type=warning | type is set to warning |
?:event.items[0].text=body | a nested value (dots and [index], at most 5 steps) becomes body; a missing path is 400 |
curl -X POST -H 'Content-Type: application/json' \
-d '{"subject": "CPU", "event": {"state": "critical"}}' \
'http://127.0.0.1:8000/notify/demo?:subject=title&:event.state=body'
Alertmanager and Grafana webhooks
A JSON payload with an alerts list and a status, and no body, is read
as an Alertmanager or Grafana webhook, so either can post straight to
/notify/{key} (or to /notify with urls):
| Field | From |
|---|---|
title | Grafana’s title; otherwise Alertmanager’s default subject, e.g. [FIRING:2] HighCPU (prod critical) |
body | Grafana’s message; otherwise one line per alert, [FIRING] name: summary, with the description below it |
type | success once resolved; while firing, the highest severity label: critical, error or page give failure, info gives info, anything else warning |
A type (or title, body) in the payload, the query or an X-Apprise-*
header still wins, and ?tag= picks the stored entries as usual:
# alertmanager.yml
receivers:
- name: mercurio
webhook_configs:
- url: http://127.0.0.1:8000/notify/ops?tag=oncall
Tags
tag | Notifies |
|---|---|
| absent | stored configuration: entries without tags; stateless: everything |
devops | entries tagged devops |
devops critical (also &, +) | entries tagged both |
dev, qa (also |) | entries tagged dev or qa |
leaders teamA, leaders teamB | (leaders and teamA) or (leaders and teamB) |
all | everything |
Entries tagged always are included whenever a tag is given. A JSON list is
a list of alternatives; a nested list is an AND group. Characters other than
letters, digits, _, -, : and the separators are 400.
Attachments
Multipart file parts become attachments (type from the part, else the file
name). URLs are downloaded by the server after the URL rules allow them;
anything that is not http(s):// (a server-local path, file://) is
refused, so clients can never read files on the server. Any problem with an
attachment is 400 Bad Attachment (the reason is logged).
Responses
The response format follows Accept, and, without one (or with */*), the
request’s content type:
- JSON (
application/json): errors are{"error": "..."}; successes of/add,/del,/moveare{"error": null}; - otherwise plain text.
Notifications answer with their log: the library’s own lines for this
request (DEBUG - -> HTTP 200, WARNING - ..., URLs redacted) and one line
per service (2026-10-17 12:00:00,000 - INFO - Sent json:// (JSON) notification.),
in the order they happened and at or above the request’s log level
(X-Apprise-Log-Level, default LOG_LEVEL); a JSON failure is
{"error":"One or more notifications could not be sent","details":[[level, time, message], ...]}.
With Accept: text/html the log is an HTML list (<ul class="logs">).
Live progress
?stream=yes or Accept: text/event-stream answers with server-sent
events while sending: a log event per log line as it happens (the same
lines as above), : heartbeat comments every 15 s while waiting and one
final result event.
: connected
event: log
data: {"asctime":"2026-10-17 12:00:00,000","level":"INFO","message":"Sent json:// (JSON) notification.","service":"json"}
event: result
data: {"status":"SUCCESS"}
The status is SUCCESS, PARTIAL, FAILURE, NOMATCH or TIMEOUT.
Streams beyond the stream limits get 503 with
Retry-After: 15.
Result webhook
With APPRISE_WEBHOOK_URL, every notification POSTs
{"source": "<client address>", "status": 0 | 1, "output": [[level, time, message], ...]}
to that URL (credentials in the URL become Basic Auth).
Stored configurations
/add/{key} stores either urls (saved as TEXT, only the URLs that parse)
or a config in TEXT or YAML. A configuration with no usable URL is still
saved; YAML that can not be read at all is 400. /add answers with
X-Apprise-Config-Created, X-Apprise-Config-MTime and
X-Apprise-Timezone headers (UTC).
APPRISE_STATEFUL_MODE | Files |
|---|---|
hash | <dir>/<h[0..2]>/<h[2..]>.text or .yaml, gzip compressed, h = sha224(SECRET_KEY + key) |
simple | <dir>/<key>.cfg or <key>.yml, plain text |
disabled | none; stateful endpoints answer 403 |
Beside each entry: .<name>.created (creation time) and .<name>.lock
(the key’s login). The layout is the one the existing API servers use, so
their configuration directory can be mounted as it is (with the same
SECRET_KEY in hash mode).
/get returns YAML as text/yaml, TEXT as text/plain or
{"format", "config"} as JSON; 204 when nothing is stored. /del returns
200; 204 when nothing was stored. /notify/{key} without a stored
configuration is 404.
/json/urls/{key} lists every entry:
{
"tags": ["devops", "home"],
"urls": [
{"id": "1a2b3c4d", "service_name": "JSON", "enabled": true,
"url": "json://127.0.0.1:8766/ops", "retry": 0, "optional": false,
"tags": ["devops"],
"tag_details": [{"name": "devops", "priority": 0, "token": "devops", "exact": "0:devops"}],
"template": {}}
]
}
?privacy=yes hides everything after the host of each URL. template maps
each ${NAME} of the entry to its configuration default (null with
privacy or APPRISE_CONFIG_LOCK). ?tag= filters, comma separated.
Stored configurations go through the library’s configuration loader: tags,
groups, ${NAME} templates (values from the request, the configuration
defaults, then APPRISE_TEMPLATE_<NAME>) and include, which may only
point at http(s)://.
Authentication
With APPRISE_AUTH_REQUIRED=yes every request needs Basic Auth:
- the administrator (
APPRISE_USER/APPRISE_PASSWORD) may do everything; - a key’s own login may use that key (in the path or
X-Apprise-Config-ID),/statusand/details; - anything else is
401withWWW-Authenticate.
Each key has one access mode:
| Access | Effect |
|---|---|
user | its login may read, change and clear the configuration; tags optional; may send stateless notifications with X-Apprise-Config-ID |
locked | its login may only notify, with a specific tag (not all); content hidden |
public | anyone may POST /notify/{key} with a specific tag; everything else needs a login |
disabled | only the administrator may use the key (403 otherwise) |
# The administrator gives a key its own login; the key's user may later
# change the password (not the access). GET reads it, DELETE removes it.
curl -u admin:pw -H 'Content-Type: application/json' \
-d '{"access": "user", "username": "alice", "password": "s3cret"}' http://127.0.0.1:8000/auth/team
APPRISE_CONFIG_LOCK turns user into locked without changing what is
saved. It allows reading or changing configuration content only to the
administrator. Logins are stored as salted PBKDF2-SHA256 digests;
successful checks are remembered for five minutes. Without
APPRISE_AUTH_REQUIRED, saved logins are ignored and /auth answers 403.
Status codes
| Code | Meaning |
|---|---|
| 200 | sent, saved, deleted, moved or the requested data |
| 204 | nothing stored for the key (/get, /cfg/{key}, /del, /json/urls) |
| 400 | bad payload, key, header, tag, template, format or attachment; no URLs; no body and no attachment |
| 401 | Basic Auth missing or wrong |
| 403 | refused by a mode, the lock or the key’s access |
| 404 | unknown path or key; no stored configuration for /notify/{key} |
| 405 | known path, wrong method |
| 406 | X-Apprise-Recursion-Count above the limit |
| 409 | /move to a key that is taken |
| 413 | request body over the limit (attachment size plus 1 MiB, at least 8 MiB) |
| 417 | /status found a problem (CONFIG_PERMISSION_ISSUE, STORE_PERMISSION_ISSUE) |
| 424 | at least one notification failed; nothing matched the tag |
| 500 | the configuration or login could not be saved or read |
| 503 | too many requests or live streams in progress |
Using the library
The mercurio crate is the library behind the CLI: same URLs, same
configuration files, same services. This page is the crate’s own
documentation; every type and method is in the
API reference
(cargo doc -p mercurio --open).
Apprise-compatible Rust library, CLI and HTTP server to send notifications to 150+ services via a single URL.
Services are addressed by URL scheme and query parameters. They can be grouped in configuration files (TEXT and YAML) with tags and ${NAME} templates. The default API is async on tokio (AsyncMercurio); Mercurio is the blocking one. The core is sans-IO, so any AsyncTransport or Transport (another runtime, wasm, a proxy, a test double) can drive it.
Quick start
#![allow(unused)]
fn main() {
async fn run() -> Result<(), mercurio::Error> {
use mercurio::{AsyncMercurio, Message, NotifyType};
let mut m = AsyncMercurio::new();
m.add("ntfy://my-topic")?;
m.add("discord://webhook_id/webhook_token")?;
let msg = Message::new("Disk almost full").title("server-1").kind(NotifyType::Warning);
let report = m.notify(&msg).await;
for (entry, outcome) in report.failures() {
eprintln!("{}: {:?}", entry.label, outcome.result);
}
m.close().await;
Ok(()) }
}
AsyncMercurio works on any runtime and spawns nothing. One notify call sends to its targets concurrently inside the calling task (at most 128 sends in flight across the process), so it uses one thread; spawn several calls to use more cores. AsyncMercurio::new does its I/O on tokio and rustls with an in-house HTTP/1.1 client (TokioTransport, feature transport-tokio); AsyncMercurio::with_transport takes any AsyncTransport.
notify never panics and never returns early: every URL gets a ReportEntry in the Report, with one Outcome per target and every Attempt made (more than one with ?retry=). Report::status sums it up as a Status.
Architecture
- Parse.
parse()splits a URL into aParsedUrl(lenient: tokens may contain:,/or@), finds theServiceDeffor the scheme (service_for_scheme) and calls its parser. The parser validates the URL and returns a typedNotifyvalue, wrapped in aTarget. - Prepare.
Target::prepareruns the message pipeline: payload cap, escapes, format conversion (NotifyFormat), title merging and overflow handling (OverflowMode:upstream,truncate,split). The result is one or morePreparedpieces. - Plan.
Notify::planturns each piece into aPlan: HTTP requests with continuations that inspect the responses, socket sessions, datagrams, local commands. No I/O happens here (Target::plandoes steps 2 and 3). - Execute.
Target::send_asyncwalks the plan on anAsyncTransport(TokioTransportby default) andTarget::sendon a blockingTransport(BlockingTransport,testing::FakeTransportin tests, or your own), both with?retry=/?wait=handling based onErrorClass.Target::send_attemptsandTarget::send_attempts_asyncreturn every attempt.
Around this core:
- Runtime services: a per-notifier
Registry, withRegistry::register_schemefor a closure andRegistry::registerfor a fullServiceDef. - Configuration:
Configloads TEXT and YAML files from paths,http(s)://or memory, withinclude, tags andTemplateVars. - Tags:
TagandTagFilter(all,always, AND/OR groups). store: the per-targetPersistentStore(tokens, sessions, delivery tracking).- Attachments:
AttachmentSetloads files,http(s)://andmemory://sources intoAttachments. Asset: branding (app_id, colours, images) and pipeline defaults.
Sans-IO: plans without a network
A Target builds its Plan without sending anything. The plan is a plain value: inspect it or hand it to any transport. testing::FakeTransport records every request and answers from a script:
#![allow(unused)]
fn main() {
use mercurio::testing::FakeTransport;
use mercurio::{Asset, Message, service::Plan};
let target = mercurio::parse("json://localhost/hook")?;
let msg = Message::new("Backup done").title("cron");
// Build the plan: no I/O.
match target.plan(&msg, &Asset::default())? {
Plan::Http(req, _) => assert_eq!(req.url, "http://localhost/hook"),
other => panic!("unexpected plan {other:?}"),
}
// Run it on a fake transport.
let fake = FakeTransport::new();
fake.respond(204, "");
assert!(target.send(&msg, &fake, &Asset::default()).is_success());
let req = fake.last_request().unwrap();
assert!(String::from_utf8_lossy(&req.body).contains("Backup done"));
Ok::<(), mercurio::Error>(())
}
Services read the clock and randomness (timestamps, signatures, nonces, multipart boundaries) from the transport’s Env too, through Context::env. testing::FixedEnv freezes both, so two runs build byte-identical requests: FakeTransport::new().with_env(FixedEnv::new(1_700_000_000)).
Custom transport
Implement AsyncTransport (for AsyncMercurio) or Transport (for Mercurio) to add logging, tracing, metrics, a proxy or a test double. Only http, file and sleep are required; connect, datagram and command default to Error::Unsupported and env to SystemEnv, so a wrapper forwards them to keep e-mail, chat protocols, syslog and desktop notifications working:
#![allow(unused)]
fn main() {
use std::sync::Arc;
use std::time::Duration;
use mercurio::{
transport::AsyncConn, AsyncMercurio, transport::AsyncTransport, transport::BoxFuture, transport::Command, transport::CommandOutput, transport::Datagram, transport::Endpoint, transport::FileOp,
transport::FileOutput, transport::Request, transport::Response, Result, transport::TokioTransport,
};
/// Logs every operation, then lets tokio do it.
struct Logged(TokioTransport);
impl AsyncTransport for Logged {
fn http<'a>(&'a self, req: &'a Request) -> BoxFuture<'a, Result<Response>> {
eprintln!("{} {}", req.method.as_str(), mercurio::redact_url(&req.url));
self.0.http(req)
}
fn connect<'a>(&'a self, ep: &'a Endpoint) -> BoxFuture<'a, Result<Box<dyn AsyncConn>>> {
eprintln!("connect {ep:?}");
self.0.connect(ep)
}
fn datagram<'a>(&'a self, dg: &'a Datagram) -> BoxFuture<'a, Result<()>> {
self.0.datagram(dg)
}
fn command<'a>(&'a self, cmd: &'a Command) -> BoxFuture<'a, Result<CommandOutput>> {
eprintln!("run {}", cmd.program);
self.0.command(cmd)
}
fn file<'a>(&'a self, op: &'a FileOp) -> BoxFuture<'a, Result<FileOutput>> {
self.0.file(op)
}
fn sleep(&self, d: Duration) -> BoxFuture<'_, ()> {
self.0.sleep(d)
}
}
let mut m = AsyncMercurio::with_transport(Arc::new(Logged(TokioTransport::new())));
m.add("mailto://user:pass@example.com")?;
Ok::<(), mercurio::Error>(())
}
A tracing wrapper does the same with each future wrapped in a span (Instrument::instrument).
Blocking API
Mercurio has the same targets, configuration and reports as AsyncMercurio without a runtime: notify blocks until every service has answered, sending on one thread per target. Mercurio::new uses BlockingTransport (ureq + rustls), which needs the transport-blocking feature:
mercurio = { version = "0.1", default-features = false, features = ["all-services", "transport-blocking"] }
#![allow(unused)]
fn main() {
use mercurio::{Mercurio, Message};
let mut m = Mercurio::new();
m.add("ntfy://my-topic")?;
let report = m.notify(&Message::new("Finished in 42s").title("Backup"));
Ok::<(), mercurio::Error>(())
}
Blocking puts a blocking Transport behind AsyncTransport; AsyncMercurio converts from a Mercurio.
Custom services
Registry::register_scheme adds a URL scheme at run time, to one notifier’s Registry (Mercurio::registry_mut). The closure gets each prepared piece of the message and a Hook (parsed URL, asset, store) and returns a Plan: requests for mercurio to send, or Plan::Done when it did the work itself.
#![allow(unused)]
fn main() {
use mercurio::Mercurio;
use mercurio::service::{Plan, Request};
let mut m = Mercurio::new();
m.registry_mut().register_scheme("bookhook", |msg, hook| {
let channel = hook.url.text("channel").unwrap_or_else(|| "general".into());
Plan::send(Request::post(format!("https://{}/notify", hook.url.host())).json(&serde_json::json!({
"channel": channel,
"text": format!("{}: {}", msg.title, msg.body),
})))
})?;
m.add("bookhook://hooks.internal?channel=ops")?;
Ok::<(), mercurio::Error>(())
}
Registry::register adds a full ServiceDef with its own URL parser, limits and Notify type, written like a built-in service. Built-in services always win. Each notifier has its own registry, so two notifiers in one process can map the same scheme to different handlers.
Configuration and tags
Mercurio::add_config loads a file or URL; Mercurio::add_config_text takes the text directly. The format (TEXT or YAML) is detected.
#![allow(unused)]
fn main() {
use std::sync::Arc;
use mercurio::testing::FakeTransport;
use mercurio::{Mercurio, Message, NotifyOptions, TagFilter};
let yaml = "
version: 1
urls:
- json://localhost/devops:
tag: devops, critical
- json://localhost/always:
tag: always
- json://localhost/untagged
";
let fake = Arc::new(FakeTransport::new());
let mut m = Mercurio::with_transport(fake.clone());
assert_eq!(m.add_config_text(yaml, None)?, 3);
// "devops" matches the devops entry; `always` joins every tagged run.
let report = m.notify_with(&Message::new("deploy failed"), NotifyOptions::new().tags(&TagFilter::parse("devops")));
assert_eq!(report.entries.len(), 2);
// Without a tag (the CLI default) only untagged entries are notified.
let report = m.notify_with(&Message::new("fyi"), NotifyOptions::new().tags(&TagFilter::untagged()));
assert_eq!(report.entries.len(), 1);
Ok::<(), mercurio::Error>(())
}
Testing your integration
testing::FakeTransport works with the whole stack, so application code that sends notifications can be tested without accounts or a network:
#![allow(unused)]
fn main() {
use std::sync::Arc;
use mercurio::testing::FakeTransport;
use mercurio::{Mercurio, Message, Status};
let fake = Arc::new(FakeTransport::new());
fake.respond(500, "server error");
let mut m = Mercurio::with_transport(fake.clone());
m.add("json://localhost/hook")?;
let report = m.notify(&Message::new("hi"));
assert_eq!(report.status(), Status::Failure);
assert_eq!(fake.requests().len(), 1);
Ok::<(), mercurio::Error>(())
}
Cargo features
Every service is compiled by default (all-services). Each one also has its own feature, service-<id>, so a build can carry only the services it uses:
| Feature | Description | Turns on |
|---|---|---|
default | Every service, the async API on tokio and the bundled time zones. | all-services, transport-tokio, bundle-timezones |
all-services | Every service-* feature. | 162 service-* features |
bundle-timezones | The IANA time zone database inside the binary (about 256 KiB), so ?tz= zones resolve where the host has no /usr/share/zoneinfo, as in a scratch image. A system copy is still preferred when there is one. | jiff/tzdb-bundle-always |
transport-tokio | Tokio transport: TokioTransport and AsyncMercurio::new (tokio + rustls). | |
transport-blocking | Blocking transport: BlockingTransport and Mercurio::new (ureq). | |
testing | Compile the fixture runner (testing::fixtures); testing::FakeTransport is always available. | |
service-deltachat-pgp | OpenPGP signing and encryption (?pgp=) for Delta Chat. | service-deltachat |
service-email-pgp | OpenPGP signing and encryption (?pgp=) for e-mail. | service-email |
service-matrix-e2ee | Matrix end-to-end encrypted rooms (extra cryptography crates). | service-matrix |
For a slim build, disable default features and pick services: mercurio = { version = "0.1", default-features = false, features = ["service-telegram", "service-ntfy"] }. Add bundle-timezones to keep ?tz= zones working on hosts without a system time zone database.
Services
159 services. Each page lists the URL formats, every query parameter with its default, known differences with Apprise and examples.
Every service is compiled by default (all-services). Each has its own Cargo feature (the Feature column): with default-features = false, turn on only the ones you use. Matrix end-to-end encryption is service-matrix-e2ee.
| Service | Schemes | Attachments | Formats | Feature |
|---|---|---|---|---|
| 46elks | 46elks://, elks:// | no | text | service-fortysixelks |
| 800.com | eight00com:// | yes | text | service-eighthundredcom |
| Africas Talking | atalk:// | no | text | service-africastalking |
| Apprise API | apprise://, apprises:// | yes | text, html, markdown | service-appriseapi |
| Aprs | aprs:// | no | text | service-aprs |
| AWS Simple Email Service (SES) | ses:// | yes | html | service-ses |
| AWS Simple Notification Service (SNS) | sns:// | no | text | service-sns |
| Bark | bark://, barks:// | no | text | service-bark |
| Bird (MessageBird) | msgbird:// | no | text | service-messagebird |
| blink(1) | blink1:// | no | text | service-blink1 |
| BlueSky | bsky://, bluesky:// | yes | text | service-bluesky |
| Brevo | brevo:// | yes | html, text | service-brevo |
| BulkSMS | bulksms:// | no | text | service-bulksms |
| BulkVS | bulkvs:// | no | text | service-bulkvs |
| Burst SMS | burstsms:// | no | text | service-burstsms |
| Chanify | chanify:// | no | text | service-chanify |
| Cisco Webex Teams | wxteams://, webex:// | yes | markdown | service-webexteams |
| Clickatell | clickatell:// | no | text | service-clickatell |
| ClickSend | clicksend:// | no | text | service-clicksend |
| Courier | courier:// | no | text, html, markdown | service-courier |
| D7 Networks | d7sms:// | no | text | service-d7networks |
| Dapnet | dapnet:// | no | text | service-dapnet |
| DBus Notification | qt://, kde://, dbus:// | no | text | service-dbus |
| Delta Chat | deltachat://, deltachats:// | yes | text | service-deltachat |
| DingTalk | dingtalk:// | no | text, markdown | service-dingtalk |
| Discord | discord:// | yes | text, markdown | service-discord |
| Dot. | dot:// | yes | text | service-dot |
mailto://, mailtos:// | yes | html, text | service-email | |
| Emby | emby://, embys:// | no | text | service-emby |
| Enigma2 | enigma2://, enigma2s:// | no | text | service-enigma2 |
| Evolution API | evolution://, evolutions:// | no | markdown | service-evolution |
| Exotel | exotel:// | no | text | service-exotel |
| Feishu | feishu:// | no | text | service-feishu |
| File | file:// | yes | text, html, markdown | service-file |
| Firebase Cloud Messaging | fcm:// | no | text | service-fcm |
| Flock | flock:// | no | text | service-flock |
| Flowtriq | flowtriq://, flowtriqs:// | no | text | service-flowtriq |
| Fluxer | fluxer://, fluxers:// | yes | text | service-fluxer |
| Form | form://, forms:// | yes | text, html, markdown | service-form |
| Free-Mobile | freemobile:// | no | text | service-freemobile |
| GLib Notification | glib://, gio:// | no | text | service-glib |
| Gnome Notification | gnome:// | no | text | service-gnome |
| GoAlert | goalert://, goalerts:// | no | markdown | service-goalert |
| Google Chat | gchat:// | no | markdown | service-googlechat |
| Gotify | gotify://, gotifys:// | no | text | service-gotify |
| GroupMe | groupme:// | yes | text | service-groupme |
| HomeAssistant | hassio://, hassios:// | no | text | service-homeassistant |
| httpSMS | httpsms:// | no | text | service-httpsms |
| HumHub | humhub://, humhubs:// | yes | text | service-humhub |
| IFTTT | ifttt:// | no | text | service-ifttt |
| IRC | irc://, ircs:// | no | text | service-irc |
| Jellyfin | jellyfin://, jellyfins:// | no | text | service-jellyfin |
| Jira | jira://, opsgenie:// | no | text | service-jira |
| Join | join:// | no | text | service-join |
| JSON | json://, jsons:// | yes | text, html, markdown | service-json |
| Kavenegar | kavenegar:// | no | text | service-kavenegar |
| Knock | knock:// | no | text, html, markdown | service-knock |
| Kodi/XBMC | kodi://, xbmc://, kodis://, xbmcs:// | no | text | service-kodi |
| Kook | kook:// | yes | markdown | service-kook |
| LaMetric | lametric://, lametrics:// | no | text | service-lametric |
| Lark (Feishu) | lark:// | no | text | service-lark |
| Lauther | lauther:// | no | text | service-lauther |
| Line | line:// | no | text | service-line |
| Logger | logger:// | no | text | service-logger |
| MacOSX Notification | macosx:// | no | text | service-macosx |
| MailerSend | mailersend:// | yes | html, text | service-mailersend |
| Mailgun | mailgun:// | yes | html | service-mailgun |
| Mastodon | mastodon://, toot://, mastodons://, toots:// | yes | text | service-mastodon |
| Matrix | matrix://, matrixs:// | yes | text, html, markdown | service-matrix |
| Mattermost | mmost://, mmosts:// | yes | text | service-mattermost |
| Misskey | misskey://, misskeys:// | no | text | service-misskey |
| Mobile Message | mobilemessage://, mobilemsg:// | no | text | service-mobilemessage |
| MQTT Notification | mqtt://, mqtts:// | no | text | service-mqtt |
| MSG91 | msg91:// | no | text | service-msg91 |
| Nextcloud | ncloud://, nclouds:// | no | text | service-nextcloud |
| Nextcloud Talk | nctalk://, nctalks:// | no | text | service-nextcloudtalk |
| Notica | notica://, noticas:// | no | text | service-notica |
| Notifiarr | notifiarr:// | no | text | service-notifiarr |
| Notifyre | notifyre:// | yes | text | service-notifyre |
| Novu | novu:// | no | text, html, markdown | service-novu |
| ntfy | ntfy://, ntfys:// | yes | text | service-ntfy |
| Octopush | octopush:// | no | text | service-octopush |
| Office 365 | azure://, o365:// | yes | html | service-office365 |
| OneBot | onebot://, onebots:// | yes | text | service-onebot |
| OneSignal | onesignal:// | no | text | service-onesignal |
| Pager Duty | pagerduty:// | no | text | service-pagerduty |
| PagerTree | pagertree:// | no | text | service-pagertree |
| Parse Platform | parsep://, parseps:// | no | text | service-parseplatform |
| Pinglet | pinglet://, pinglets:// | no | text | service-pinglet |
| Pingram | pingram:// | no | text, html | service-pingram |
| Plivo | plivo:// | no | text | service-plivo |
| Postmark | postmark:// | yes | html | service-postmark |
| Power Automate / Workflows (for MSTeams) | workflow://, workflows:// | no | markdown | service-workflows |
| Prowl | prowl:// | no | text | service-prowl |
| Pushbullet | pbul:// | yes | text | service-pushbullet |
| PushDeer | pushdeer://, pushdeers:// | no | text | service-pushdeer |
| PushMe | pushme:// | no | text | service-pushme |
| Pushover | pover:// | yes | text, html, markdown | service-pushover |
| Pushplus | pushplus://, wecom:// | no | html | service-pushplus |
| Pushsafer | psafer://, psafers:// | yes | text | service-pushsafer |
| PushWard | pushward:// | no | text | service-pushward |
| Pushy | pushy:// | no | text | service-pushy |
| QQ Push | qq:// | no | text | service-qq |
reddit:// | no | markdown | service-reddit | |
| Remote Syslog | rsyslog:// | no | text | service-rsyslog |
| Resend | resend:// | yes | html | service-resend |
| Revolt | revolt:// | no | text | service-revolt |
| RingCentral | ringc:// | yes | text | service-ringcentral |
| Rocket.Chat | rocket://, rockets:// | no | markdown | service-rocketchat |
| Ryver | ryver:// | no | text | service-ryver |
| SendGrid | sendgrid:// | yes | html | service-sendgrid |
| SendPulse | sendpulse:// | yes | html, text | service-sendpulse |
| ServerChan | schan:// | no | text | service-serverchan |
| SerwerSMS | serwersms:// | yes | text | service-serwersms |
| Session Open Group Server | session://, sessions://, sogs:// | no | text | service-sogs |
| seven | seven:// | no | text | service-seven |
| Signal API | signal://, signals:// | yes | text | service-signalapi |
| Signalgrid | signalgrid:// | no | text | service-signalgrid |
| SIGNL4 | signl4:// | no | text | service-signl4 |
| Simplepush | spush://, simplepush:// | yes | markdown | service-simplepush |
| Sinch | sinch:// | no | text | service-sinch |
| Slack | slack:// | yes | markdown, text | service-slack |
| SMPP | smpp://, smpps:// | no | text | service-smpp |
| SMS Eagle | smseagle://, smseagles:// | yes | text | service-smseagle |
| SMS Manager | smsmgr://, smsmanager:// | no | text | service-smsmanager |
| SMSC | smsc:// | yes | text | service-smsc |
| SMTP2Go | smtp2go:// | yes | html | service-smtp2go |
| Société Française du Radiotéléphone | sfr:// | no | text | service-sfr |
| SparkPost | sparkpost:// | yes | html | service-sparkpost |
| Spike.sh | spike:// | no | text | service-spike |
| Splunk On-Call | splunk://, victorops:// | no | text | service-splunk |
| SpugPush | spugpush:// | no | text | service-spugpush |
| Stackfield | stackfield:// | no | text | service-stackfield |
| Streamlabs | strmlabs:// | no | text | service-streamlabs |
| Synology Chat | synology://, synologys:// | no | text | service-synology |
| Syslog | syslog:// | no | text | service-syslog |
| Techulus Push | push:// | no | text | service-techuluspush |
| Telegram | tgram:// | yes | html, markdown | service-telegram |
| Telnyx | telnyx:// | no | text | service-telnyx |
| Threema Gateway | threema:// | no | text | service-threema |
| Trigv | trigv://, trigvs:// | no | text | service-trigv |
| Twilio | twilio:// | no | text | service-twilio |
| Twist | twist:// | no | markdown | service-twist |
x://, twitter://, tweet:// | yes | text | service-twitter | |
| Vapid Web Push Notifications | vapid:// | no | text | service-vapid |
| Viber | viber:// | no | text | service-viber |
| VoIPms | voipms:// | no | text | service-voipms |
| Vonage | vonage://, nexmo:// | no | text | service-vonage |
| WeChat (WeCom) | wechat:// | no | text | service-wechat |
| WeCom Bot | wecombot:// | no | text | service-wecombot |
whatsapp:// | no | text | service-whatsapp | |
| Windows Notification | windows:// | no | text | service-windows |
| WPUSH | wpush:// | no | text | service-wpush |
| WxPusher | wxpusher:// | no | text | service-wxpusher |
| XML | xml://, xmls:// | yes | text, html, markdown | service-xml |
| XMPP | xmpp://, xmpps:// | no | text | service-xmpp |
| YouLMK | youlmk:// | no | text | service-youlmk |
| Zoom | zoom:// | no | text | service-zoom |
| Zulip | zulip:// | no | text | service-zulip |
46elks
| Schemes | 46elks://, elks:// |
| Cargo feature | service-fortysixelks |
| Service | https://46elks.com |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 160 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | yes |
URL formats
{schema}://{user}:{password}@{from_phone}
{schema}://{user}:{password}@{from_phone}/{targets}
{schema} is one of 46elks://, elks://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{from_phone} | From Phone No | string | yes | ||
{password} | API Password | string | yes | secret | |
{target_phone} | Target Phone | string | no | ||
{targets} | Targets | list | no | any of target_phone; separated by / | |
{user} | API Username | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
from | From Phone No | string | sets {from_phone} | |
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
elks://user:pass@+15551234123/
46elks://user:pass@+15551234556
46elks://user:pass@Acme/15551234512/%2B15551234513
46elks://user:pass@+15551234567/+46701234534?from=Acme
https://user1:pass@api.46elks.com/a1/sms/?to=15551234511
https://user1:pass@api.46elks.com/a1/sms?to=+15551234511&from=Acme
46elks://user:pass@Acme?to=15551234511,+15551234512
Rejected URLs:
46elks://
46elks://user@/
46elks://:pass@/
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'elks://user:pass@+15551234123/'
Notes
46elks (46elks://, elks://): SMS through the 46elks API.
800.com
| Schemes | eight00com:// |
| Cargo feature | service-eighthundredcom |
| Service | https://www.800.com |
| Body formats | text (first is the default) |
| Attachments | yes |
| Title length | no title (merged into the body) |
| Body length | 600 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{token}@{from_phone}
{schema}://{token}@{from_phone}/{targets}
{schema} is one of eight00com://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{from_phone} | From Phone No | string | yes | must match ^\+?[0-9\s)(+-]+$ | |
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | no | any of target_phone; separated by / | |
{token} | API Token | string | yes | secret |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
from | From Phone No | string | ||
to | Targets | list | sets {targets} | |
token | API Token | string | sets {token} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
eight00com://token@15551232000
eight00com://token@15551232000/15551232001
eight00com://token@15551232000/15551232001/15551232002
eight00com://user@15551232000?token=tok
eight00com://token@15551232001/15551232002?from=15551232000
eight00com://15551232000?token=tok&to=15551232001
Rejected URLs:
eight00com://
eight00com://15551232000
eight00com://token@abcd
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'eight00com://token@15551232000'
Notes
800.com (eight00com://): SMS through the 800.com messaging API.
Africas Talking
| Schemes | atalk:// |
| Cargo feature | service-africastalking |
| Service | https://africastalking.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 160 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{appuser}@{apikey}/{targets}
{schema} is one of atalk://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret; must match ^[A-Z0-9_-]+$ | |
{appuser} | App User Name | string | yes | must match ^[A-Z0-9_-]+$ | |
{target_phone} | Target Phone | string | no | ||
{targets} | Targets | list | yes | any of target_phone; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
apikey | API Key | string | sets {apikey} | |
batch | Batch Mode | bool | no | |
from | From | string | AFRICASTKNG | |
mode | SMS Mode | choice | bulksms | one of bulksms, premium, sandbox |
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
atalk://user@apikey/11111111111/
atalk://user@apikey/+254711000111
atalk://user@apikey/123/33333333333/abcd/+44444444444
atalk://user@apikey/+44444444444?mode=s
atalk://user@apikey/+44444444444/55555555555?batch=y
atalk://11111111111?apikey=key&user=user&from=FROMUSER
atalk://_?user=user&to=11111111111,22222222222&key=bbbbbbbbbb&from=5555555555555
Rejected URLs:
atalk://
atalk://:@/
atalk://user@^/
atalk://user@apikey/+44444444444?mode=invalid
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'atalk://user@apikey/11111111111/'
Notes
Africa’s Talking (atalk://): SMS through the Africa’s Talking messaging API.
Apprise API
| Schemes | apprise://, apprises:// |
| Cargo feature | service-appriseapi |
| Service | https://github.com/caronc/apprise-api |
| Body formats | text, html, markdown (first is the default) |
| Attachments | yes |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | yes |
URL formats
{schema}://{host}/{token}
{schema}://{host}:{port}/{token}
{schema}://:{password}@{host}/{token}
{schema}://:{password}@{host}:{port}/{token}
{schema}://{user}@{host}/{token}
{schema}://{user}@{host}:{port}/{token}
{schema}://{user}:{password}@{host}/{token}
{schema}://{user}:{password}@{host}:{port}/{token}
{schema} is one of apprise://, apprises://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{password} | Password | string | no | secret | |
{port} | Port | int, 1 to 65535 | no | ||
{token} | Token | string | yes | secret; must match ^[A-Z0-9_-]{1,128}$ | |
{user} | Username | string | no |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
method | Query Method | choice | form | one of form, json |
tags | Tags | string | ||
to | Token | string | sets {token} | |
version | API Version | choice | 2 | also v; one of 1, 2 |
Prefixed parameters:
+name=value: HTTP Header
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
apprise://localhost/mytoken0/
apprise://user@localhost/mytoken1/
apprise://localhost/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
apprises://localhost/cccccccccccccccccccccccccccccccc
http://example.com/notify/dddddddddddddddddddddddddddddddd
https://example.com/path/notify/dddddddddddddddddddddddddddddddd
apprise://localhost/mytoken1/?v=1
apprise://localhost/tok/?tags=a,b
Rejected URLs:
apprise://
apprise://:@/
apprise://localhost
apprise://localhost/!
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'apprise://localhost/mytoken0/'
Notes
Apprise API relay (apprise://, apprises://): hands the notification to an Apprise API server, which delivers it to its configured services.
Aprs
| Schemes | aprs:// |
| Cargo feature | service-aprs |
| Service | https://www.aprs2.net/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 67 characters |
| Body lines | unlimited |
| Request throttle | 800 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{user}:{password}@{targets}
{schema} is one of aprs://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{password} | Password | string | yes | secret | |
{target_callsign} | Target Callsign | string | no | must match ^[a-z0-9]{2,5}(-[a-z0-9]{1,2})?$ | |
{targets} | Targets | list | yes | any of target_callsign; separated by / | |
{user} | User Name | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
delay | Resend Delay | float, 0 to 5 | 0.0 | |
locale | Locale | choice | EURO | one of NOAM, SOAM, EURO, ASIA, AUNZ, ROTA |
to | Target Callsign | string |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
aprs://DF1JSL-15:12345@DF1ABC
aprs://DF1JSL-15:12345@DF1ABC/DF1DEF
aprs://DF1JSL-15:12345@DF1ABC-1/DF1ABC/DF1ABC-15
aprs://DF1JSL-15:12345@DF1ABC?locale=EURO
aprs://DF1JSL-15:12345@?to=DF1ABC,DF1DEF
aprs://DF1JSL-15:12345@DF1ABC?locale=noam&delay=0.1
Rejected URLs:
aprs://
aprs://:@/
aprs://DF1JSL-15:12345
aprs://DF1JSL-15@DF1ABC
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'aprs://DF1JSL-15:12345@DF1ABC'
Notes
APRS (aprs://): text messages to amateur radio call signs through APRS-IS.
One TCP connection to the regional APRS-IS server (port 10152): the user ... pass ... vers ... login, the server’s # logresp check, then one message packet per call sign: FROMCALL>APPRIS::TOCALL :text (text cleaned and cut to 67 chars).
Differences with Apprise
- The login names the software
mercurio <version>(Apprise:apprise <version>). - When the first read holds only the server banner, mercurio reads once more for the
# logrespline (Apprise fails). - The 0.8 s (+
delay) wait applies between the message packets of one notification, not between login and the first packet.
AWS Simple Email Service (SES)
| Schemes | ses:// |
| Cargo feature | service-ses |
| Service | https://aws.amazon.com/ses/ |
| Body formats | html (first is the default) |
| Attachments | yes |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{from_email}/{access_key_id}/{secret_access_key}/{region}/{targets}
{schema}://{from_email}/{access_key_id}/{secret_access_key}/{region}
{schema} is one of ses://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{access_key_id} | Access Key ID | string | yes | secret | |
{from_email} | From Email | yes | |||
{region} | Region | string | yes | must match ^[a-z]{2}-[a-z-]+?-[0-9]+$ | |
{secret_access_key} | Secret Access Key | string | yes | secret | |
{targets} | Target Emails | list | no | separated by / | |
{token} | Session Token | string | no | secret |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
access | Access Key ID | string | sets {access_key_id} | |
bcc | Blind Carbon Copy | list | separated by , or space | |
cc | Carbon Copy | list | separated by , or space | |
from | From Email | sets {from_email} | ||
key | Access Key ID | string | sets {access_key_id} | |
name | From Name | string | ||
region | Region | string | sets {region} | |
reply | Reply To Email | string | ||
secret | Secret Access Key | string | sets {secret_access_key} | |
to | Target Emails | list | sets {targets} | |
token | Session Token | string | sets {token} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
ses://user@example.com/T1JJ3T3L2/A1BRTD4JD/TIiajkdnlazkcevi7FQ/us-west-2
ses://user:SESSIONTOKEN@example.com/T1JJ3T3L2/A1BRTD4JD/TIiajkdnlazkcevi7FQ/us-east-1/
ses://user@example.com/T1JJ3T3L2/A1BRTD4JD/TIiajkdnlazkcevi7FQ/us-west-2/user2@example.com/Bob%20Smith%20%3Cbob@example.org%3E
ses://user@example.com/T1JJ3T3L2/A1BRTD4JD/TIiajkdnlazkcevi7FQ/us-west-2?format=text
ses://user@example.com/T1JJ3T3L2/A1BRTD4JD/TIiajkdnlazkcevi7FQ/us-west-2?token=TOK%2Bx%3D
ses://user@example.com/T1JJ3T3L2/A1BRTD4JD/TIiajkdnlazkcevi7FQ/us-west-2/a@example.com/b@example.com?cc=b@example.com
ses://user@example.com/T1JJ3T3L2/A1BRTD4JD/TIiajkdnlazkcevi7FQ/us-west-2/user2@example.com?reply=Rep%20Ly%20%3Crep@example.com%3E
ses://user@example.com/?key=T1JJ3T3L2&secret=A1BRTD4JD/TIiajkdnlazkcevi7FQ®ion=US-WEST-2&from=other@example.net
Rejected URLs:
ses://
ses://:@/
ses://user@example.com/T1JJ3T3L2
ses://user@example.com/T1JJ3TD4JD/TIiajkdnlazk7FQ/
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'ses://user@example.com/T1JJ3T3L2/A1BRTD4JD/TIiajkdnlazkcevi7FQ/us-west-2'
Notes
AWS Simple Email Service (ses://): SendRawEmail with a MIME message built by the shared mail module, signed with AWS SigV4.
Cc/Bcc recipients are sent in sorted order.
AWS Simple Notification Service (SNS)
| Schemes | sns:// |
| Cargo feature | service-sns |
| Service | https://aws.amazon.com/sns/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 160 characters |
| Body lines | unlimited |
| Request throttle | 2500 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{token}@{access_key_id}/{secret_access_key}/{region}/{targets}
{schema}://{access_key_id}/{secret_access_key}/{region}/{targets}
{schema} is one of sns://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{access_key_id} | Access Key ID | string | yes | secret | |
{region} | Region | string | yes | must match ^[a-z]{2}-[a-z-]+?-[0-9]+$ | |
{secret_access_key} | Secret Access Key | string | yes | secret | |
{target_phone_no} | Target Phone No | string | no | must match ^[0-9\s)(+-]+$ | |
{target_topic} | Target Topic | string | no | prefix #; must match ^[A-Za-z0-9_-]+$ | |
{targets} | Targets | list | yes | any of target_phone_no, target_topic; separated by / | |
{token} | Session Token | string | no | secret |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
access | Access Key ID | string | sets {access_key_id} | |
key | Access Key ID | string | sets {access_key_id} | |
mode | Mode | choice | sms (usually; depends on the URL) | one of sms, topic |
region | Region | string | sets {region} | |
secret | Secret Access Key | string | sets {secret_access_key} | |
to | Targets | list | sets {targets} | |
token | Session Token | string | sets {token} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
sns://T1JJ3T3L2/A1BRTD4JD/TIiajkdnlazkcevi7FQ/us-west-2/12223334444
sns://T1JJ3T3L2/A1BRTD4JD/TIiajkdnlazkcevi7FQ/us-east-1/MyTopic/12223334444
sns://SESSIONTOKEN@T1JJ3T3L2/A1BRTD4JD/TIiajkdnlazkcevi7FQ/us-east-1/12223334444
sns://T1JJ3T3L2/A1BRTD4JD/TIiajkdnlazkcevi7FQ/us-east-1/MyTopic/12223334444?mode=t
sns://T1JJ3T3L2/A1BRTD4JD/TIiajkdnlazkcevi7FQ/us-east-1/MyTopic?mode=sms
sns://OTHER@T1JJ3T3L2/A1BRTD4JD/TIiajkdnlazkcevi7FQ/us-east-1/12223334444?token=TOK%2Bx%3D
sns://?key=T1JJ3T3L2&secret=A1BRTD4JD/TIiajkdnlazkcevi7FQ®ion=US-WEST-2&to=12223334444
sns://?access=T1JJ3T3L2&secret=A1BRTD4JD/TIiajkdnlazkcevi7FQ®ion=us-west-2&to=12223334444
Rejected URLs:
sns://
sns://T1JJ3T3L2
sns://T1JJ3TD4JD/TIiajkdnlazk7FQ/
sns://T1JJ3T3L2/A1BRTD4JD/TIiajkdnlazkcevi7FQ/us-east-1/12223334444?region=useast
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'sns://T1JJ3T3L2/A1BRTD4JD/TIiajkdnlazkcevi7FQ/us-west-2/12223334444'
Notes
AWS Simple Notification Service (sns://): SMS and topic messages through AWS SNS.
Requests are signed with AWS Signature Version 4 when they are sent.
Bark
| Schemes | bark://, barks:// |
| Cargo feature | service-bark |
| Service | https://github.com/Finb/Bark |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{host}/{targets}
{schema}://{host}:{port}/{targets}
{schema}://{user}:{password}@{host}/{targets}
{schema}://{user}:{password}@{host}:{port}/{targets}
{schema} is one of bark://, barks://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{password} | Password | string | no | secret | |
{port} | Port | int, 1 to 65535 | no | ||
{target_device} | Target Device | string | no | secret | |
{targets} | Targets | list | yes | secret; any of target_device; separated by / | |
{user} | Username | string | no |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
badge | Badge | int, min 0 | ||
call | Call | bool | no | |
category | Category | string | ||
click | Click | string | ||
group | Group | string | ||
icon | Icon URL | string | ||
image | Include Image | bool | yes | |
key | Encryption Key | string | secret | |
level | Level | choice | one of active, timeSensitive, passive, critical | |
sound | Sound | choice | one of alarm.caf, anticipate.caf, bell.caf, birdsong.caf, bloom.caf, calypso.caf, chime.caf, choo.caf, descent.caf, electronic.caf, fanfare.caf, glass.caf, … (32 values) | |
to | Targets | list | sets {targets} | |
volume | Volume | int, 0 to 10 |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
barks://192.168.0.7/device_key/
bark://192.168.0.6:8081/device_key
bark://user@192.168.0.6:8081/device_key
bark://192.168.0.6:8081/device_key/?image=no
bark://192.168.0.6:8081/device_key/?volume=-1
bark://192.168.0.6:8081/device_key/?sound=invalid
bark://192.168.0.6:8081/device_key/?level=invalid
barks://192.168.0.6:8081/device_key/?badge=invalid
Rejected URLs:
bark://
bark://:@/
bark://192.168.0.6:8081/device_key/?key=short
bark://192.168.0.6:8081/device_key/?key=%C3%A90123456789abcd
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'barks://192.168.0.7/device_key/'
Notes
Bark (bark://, barks://): push notifications to the Bark iOS app through a Bark server.
With ?key= every payload is encrypted with AES-GCM (16, 24 or 32 byte ASCII key, fresh 12 character IV per request) the way the Bark app expects.
Bird (MessageBird)
| Schemes | msgbird:// |
| Cargo feature | service-messagebird |
| Service | https://bird.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 160 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}/{source}
{schema}://{apikey}/{source}/{targets}
{schema} is one of msgbird://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret; must match ^bk_[a-z0-9]+_[a-z0-9_-]+$ | |
{source} | Source Phone No | string | yes | prefix +; must match ^[0-9\s)(+-]+$ | |
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | no | any of target_phone; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
category | Category | choice | transactional | one of transactional, marketing, authentication, service |
from | Source Phone No | string | sets {source} | |
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
msgbird://bk_eu1_bbbbbbbbbbbbbbbbbbbbbbbb/15551232000
msgbird://bk_us1_aaaaaaaaaaaaaaaaaaaaaaaaaaaa/15551232000/15551232001/15551232002
msgbird://bk_us1_aaaaaaaaaaaaaaaaaaaaaaaaaaaa/15551232000/15551232001?from=15551233000
msgbird://bk_us1_aaaaaaaaaaaaaaaaaaaaaaaaaaaa/15551232000?category=Marketing
msgbird://bk_us1_aaaaaaaaaaaaaaaaaaaaaaaaaaaa/?from=15551233000&to=15551232000
Rejected URLs:
msgbird://
msgbird://bk_us1_aaaaaaaaaaaaaaaaaaaaaaaaaaaa/abcd
msgbird://bk_us1_aaaaaaaaaaaaaaaaaaaaaaaaaaaa/123
msgbird://bk_us1_aaaaaaaaaaaaaaaaaaaaaaaaaaaa
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'msgbird://bk_eu1_bbbbbbbbbbbbbbbbbbbbbbbb/15551232000'
Notes
Bird, formerly MessageBird, SMS (msgbird://).
POST https://{region}.platform.bird.com/v1/sms/messages with a Bird API key (bk_{region}_...) as a Bearer token, one request per target. Classic MessageBird keys (25 characters, rest.messagebird.com) stop working on 2026-12-31 and are rejected.
Differences with Apprise
- Apprise posts to the classic
rest.messagebird.com/messagesAPI with a 25-character key, while mercurio uses Bird’s SMS API ({region}.platform.bird.com/v1/sms/messages,bk_...key as Bearer, JSONfrom/to/text/category, new?category=); classic keys, which stop working on 2026-12-31, are rejected.
blink(1)
| Schemes | blink1:// |
| Cargo feature | service-blink1 |
| Service | https://blink1.thingm.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://
{schema}://{serial}/
{schema} is one of blink1://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{serial} | Serial Number | string | no |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
duration | Duration (ms) | int, 0 to 300000 | 5000 | |
fade | Fade Time (ms) | int, 0 to 10000 | 0 | |
ledn | LED Number | choice | 0 | one of 0, 1, 2 |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
blink1://
blink1://_/
blink1://?ledn=1
blink1://?fade=10000
blink1://?duration=300000
blink1://?fade=15&duration=5
blink1://ABCD1234/?fade=100&duration=50
blink1://?fade=200&duration=100&ledn=2
Rejected URLs:
blink1://?fade=10001
blink1://?fade=-1
blink1://?fade=abc
blink1://?duration=300001
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'blink1://'
Notes
blink(1) (blink1://, blink1://<serial>/): lights a blink(1) USB LED in the notification type’s colour.
Sequence: fade to the colour over fade ms, wait fade + duration ms, then switch the LED off instantly. Mercurio has no HID dependency and drives the sequence through ThingM’s blink1-tool, which must be installed and on PATH:
blink1-tool [--id <serial>] --led <n> -m <fade> --rgb <r>,<g>,<b>
(sleep fade + duration)
blink1-tool [--id <serial>] --led <n> -m 0 --rgb 0,0,0
The fade is passed rounded down to 10 ms, the device’s resolution.
BlueSky
| Schemes | bsky://, bluesky:// |
| Cargo feature | service-bluesky |
| Service | https://bluesky.us/ |
| Body formats | text (first is the default) |
| Attachments | yes |
| Title length | no title (merged into the body) |
| Body length | 280 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{user}@{password}
{schema} is one of bsky://, bluesky://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{password} | Password | string | yes | secret | |
{user} | Username | string | yes |
Query parameters
No service-specific parameters.
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
bsky://user@app-pw
bluesky://user@app-pw
Rejected URLs:
bluesky://
bluesky://:@/
bluesky://app-pw
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'bsky://user@app-pw'
Notes
BlueSky (bsky://, bluesky://): posts to a BlueSky account through the AT Protocol API.
Flow per message: resolve the handle to a DID, fetch the DID document to find the PDS endpoint, create a session, upload image blobs, then create one record per blob (or a single text record).
The persistent store keeps the DID and PDS endpoint of each handle (did.<handle>, endpoint.<handle>) and the session (access_token, refresh_token for an hour less 10 s, endpoint), so later sends skip the lookups and the login.
Brevo
| Schemes | brevo:// |
| Cargo feature | service-brevo |
| Service | https://www.brevo.com/ |
| Body formats | html, text (first is the default) |
| Attachments | yes |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | 200 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}:{from_email}
{schema}://{apikey}:{from_email}/{targets}
{schema} is one of brevo://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret; must match ^[a-zA-Z0-9._-]+$ | |
{from_email} | Source Email | yes | |||
{target_email} | Target Email | no | |||
{targets} | Targets | list | no | any of target_email; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
bcc | Blind Carbon Copy | list | separated by , or space | |
cc | Carbon Copy | list | separated by , or space | |
reply | Reply To Email | string | ||
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
brevo://abcd:user@example.com
brevo://abcd:user@example.com/newuser@example.com
brevo://abcd:user@example.com?format=text
brevo://abcd:user@example.com/newuser@example.com?cc=l2g@nuxref.com
brevo://abcd:user@example.com/newuser@example.com?to=l2g@nuxref.com
brevo://abcd:user@example.com/newuser@example.com?bcc=l2g@nuxref.com
brevo://abcd:user@example.com/newuser@example.com?reply=Bob%20<bob@example.com>
brevo://abcd:user@example.com/newuser@example.com?cc=l2g@nuxref.com&bcc=l2g@nuxref.com
Rejected URLs:
brevo://
brevo://:@/
brevo://abcd
brevo://abcd@host
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'brevo://abcd:user@example.com'
Notes
Brevo (brevo://): transactional e-mail through the Brevo API.
brevo://{apikey}:{from_user}@{from_domain}[/{to_email}...][?cc=..&bcc=..&reply=..&to=..]
Both an HTML and a plain-text part are sent; the one not given is converted from the other. Without targets the message goes to the sender.
BulkSMS
| Schemes | bulksms:// |
| Cargo feature | service-bulksms |
| Service | https://bulksms.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 160 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{token_id}:{token_secret}@{targets}
{schema} is one of bulksms://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{target_group} | Target Group | string | no | prefix @; must match ^[A-Z0-9 _-]+$ | |
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | yes | any of target_group, target_phone; separated by / | |
{token_id} | Token | string | yes | ||
{token_secret} | Secret | string | yes | secret |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
batch | Batch Mode | bool | no | |
from | From Phone No | string | must match ^\+?[0-9\s)(+-]+$ | |
route | Route Group | choice | STANDARD | one of ECONOMY, STANDARD, PREMIUM |
to | Targets | list | sets {targets} | |
unicode | Unicode Characters | bool | yes |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
bulksms://aaaaaaaaaa:bbbbbbbbbb@55555555555
bulksms://aaaaa:bbbbbbbbbb@123/33333333333/abcd/
bulksms://aaaaaaaaaa:bbbbbbbbbb@123456/44444444444
bulksms://bbbbb:cccccccccc@44444444444/55555555555/@grp?batch=y
bulksms://aaaaaaaaaa:bbbbbbbbbb@admin?route=premium
bulksms://aaaaaaaaaa:bbbbbbbbbb@55555555555?unicode=maybe
bulksms://bbbbb:cccccccccc@44444444444?batch=y&unicode=n
bulksms://_?user=aaaaaaaaaa&password=bbbbbbbbbb&from=55555555555
Rejected URLs:
bulksms://aaaaaaaaaa:bbbbbbbbbb@admin?route=invalid
bulksms://_?user=aaaaaaaaaa&password=bbbbbbbbbb&from=555
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'bulksms://aaaaaaaaaa:bbbbbbbbbb@55555555555'
Notes
BulkSMS (bulksms://): SMS through the BulkSMS API.
BulkVS
| Schemes | bulkvs:// |
| Cargo feature | service-bulkvs |
| Service | https://www.bulkvs.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 160 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{user}:{password}@{from_phone}/{targets}
{schema}://{user}:{password}@{from_phone}
{schema} is one of bulkvs://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{from_phone} | From Phone No | string | yes | must match ^\+?[0-9\s)(+-]+$ | |
{password} | Password | string | yes | secret | |
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | yes | any of target_phone; separated by / | |
{user} | User Name | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
batch | Batch Mode | bool | no | |
from | From Phone No | string | must match ^\+?[0-9\s)(+-]+$ | |
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
bulkvs://uuuuuuuuuu:pppppppppp@2222222222
bulkvs://aaaaa:bbbbbbbbbb@9876543210/33333333333/abcd/
bulkvs://bbbbb:cccccccccc@44444444444?batch=y
bulkvs://bbbbb:cccccccccc@44444444444/55555555555/66666666666?batch=y
bulkvs://aaaaaaaaaa:bbbbbbbbbb@66666666666/77777777777?from=55555555555
bulkvs://?user=zzzzzzzzzz&password=yyyyyyyyyy&from=55555555555
bulkvs://?user=aaaaaaaaaa&password=bbbbbbbbbb&from=55555555555&to=7777777777777
Rejected URLs:
bulkvs://
bulkvs://:@/
bulkvs://aaaaaaaaaa@9876543210/
bulkvs://uuuuuuuuuu:pppppppppp@33333
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'bulkvs://uuuuuuuuuu:pppppppppp@2222222222'
Notes
BulkVS (bulkvs://): SMS through the BulkVS messaging API.
Burst SMS
| Schemes | burstsms:// |
| Cargo feature | service-burstsms |
| Service | https://burstsms.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 160 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}:{secret}@{sender_id}/{targets}
{schema} is one of burstsms://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret; must match ^[a-z0-9]+$ | |
{secret} | API Secret | string | yes | secret; must match ^[a-z0-9]+$ | |
{sender_id} | Sender ID | string | yes | ||
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | yes | any of target_phone; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
batch | Batch Mode | bool | no | |
country | Country | choice | us | one of au, nz, gb, us |
from | Sender ID | string | sets {sender_id}; also source | |
key | API Key | string | sets {apikey} | |
secret | API Secret | string | sets {secret} | |
to | Targets | list | sets {targets} | |
validity | validity | int | 0 |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
burstsms://aaaaaaaa:bbbbbbbbbbbbbbbb@Sender/66666666666/77777777777
burstsms://_?key=aaaaaaaa&secret=bbbbbbbbbbbbbbbb&from=55555555555&to=66666666666
burstsms://_?key=aaaaaaaa&secret=bbbbbbbbbbbbbbbb&source=55555555555&to=66666666666&country=gb
burstsms://_?key=aaaaaaaa&secret=bbbbbbbbbbbbbbbb&source=55555555555&to=66666666666&validity=10
burstsms://_?key=aaaaaaaa&secret=bbbbbbbbbbbbbbbb&from=55555555555&to=66666666666,77777777777&batch=y
Rejected URLs:
burstsms://
burstsms://:@/
burstsms://aaaaaaaa@12345678
burstsms://dddddddd:eeeeeeeeeeeeeeee@%20
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'burstsms://aaaaaaaa:bbbbbbbbbbbbbbbb@Sender/66666666666/77777777777'
Notes
Burst SMS (burstsms://): SMS through the Burst SMS API.
Chanify
| Schemes | chanify:// |
| Cargo feature | service-chanify |
| Service | https://chanify.net/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{token}
{schema} is one of chanify://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{token} | Token | string | yes | secret; must match ^[A-Z0-9._-]+$ |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
token | Token | string | sets {token} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
chanify://abc123
chanify://?token=abc123
chanify://other/?token=abc.1_2-3
Rejected URLs:
chanify://
chanify://:@/
chanify://%badtoken%
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'chanify://abc123'
Notes
Chanify (chanify://): push notifications to the Chanify app.
Cisco Webex Teams
| Schemes | wxteams://, webex:// |
| Cargo feature | service-webexteams |
| Service | https://webex.teams.com/ |
| Body formats | markdown (first is the default) |
| Attachments | yes |
| Title length | no title (merged into the body) |
| Body length | 1,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | yes |
URL formats
{schema}://{token}
{schema}://{access_token}/{targets}
{schema} is one of wxteams://, webex://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{access_token} | Bot Access Token | string | yes | secret | |
{targets} | Room IDs | list | no | separated by / | |
{token} | Webhook Token | string | yes | secret; must match ^[a-z0-9]{80,160}$ |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
mode | Mode | choice | one of webhook, bot | |
to | Room IDs | list | sets {targets} | |
token | Webhook Token | string | sets {token} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
wxteams://BotToken1234567890/Y2lzY29zcGFyazovL3VzL1JPT00vabc
wxteams://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
https://api.ciscospark.com/v1/webhooks/incoming/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
webex://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
wxteams://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Y2lzY29zcGFyazovL3VzL1JPT00vabc?mode=b
wxteams://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa?format=text
https://webexapis.com/v1/webhooks/incoming/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa?format=text
wxteams://BotToken1234567890?to=Y2lzY29zcGFyazovL3VzL1JPT00vabc&mode=bot
Rejected URLs:
wxteams://
wxteams://:@/
wxteams://shorttoken?mode=webhook
wxteams://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa?mode=invalid
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'wxteams://BotToken1234567890/Y2lzY29zcGFyazovL3VzL1JPT00vabc'
Notes
Cisco Webex Teams (wxteams://, webex://): messages through Webex incoming webhooks.
Clickatell
| Schemes | clickatell:// |
| Cargo feature | service-clickatell |
| Service | https://www.clickatell.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}/{targets}
{schema}://{source}@{apikey}/{targets}
{schema} is one of clickatell://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Token | string | yes | secret | |
{source} | From Phone No | string | no | must match ^[0-9\s)(+-]+$ | |
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | yes | any of target_phone; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
from | From Phone No | string | sets {source} | |
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
clickatell://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/1111111111
clickatell://1111111111@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/1111111111
clickatell://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/+1%20555%20123%204567/tel:15551234568
clickatell://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa?from=1111111111&to=1111111111,2222222222
Rejected URLs:
clickatell://
clickatell:///
clickatell://@/
clickatell://1111111111@/
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'clickatell://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/1111111111'
Notes
Clickatell (clickatell://): SMS through the Clickatell API.
ClickSend
| Schemes | clicksend:// |
| Cargo feature | service-clicksend |
| Service | https://clicksend.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 160 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{user}:{apikey}@{targets}
{schema} is one of clicksend://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret | |
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | yes | any of target_phone; separated by / | |
{user} | User Name | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
batch | Batch Mode | bool | no | |
key | API Key | string | sets {apikey} | |
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
clicksend://user:pass@33333333333/44444444444/55555555555
clicksend://user:pass@33333333333333?batch=yes
clicksend://user:pass@33333333333/44444444444/55555555555?batch=yes
clicksend://user@33333333333333?key=a%252Bb
clicksend://user@33333333333333?batch=no&key=abc123
clicksend://user:pass@33333333333333?batch=yes&to=66666666666666
Rejected URLs:
clicksend://
clicksend://:@/
clicksend://user@33333333333333
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'clicksend://user:pass@33333333333/44444444444/55555555555'
Notes
ClickSend (clicksend://): SMS through the ClickSend API.
Courier
| Schemes | courier:// |
| Cargo feature | service-courier |
| Service | https://www.courier.com/ |
| Body formats | text, html, markdown (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
courier://{auth_token}/{targets}
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{auth_token} | Auth Token | string | yes | secret | |
{targets} | Recipients | list | yes | separated by /; e-mail, +phone or user id |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
channels | Routing Channels | list | separated by , or space | |
host | API Host | string | api.courier.com | host[:port][/path] or a full http(s):// URL |
template | Template | string | template id or alias; title and body go to data | |
to | Recipients | list | sets {targets} |
Prefixed parameters:
:name=value: Message Data+name=value: HTTP Header
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
courier://pk_prod_abc/example_user
courier://pk_prod_abc/ben@example.com
courier://pk_prod_abc/ben@example.com/+15551234567/user42
courier://pk_prod_abc/example_user?template=nt_01abc&channels=email,sms&:name=Ben
courier://pk_prod_abc?to=u1,u2&host=courier.internal:8443&+Idempotency-Key=abc123
Rejected URLs:
courier://
courier://pk_prod_abc
courier://pk_prod_abc/u1?host=bad_host!
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'courier://pk_prod_abc/example_user'
Notes
Courier (courier://): notifications through the Courier send API, written from the API reference (https://www.courier.com/docs/reference/send/message).
courier://{auth_token}/{recipient}[/{recipient}...]
Options:
?host=api.example.com[:port][/path](or a fullhttp(s)://URL) overrides the API base (defaulthttps://api.courier.com).?to=a,badds recipients.?template={id|alias}sends a template instead of inline content; the title and body are then only available asdata.title/data.body.?channels=email,smssetsrouting: {"method": "single", "channels": [...]}.:key=valueaddskeytomessage.data;+Header=valueadds an HTTP header.
Each recipient is an e-mail ({"email": ..}), +<phone> ({"phone_number": ..}) or a user id ({"user_id": ..}). One POST /send carries all recipients (message.to is an object for one, an array for several), with Authorization: Bearer {auth_token} and {"message": {"to", "content": {"title", "body"}, "data": {"type", ...}}}. Any 2xx (Courier answers 202) is success.
Differences with Apprise
- Not in Apprise; written from the vendor documentation (hand-written fixtures).
D7 Networks
| Schemes | d7sms:// |
| Cargo feature | service-d7networks |
| Service | https://d7networks.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 160 characters |
| Body lines | unlimited |
| Request throttle | 200 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{token}@{targets}
{schema} is one of d7sms://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | yes | any of target_phone; separated by / | |
{token} | API Access Token | string | yes | secret |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
batch | Batch Mode | bool | no | |
source | Originating Address | string | also from | |
to | Targets | list | sets {targets} | |
unicode | Unicode Characters | bool | no |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
d7sms://token1@33333333333333?batch=yes
d7sms://token4@33333333333333?unicode=no
d7sms://token8@33333333333333/44444444444444/?unicode=yes
d7sms://33333333333333?token=token6
d7sms://token@33333333333333?source=%20%20
d7sms://token@33333333333333?batch=yes&from=mercurio
d7sms://token@33333333333333?batch=yes&source=mercurio
d7sms://token@33333333333333?batch=yes&to=66666666666666
Rejected URLs:
d7sms://
d7sms://:@/
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'd7sms://token1@33333333333333?batch=yes'
Notes
D7 Networks (d7sms://): SMS through the D7 Networks messaging API.
Dapnet
| Schemes | dapnet:// |
| Cargo feature | service-dapnet |
| Service | https://hampager.de/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 80 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{user}:{password}@{targets}
{schema} is one of dapnet://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{password} | Password | string | yes | secret | |
{target_callsign} | Target Callsign | string | no | must match ^[a-z0-9]{2,5}(-[a-z0-9]{1,2})?$ | |
{targets} | Targets | list | yes | any of target_callsign; separated by / | |
{user} | User Name | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
batch | Batch Mode | bool | no | |
priority | Priority | choice | 0 | one of 0, 1 |
to | Target Callsign | string | ||
txgroups | Transmitter Groups | string | dl-all | secret |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
dapnet://user:pass@DF1ABC
dapnet://user:pass@DF1ABC/DG2XYZ/DL3AB?batch=yes
dapnet://user:pass@DF1ABC?priority=emergency
dapnet://user:pass@DF1ABC?txgroups=DL-BY,dl-all,DL-BW
Rejected URLs:
dapnet://
dapnet://:@/
dapnet://user@DF1ABC
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'dapnet://user:pass@DF1ABC'
Notes
DAPNET (dapnet://): pager calls to amateur radio call signs through the DAPNET (hampager.de) API.
DBus Notification
| Schemes | qt://, kde://, dbus:// |
| Cargo feature | service-dbus |
| Service | http://www.freedesktop.org/Software/dbus/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | 10 lines |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://
{schema} is one of qt://, kde://, dbus://.
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
image | Include Image | bool | yes | |
urgency | Urgency | choice | 1 | also priority; one of 0, 1, 2 |
x | X-Axis | int, min 0 | ||
y | Y-Axis | int, min 0 |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
kde://
dbus://
dbus://_/
dbus://_/?x=0&y=0
dbus://?image=yes
dbus://?urgency=2
qt://?urgency=low
dbus://?x=100&y=200
Rejected URLs:
dbus://_/?x=5
dbus://_/?y=5
dbus://_/?x=a&y=5
dbus://_/?x=1.5&y=5
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'kde://'
Notes
D-Bus (dbus://, kde://, qt://): desktop notifications through org.freedesktop.Notifications on the session bus.
Mercurio has no D-Bus dependency and runs no program: it connects to the session bus itself (DBUS_SESSION_BUS_ADDRESS, else $XDG_RUNTIME_DIR/bus; unix:path= and Linux unix:abstract= addresses), authenticates with EXTERNAL and calls Notify with these arguments: app name, replaces-id 0, the icon (the bundled SVG or image_path_mask; empty with ?image=no), title, body, no actions, {urgency: byte, x: int32, y: int32} hints and a 13 s timeout.
Differences with Apprise
kde:///qt://select a Qt/GLib main loop in Apprise, while in mercurio all schemes behave alike.- Apprise attaches the icon as
icon_datapixels (GdkPixbuf), while mercurio passes the icon file asapp_icon.
Delta Chat
| Schemes | deltachat://, deltachats:// |
| Cargo feature | service-deltachat |
| Service | https://delta.chat/ |
| Body formats | text (first is the default) |
| Attachments | yes |
| Title length | no title (merged into the body) |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{host}
{schema}://{host}:{port}
{schema}://{host}:{port}/{targets}
{schema}://{host}/{targets}
{schema}://{user}@{host}
{schema}://{user}@{host}/{targets}
{schema}://{user}@{host}:{port}
{schema}://{user}@{host}/{targets}
{schema}://{user}@{host}:{port}/{targets}
{schema}://{user}:{password}@{host}
{schema}://{user}:{password}@{host}/{targets}
{schema}://{user}:{password}@{host}:{port}
{schema}://{user}:{password}@{host}:{port}/{targets}
{schema} is one of deltachat://, deltachats://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Domain | string | yes | ||
{password} | Password | string | no | secret | |
{port} | Port | int, 1 to 65535 | no | ||
{target_email} | Target Email | string | no | ||
{targets} | Targets | list | no | any of target_email; separated by / | |
{user} | User Name | string | no |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
bcc | Blind Carbon Copy | list | separated by , or space | |
cc | Carbon Copy | list | separated by , or space | |
from | From Email | string | ||
inline | Inline Attachments | bool | no | |
mode | Secure Mode | choice | starttls (usually; depends on the URL) | one of starttls, ssl, insecure |
name | From Name | string | ||
pgp | PGP Security Mode | choice | no | one of no, sign, encrypt; sign: Ed25519 or RSA (2048 to 8192 bits) private key; encrypt: cv25519 or RSA public key; without the service-deltachat-pgp feature a PGP mode fails with Unsupported |
pgpprv | PGP Private Key Path | string | secret; path, file:// or http(s)://; default: the storage folder | |
pgppub | PGP Public Key Path | string | secret; path, file:// or http(s)://; default: the storage folder | |
reply | Reply To | list | separated by , or space | |
smtp | SMTP Server | string | ||
to | To Email | string | ||
wkd | Web Key Directory | bool | no |
Prefixed parameters:
+name=value: Email Header
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
deltachat://user:pass@smtp.example.com/friend@example.org
deltachats://user:pass@smtp.example.com/friend@example.org
deltachats://user:pass@smtp.example.com/friend@example.org?format=html
deltachats://user:pass@smtp.example.com/friend@example.org?cc=other@example.org&+X-Extra=1
Rejected URLs:
deltachat://
deltachat://user:pass@smtp.example.com/friend@example.org?pgp=invalid
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'deltachat://user:pass@smtp.example.com/friend@example.org'
Notes
Delta Chat (deltachat://, deltachats://): messages to Delta Chat users as e-mail, delivered with a Chat-Version: 1.0 header, plain-text bodies and a Chat: <excerpt> subject built from the body (the title is merged into the body).
Differences with Apprise
- PGP works as for
email(featureservice-deltachat-pgp), with the subjectChat:when signing andChat: Encrypted messagewhen encrypting, the Autocrypt header and key generation included.
DingTalk
| Schemes | dingtalk:// |
| Cargo feature | service-dingtalk |
| Service | https://www.dingtalk.com/ |
| Body formats | text, markdown (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{token}/
{schema}://{token}/{targets}/
{schema}://{secret}@{token}/
{schema}://{secret}@{token}/{targets}/
{schema} is one of dingtalk://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{secret} | Secret | string | no | secret; must match ^[a-z0-9]+$ | |
{target_phone_no} | Target Phone No | string | no | ||
{targets} | Targets | list | no | any of target_phone_no; separated by / | |
{token} | Token | string | yes | secret; must match ^[a-z0-9]+$ |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
secret | Secret | string | sets {secret} | |
to | Targets | list | sets {targets} | |
token | Token | string | sets {token} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
dingtalk://12345678
dingtalk://aaaaaaaa/11111111111111
dingtalk://aaaaaaaa/111/invalid/+1 (555) 123-45678
dingtalk://aaaaaaaa?format=markdown
dingtalk://secret@aaaaaaaa/?to=11111111111111
dingtalk://aaaaaaaa/?to=11111111111111,22222222222
dingtalk://?token=bbbbbbbb&to=11111111111111&secret=abc123
Rejected URLs:
dingtalk://aaaaaaaa/?to=11111111111111&secret=_
dingtalk://a_b@aaaaaaaa
dingtalk://
dingtalk://a_bd_/
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'dingtalk://12345678'
Notes
DingTalk (dingtalk://): messages to a DingTalk group robot webhook.
Discord
| Schemes | discord:// |
| Cargo feature | service-discord |
| Service | https://discord.com/ |
| Body formats | text, markdown (first is the default) |
| Attachments | yes |
| Title length | 250 characters |
| Body length | 1,750 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | yes |
URL formats
{schema}://{webhook_id}/{webhook_token}
{schema}://{botname}@{webhook_id}/{webhook_token}
{schema} is one of discord://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{botname} | Bot Name | string | no | ||
{webhook_id} | Webhook ID | string | yes | secret | |
{webhook_token} | Webhook Token | string | yes | secret |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
avatar | Avatar Image | bool | yes | |
avatar_url | Avatar URL | string | ||
batch | Batch Attachments | bool | yes | |
emojis | Interpret Emojis | bool | yes | no escapes every :name: so Discord shows it as text |
fields | Use Fields | bool | yes | |
flags | Discord Flags | int, min 0 | ||
footer | Display Footer | bool | no | |
footer_logo | Footer Logo | bool | yes | |
href | URL | string | also url | |
image | Include Image | bool | no | |
ping | Ping Users/Roles | list | separated by , or space | |
template | Template Path | string | secret | |
thread | Thread ID | string | ||
tts | Text To Speech | bool | no |
Prefixed parameters:
:name=value: Template Tokens
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
https://discord.com/api/webhooks/0000000000/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
discord://iiiiiiiiiiiiiiiiiiiiiiii/tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt
discord://l2g@iiiiiiiiiiiiiiiiiiiiiiii/tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt
discord://iiiiiiiiiiiiiiiiiiiiiiii/tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt?flags=1
discord://iiiiiiiiiiiiiiiiiiiiiiii/tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt?batch=no
discord://iiiiiiiiiiiiiiiiiiiiiiii/tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt/?emojis=no
discord://iiiiiiiiiiiiiiiiiiiiiiii/tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt?format=markdown
discord://iiiiiiiiiiiiiiiiiiiiiiii/tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt?url=http://localhost
Rejected URLs:
discord://
discord://:@/
discord://iiiiiiiiiiiiiiiiiiiiiiii
discord://iiiiiiiiiiiiiiiiiiiiiiii/tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt?flags=-1
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'https://discord.com/api/webhooks/0000000000/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB'
Notes
Discord (discord://): messages to a Discord channel through a webhook.
Dot.
| Schemes | dot:// |
| Cargo feature | service-dot |
| Service | https://dot.mindreset.tech |
| Body formats | text (first is the default) |
| Attachments | yes |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}@{device_id}/
{schema} is one of dot://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret | |
{device_id} | Device Serial Number | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
border | Border | int, 0 to 1 | 0 (usually; depends on the URL) | |
dither_kernel | Dither Kernel | choice | FLOYD_STEINBERG (usually; depends on the URL) | one of THRESHOLD, ATKINSON, BURKES, FLOYD_STEINBERG, SIERRA2, STUCKI, JARVIS_JUDICE_NINKE, DIFFUSION_ROW, DIFFUSION_COLUMN, DIFFUSION_2D |
dither_type | Dither Type | choice | DIFFUSION (usually; depends on the URL) | one of DIFFUSION, ORDERED, NONE |
icon | Icon Base64 (Text API) | string | ||
image | Image Base64 (Image API) | string | ||
link | Link | string | ||
mode | API Mode | choice | text (usually; depends on the URL) | one of text, image |
refresh | Refresh Now | bool | yes | |
signature | Text Signature | string | ||
task_key | Task Key | string |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
dot://apikey@device_id/
dot://apikey@device_id/text/
dot://apikey@device_id/?mode=text
dot://apikey@device_id/?refresh=no
dot://token@device/image/?image=Zm9vYmFy
dot://apikey@device_id/?image=ZmFrZUJhc2U2NA==
dot://token@device/image/?image=Zm9vYmFy&border=abc
dot://apikey@device_id/?mode=image&image=ZmFrZUJhc2U2NA==
Rejected URLs:
dot://
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'dot://apikey@device_id/'
Notes
Dot. (dot://): text and image content pushed to a Dot. device through the MindReset API.
| Schemes | mailto://, mailtos:// |
| Cargo feature | service-email |
| Body formats | html, text (first is the default) |
| Attachments | yes |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{host}
{schema}://{host}:{port}
{schema}://{host}:{port}/{targets}
{schema}://{host}/{targets}
{schema}://{user}@{host}
{schema}://{user}@{host}/{targets}
{schema}://{user}@{host}:{port}
{schema}://{user}@{host}/{targets}
{schema}://{user}@{host}:{port}/{targets}
{schema}://{user}:{password}@{host}
{schema}://{user}:{password}@{host}/{targets}
{schema}://{user}:{password}@{host}:{port}
{schema}://{user}:{password}@{host}:{port}/{targets}
{schema} is one of mailto://, mailtos://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Domain | string | yes | ||
{password} | Password | string | no | secret | |
{port} | Port | int, 1 to 65535 | no | ||
{target_email} | Target Email | string | no | ||
{targets} | Targets | list | no | any of target_email; separated by / | |
{user} | User Name | string | no |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
bcc | Blind Carbon Copy | list | separated by , or space | |
cc | Carbon Copy | list | separated by , or space | |
from | From Email | string | ||
inline | Inline Attachments | bool | no | |
mode | Secure Mode | choice | starttls (usually; depends on the URL) | one of starttls, ssl, insecure |
name | From Name | string | ||
pgp | PGP Security Mode | choice | no (usually; depends on the URL) | one of no, sign, encrypt; sign: Ed25519 or RSA (2048 to 8192 bits) private key; encrypt: cv25519 or RSA public key; without the service-email-pgp feature a PGP mode fails with Unsupported |
pgpprv | PGP Private Key Path | string | secret; path, file:// or http(s)://; default: the storage folder | |
pgppub | PGP Public Key Path | string | secret; path, file:// or http(s)://; default: the storage folder | |
reply | Reply To | list | separated by , or space | |
smtp | SMTP Server | string | ||
to | To Email | string | ||
wkd | Web Key Directory | bool | no |
Prefixed parameters:
+name=value: Email Header
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
mailto://localhost
mailto://user:pass@gmail.com
mailtos://user:pass123@outlook.com.au
mailtos://user:pass@nuxref.com:567/l2g@nuxref.com
mailto://user:pass@localhost/test@example.com/test2@/$@!/
mailtos://user:pass@nuxref.com?from=@
mailto://user:pass@fastmail.com?tz=UTC
mailto://user:pass@nuxref.com?mode=ssl
Rejected URLs:
mailto://
mailtos://
mailto://:@/
mailtos://:pass@nuxref.com:567
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'mailto://localhost'
Notes
E-Mail (mailto://, mailtos://): sends the notification as e-mail over SMTP.
SMTP with STARTTLS or implicit TLS, AUTH CRAM-MD5/PLAIN/LOGIN, the provider template table (Gmail, Outlook, Yahoo, …), To/Cc/Bcc/Reply-To, HTML + text multipart/alternative, attachments (inline with ?inline=yes) and ?+X-Header=value.
Differences with Apprise
?pgp=sign(featureservice-email-pgp) signs with Ed25519 keys (GnuPG’s encoding) and RSA keys of 2048 to 8192 bits, while Apprise also accepts DSA, ECDSA and smaller RSA keys: mercurio’s OpenPGP is its own, built onring, and covers those two.?pgp=encrypt(and?pgp=signwhen the recipient’s key is at hand) encrypts to Curve25519 (cv25519) and RSA keys, without compression, while Apprise compresses the message (ZIP) and also encrypts to ECDH keys on the NIST, Brainpool and secp256k1 curves.?wkd=yesasks a recipient’s Web Key Directory (RFC 9080) only when no key is in?pgppub=or the storage folder, as in Apprise, but asks both URLs at once, where Apprise tries the direct URL only after theopenpgpkey.one fails; theopenpgpkey.answer still wins.- When encryption needs a key pair and none exists (a message to oneself, or the Autocrypt header advertising ours), mercurio generates an Ed25519 key with a Curve25519 encryption subkey, while Apprise generates RSA 2048 keys; both write
<local>-pub.ascand<local>-prv.ascto the storage folder (asset: pgp_autogen: noturns it off). ?reply=with several targets raised on the second target in Apprise, while mercurio sends it.
Emby
| Schemes | emby://, embys:// |
| Cargo feature | service-emby |
| Service | https://emby.media/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{host}
{schema}://{host}:{port}
{schema}://{user}:{password}@{host}
{schema}://{user}:{password}@{host}:{port}
{schema} is one of emby://, embys://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{password} | Password | string | no | secret | |
{port} | Port | int, 1 to 65535 | no | 8096 | |
{user} | Username | string | no |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
modal | Modal | bool | no |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
emby://l2g@localhost
emby://l2g:l2gpass@localhost:8096?modal=no
embys://l2g:l2gpass@localhost:1234?modal=yes
Rejected URLs:
emby://
embys://
emby://localhost
emby://:@/
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'emby://l2g@localhost'
Notes
Emby (emby://, embys://): messages to the active Emby client sessions (the same code serves Jellyfin).
The login session lives as long as the parsed URL (a non-persistent store entry): later sends only look up the client sessions and post. Target::close logs out.
Enigma2
| Schemes | enigma2://, enigma2s:// |
| Cargo feature | service-enigma2 |
| Service | https://dreambox.de/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 1,000 characters |
| Body lines | unlimited |
| Request throttle | 500 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{host}
{schema}://{host}:{port}
{schema}://{user}@{host}
{schema}://{user}@{host}:{port}
{schema}://{user}:{password}@{host}
{schema}://{user}:{password}@{host}:{port}
{schema}://{host}/{fullpath}
{schema}://{host}:{port}/{fullpath}
{schema}://{user}@{host}/{fullpath}
{schema}://{user}@{host}:{port}/{fullpath}
{schema}://{user}:{password}@{host}/{fullpath}
{schema}://{user}:{password}@{host}:{port}/{fullpath}
{schema} is one of enigma2://, enigma2s://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{fullpath} | Path | string | no | ||
{host} | Hostname | string | yes | ||
{password} | Password | string | no | secret | |
{port} | Port | int, 1 to 65535 | no | ||
{user} | Username | string | no |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
timeout | Server Timeout | int, min -1 | 13 |
Prefixed parameters:
+name=value: HTTP Header
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
enigma2://localhost
enigma2s://localhost
enigma2://user@localhost
enigma2://localhost/a/b%20c/
enigma2s://localhost:8080/path/
enigma2://localhost?timeout=30
enigma2://user@localhost?timeout=-1
enigma2://localhost:8080/path?+HeaderKey=HeaderValue&+User-Agent=Custom
Rejected URLs:
enigma2://:@/
enigma2://
enigma2s://
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'enigma2://localhost'
Notes
Enigma2 (enigma2://, enigma2s://): on-screen messages on Enigma2 set-top boxes through their web API.
Evolution API
| Schemes | evolution://, evolutions:// |
| Cargo feature | service-evolution |
| Service | https://github.com/EvolutionAPI/evolution-api |
| Body formats | markdown (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}@{host}/{instance}/{targets}
{schema}://{apikey}@{host}:{port}/{instance}/{targets}
{schema} is one of evolution://, evolutions://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret | |
{host} | Hostname | string | yes | ||
{instance} | Instance Name | string | yes | ||
{port} | Port | int, 1 to 65535 | no | ||
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | no | any of target_phone; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
evolution://myapikey@hostname/myinstance/5511999999999
evolutions://myapikey@hostname/myinstance/5511999999999
evolution://myapikey@hostname/myinstance/5511999999999/5521888888888
evolution://myapikey@hostname/myinstance/5511999999999/bad/+1 (555) 123-4567
evolution://myapikey@hostname/myinstance?to=5511999999999,5521888888888
Rejected URLs:
evolution://
evolution://:@/
evolution://hostname/myinstance/5511999999999
evolution://myapikey@hostname/5511999999999
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'evolution://myapikey@hostname/myinstance/5511999999999'
Notes
Evolution API (evolution://, evolutions://): WhatsApp messages through an Evolution API server.
Exotel
| Schemes | exotel:// |
| Cargo feature | service-exotel |
| Service | https://exotel.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 2,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{sid}:{token}@{from_phone}
{schema}://{sid}:{token}@{from_phone}/{targets}
{schema} is one of exotel://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{from_phone} | From Phone No / Sender ID | string | yes | must match ^(?:(?=.{3,16}$)(?=.*[A-Z.-])[A-Z0-9][A-Z0-9.-]*|[0-9]{6}|\+?[0-9\s)(+-]{9,})$ | |
{sid} | Account SID | string | yes | secret | |
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | no | any of target_phone; separated by / | |
{token} | Token | string | yes | secret |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
apikey | API Key | string | also key; secret | |
batch | Batch Mode | bool | no | |
from | From Phone No / Sender ID | string | sets {from_phone} | |
priority | Priority | choice | normal | one of normal, high |
region | Region Name | choice | us | one of us, in |
sid | Account SID | string | sets {sid} | |
to | Targets | list | sets {targets} | |
token | Token | string | sets {token} | |
unicode | Unicode Characters | bool | yes |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
exotel://sid:token@15551232000
exotel://sid:token@MYBRAND/919876543210
exotel://sid:token@15551232000/919876543210/+91 98765 43211
exotel://sid:token@15551232000?region=IN
exotel://sid:token@15551232000/919876543210/919876543211/919876543212?batch=yes
exotel://sid:token@15551232000?priority=h
exotel://sid:token@15551232000?unicode=no
exotel://sid:token@15551232000?key=K2&source=ALT.ID
Rejected URLs:
exotel://
exotel://sid@15551232000
exotel://:token@15551232000
exotel://sid:token@12345/919876543210
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'exotel://sid:token@15551232000'
Notes
Exotel (exotel://): SMS through the Exotel API.
Feishu
| Schemes | feishu:// |
| Cargo feature | service-feishu |
| Service | https://open.feishu.cn/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 19,985 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{token}
{schema} is one of feishu://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{token} | Token | string | yes | secret; must match ^[A-Z0-9_-]+$ |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
token | Token | string | sets {token} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
feishu://abc123
feishu://?token=abc123
feishu://other/?token=abc_1-23
Rejected URLs:
feishu://
feishu://:@/
feishu://%badtoken%
feishu://abc.def
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'feishu://abc123'
Notes
Feishu (feishu://): messages to a Feishu group bot webhook.
File
| Schemes | file:// |
| Cargo feature | service-file |
| Body formats | text, html, markdown (first is the default) |
| Attachments | yes |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{path}
{schema} is one of file://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{path} | File Path | string | yes |
Query parameters
No service-specific parameters.
Prefixed parameters:
:name=value: Payload Extras
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Notes
File (file://): appends each notification to a local file as one JSON line (JSON Lines).
Each line is exactly the body json:// would post (attachments included, :key=value payload entries applied). file:///var/log/alerts.jsonl is an absolute path, file:///C:/logs/alerts.jsonl a Windows one, file://alerts.jsonl a path relative to the working directory. The file is created when missing; its directory must exist. Each line is written in one append, so concurrent writers do not interleave lines.
Firebase Cloud Messaging
| Schemes | fcm:// |
| Cargo feature | service-fcm |
| Service | https://firebase.google.com |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 1,024 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{project}/{targets}?keyfile={keyfile}
{schema} is one of fcm://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{keyfile} | OAuth2 KeyFile | string | yes | secret | |
{project} | Project ID | string | no | ||
{target_device} | Target Device | string | no | ||
{target_topic} | Target Topic | string | no | prefix # | |
{targets} | Targets | list | yes | any of target_device, target_topic; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
color | Notification Color | string | no | |
image | Include Image | bool | no (usually; depends on the URL) | |
image_url | Custom Image URL | string | ||
mode | Mode | choice | oauth2 | one of oauth2; legacy is rejected: that API was shut down in July 2024 |
priority | Mode | choice | one of min, low, normal, high, max | |
to | Targets | list | sets {targets} |
Prefixed parameters:
+name=value: Data Entries
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Rejected URLs:
fcm://
fcm://:@/
fcm://project@%20%20/
fcm://apikey/device
Notes
Firebase Cloud Messaging (fcm://).
Reads a service account JSON key file, signs an RS256 JWT assertion, trades it for an access token and sends through the HTTP v1 API. The legacy API (server keys, fcm/send) was shut down in July 2024: URLs without a key file are rejected. So are URLs with ?mode=legacy.
Differences with Apprise
- The key file must be local (a path or
file://); only RSA service account keys are supported (Apprise fails on others as well). - Legacy mode (server API key,
fcm/send) defaults on in Apprise when no key file is given, while mercurio rejects such URLs and?mode=legacy: Google shut that API down in July 2024. Only the HTTP v1 API is used.
Flock
| Schemes | flock:// |
| Cargo feature | service-flock |
| Service | https://flock.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | yes |
URL formats
{schema}://{token}
{schema}://{botname}@{token}
{schema}://{botname}@{token}/{targets}
{schema}://{token}/{targets}
{schema} is one of flock://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{botname} | Bot Name | string | no | ||
{targets} | Targets | list | no | any of to_channel, to_user; separated by / | |
{to_channel} | To Channel ID | string | no | prefix #; must match ^[A-Z0-9_]+$ | |
{to_user} | To User ID | string | no | prefix @; must match ^[A-Z0-9_]+$ | |
{token} | Access Key | string | yes | secret; must match ^[a-z0-9-]+$ |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
image | Include Image | bool | yes | |
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
flock://tttttttttttttttttttttttt
flock://mybot@tttttttttttttttttttttttt
flock://iiiiiiiiiiiiiiiiiiiiiiii/g:/u:abc
https://api.flock.com/hooks/sendMessage/iiiiiiiiiiiiiiiiiiiiiiii/
flock://tttttttttttttttttttttttt?image=False
flock://iiiiiiiiiiiiiiiiiiiiiiii?format=text
flock://iiiiiiiiiiiiiiiiiiiiiiii/u:uuuuuuuuuuuu?format=html
flock://iiiiiiiiiiiiiiiiiiiiiiii/g:gggggggggggg/u:uuuuuuuuuuuu/%23chan/%40user?format=text
Rejected URLs:
flock://
flock://:@/
flock://bad_token!
flock://iiiiiiiiiiiiiiiiiiiiiiii/g:/u:?format=text
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'flock://tttttttttttttttttttttttt'
Notes
Flock (flock://): messages to Flock channels or users through a webhook or bot token.
Flowtriq
| Schemes | flowtriq://, flowtriqs:// |
| Cargo feature | service-flowtriq |
| Service | https://flowtriq.com |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}@{host}/{path}/
{schema}://{apikey}@{host}:{port}/{path}/
{schema} is one of flowtriq://, flowtriqs://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret | |
{host} | Hostname | string | yes | ||
{path} | Webhook Path | string | yes | ||
{port} | Port | int, 1 to 65535 | no |
Query parameters
No service-specific parameters.
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
flowtriqs://key:secret@flowtriq.com/hook
flowtriqs://my%20key@flowtriq.com/a%20b/c
flowtriq://myapikey@hostname/hooks/abc123/
flowtriqs://myapikey@hostname/hooks/abc123/
flowtriqs://myapikey@flowtriq.com/api/v1/webhook/xyz/
Rejected URLs:
flowtriq://
flowtriq://apikey@hostname
flowtriq://apikey@hostname///
flowtriq://hostname/hooks/abc123
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'flowtriqs://key:secret@flowtriq.com/hook'
Notes
Flowtriq (flowtriq://, flowtriqs://): posts the notification as a JSON event to a Flowtriq endpoint.
Fluxer
| Schemes | fluxer://, fluxers:// |
| Cargo feature | service-fluxer |
| Service | https://fluxer.app/ |
| Body formats | text (first is the default) |
| Attachments | yes |
| Title length | 250 characters |
| Body length | 1,750 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | yes |
URL formats
{schema}://{webhook_id}/{webhook_token}
{schema}://{host}/{webhook_id}/{webhook_token}
{schema}://{host}:{port}/{webhook_id}/{webhook_token}
{schema}://{host}{path}{webhook_id}/{webhook_token}
{schema}://{host}:{port}{path}{webhook_id}/{webhook_token}
{schema}://{botname}@{webhook_id}/{webhook_token}
{schema}://{botname}@{host}:{port}/{webhook_id}/{webhook_token}
{schema}://{botname}@{host}:{port}{path}{webhook_id}/{webhook_token}
{schema} is one of fluxer://, fluxers://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{botname} | Bot Name | string | no | ||
{host} | Hostname | string | no | ||
{path} | Path | string | no | /api/ | |
{port} | Port | int, 1 to 65535 | no | ||
{webhook_id} | Webhook ID | string | yes | secret; must match ^[0-9]{10,}$ | |
{webhook_token} | Webhook Token | string | yes | secret; must match ^[A-Za-z0-9_\-]{16,}$ |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
avatar | Avatar Image | bool | yes | |
avatar_url | Avatar URL | string | ||
fields | Use Fields | bool | yes | |
flags | Discord Flags | int, min 0 | ||
footer | Display Footer | bool | no | |
footer_logo | Footer Logo | bool | yes | |
href | URL | string | also url | |
image | Include Image | bool | no | |
mode | Mode | choice | cloud (usually; depends on the URL) | one of cloud, private |
name | Bot Name | string | sets {botname} | |
path | Path | string | sets {path} | |
ping | Ping Users/Roles | list | separated by , or space | |
thread | Thread ID | string | ||
thread_name | Thread Name | string | ||
tts | Text To Speech | bool | no |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
fluxer://0000000000/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
fluxer://l2g@0000000000/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
fluxer://example.ca:123/0000000000/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
fluxers://example.ca/api/0000000000/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
https://api.fluxer.app/webhooks/0000000000/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
fluxers://example.ca:8443/custom/api/0000000000/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
fluxers://example.ca/0000000000/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB?path=/
fluxer://0000000000/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB?flags=1
Rejected URLs:
fluxer://
fluxer://:@/
fluxer://0000000000
fluxer://0000000000/abc
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'fluxer://0000000000/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB'
Notes
Fluxer (fluxer://, fluxers://): messages to a Fluxer channel through a webhook.
Cloud: fluxer://[botname@]{webhook_id}/{webhook_token}. Self-hosted: fluxers://[botname@]{host}[:port][/path]/{webhook_id}/{webhook_token} (/api/ is the default path, ?path=/ selects the host root).
Form
| Schemes | form://, forms:// |
| Cargo feature | service-form |
| Body formats | text, html, markdown (first is the default) |
| Attachments | yes |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{host}
{schema}://{host}:{port}
{schema}://{user}@{host}
{schema}://{user}@{host}:{port}
{schema}://{user}:{password}@{host}
{schema}://{user}:{password}@{host}:{port}
{schema} is one of form://, forms://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{password} | Password | string | no | secret | |
{port} | Port | int, 1 to 65535 | no | ||
{user} | Username | string | no |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
attach-as | Attach File As | string | file* | |
method | Fetch Method | choice | POST | one of POST, GET, DELETE, PUT, HEAD, PATCH, UPDATE, OPTIONS |
Prefixed parameters:
+name=value: HTTP Header-name=value: GET Params:name=value: Payload Extras
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
form://localhost
forms://user:pass@localhost:8080/path/to/hook
form://localhost/?method=delete
form://localhost?attach-as=meta
form://localhost/?method=GET&-p=1
form://localhost/?+X-Custom=yes&-param=1&:title=subject&:message=&:extra=value
Rejected URLs:
form://localhost/?method=invalid
form://localhost?attach-as=!!!
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'form://localhost'
Notes
Form webhook (form://, forms://): posts the notification as form fields (or multipart with attachments) to any HTTP endpoint.
Free-Mobile
| Schemes | freemobile:// |
| Cargo feature | service-freemobile |
| Service | https://mobile.free.fr/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 160 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{user}@{password}
{schema} is one of freemobile://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{password} | Password | string | yes | secret | |
{user} | Username | string | yes |
Query parameters
No service-specific parameters.
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
freemobile://user@password
freemobile://?user=user&pass=password
Rejected URLs:
freemobile://
freemobile://:@/
freemobile://password
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'freemobile://user@password'
Notes
Free Mobile (freemobile://): SMS to your own Free Mobile line through its notification API.
GLib Notification
| Schemes | glib://, gio:// |
| Cargo feature | service-glib |
| Service | https://lazka.github.io/pgi-docs/Gio-2.0/classes/DBusProxy.html |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | 10 lines |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://
{schema} is one of glib://, gio://.
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
image | Include Image | bool | yes | |
urgency | Urgency | choice | 1 | also priority; one of 0, 1, 2 |
x | X-Axis | int, min 0 | ||
y | Y-Axis | int, min 0 |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
glib://
glib://_/
glib://_/?x=0&y=0
glib://?image=yes
glib://?urgency=2
glib://?x=100&y=200
glib://?priority=low
gio://?urgency=high&x=1&y=2
Rejected URLs:
glib://_/?x=5
glib://_/?y=5
glib://_/?x=a&y=5
glib://_/?x=1.5&y=5
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'glib://'
Notes
GLib/Gio (glib://, gio://): desktop notifications through org.freedesktop.Notifications.Notify.
Like dbus://, mercurio connects to the session bus itself (DBUS_SESSION_BUS_ADDRESS, else $XDG_RUNTIME_DIR/bus; unix:path= and Linux unix:abstract= addresses), authenticates with EXTERNAL and calls Notify with these arguments: app name, replaces-id 0, the icon (the bundled SVG or image_path_mask; empty with ?image=no), title, body, no actions, {urgency: byte, x: int32, y: int32} hints and a 13 s timeout.
Differences with Apprise
- Apprise uses a
Gio.DBusProxy, while mercurio speaks D-Bus itself; the call is the same. - Apprise attaches the icon as
icon_datapixels (GdkPixbuf), while mercurio passes the icon file asapp_icon.
Gnome Notification
| Schemes | gnome:// |
| Cargo feature | service-gnome |
| Service | https://www.gnome.org/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 32,768 characters |
| Body lines | 10 lines |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://
{schema} is one of gnome://.
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
image | Include Image | bool | yes | |
urgency | Urgency | choice | 1 | also priority; one of 0, 1, 2 |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
gnome://
gnome://_/
gnome://?image=yes
gnome://?urgency=2
gnome://_/?image=False
gnome://?priority=low
gnome://_/?priority=invalid
gnome://_/?image=no&urgency=high
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'gnome://'
Notes
GNOME (gnome://): desktop notifications as libnotify sends them.
Mercurio connects to the session bus itself (DBUS_SESSION_BUS_ADDRESS, else $XDG_RUNTIME_DIR/bus; unix:path= and Linux unix:abstract= addresses), authenticates with EXTERNAL and calls Notify the way libnotify’s Notification.new(body) does: app id, replaces-id 0, the icon file (empty with ?image=no), the body as the summary (the title is merged into it), no body, no actions, {urgency: byte} and the daemon’s default timeout (-1).
Differences with Apprise
- Apprise uses libnotify bindings, while mercurio speaks D-Bus itself.
- libnotify also sends a
sender-pidhint and the icon asimage-datapixels, while mercurio passes the icon file asapp_icon.
GoAlert
| Schemes | goalert://, goalerts:// |
| Cargo feature | service-goalert |
| Service | https://goalert.me/ |
| Body formats | markdown (first is the default) |
| Attachments | no |
| Title length | 1,024 characters |
| Body length | 6,144 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{host}/{targets}
{schema}://{host}:{port}/{targets}
{schema}://{host}{path}{targets}
{schema}://{host}:{port}{path}{targets}
{schema} is one of goalert://, goalerts://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{path} | Path | string | no | / | |
{port} | Port | int, 1 to 65535 | no | ||
{targets} | Integration Keys | list | yes | secret; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
action | Action | choice | map | one of map, trigger, close |
dedup | Deduplication Key | string | ||
to | Integration Keys | list | sets {targets} | |
token | Integration Keys | list | sets {targets} |
Prefixed parameters:
+name=value: Metadata
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
goalert://localhost/a1b2c3d4-e5f6-7890-abcd-ef1234567890
goalert://localhost/my%20path/a1b2c3d4-e5f6-7890-abcd-ef1234567890
goalerts://localhost:8443/goalert/a1b2c3d4-e5f6-7890-abcd-ef1234567890/B1B2C3D4-E5F6-7890-ABCD-EF123456789C
goalert://localhost/a1b2c3d4-e5f6-7890-abcd-ef1234567890?action=t
goalerts://localhost/a1b2c3d4-e5f6-7890-abcd-ef1234567890?action=trigger&+env=prod&+Region=eu%20west
goalerts://localhost/?token=a1b2c3d4-e5f6-7890-abcd-ef1234567890&action=close&dedup=disk
goalert://localhost:8080/a/b/?to=a1b2c3d4-e5f6-7890-abcd-ef1234567890,invalid,c1b2c3d4-e5f6-7890-abcd-ef1234567890
Rejected URLs:
goalert://
goalerts://localhost/a1b2c3d4-e5f6-7890-abcd-ef1234567890?action=invalid
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'goalert://localhost/a1b2c3d4-e5f6-7890-abcd-ef1234567890'
Notes
GoAlert (goalert://, goalerts://): alerts through a GoAlert generic incoming integration.
Google Chat
| Schemes | gchat:// |
| Cargo feature | service-googlechat |
| Service | https://chat.google.com/ |
| Body formats | markdown (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 4,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | yes |
URL formats
{schema}://{workspace}/{webhook_key}/{webhook_token}
{schema}://{workspace}/{webhook_key}/{webhook_token}/{thread_key}
{schema} is one of gchat://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{thread_key} | Thread Key | string | no | secret | |
{webhook_key} | Webhook Key | string | yes | secret | |
{webhook_token} | Webhook Token | string | yes | secret | |
{workspace} | Workspace | string | yes | secret |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
key | Webhook Key | string | sets {webhook_key} | |
thread | Thread Key | string | sets {thread_key}; also threadkey | |
token | Webhook Token | string | sets {webhook_token} | |
workspace | Workspace | string | sets {workspace} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
gchat://workspace/key/token
gchat://workspace/key/token/thread123
gchat://workspace/key/token/thr?thread=
gchat://workspace/key/token?format=text
https://chat.googleapis.com/v1/spaces/myworkspace/messages?key=mykey&token=mytoken
gchat://?workspace=ws&key=mykey&token=mytoken
gchat://a/b/c?workspace=ws&key=my%2Bkey&token=mytoken
https://chat.googleapis.com/v1/spaces/myworkspace/messages?key=mykey&token=mytoken&threadKey=mythreadkey
Rejected URLs:
gchat://
gchat://:@/
gchat://workspace
gchat://workspace/key/
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'gchat://workspace/key/token'
Notes
Google Chat (gchat://): messages to a Google Chat space through a webhook.
Gotify
| Schemes | gotify://, gotifys:// |
| Cargo feature | service-gotify |
| Service | https://github.com/gotify/server |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{host}/{token}
{schema}://{host}:{port}/{token}
{schema}://{host}{path}{token}
{schema}://{host}:{port}{path}{token}
{schema} is one of gotify://, gotifys://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{path} | Path | string | no | / | |
{port} | Port | int, 1 to 65535 | no | ||
{token} | Token | string | yes | secret |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
priority | Priority | choice | 5 | one of 0, 3, 5, 8, 10 |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
gotify://hostname/abcd1234
gotifys://user:pass@hostname:8443/a/path/abcd1234/
gotifys://hostname/abcd1234?verify=no
gotify://hostname/abcd1234?priority=high
gotify://hostname/abcd1234?format=markdown
Rejected URLs:
gotify://hostname
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'gotify://hostname/abcd1234'
Notes
Gotify (gotify://, gotifys://): push messages to a Gotify server.
GroupMe
| Schemes | groupme:// |
| Cargo feature | service-groupme |
| Service | https://groupme.com/ |
| Body formats | text (first is the default) |
| Attachments | yes |
| Title length | no title (merged into the body) |
| Body length | 1,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{bot_id}
{schema}://{bot_id}/{token}
{schema} is one of groupme://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{bot_id} | Bot ID | string | yes | secret | |
{token} | Access Token | string | no | secret |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
bot_id | Bot ID | string | sets {bot_id} | |
token | Access Token | string | sets {token} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
groupme://botid123
groupme://botid123/tokenabc
groupme://ignored/?bot_id=other1&token=tok
Rejected URLs:
groupme://
groupme://bad-bot!
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'groupme://botid123'
Notes
GroupMe (groupme://): messages to a GroupMe group through a bot.
HomeAssistant
| Schemes | hassio://, hassios:// |
| Cargo feature | service-homeassistant |
| Service | https://www.home-assistant.io/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{host}/{accesstoken}
{schema}://{host}/{accesstoken}/{targets}
{schema}://{host}:{port}/{accesstoken}
{schema}://{host}:{port}/{accesstoken}/{targets}
{schema}://{user}@{host}/{accesstoken}
{schema}://{user}@{host}/{accesstoken}/{targets}
{schema}://{user}@{host}:{port}/{accesstoken}
{schema}://{user}@{host}:{port}/{accesstoken}/{targets}
{schema}://{user}:{password}@{host}/{accesstoken}
{schema}://{user}:{password}@{host}/{accesstoken}/{targets}
{schema}://{user}:{password}@{host}:{port}/{accesstoken}
{schema}://{user}:{password}@{host}:{port}/{accesstoken}/{targets}
{schema} is one of hassio://, hassios://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{accesstoken} | Long-Lived Access Token | string | yes | secret | |
{host} | Hostname | string | yes | ||
{password} | Password | string | no | secret | |
{port} | Port | int, 1 to 65535 | no | ||
{target_device} | Target Device | string | no | ||
{targets} | Targets | list | no | any of target_device; separated by / | |
{user} | Username | string | no |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
batch | Batch Mode | bool | no | |
nid | Notification ID | string | must match ^[a-z0-9_-]+$ | |
prefix | Path Prefix | string | ||
to | Targets | list | sets {targets} | |
token | Long-Lived Access Token | string | sets {accesstoken} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
hassio://localhost/long.lived.token
hassio://user@localhost:8123/long.lived.token
hassio://user:pass@localhost/long.lived.token/
hassio://localhost/prefix/path/long.lived.token
hassios://localhost:8443/path/long.lived.token/
hassio://localhost/0123abcd.0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef/light.turn_on
hassios://localhost/long.lived.token?nid=abcd
hassio://localhost/long.lived.token/notify.mobile:dev1,dev2,dev3?batch=yes
Rejected URLs:
hassio://
hassio://user@localhost
hassios://localhost/long.lived.token?nid=!%
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'hassio://localhost/long.lived.token'
Notes
Home Assistant (hassio://, hassios://): notifications through the Home Assistant REST API.
Without targets a persistent notification is created; otherwise each [domain.]service[:target,...] entry calls /api/services/{domain}/{service}.
httpSMS
| Schemes | httpsms:// |
| Cargo feature | service-httpsms |
| Service | https://httpsms.com |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 160 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}@{from_phone}
{schema}://{apikey}@{from_phone}/{targets}
{schema} is one of httpsms://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret | |
{from_phone} | From Phone No | string | yes | must match ^\+?[0-9\s)(+-]+$ | |
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | yes | any of target_phone; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
from | From Phone No | string | must match ^\+?[0-9\s)(+-]+$ | |
key | API Key | string | sets {apikey} | |
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
httpsms://apikey@15551232000
httpsms://apikey@15551232000/15551232001/15551232002
httpsms://user@15551232000?key=thekey
httpsms://apikey@15551232001?from=15551232000
httpsms://apikey@15551232000?to=15551232003,15551232004
Rejected URLs:
httpsms://
httpsms://15551232000
httpsms://%20@15551232000
httpsms://apikey@555
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'httpsms://apikey@15551232000'
Notes
httpSMS (httpsms://): SMS sent from your Android phone through the httpSMS API.
HumHub
| Schemes | humhub://, humhubs:// |
| Cargo feature | service-humhub |
| Service | https://www.humhub.com/ |
| Body formats | text (first is the default) |
| Attachments | yes |
| Title length | no title (merged into the body) |
| Body length | 4,000 characters |
| Body lines | unlimited |
| Request throttle | 20 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{user}@{host}/{targets}
{schema}://{user}@{host}:{port}/{targets}
{schema}://{user}:{password}@{host}/{targets}
{schema}://{user}:{password}@{host}:{port}/{targets}
{schema} is one of humhub://, humhubs://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{password} | Password | string | no | secret | |
{port} | Port | int, 1 to 65535 | no | ||
{targets} | Targets | list | no | separated by / | |
{user} | Token or Username | string | yes | secret |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
humhub://mytoken@hostname/1
humhubs://mytoken@hostname/1
humhubs://mytoken@hostname/1/2/3
humhubs://mytoken@hostname/1/?to=2,3
Rejected URLs:
humhub://
humhub://hostname
humhub://token@hostname
humhubs://token@hostname/invalid
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'humhub://mytoken@hostname/1'
Notes
HumHub (humhub://, humhubs://): posts to HumHub spaces or user streams.
One post per container; attachments are uploaded to the post id the server returns. On ?retry=, containers already posted to are not posted again and only their missing attachments are uploaded to the remembered post id.
IFTTT
| Schemes | ifttt:// |
| Cargo feature | service-ifttt |
| Service | https://ifttt.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | yes |
URL formats
{schema}://{webhook_id}/{events}
{schema} is one of ifttt://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{events} | Events | list | yes | separated by / | |
{webhook_id} | Webhook ID | string | yes | secret |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
to | Events | list | sets {events} |
Prefixed parameters:
+name=value: Add Tokens-name=value: Remove Tokens
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
ifttt://WebHookID@EventID
ifttt://WebHookID@zeta/alpha/beta/
https://maker.ifttt.com/use/WebHookID/EventID/
http://maker.ifttt.com/use/WebHookID/EventID/Other
ifttt://WebHookID@ev/ev/?to=ev
https://maker.ifttt.com/use/WebHookID/EventID/?to=More
ifttt://WebHookID@EventID/?-Value1=&-value2
ifttt://WebHookID?to=EventID,EventID2
Rejected URLs:
ifttt://
ifttt://:@/
ifttt://EventID/
https://maker.ifttt.com/use/WebHookID/
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'ifttt://WebHookID@EventID'
Notes
IFTTT (ifttt://): triggers IFTTT Webhooks events with the notification as values.
Differences with Apprise
- Apprise ignores
+/-options (attribute typo), while mercurio applies them.
IRC
| Schemes | irc://, ircs:// |
| Cargo feature | service-irc |
| Service | https://ircv3.net/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 380 characters |
| Body lines | unlimited |
| Request throttle | 20 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{host}/{targets}
{schema}://{host}:{port}/{targets}
{schema}://{user}@{host}/{targets}
{schema}://{user}@{host}:{port}/{targets}
{schema}://{user}:{password}@{host}/{targets}
{schema}://{user}:{password}@{host}:{port}/{targets}
{schema} is one of irc://, ircs://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{password} | Password | string | no | secret | |
{port} | Port | int, 1 to 65535 | no | ||
{target_channel} | Target Channel | string | no | prefix # | |
{target_user} | Target User | string | no | prefix @ | |
{targets} | Targets | list | yes | any of target_channel, target_user; separated by / | |
{user} | User | string | no |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
join | Join Channels | bool | yes | |
mode | Auth Mode | choice | server (usually; depends on the URL) | one of znc, server, nickserv, none |
name | Real Name | string | ||
nick | Nickname | string | ||
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
irc://me@irc.example.com/%23chan
ircs://me@irc.example.com/%23chan
irc://me@irc.example.com/%23chan/@bob
irc://me@irc.example.com/%23zeta/%23alpha/@zed/@amy
irc://me@irc.example.com/%23chan?join=no
irc://me@irc.example.com/chan2?to=%23chan
irc://me@irc.example.com/%23a/@b?to=%23c,@d
irc://me:pw@irc.example.com/%23chan?mode=server
Rejected URLs:
irc://me@irc.example.com/@bob?mode=invalid
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'irc://me@irc.example.com/%23chan'
Notes
IRC (irc://, ircs://): messages to IRC channels and users.
One connection per notification: optional PASS, NICK + USER, wait for the 001 welcome (answering PINGs, retrying taken nicknames up to 3 times), optional ZNC liveness PING, then per channel JOIN (waiting for the server’s confirmation) and one PRIVMSG per non-blank body line, PRIVMSG to each user, QUIT.
Auth modes (?mode=): server (default, PASS), nickserv (PRIVMSG NickServ :IDENTIFY after registration), znc (PASS user:password), none. Known networks (Libera.Chat, SynIRC, EFnet) get TLS / port / mode defaults when no port is given.
Differences with Apprise
- NickServ identification is sent (Apprise clears the password first, so its
nickservmode never identifies). - After the welcome mercurio continues at once instead of draining the MOTD for a quiet period.
- A missing JOIN confirmation is waited for up to the read timeout (30 s) and then ignored, like Apprise after its 6 s join timeout.
Jellyfin
| Schemes | jellyfin://, jellyfins:// |
| Cargo feature | service-jellyfin |
| Service | https://jellyfin.org/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{host}
{schema}://{host}:{port}
{schema}://{user}:{password}@{host}
{schema}://{user}:{password}@{host}:{port}
{schema} is one of jellyfin://, jellyfins://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{password} | Password | string | no | secret | |
{port} | Port | int, 1 to 65535 | no | 8096 | |
{user} | Username | string | no |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
modal | Modal | bool | no |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
jellyfin://l2g@localhost
jellyfin://l2g:l2gpass@localhost:8096?modal=no
jellyfins://l2g:l2gpass@localhost:1234?modal=yes
Rejected URLs:
jellyfin://
jellyfins://
jellyfin://localhost
jellyfin://:@/
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'jellyfin://l2g@localhost'
Notes
Jellyfin (jellyfin://, jellyfins://): messages to the active Jellyfin client sessions; same API and code as Emby.
Jira
| Schemes | jira://, opsgenie:// |
| Cargo feature | service-jira |
| Service | https://atlassian.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 15,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}
{schema}://{user}@{apikey}
{schema}://{apikey}/{targets}
{schema}://{user}@{apikey}/{targets}
{schema} is one of jira://, opsgenie://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret | |
{target_escalation} | Target Escalation | string | no | prefix ^ | |
{target_schedule} | Target Schedule | string | no | prefix * | |
{target_team} | Target Team | string | no | prefix # | |
{target_user} | Target User | string | no | prefix @ | |
{targets} | Targets | list | no | any of target_escalation, target_schedule, target_team, target_user; separated by / | |
{user} | Username | string | no |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
action | Action | choice | map | one of map, new, close, delete, acknowledge, note |
alias | Alias | string | ||
batch | Batch Mode | bool | no | |
entity | Entity | string | ||
priority | Priority | choice | 3 | one of 1, 2, 3, 4, 5 |
region | Region Name | choice | us | one of us, eu |
tags | Tags | string | ||
to | Targets | list | sets {targets} |
Prefixed parameters:
+name=value: Details:name=value: Action Mapping
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
jira://k3/
jira://user@k2/
jira://k13b/@user?:s=
jira://k21/?action=new
jira://k17/user@email.com/#team/*sche/^esc/%20/a?action=new
jira://k12/@user?action=close
jira://k6/@user?region=EU&action=new
opsgenie://k6/@user?region=EU&action=new
Rejected URLs:
jira://
jira://:@/
jira://%20%20/
jira://k1/user/?region=xx
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'jira://k3/'
Notes
Jira Service Management (jira://, opsgenie://): creates and manages alerts through the JSM Operations alert API.
opsgenie:// URLs land here too: Opsgenie shuts down on 2027-04-05 and its alert API lives on unchanged as JSM Operations (api.atlassian.com/jsm/ops/integration/v2/alerts, GenieKey auth).
The requestIds of created alerts are kept in the persistent store (60 days) so later close/acknowledge/note/delete actions act on them.
Differences with Apprise
opsgenie://URLs are sent by thejiraservice to Jira Service Management Operations (Apprise posts them toapi(.eu).opsgenie.com, which shuts down on 2027-04-05); the key must come from a JSM Operations API integration.?region=euno longer changes the host.
Join
| Schemes | join:// |
| Cargo feature | service-join |
| Service | https://joaoapps.com/join/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 1,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}/{targets}
{schema} is one of join://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret; must match ^[a-z0-9]{32}$ | |
{device} | Device ID | string | no | must match ^[a-z0-9]{32}$ | |
{device_name} | Device Name | string | no | ||
{group} | Group | choice | no | one of all, android, chrome, windows10, phone, tablet, pc | |
{targets} | Targets | list | yes | any of device, device_name, group; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
image | Include Image | bool | yes | |
priority | Priority | choice | 0 | one of -2, -1, 0, 1, 2 |
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
join://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
join://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/MyDevice
join://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/android/PHONE/allthings
join://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/dddddddddddddddddddddddddddddddd/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
join://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa?image=no
join://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@dddddddddddddddddddddddddddddddd?image=True
join://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa?priority=high
join://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa?to=dddddddddddddddddddddddddddddddd
Rejected URLs:
join://
join://:@/
join://abc
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'join://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
Notes
Join (join://): push notifications to Join devices or device groups.
JSON
| Schemes | json://, jsons:// |
| Cargo feature | service-json |
| Body formats | text, html, markdown (first is the default) |
| Attachments | yes |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{host}
{schema}://{host}:{port}
{schema}://{user}@{host}
{schema}://{user}@{host}:{port}
{schema}://{user}:{password}@{host}
{schema}://{user}:{password}@{host}:{port}
{schema} is one of json://, jsons://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{password} | Password | string | no | secret | |
{port} | Port | int, 1 to 65535 | no | ||
{user} | Username | string | no |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
method | Fetch Method | choice | POST | one of POST, GET, DELETE, PUT, HEAD, PATCH, UPDATE, OPTIONS |
Prefixed parameters:
+name=value: HTTP Header-name=value: GET Params:name=value: Payload Extras
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
json://localhost
json://user@localhost
json://localhost/a%20b/c
jsons://user:pass@localhost:8080/path/to/hook
json://localhost/?method=put
json://localhost/?:key%2520a=b%2520c
json://localhost/?+X-Custom=yes&-param=1&:title=subject&:message=&:extra=value
Rejected URLs:
json://localhost/?method=invalid
json://
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'json://localhost'
Notes
JSON webhook (json://, jsons://): posts the notification as a JSON object to any HTTP endpoint.
Kavenegar
| Schemes | kavenegar:// |
| Cargo feature | service-kavenegar |
| Service | https://kavenegar.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 160 characters |
| Body lines | unlimited |
| Request throttle | 200 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}/{targets}
{schema}://{source}@{apikey}/{targets}
{schema} is one of kavenegar://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret; must match ^[a-z0-9]+$ | |
{source} | Source Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | yes | any of target_phone; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
from | Source Phone No | string | sets {source} | |
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
kavenegar://aaaaaaaaaaaaaaaaaaaaaaaa/33333333333333
kavenegar://11111111111111@bbbbbbbbbbbbbbbbbbbbbbbb/33333333333333
kavenegar://bbbbbbbbbbbbbbbbbbbbbbbb/33333333333333/44444444444444
kavenegar://aaaaaaaaaaaaaaaaaaaaaaaa?to=33333333333333
kavenegar://bbbbbbbbbbbbbbbbbbbbbbbb/33333333333333?from=11111111111111
Rejected URLs:
kavenegar://
kavenegar://:@/
kavenegar://aaaaaaaaaaaaaa@bbbbbbbbbbbbbbbbbbbbbbbb/33333333333333
kavenegar://3333@bbbbbbbbbbbbbbbbbbbbbbbb/33333333333333
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'kavenegar://aaaaaaaaaaaaaaaaaaaaaaaa/33333333333333'
Notes
Kavenegar (kavenegar://): SMS through the Kavenegar API.
Knock
| Schemes | knock:// |
| Cargo feature | service-knock |
| Service | https://knock.app/ |
| Body formats | text, html, markdown (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
knock://{api_key}/{workflow_key}/{targets}
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{api_key} | API Key | string | yes | secret | |
{targets} | Recipients | list | yes | separated by /; user id, e-mail or +phone | |
{workflow_key} | Workflow Key | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
actor | Actor | string | ||
cancel | Cancellation Key | string | ||
host | API Host | string | api.knock.app | host[:port][/path] or a full http(s):// URL |
tenant | Tenant | string | ||
to | Recipients | list | sets {targets} |
Prefixed parameters:
:name=value: Workflow Data+name=value: HTTP Header
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
knock://sk_test_123/alerts/u1/u1
knock://sk_test_123/new-comment/dr_grant
knock://sk_test_123/new-comment/dr_grant/ellie@example.com/+15551234567
knock://sk_test_123/alerts?to=u1,u2&host=knock.example.com&+X-Env=staging
knock://sk_test_123/new-comment/dr_grant?actor=mr_dna&tenant=ingen&cancel=incident_1993&:severity=high
Rejected URLs:
knock://
knock://sk_test_123
knock://sk_test_123/new-comment
knock://sk_test_123/new-comment/u1?host=bad_host!
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'knock://sk_test_123/alerts/u1/u1'
Notes
Knock (knock://): triggers a Knock workflow for the recipients, written from the API reference (https://docs.knock.app/api-reference/workflows/trigger).
knock://{api_key}/{workflow_key}/{recipient}[/{recipient}...]
Options:
?host=api.example.com[:port][/path](or a fullhttp(s)://URL) overrides the API base (defaulthttps://api.knock.app).?to=a,badds recipients;?actor=..,?tenant=..and?cancel=..(cancellation_key) are passed through.:key=valueaddskeyto the workflowdata;+Header=valueadds an HTTP header.
Each recipient is a user id, an e-mail (inline identification {"id": email, "email": email}) or +<phone> ({"id": phone, "phone_number": phone}). One POST /v1/workflows/{key}/trigger is sent per 1000 recipients with Authorization: Bearer {api_key} and {"recipients": [...], "data": {"title", "body", "type"}}; any 2xx is success.
Differences with Apprise
- Not in Apprise; written from the vendor documentation (hand-written fixtures).
Kodi/XBMC
| Schemes | kodi://, xbmc://, kodis://, xbmcs:// |
| Cargo feature | service-kodi |
| Service | http://kodi.tv/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | 2 lines |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{host}
{schema}://{host}:{port}
{schema}://{user}:{password}@{host}
{schema}://{user}:{password}@{host}:{port}
{schema} is one of kodi://, xbmc://, kodis://, xbmcs://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{password} | Password | string | no | secret | |
{port} | Port | int, 1 to 65535 | no | ||
{user} | Username | string | no |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
duration | Duration | int, min 1 | 12 | |
image | Include Image | bool | yes |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
kodi://localhost
xbmc://localhost
xbmc://user@localhost
kodi://user:pass@localhost
kodis://localhost:8080/path/
xbmcs://user:pass@localhost:443
kodis://user:password@localhost:8080
kodi://localhost?image=no
Rejected URLs:
kodi://
kodis://
kodi://:@/
xbmc://
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'kodi://localhost'
Notes
Kodi / XBMC (kodi://, xbmc://, kodis://, xbmcs://): on-screen notifications through the Kodi JSON-RPC API.
Kook
| Schemes | kook:// |
| Cargo feature | service-kook |
| Service | https://www.kookapp.cn/ |
| Body formats | markdown (first is the default) |
| Attachments | yes |
| Title length | no title (merged into the body) |
| Body length | 5,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | yes |
URL formats
{schema}://{token}
{schema}://{token}/{targets}
{schema} is one of kook://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{targets} | Targets | list | no | separated by / | |
{token} | Token | string | yes | secret |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
mode | Mode | choice | bot | one of bot, webhook |
to | Targets | list | sets {targets} | |
token | Token | string | sets {token} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
kook://kookbottoken123/1234567890
kook://kookbottoken123/1234567890/@1111111111
https://www.kookapp.cn/api/v3/incoming/nativekey123
kook://kookbottoken123/9876543210/1234567890/1234567890
kook://kookbottoken123/@1111111111/%231234567890/bad/@x
kook://kookbottoken123/1234567890/?format=text
https://www.kookapp.cn/api/v3/incoming/nativekey123/?format=text
kook://abc123webhookkey/?mode=webhook
Rejected URLs:
kook://
kook://kookbottoken123/?mode=invalid
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'kook://kookbottoken123/1234567890'
Notes
Kook (kook://): messages through bot mode (channels, DMs, CDN attachments) and incoming-webhook mode.
LaMetric
| Schemes | lametric://, lametrics:// |
| Cargo feature | service-lametric |
| Service | https://lametric.com |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | 200 ms between requests |
| Vendor URLs accepted | yes |
URL formats
{schema}://{app_token}@{app_id}
{schema}://{app_token}@{app_id}/{app_ver}
{schema}://{apikey}@{host}
{schema}://{user}:{apikey}@{host}
{schema}://{apikey}@{host}:{port}
{schema}://{user}:{apikey}@{host}:{port}
{schema} is one of lametric://, lametrics://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | Device API Key | string | no | secret | |
{app_id} | App ID | string | no | secret | |
{app_token} | App Access Token | string | no | must match ^[A-Z0-9]{80,}==$ | |
{app_ver} | App Version | string | no | 1 | must match ^[1-9][0-9]*$ |
{host} | Hostname | string | no | ||
{port} | Port | int, 1 to 65535 | no | 8080 | |
{user} | Username | string | no |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
apikey | Device API Key | string | sets {apikey} | |
app_id | App ID | string | sets {app_id} | |
app_ver | App Version | string | sets {app_ver} | |
cycles | Cycles | int, min 0 | 1 | |
icon | Custom Icon | string | ||
icon_type | Icon Type | choice | none | one of info, alert, none |
mode | Mode | choice | device (usually; depends on the URL) | one of cloud, device |
priority | Priority | choice | info | one of info, warning, critical |
sound | Sound | string |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
lametric://root:8b799edf-6f98-4d3a-9be7-2862fb4e5752@192.168.0.5:8080/
lametrics://TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT==@com.lametric.941c51dff3135bd87aa72db9d855dd50/
lametrics://TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT==@com.lametric.941c51dff3135bd87aa72db9d855dd50/2/
lametric://8b799edf-6f98-4d3a-9be7-2862fb4e5752@192.168.1.2/?icon=230
lametric://8b799edf-6f98-4d3a-9be7-2862fb4e5752@192.168.1.3/?cycles=2
lametrics://8b799edf-6f98-4d3a-9be7-2862fb4e5752@192.168.0.6/?mode=device
lametrics://8b799edf-6f98-4d3a-9be7-2862fb4e5752@192.168.1.2/?icon=%23230
lametrics://8b799edf-6f98-4d3a-9be7-2862fb4e5752@192.168.0.6/?sound=alarm1
Rejected URLs:
lametric://
lametric://:@/
lametric://8b799edf-6f98-4d3a-9be7-2862fb4e5752/
lametrics://TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT==@com.lametric.941c51dff3135bd87aa72db9d855dd50/abc/
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'lametric://root:8b799edf-6f98-4d3a-9be7-2862fb4e5752@192.168.0.5:8080/'
Notes
LaMetric (lametric://, lametrics://): notifications on LaMetric Time devices.
Two modes: cloud (developer widget push, {token}@{app_id}[/{ver}]) and device (local API, [user:]{apikey}@{host}[:port]).
Lark (Feishu)
| Schemes | lark:// |
| Cargo feature | service-lark |
| Service | https://open.larksuite.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | yes |
URL formats
{schema}://{token}
{schema} is one of lark://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{token} | Bot Token | string | yes | secret; must match ^[a-z0-9-]+$ |
Query parameters
No service-specific parameters.
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
lark://abcd-1234
lark://abcd-1234/
https://open.larksuite.com/open-apis/bot/v2/hook/abcd-1234
HTTPS://OPEN.LARKSUITE.COM/open-apis/bot/v2/hook/ABCD-1234
lark://?token=abcd-1234
Rejected URLs:
https://open.larksuite.com/open-apis/bot/v2/hook/abc_d
lark://
lark://:@/
lark://abc_def
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'lark://abcd-1234'
Notes
Lark (lark://): messages to a Lark group bot webhook.
Lauther
| Schemes | lauther:// |
| Cargo feature | service-lauther |
| Service | https://lauther.app/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 2,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{token}
{schema} is one of lauther://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{token} | Token | string | yes | secret; must match ^lpt_[a-z0-9]+$ |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
click | Click URL | string | ||
color | Color | string | ||
group | Group | string | ||
icon | Icon URL | string | ||
priority | Priority | choice | 0 | one of -2, -1, 0, 1, 2 |
route | Route | string | ||
sound | Sound | string | ||
token | Token | string | sets {token} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
lauther://lpt_abc123
lauther://lpt_abc123?priority=high
lauther://?token=lpt_abc123
lauther://lpt_abc123?sound=default&click=https://example.ca&icon=https%3A%2F%2Fi.ca%2Fx.png&color=red&group=g1&route=%2Fhome
Rejected URLs:
lauther://
lauther://:@/
lauther://%badtoken%
lauther://abc123
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'lauther://lpt_abc123'
Notes
Lauther (lauther://): push notifications through the Lauther API.
Line
| Schemes | line:// |
| Cargo feature | service-line |
| Service | https://line.me/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 5,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{token}/{targets}
{schema} is one of line://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{target_user} | Target User | string | no | ||
{targets} | Targets | list | yes | any of target_user; separated by / | |
{token} | Access Token | string | yes | secret |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
image | Include Image | bool | yes | |
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
line://token=/target
line://token/target2/target1/target2
line://token/target?image=no
line://a/very/long/token=/target?image=no
line://token/a?to=b,%23c
line://?token=token&to=target1
Rejected URLs:
line://
line://%20/
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'line://token=/target'
Notes
LINE (line://): push messages to users or groups through the LINE Messaging API.
Logger
| Schemes | logger:// |
| Cargo feature | service-logger |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
logger://
Query parameters
No service-specific parameters.
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Notes
Logger (logger://): writes the notification to the log facade at info level.
MacOSX Notification
| Schemes | macosx:// |
| Cargo feature | service-macosx |
| Service | https://github.com/julienXX/terminal-notifier |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | 10 lines |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://
{schema} is one of macosx://.
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
click | Open/Click URL | string | ||
image | Include Image | bool | yes | |
sender | Sender | string | ||
sound | Sound | string | ||
version | Terminal-Notifier Version | choice | one of 2, 3 |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
macosx://
macosx://_/
macosx://_/?image=no
macosx://_/?sender=me
macosx://_/?version=2
macosx://_/?sound=default
macosx://_/?version=2&image=no
macosx://_/?version=2&sound=-x
Rejected URLs:
macosx://_/?version=4
macosx://_/?version=abc
macosx://_/?version=3.0
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'macosx://'
Notes
macOS Notification Center (macosx://): banners through terminal-notifier.
mercurio runs terminal-notifier (brew install terminal-notifier), looked up in the same places: /opt/homebrew/bin, /usr/local/bin, /usr/bin, /bin, /opt/local/bin. Without ?version=, the installed major version is probed once per URL with terminal-notifier -version (falling back to 3); version 2 gets -sender and -appIcon, version 3 -contentImage. Every value is prefixed with \ so terminal-notifier reads it as plain text.
There is no osascript fallback.
Differences with Apprise
- When no known path holds
terminal-notifier, mercurio still runs it throughPATH(Apprise gives up). - On other platforms delivery fails with
Unsupported(Apprise does not load the plugin there).
MailerSend
| Schemes | mailersend:// |
| Cargo feature | service-mailersend |
| Service | https://www.mailersend.com/ |
| Body formats | html, text (first is the default) |
| Attachments | yes |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | 200 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}:{from_email}
{schema}://{apikey}:{from_email}/{targets}
{schema} is one of mailersend://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret; must match ^[a-zA-Z0-9._-]+$ | |
{from_email} | Source Email | yes | |||
{target_email} | Target Email | no | |||
{targets} | Targets | list | no | any of target_email; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
bcc | Blind Carbon Copy | list | separated by , or space | |
cc | Carbon Copy | list | separated by , or space | |
reply | Reply To | string | ||
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
mailersend://abcd:user@example.com
mailersend://abcd:user@example.com/newuser@example.com
mailersend://abcd:user@example.com?format=text
mailersend://abcd:user@example.com?cc=cc@example.com
mailersend://abcd:user@example.com?bcc=bcc@example.com
mailersend://abcd:user@example.com?to=extra@example.com
mailersend://abcd:user@example.com?reply=reply@example.com
mailersend://abcd:user@example.com/to@example.com?cc=x@example.com&bcc=x@example.com
Rejected URLs:
mailersend://
mailersend://:@/
mailersend://abcd
mailersend://abcd@host
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'mailersend://abcd:user@example.com'
Notes
MailerSend (mailersend://): e-mail through the MailerSend API.
mailersend://{apikey}:{from_user}@{from_domain}[/{to_email}...][?cc=..&bcc=..&reply=..&to=..]
Both an HTML and a plain-text part are sent; the one not given is converted from the other. Without targets the message goes to the sender.
Mailgun
| Schemes | mailgun:// |
| Cargo feature | service-mailgun |
| Service | https://www.mailgun.com/ |
| Body formats | html (first is the default) |
| Attachments | yes |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | 200 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{user}@{host}/{apikey}/
{schema}://{user}@{host}/{apikey}/{targets}
{schema} is one of mailgun://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret | |
{host} | Domain | string | yes | ||
{target_email} | Target Email | no | |||
{targets} | Targets | list | no | any of target_email; separated by / | |
{user} | User Name | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
batch | Batch Mode | bool | no | |
bcc | Blind Carbon Copy | list | separated by , or space | |
cc | Carbon Copy | list | separated by , or space | |
name | From Name | string | also from | |
region | Region Name | choice | us | one of us, eu |
to | Targets | list | sets {targets} |
Prefixed parameters:
+name=value: Email Header:name=value: Template Tokens
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
mailgun://user@localhost.localdomain/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbb-cccccccc
mailgun://user@localhost.localdomain/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbb-cccccccc/test@example.com
mailgun://user@localhost.localdomain/apikey?verify=no
mailgun://no-reply@example.com/apikey/user1@example.com/User2:user2@example.com?batch=yes
mailgun://user@localhost.localdomain/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbb-cccccccc?region=uS
mailgun://user@localhost.localdomain/apikey?name=J%C3%B6rg
mailgun://user@localhost.localdomain/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbb-cccccccc?format=markdown
mailgun://user@localhost.localdomain/apikey?to=test@example.com
Rejected URLs:
mailgun://
mailgun://:@/
mailgun://user@localhost.localdomain
mailgun://localhost.localdomain/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbb-cccccccc
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'mailgun://user@localhost.localdomain/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbb-cccccccc'
Notes
Mailgun (mailgun://): e-mail through the Mailgun API.
mailgun://{user}@{domain}/{apikey}[/{to_email}...] ?region=us|eu&from=..&name=..&cc=..&bcc=..&batch=yes&+Header=v&:token=v
+key=value entries become h:key e-mail headers, :key=value entries v:key template variables. Without targets the message goes to the sender.
Mastodon
| Schemes | mastodon://, toot://, mastodons://, toots:// |
| Cargo feature | service-mastodon |
| Service | https://joinmastodon.org |
| Body formats | text (first is the default) |
| Attachments | yes |
| Title length | no title (merged into the body) |
| Body length | 500 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{token}@{host}
{schema}://{token}@{host}:{port}
{schema}://{token}@{host}/{targets}
{schema}://{token}@{host}:{port}/{targets}
{schema} is one of mastodon://, toot://, mastodons://, toots://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{port} | Port | int, 1 to 65535 | no | ||
{target_user} | Target User | string | no | prefix @ | |
{targets} | Targets | list | no | any of target_user; separated by / | |
{token} | Access Token | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
batch | Batch Mode | bool | yes | |
key | Idempotency-Key | string | ||
language | Language Code | string | ||
ping | Ping Users/Tags | list | separated by , or space | |
sensitive | Sensitive Attachments | bool | no | |
spoiler | Spoiler Text | string | ||
to | Targets | list | sets {targets} | |
token | Access Token | string | sets {token} | |
visibility | Visibility | choice | default (usually; depends on the URL) | one of default, direct, private, unlisted, public |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
toot://access_token@hostname
toots://access_token@hostname
mastodon://access_token@hostname
mastodon://access_token@hostname/@user/@user2
mastodon://access_token@hostname/?batch=no
mastodon://hostname/@user/@user2?token=abcd123
mastodon://access_token@hostname?visibility=unl
mastodon://access_token@hostname?format=markdown
Rejected URLs:
mastodon://hostname
mastodon://access_token@hostname/-/%/
mastodon://access_token@hostname?visibility=invalid
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'toot://access_token@hostname'
Notes
Mastodon (mastodon://, toot://, mastodons://, toots://): posts statuses to a Mastodon instance.
Differences with Apprise
- The rate-limit reset is read from
X-RateLimit-Reset(an RFC 3339 time); Apprise readsX-RateLimit-Limit, a request count, so its back-off never waits. The budget is kept for the life of the URL, as in Apprise. - The account lookup of direct mode is kept for the life of the URL whatever
?cache=says, as in Apprise (whose_whoami()call ignores it). - In direct mode prepended targets keep their configured (sorted) order; Apprise iterates an unordered set.
Matrix
| Schemes | matrix://, matrixs:// |
| Cargo feature | service-matrix |
| Service | https://matrix.org/ |
| Body formats | text, html, markdown (first is the default) |
| Attachments | yes |
| Title length | 250 characters |
| Body length | 65,000 characters |
| Body lines | unlimited |
| Request throttle | 500 ms between requests |
| Vendor URLs accepted | yes |
URL formats
{schema}://{token}
{schema}://{user}@{token}
{schema}://{user}:{password}@{host}/{targets}
{schema}://{user}:{password}@{host}:{port}/{targets}
{schema}://{token}@{host}/{targets}
{schema}://{token}@{host}:{port}/{targets}
{schema}://{user}:{token}@{host}/{targets}
{schema}://{user}:{token}@{host}:{port}/{targets}
{schema} is one of matrix://, matrixs://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{password} | Password | string | no | secret | |
{port} | Port | int, 1 to 65535 | no | ||
{target_room_alias} | Target Room Alias | string | no | prefix # | |
{target_room_id} | Target Room ID | string | no | prefix ! | |
{target_user} | Target User | string | no | prefix @ | |
{targets} | Targets | list | no | any of target_room_alias, target_room_id, target_user; separated by / | |
{token} | Access Token | string | yes | secret | |
{user} | Username | string | no |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
autoverify | Automatic Device Verification | bool | no | |
discovery | Server Discovery | bool | yes | |
e2ee | End-to-End Encryption | bool | yes | |
hsreq | Force Home Server on Room IDs | bool | yes | |
image | Include Image | bool | no | |
mode | Webhook Mode | choice | off (usually; depends on the URL) | one of off, matrix, slack, t2bot, hookshot |
msgtype | Message Type | choice | text | one of text, notice |
path | Webhook Path | string | /webhook | |
to | Targets | list | sets {targets} | |
token | Access Token | string | sets {token} | |
version | Matrix API Version | choice | 3 | also v; one of 2, 3 |
keystore | Key store directory | string | keeps this URL’s state under the directory |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
matrix://user:pass@localhost
matrix://user:pass@localhost/!room:localhost
matrix://user:pass@localhost/!r1:localhost/!r2:localhost
matrixs://cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
https://webhooks.t2bot.io/api/v1/matrix/hook/dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd/
matrix://user:pass@localhost/!room:localhost?v=2
matrixs://user:pass@localhost/!room:localhost?e2ee=no
matrix://user:pass@localhost/!room?hsreq=no
Rejected URLs:
matrix://
matrixs://
matrix://localhost
matrix://user:token@localhost:123/#general/?v=invalid
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'matrix://user:pass@localhost'
Notes
Attachment encryption (Matrix EncryptedFile v2, AES-256-CTR).
Mattermost
| Schemes | mmost://, mmosts:// |
| Cargo feature | service-mattermost |
| Service | https://mattermost.com/ |
| Body formats | text (first is the default) |
| Attachments | yes |
| Title length | no title (merged into the body) |
| Body length | 4,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | yes |
URL formats
{schema}://{host}/{token}
{schema}://{host}:{port}/{token}
{schema}://{host}/{fullpath}/{token}
{schema}://{host}:{port}/{fullpath}/{token}
{schema}://{user}@{host}/{token}
{schema}://{user}@{host}:{port}/{token}
{schema}://{user}@{host}/{fullpath}/{token}
{schema}://{user}@{host}:{port}/{fullpath}/{token}
{schema} is one of mmost://, mmosts://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{fullpath} | Path | string | no | ||
{host} | Hostname | string | yes | ||
{port} | Port | int, 1 to 65535 | no | ||
{target_channel} | Target Channel | string | no | prefix # | |
{target_channel_id} | Target Channel ID | string | no | ||
{targets} | Targets | list | no | any of target_channel, target_channel_id; separated by / | |
{token} | Token | string | yes | secret | |
{user} | User | string | no |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
botname | User | string | sets {user} | |
channel | Targets | list | sets {targets} | |
channels | Targets | list | sets {targets} | |
icon_url | Icon URL | string | ||
image | Include Image | bool | yes | |
mode | Mode | choice | webhook (usually; depends on the URL) | one of webhook, bot |
team | User | string | sets {user} | |
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
mmost://localhost/3ccdd113474722377935511fc85d3dd4
mmosts://localhost/a/path/3ccdd113474722377935511fc85d3dd4
mmosts://localhost/////3ccdd113474722377935511fc85d3dd4///
https://mattermost.example.com/hooks/3ccdd113474722377935511fc85d3dd4
mmost://localhost/token?mode=w
mmost://localhost/3ccdd113474722377935511fc85d3dd4?to=#raw
mmost://localhost/3ccdd113474722377935511fc85d3dd4?image=no
http://mattermost.example.com:8065/hooks/3ccdd113474722377935511fc85d3dd4/?image=no
Rejected URLs:
mmost://
mmosts://
mmost://:@/
mmosts://localhost
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'mmost://localhost/3ccdd113474722377935511fc85d3dd4'
Notes
Mattermost (mmost://, mmosts://): posts to Mattermost channels.
Channel-name lookups (bot mode) are cached in the persistent store for 20 days (c:<name>).
Misskey
| Schemes | misskey://, misskeys:// |
| Cargo feature | service-misskey |
| Service | https://misskey-hub.net/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 512 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{token}@{host}
{schema}://{token}@{host}:{port}
{schema} is one of misskey://, misskeys://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{port} | Port | int, 1 to 65535 | no | ||
{token} | Access Token | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
token | Access Token | string | sets {token} | |
visibility | Visibility | choice | public | one of public, home, followers, specified |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
misskey://access_token@hostname
misskeys://access_token@hostname
misskey://hostname/?token=abcd123
misskeys://access_token@hostname?visibility=specified
Rejected URLs:
misskey://
misskey://:@/
misskey://hostname
misskey://user:pass@hostname
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'misskey://access_token@hostname'
Notes
Misskey notes (misskey://, misskeys://): posts a note to a Misskey instance.
Mobile Message
| Schemes | mobilemessage://, mobilemsg:// |
| Cargo feature | service-mobilemessage |
| Service | https://mobilemessage.com.au/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 1,530 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{user}:{password}@{sender}/{targets}
{schema} is one of mobilemessage://, mobilemsg://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{password} | API Password | string | yes | secret | |
{sender} | Sender ID | string | yes | must match ^\+?[a-z0-9][a-z0-9 ()_.-]{1,19}$ | |
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | yes | any of target_phone; separated by / | |
{user} | API Username | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
batch | Batch Mode | bool | yes | |
from | Sender ID | string | sets {sender} | |
max_parts | Max Message Parts | int, 1 to 99 | 10 | |
ref | Custom Reference | string | ||
to | Targets | list | sets {targets} | |
unicode | Unicode Characters | bool | no |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
mobilemessage://user:pass@MyBiz/0412345678
mobilemessage://user:pass@MyBiz/0412345678?unicode=yes&max_parts=2
mobilemessage://user:pass@0412345678?from=%2B61%20(412)%20345-670&to=0412345679
Rejected URLs:
mobilemessage://
mobilemessage://user@Sender/0412345678
mobilemessage://user:pass@-x/0412345678
mobilemessage://user:pass@MyBiz/0412345678?max_parts=abc
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'mobilemessage://user:pass@MyBiz/0412345678'
Notes
Mobile Message (mobilemessage://, mobilemsg://): SMS through the Mobile Message API.
MQTT Notification
| Schemes | mqtt://, mqtts:// |
| Cargo feature | service-mqtt |
| Service | https://mqtt.org/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 268,435,455 characters |
| Body lines | unlimited |
| Request throttle | 500 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{user}@{host}/{topic}
{schema}://{user}@{host}:{port}/{topic}
{schema}://{user}:{password}@{host}/{topic}
{schema}://{user}:{password}@{host}:{port}/{topic}
{schema} is one of mqtt://, mqtts://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{password} | Password | string | yes | secret | |
{port} | Port | int, 1 to 65535 | no | ||
{targets} | Targets | list | no | any of topic; separated by / | |
{topic} | Target Queue | string | yes | ||
{user} | User Name | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
client_id | Client ID | string | ||
qos | QOS | int, 0 to 2 | 0 | |
retain | Retain Messages | bool | no | |
session | Use Session | bool | no | |
to | Targets | list | sets {targets} | |
version | Version | choice | v3.1.1 | one of v3.1.1, v3.1, v5.0 |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
mqtt://user@localhost/t
mqtt://localhost/b%20a;c
mqtts://localhost:8884/t
mqtt://localhost/my/topic
mqtts://user:pass@localhost/my/topic
mqtt://localhost/my/topic,my/other/topic
mqtt://user:pass@localhost/a/b?qos=2
mqtt://user@localhost/my/topic?retain=yes
Rejected URLs:
mqtt://
mqtt://localhost?qos=123
mqtt://localhost/t?qos=-1
mqtt://localhost?qos=invalid
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'mqtt://user@localhost/t'
Notes
MQTT (mqtt://, mqtts://): publishes the message to an MQTT broker.
The client is built in: MQTT 3.1 / 3.1.1 / 5, with CONNECT (client id, clean session, credentials, keepalive 30) answered by CONNACK, then one PUBLISH per topic (QoS 1 waits for PUBACK, QoS 2 runs PUBREC/PUBREL/PUBCOMP), then DISCONNECT.
Differences with Apprise
- MQTT 5 works (Apprise passes
clean_sessionto paho for every version, which paho rejects for v5). - TLS uses the bundled Mozilla roots or the
SSL_CERT_FILEbundle (Apprise refuses verifiedmqtts://without a CA bundle on disk). - Topics of one notification are not throttled against each other (Apprise waits 0.5 s between publishes).
- CONNACK is awaited before publishing (paho publishes asynchronously).
MSG91
| Schemes | msg91:// |
| Cargo feature | service-msg91 |
| Service | https://msg91.com |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 160 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{template}@{authkey}/{targets}
{schema} is one of msg91://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{authkey} | Authentication Key | string | yes | secret; must match ^[a-z0-9]+$ | |
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | yes | any of target_phone; separated by / | |
{template} | Template ID | string | yes | secret; must match ^[a-z0-9 _-]+$ |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
short_url | Short URL | bool | no | |
to | Targets | list | sets {targets} |
Prefixed parameters:
:name=value: Template Mapping
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
msg91://tttttttttttttttttttt@aaaaaaaaaaaaaaaaaaaaaaa/15551232000
msg91://tttttttttttttttttttt@aaaaaaaaaaaaaaaaaaaaaaa/15551232000?:body=body
msg91://tttttttttttttttttttt@aaaaaaaaaaaaaaaaaaaaaaa/15551232000/15551232001?short_url=yes
msg91://tttttttttttttttttttt@aaaaaaaaaaaaaaaaaaaaaaa/?to=15551232000&short_url=no
msg91://tttttttttttttttttttt@aaaaaaaaaaaaaaaaaaaaaaa/15551232000?:body=msg&:type=&:extra=value&:mobiles=x
Rejected URLs:
msg91://
msg91://-
msg91://aaaaaaaaaaaaaaaaaaaaaaa
msg91://tttttttttttttttttttt@aaaaaaaaaaaaaaaaaaaa-x/15551232000
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'msg91://tttttttttttttttttttt@aaaaaaaaaaaaaaaaaaaaaaa/15551232000'
Notes
MSG91 flows (msg91://): SMS through MSG91 flow templates.
Nextcloud
| Schemes | ncloud://, nclouds:// |
| Cargo feature | service-nextcloud |
| Service | https://nextcloud.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 255 characters |
| Body length | 4,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{host}/{targets}
{schema}://{host}:{port}/{targets}
{schema}://{user}:{password}@{host}/{targets}
{schema}://{user}:{password}@{host}:{port}/{targets}
{schema} is one of ncloud://, nclouds://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{password} | Password | string | no | secret | |
{port} | Port | int, 1 to 65535 | no | ||
{target_group} | Target Group | string | no | prefix # | |
{target_user} | Target User | string | no | prefix @ | |
{targets} | Targets | list | yes | any of target_group, target_user; separated by / | |
{user} | Username | string | no |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
to | Targets | list | sets {targets} | |
url_prefix | URL Prefix | string | ||
version | Version | int, min 1 | 21 |
Prefixed parameters:
+name=value: HTTP Header
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
ncloud://localhost/admin
ncloud://user@localhost/admin
ncloud://localhost/admin/@admin
nclouds://user:pass@localhost/admin
ncloud://user:pass@localhost/?to=*
ncloud://user@localhost?to=user1&version=20
ncloud://user@localhost?to=user1&version=20&url_prefix=/abcd
ncloud://localhost:8080/admin?+HeaderKey=HeaderValue&+Accept=text/plain
Rejected URLs:
ncloud://
ncloud://user@localhost?to=user1&version=invalid
ncloud://user@localhost?to=user1&version=0
ncloud://user@localhost?to=user1&version=-23
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'ncloud://localhost/admin'
Notes
Nextcloud (ncloud://, nclouds://): notifications to Nextcloud users.
Targets are users, #groups or all/everyone/*; groups are expanded through the OCS provisioning API before sending.
Group lookups are cached for a day in the persistent store.
Differences with Apprise
- URL order is kept (users first, then group members); Apprise iterates unordered sets.
Nextcloud Talk
| Schemes | nctalk://, nctalks:// |
| Cargo feature | service-nextcloudtalk |
| Service | https://nextcloud.com/talk |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 255 characters |
| Body length | 31,745 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{user}:{password}@{host}/{targets}
{schema}://{user}:{password}@{host}:{port}/{targets}
{schema}://{host}/{targets}?secret={secret}
{schema}://{host}:{port}/{targets}?secret={secret}
{schema} is one of nctalk://, nctalks://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{password} | Password | string | yes | secret | |
{port} | Port | int, 1 to 65535 | no | ||
{secret} | Secret | string | yes | secret | |
{target_room_id} | Room ID | string | no | ||
{targets} | Targets | list | yes | any of target_room_id; separated by / | |
{user} | Username | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
secret | Secret | string | sets {secret} | |
silent | Silent Notification | bool | no | |
url_prefix | URL Prefix | string |
Prefixed parameters:
+name=value: HTTP Header
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
nctalks://user:pass@localhost/roomid
nctalk://user:pass@localhost:8080/roomid
nctalk://user:pass@localhost/roomid2/roomid1
nctalk://user:pass@localhost/roomid?silent=yes
nctalks://localhost/room1/room2?secret=abcd
nctalk://user:pass@localhost:8080/roomid?url_prefix=/prefix
nctalks://user:pass@localhost/room?secret=abc&silent=yes
nctalk://user:pass@localhost/admin/?url_prefix=a/longer/path/abcd/
Rejected URLs:
nctalk://
nctalk://localhost/roomid
nctalk://user@localhost/roomid
nctalk://localhost/roomid?secret=
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'nctalks://user:pass@localhost/roomid'
Notes
Nextcloud Talk (nctalk://, nctalks://): messages to Nextcloud Talk rooms.
Either user/password (chat API) or ?secret= (bot API, HMAC-SHA256 signed).
Notica
| Schemes | notica://, noticas:// |
| Cargo feature | service-notica |
| Service | https://notica.us/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | yes |
URL formats
{schema}://{token}
{schema}://{host}/{token}
{schema}://{host}:{port}/{token}
{schema}://{user}@{host}/{token}
{schema}://{user}@{host}:{port}/{token}
{schema}://{user}:{password}@{host}/{token}
{schema}://{user}:{password}@{host}:{port}/{token}
{schema}://{host}{path}/{token}
{schema}://{host}:{port}/{path}/{token}
{schema}://{user}@{host}/{path}/{token}
{schema}://{user}@{host}:{port}{path}/{token}
{schema}://{user}:{password}@{host}{path}/{token}
{schema}://{user}:{password}@{host}:{port}/{path}/{token}
{schema} is one of notica://, noticas://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | no | ||
{password} | Password | string | no | secret | |
{path} | Path | string | no | / | |
{port} | Port | int, 1 to 65535 | no | ||
{token} | Token | string | yes | secret; must match ^\?*(?P<token>[^/]+)\s*$ | |
{user} | Username | string | no |
Query parameters
No service-specific parameters.
Prefixed parameters:
+name=value: HTTP Header
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
notica://aaaaaa
notica://localhost/bbbbbb
noticas://localhost/jjjjjj
notica://user@localhost/cccccc
notica://user:pass@localhost/dddddd/
noticas://localhost:8080/path/555555
noticas://user:pass@localhost:8080/666666
notica://user:pass@localhost/a/path/rrrrrr/
Rejected URLs:
notica://
notica://:@/
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'notica://aaaaaa'
Notes
Notica (notica://, noticas://): browser notifications through Notica.
Notifiarr
| Schemes | notifiarr:// |
| Cargo feature | service-notifiarr |
| Service | https://notifiarr.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | 40 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}/{targets}
{schema} is one of notifiarr://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | Token | string | yes | secret | |
{target_channel} | Target Channel | string | no | prefix # | |
{targets} | Targets | list | yes | any of target_channel; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
apikey | Token | string | sets {apikey}; also key | |
event | Discord Event ID | int | ||
image | Include Image | bool | no | |
source | Source | string | also from | |
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
notifiarr://apikey/1234
notifiarr://apikey/#1234/#5678
notifiarr://apikey/123?image=yes
notifiarr://apikey/123?event=1234
notifiarr://apikey/?to=123,%23456
notifiarr://123/?apikey=myapikey
notifiarr://apikey/123?source=My%20App
notifiarr://apikey/123?from=other&image=no
Rejected URLs:
notifiarr://
notifiarr://:@/
notifiarr://apikey/123?event=abc
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'notifiarr://apikey/1234'
Notes
Notifiarr (notifiarr://): notifications through the Notifiarr API.
Notifyre
| Schemes | notifyre:// |
| Cargo feature | service-notifyre |
| Service | https://notifyre.com/ |
| Body formats | text (first is the default) |
| Attachments | yes |
| Title length | no title (merged into the body) |
| Body length | 160 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}/{targets}
{schema} is one of notifyre://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret | |
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | no | any of target_phone; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
campaign | Campaign Name | string | ||
from | Source Phone No | string | ||
header | Fax Header | string | ||
hq | High Quality | bool | yes | |
mode | Mode | choice | sms | one of sms, fax |
ref | Client Reference | string | ||
template | Template Name | string | ||
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
notifyre://apikey/15551232000
notifyre://apikey/15551232000?mode=S
notifyre://apikey/15551232000/+61 412 345 678/bad?to=15551232001
notifyre://apikey/15551232000?from=15551239999&campaign=%20Camp%20
notifyre://apikey/15551232000?mode=fax&template=Tpl&ref=R1&hq=no&header=Hdr&from=15551239999
Rejected URLs:
notifyre://
notifyre://apikey/15551232000?from=abc
notifyre://apikey/15551232000?mode=email
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'notifyre://apikey/15551232000'
Notes
Notifyre (notifyre://): SMS and fax through the Notifyre API.
Novu
| Schemes | novu:// |
| Cargo feature | service-novu |
| Service | https://novu.co/ |
| Body formats | text, html, markdown (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
novu://{api_key}/{workflow_id}/{targets}
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{api_key} | API Key | string | yes | secret | |
{targets} | Subscribers | list | yes | separated by /; subscriber id, e-mail or +phone | |
{workflow_id} | Workflow ID | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
host | API Host | string | self-hosted API, host[:port][/path] or a full http(s):// URL; wins over region | |
region | Region | choice | us | one of us, eu |
to | Subscribers | list | sets {targets} | |
transaction | Transaction ID | string |
Prefixed parameters:
:name=value: Payload Extras+name=value: HTTP Header
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
novu://apikey/welcome/sub1
novu://apikey/welcome/sub1/user@example.com/+15551234567
novu://apikey/welcome?region=EU&to=a,b
novu://apikey/welcome/sub1?host=http://10.0.0.5:3000
novu://apikey/welcome/sub1?host=novu.example.com:3000/api&transaction=tx-1&:env=prod&+X-Trace=abc
Rejected URLs:
novu://
novu://apikey
novu://apikey/welcome
novu://apikey/welcome/sub1?region=mars
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'novu://apikey/welcome/sub1'
Notes
Novu (novu://): triggers a Novu workflow for subscribers. Written from the Novu API reference (https://docs.novu.co/api-reference/events/trigger-event).
novu://{api_key}/{workflow_id}/{subscriber}[/{subscriber}...]
Options:
?region=euuseshttps://eu.api.novu.co(defaulthttps://api.novu.co).?host=novu.example.com[:port][/path](or a fullhttp(s)://URL) points at a self-hosted Novu API; it wins overregion.?to=a,badds subscribers;?transaction=..setstransactionId.:key=valueaddskeyto the triggerpayload;+Header=valueadds an HTTP header.
Each subscriber is a subscriber id, an e-mail ({"subscriberId": email, "email": email}) or +<phone> ({"subscriberId": phone, "phone": phone}). One POST /v1/events/trigger is sent per 100 subscribers with Authorization: ApiKey {api_key} and {"name": workflow_id, "to": [...], "payload": {"title", "body", "type"}}. Success is any 2xx whose body (or its data object) does not say "acknowledged": false.
Differences with Apprise
- Not in Apprise; written from the vendor documentation (hand-written fixtures).
ntfy
| Schemes | ntfy://, ntfys:// |
| Cargo feature | service-ntfy |
| Service | https://ntfy.sh/ |
| Body formats | text (first is the default) |
| Attachments | yes |
| Title length | 200 characters |
| Body length | 7,600 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | yes |
URL formats
{schema}://{topic}
{schema}://{host}/{targets}
{schema}://{host}:{port}/{targets}
{schema}://{user}@{host}/{targets}
{schema}://{user}@{host}:{port}/{targets}
{schema}://{user}:{password}@{host}/{targets}
{schema}://{user}:{password}@{host}:{port}/{targets}
{schema}://{token}@{host}/{targets}
{schema}://{token}@{host}:{port}/{targets}
{schema} is one of ntfy://, ntfys://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | no | ||
{password} | Password | string | no | secret | |
{port} | Port | int, 1 to 65535 | no | ||
{targets} | Targets | list | yes | any of topic; separated by / | |
{token} | Token | string | no | secret | |
{topic} | Topic | string | no | must match ^[a-z0-9_-]{1,64}$ | |
{user} | Username | string | no |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
actions | Actions | string | ||
attach | Attach | string | ||
auth | Authentication Type | choice | basic (usually; depends on the URL) | one of basic, token |
avatar_url | Avatar URL | string | ||
click | Click | string | ||
delay | Delay | string | ||
email | string | |||
filename | Attach Filename | string | ||
image | Include Image | bool | yes | |
mode | Mode | choice | private (usually; depends on the URL) | one of cloud, private |
priority | Priority | choice | default | one of max, high, default, low, min |
to | Targets | list | sets {targets} | |
token | Token | string | sets {token} | |
xtags | Tags | string | also tags |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
ntfys://my-topic
ntfy://localhost/topic
ntfy://user@localhost/topic/
ntfy://ntfy.sh/topic1/topic2/
ntfy://tk_abcd123456@localhost/topic1
https://ntfy.sh?to=topic
ntfys://user:pass@localhost?to=topic
https://ntfy.sh/topicA/topicB?priority=5
Rejected URLs:
ntfys://user:web/token@localhost/topic/?mode=invalid
ntfys://token@localhost/topic/?auth=invalid
ntfys://user:web@-_/topic1/topic2/?mode=private
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'ntfys://my-topic'
Notes
ntfy (ntfy://, ntfys://, https://ntfy.sh/topic): publishes to ntfy topics.
Octopush
| Schemes | octopush:// |
| Cargo feature | service-octopush |
| Service | https://octopush.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 1,224 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{api_login}/{api_key}/{targets}
{schema}://{sender}:{api_login}/{api_key}/{targets}
{schema} is one of octopush://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{api_key} | API Key | string | yes | secret | |
{api_login} | API Login | yes | secret | ||
{sender} | Sender | string | no | ||
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | no | any of target_phone; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
batch | Batch Mode | bool | no | |
key | API Key | string | sets {api_key} | |
login | API Login | sets {api_login} | ||
purpose | Purpose | choice | alert | one of alert, wholesale |
replies | Accept Replies | bool | no | |
to | Targets | list | sets {targets} | |
type | Type | choice | sms_premium | one of sms_premium, sms_low_cost |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
octopush://user@myaccount.com/apikey/+0987654321
octopush://user@myaccount.com/apikey/1111111111/33333333333
octopush://sender:user@myaccount.com/apikey/1111111111/222/33333333333/?batch=yes
octopush://user@myaccount.com/apikey/+3333333333?replies=yes
octopush://?login=user@myaccount.com&key=key&to=9999999999&type=premium
octopush://_?key=abc123&login=user@myaccount.com&sender=abc&to=2222222222
octopush://?login=user@myaccount.com&key=key&to=9999999999&purpose=WholeSale
Rejected URLs:
octopush://
octopush://:@/
octopush://user@myaccount.com
octopush://_/apikey?login=invalid
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'octopush://user@myaccount.com/apikey/+0987654321'
Notes
Octopush SMS (octopush://): SMS through the Octopush API.
Office 365
| Schemes | azure://, o365:// |
| Cargo feature | service-office365 |
| Service | https://office.com/ |
| Body formats | html (first is the default) |
| Attachments | yes |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | 200 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{source}/{tenant}/{client_id}/{secret}
{schema}://{source}/{tenant}/{client_id}/{secret}/{targets}
{schema}://{source}/{client_id}/{secret}
{schema}://{source}/{client_id}/{secret}/{targets}
{schema} is one of azure://, o365://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{client_id} | Client ID | string | yes | secret; must match ^[a-z0-9-]+$ | |
{secret} | Client Secret | string | yes | secret | |
{source} | Account Email or Object ID | string | yes | ||
{target_email} | Target Email | no | |||
{targets} | Targets | list | no | any of target_email; separated by / | |
{tenant} | Tenant Domain | string | yes | secret; must match ^[a-z0-9-]+$ |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
bcc | Blind Carbon Copy | list | separated by , or space | |
cc | Carbon Copy | list | separated by , or space | |
mode | Mode | choice | org (usually; depends on the URL) | one of org, personal |
oauth_id | Client ID | string | sets {client_id} | |
oauth_secret | Client Secret | string | sets {secret} | |
reply_to | Reply To | list | separated by , or space | |
savesent | Save to Sent Items | bool | yes | |
to | Targets | list | sets {targets} | |
from | Account Email or Object ID | string | sets {source} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
o365://hg-fe-dc-ba/tenant/ab-cd-ef-gh/secret/to@example.com
o365://tenant/ab-cd-ef-gh/abcd/123/3343/@jack/test/email1@test.ca
o365://user@live.com/ab-cd-ef-gh/refresh-token-value/to@example.com
o365://user@example.edu/tenant/ab-cd-ef-gh/abcd/123/3343/@jack/test/email1@test.ca
o365://user@live.com/tenant-id/ab-cd-ef-gh/seed/?mode=org
o365://user@example.edu/tenant/ab-cd-ef-gh/secret/email1@test.ca?savesent=no
azure://user@example.edu/tenant/ab-cd-ef-gh/secret/email1@test.ca?format=text
o365://user@example.com/ab-cd-ef-gh/seed/?mode=personal
Rejected URLs:
o365://
o365://:@/
o365://user@example.com/,/ab-cd-ef-gh/abcd/123/3343/@jack/test/email1@test.ca
o365://user2@example.com/tenant/ab./abcd/123/3343/@jack/test/email1@test.ca
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'o365://hg-fe-dc-ba/tenant/ab-cd-ef-gh/secret/to@example.com'
Notes
Office 365 / Microsoft Graph mail (azure://, o365://): e-mail through the Microsoft Graph API.
Organisation (client credentials) mode: o365://{source}/{tenant}/{client_id}/{secret}[/{to_email}...] Personal (refresh token) mode, picked automatically for outlook.com, hotmail., live. and msn.com senders or with ?mode=personal: o365://{source}/{client_id}/{refresh_token}[/{to_email}...]
{source} is the sender e-mail (or, in org mode, a user object id). Options: ?from=..&tenant=..&oauth_id=..&oauth_secret=..&to=..&cc=..&bcc=.. &reply_to=..&mode=org|personal&savesent=yes|no.
The access token is kept (in memory) until expires_in minus 10 s, a rotated refresh token (personal mode) and the looked-up sender (org mode, from / name) go to the persistent store. Attachments above 3 MiB go through a draft + upload session.
OneBot
| Schemes | onebot://, onebots:// |
| Cargo feature | service-onebot |
| Service | https://github.com/botuniverse/onebot-11 |
| Body formats | text (first is the default) |
| Attachments | yes |
| Title length | no title (merged into the body) |
| Body length | 4,500 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{host}/{targets}
{schema}://{host}:{port}/{targets}
{schema}://{token}@{host}/{targets}
{schema}://{token}@{host}:{port}/{targets}
{schema} is one of onebot://, onebots://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{port} | Port | int, 1 to 65535 | no | ||
{target_group} | Target Group ID | string | no | prefix #; must match ^[0-9]{1,19}$ | |
{target_user} | Target User ID | string | no | prefix @; must match ^[0-9]{1,19}$ | |
{targets} | Targets | list | no | any of target_group, target_user; separated by / | |
{token} | Access Token | string | no | secret |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
to | Targets | list | sets {targets} | |
token | Access Token | string | sets {token} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
onebot://localhost/12345
onebot://localhost/1/%232
onebot://localhost:3000/@12345/%2367890
onebots://tok%20en@localhost:5700/@12345/%23678
onebot://localhost/abc/12345/11111111111111111111
onebot://localhost/12345?token=abc
onebot://localhost/?to=%23999,222,111
Rejected URLs:
onebot://
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'onebot://localhost/12345'
Notes
OneBot 11 HTTP API (onebot://, onebots://): messages through a OneBot 11 HTTP API server.
OneSignal
| Schemes | onesignal:// |
| Cargo feature | service-onesignal |
| Service | https://onesignal.com |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{app}@{apikey}/{targets}
{schema}://{template}:{app}@{apikey}/{targets}
{schema} is one of onesignal://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret | |
{app} | App ID | string | yes | secret | |
{target_email} | Target Email | no | |||
{target_player} | Target Player ID | string | no | ||
{target_segment} | Include Segment | string | no | prefix # | |
{target_user} | Target User | string | no | prefix @ | |
{targets} | Targets | list | yes | any of target_email, target_player, target_segment, target_user; separated by / | |
{template} | Template | string | no | secret |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
batch | Batch Mode | bool | no | |
contents | Enable Contents | bool | yes | |
decode | Decode Template Args | bool | no | |
image | Include Image | bool | yes | |
language | Language | string | en | also lang |
subtitle | Subtitle | string | ||
template | Template | string | sets {template} | |
to | Targets | list | sets {targets} |
Prefixed parameters:
:name=value: Custom Data+name=value: Postback Data
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
onesignal://appid@apikey/playerid
onesignal://appid@apikey/user@email.com/#seg/player/@user/%20/a
onesignal://appid@apikey/@user?image=no
onesignal://appid@apikey/@user1/@user2/pid1?batch=no
onesignal://appid@apikey/@user1/@user2/#seg1/#seg2/pid1/pid2/a@b.com/c@d.com?batch=yes
onesignal://templateid:appid@apikey/@user/?contents=no
onesignal://appid@apikey/playerid/?lang=es&subtitle=Sub
onesignal://templateid:appid@apikey/@user/?:par=b64:eyJhIjogMX0=
Rejected URLs:
onesignal://
onesignal://:@/
onesignal://apikey/
onesignal://appid@%20%20/
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'onesignal://appid@apikey/playerid'
Notes
OneSignal (onesignal://): push notifications through the OneSignal API.
Pager Duty
| Schemes | pagerduty:// |
| Cargo feature | service-pagerduty |
| Service | https://pagerduty.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{integrationkey}@{apikey}
{schema}://{integrationkey}@{apikey}/{source}
{schema}://{integrationkey}@{apikey}/{source}/{component}
{schema} is one of pagerduty://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret | |
{component} | Component | string | no | Notification | |
{integrationkey} | Integration Key | string | yes | secret | |
{source} | Source | string | no | defaults to the app id |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
class | Class | string | ||
click | Click | string | ||
group | Group | string | ||
image | Include Image | bool | yes | |
region | Region Name | choice | us | one of us, eu |
severity | Severity | choice | one of info, warning, critical, error |
Prefixed parameters:
+name=value: Custom Details
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
pagerduty://myroutekey@myapikey
pagerduty://myroutekey@myapikey/mysource/mycomponent
pagerduty://myroutekey@myapikey?image=no
pagerduty://myroutekey@myapikey?region=EU
pagerduty://myroutekey@myapikey?severity=critical
pagerduty://myroutekey@myapikey?+key=value&+key2=value%2520two
pagerduty://?integrationkey=r&apikey=a&source=s&component=c
pagerduty://routekey@apikey/ms/mc?group=mygroup&class=myclass&click=http%3A%2F%2Fexample.com
Rejected URLs:
pagerduty://
pagerduty://%20@%20/
pagerduty://%20/
pagerduty://%20@abcd/
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'pagerduty://myroutekey@myapikey'
Notes
PagerDuty (pagerduty://): events through the PagerDuty Events API.
PagerTree
| Schemes | pagertree:// |
| Cargo feature | service-pagertree |
| Service | https://pagertree.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{integration}
{schema} is one of pagertree://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{integration} | Integration ID | string | yes | secret |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
action | Action | choice | create | one of create, acknowledge, resolve |
tags | Tags | string | ||
thirdparty | Third Party ID | string | ||
urgency | Urgency | choice | one of silent, low, medium, high, critical |
Prefixed parameters:
+name=value: HTTP Header-name=value: Meta Extras:name=value: Payload Extras
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
pagertree://int_xxxxxxxxxxx
pagertree://int_xxxxxxxxxxx?tid=%20
pagertree://int_xxxxxxxxxxx?urgency=low
pagertree://int_xxxxxxxxxxx?tags=web,production,web
pagertree://int_xxxxxxxxxxx?integration=int_yyyyyyyyyy
pagertree://int_xxxxxxxxxxx?action=acknowledge&tid=abc
pagertree://int_xxxxxxxxxxx?action=resolve&thirdparty=123
pagertree://?id=int_xxxxxxxxxxx&urgency=critical
Rejected URLs:
pagertree://
pagertree://++++++++++++++++++++++++
pagertree://int_abc
pagertree://:@/
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'pagertree://int_xxxxxxxxxxx'
Notes
PagerTree (pagertree://): alerts through a PagerTree integration.
Parse Platform
| Schemes | parsep://, parseps:// |
| Cargo feature | service-parseplatform |
| Service | https://parseplatform.org/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{app_id}:{master_key}@{host}
{schema}://{app_id}:{master_key}@{host}:{port}
{schema} is one of parsep://, parseps://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{app_id} | App ID | string | yes | secret | |
{host} | Hostname | string | yes | ||
{master_key} | Master Key | string | yes | secret | |
{port} | Port | int, 1 to 65535 | no |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
app_id | App ID | string | sets {app_id} | |
device | Device | choice | all | one of all, ios, android |
master_key | Master Key | string | sets {master_key} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
parsep://app%20id:key%2Fx@localhost
parseps://app_id:master_key@localhost
parseps://app_id:master_key@localhost/sub/path/
parsep://app_id:master_key@localhost:8080?device=ios
parseps://u:p@localhost?app_id=qapp&master_key=qkey
parseps://localhost?app_id=aaaaaaaa&master_key=dddddddd
Rejected URLs:
parsep://
parsep://:@/
parsep://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
parsep://app_id@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'parsep://app%20id:key%2Fx@localhost'
Notes
Parse Platform push (parsep://, parseps://): push notifications through a Parse server.
Pinglet
| Schemes | pinglet://, pinglets:// |
| Cargo feature | service-pinglet |
| Service | https://pinglet.co.uk/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 3,000 characters |
| Body lines | unlimited |
| Request throttle | 500 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{token}@{host}/{namespace}/{topic}
{schema}://{token}@{host}:{port}/{namespace}/{topic}
{schema}://{token}@{host}{path}{namespace}/{topic}
{schema}://{token}@{host}:{port}{path}{namespace}/{topic}
{schema} is one of pinglet://, pinglets://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{namespace} | Namespace | string | yes | ||
{path} | Path | string | no | / | |
{port} | Port | int, 1 to 65535 | no | ||
{token} | API Key | string | yes | secret | |
{topic} | Topic | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
priority | Priority | choice | normal | one of silent, normal, urgent |
token | API Key | string | sets {token} |
Prefixed parameters:
:name=value: Badges+name=value: Metadata
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
pinglet://abc123@hostname/acme/deploys
pinglets://abc123@hostname/acme/deploys
pinglet://abc123@hostname/prefix/sub/acme/deploys/
pinglets://hostname/acme/deploys?token=abc123
pinglet://abc123@hostname/acme/deploys?priority=urgent
pinglet://abc123@hostname/acme/deploys?:a=1&:b=2&:c=3&:d=4
pinglet://abc123@hostname/acme/deploys?:CPU=95%25&+region=eu-west
Rejected URLs:
pinglet://
pinglet://:@/
pinglet://hostname/acme/deploys
pinglet://token@hostname
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'pinglet://abc123@hostname/acme/deploys'
Notes
Pinglet (pinglet://, pinglets://): notifications through Pinglet.
Pingram
| Schemes | pingram:// |
| Cargo feature | service-pingram |
| Service | https://www.pingram.io/ |
| Body formats | text, html (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | 200 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}/{targets}
{schema}://{type}@{apikey}/{targets}
{schema} is one of pingram://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret; must match ^pingram_(sk|pk)_[\w.-]+$ | |
{target_email} | Target Email | no | |||
{target_id} | Target ID | string | no | prefix @ | |
{target_sms} | Target SMS | string | no | ||
{targets} | Targets | list | no | any of target_email, target_id, target_sms; separated by / | |
{type} | Message Type | string | no | must match ^[A-Z0-9_-]+$; defaults to the app id |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
apikey | API Key | string | sets {apikey} | |
bcc | Blind Carbon Copy | list | separated by , or space | |
cc | Carbon Copy | list | separated by , or space | |
channels | Channels | list | separated by , or space; one of call, email, inapp, mobile_push, slack, sms, web_push | |
from | From Email | string | ||
mode | Mode | choice | one of message, template | |
region | Region Name | choice | us | one of us, ca, eu |
to | Targets | list | sets {targets} | |
type | Message Type | string | sets {type} |
Prefixed parameters:
:name=value: Template Tokens
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
pingram://pingram_sk_abc123/g@rb@ge/+15551235553/
pingram://pingram_sk_abc123/+15551235553/+15551235554
pingram://pingram_pk_aaaa.bbbb.cccc-dd_ee/user@example.ca
pingram://pingram_sk_abc123/user1@example.com/user2@example.com
pingram://pingram_sk_abc123/+15551235553?region=CA
pingram://pingram_sk_abc123/id/user6@example.ca?bcc=invalid
pingram://pingram_sk_abc123/user@example.ca?from=NotAnEmail
pingram://pingram_sk_abc123/id/user8@example.ca?cc=l2g@nuxref.com
Rejected URLs:
pingram://
pingram://abcd
pingram://pingram_sk_key/+15551235553/?mode=invalid
pingram://pingram_sk_key/+15551235553/?region=invalid
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'pingram://pingram_sk_abc123/g@rb@ge/+15551235553/'
Notes
Pingram (pingram://): messages through the Pingram notification API.
Plivo
| Schemes | plivo:// |
| Cargo feature | service-plivo |
| Service | https://plivo.com |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 140 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{auth_id}@{token}/{source}
{schema}://{auth_id}@{token}/{source}/{targets}
{schema} is one of plivo://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{auth_id} | Auth ID | string | yes | must match ^[a-z0-9]{20,30}$ | |
{source} | Source Phone No | string | yes | prefix +; must match ^[0-9\s)(+-]+$ | |
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | no | any of target_phone; separated by / | |
{token} | Auth Token | string | yes | must match ^[a-z0-9]{30,50}$ |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
batch | Batch Mode | bool | no | |
from | Source Phone No | string | sets {source} | |
id | Auth ID | string | sets {auth_id} | |
to | Targets | list | sets {targets} | |
token | Auth Token | string | sets {token} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
plivo://aaaaaaaaaaaaaaaaaaaaaaaaa@bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/15551231234
plivo://aaaaaaaaaaaaaaaaaaaaaaaaa@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/15551230000/15551231111/15551232222
plivo://aaaaaaaaaaaaaaaaaaaaaaaaa@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/15551230000/15551231111/15551232222?batch=yes
plivo://aaaaaaaaaaaaaaaaaaaaaaaaa@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/?from=15551233000&to=15551232000&batch=yes
plivo://?id=aaaaaaaaaaaaaaaaaaaaaaaaa&token=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&from=15551233000&to=15551232000
Rejected URLs:
plivo://
plivo://aaaaaaaaaa@aaaaaaaaaaaaaaaaaaaaaaaaa/15551232000
plivo://aaaaaaaaaaaaaaaaaaaaaaaaa@aaaaaaaaaa/15551232000
plivo://aaaaaaaaaaaaaaaaaaaaaaaaa@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/123
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'plivo://aaaaaaaaaaaaaaaaaaaaaaaaa@bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/15551231234'
Notes
Plivo SMS (plivo://): SMS through the Plivo API.
Differences with Apprise
- Apprise posts to a literal
{auth_id}URL, while mercurio fills it in.
Postmark
| Schemes | postmark:// |
| Cargo feature | service-postmark |
| Service | https://postmarkapp.com/ |
| Body formats | html (first is the default) |
| Attachments | yes |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | 1200 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}:{from_email}
{schema}://{apikey}:{from_email}/{targets}
{schema} is one of postmark://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret | |
{from_email} | Source Email | yes | |||
{target_email} | Target Email | no | |||
{targets} | Targets | list | no | any of target_email; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
bcc | Blind Carbon Copy | list | separated by , or space | |
cc | Carbon Copy | list | separated by , or space | |
name | From Name | string | ||
reply | Reply To Email | list | separated by , or space | |
to | Targets | list | sets {targets} | |
from | Source Email | sets {from_email} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
postmark://abcd:user@example.com
postmark://abcd:user@example.com/newuser1@example.com
postmark://abcd:user@example.com/newuser2@example.com?name=John
postmark://abcd:user@example.com?format=text
postmark://abcd:user@example.com/newuser5@example.com?cc=cc@nuxref.com
postmark://abcd:user@example.com/newuser4@example.com?bcc=bcc@nuxref.com
postmark://abcd:user@example.com/newuser6@example.com?to=extra@nuxref.com
postmark://abcd:user@example.com/newuser3@example.com?reply=Rep<reply@example.com>
Rejected URLs:
postmark://
postmark://:@/
postmark://abcd
postmark://abcd@host
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'postmark://abcd:user@example.com'
Notes
Postmark (postmark://): e-mail through the Postmark API.
postmark://{apikey}:{from_user}@{from_domain}[/{to_email}...] postmark://{to_email_domain}?apikey=..&from=.. (the host becomes a target) ?name=..&cc=..&bcc=..&reply=..&to=..
Without targets the message goes to the sender.
Power Automate / Workflows (for MSTeams)
| Schemes | workflow://, workflows:// |
| Cargo feature | service-workflows |
| Service | https://www.microsoft.com/power-platform/products/power-automate |
| Body formats | markdown (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 1,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | yes |
URL formats
{schema}://{host}/{workflow}/{signature}
{schema}://{host}:{port}/{workflow}/{signature}
{schema} is one of workflow://, workflows://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{port} | Port | int, 1 to 65535 | no | ||
{signature} | Signature | string | yes | secret; must match ^[a-z0-9_-]+$ | |
{workflow} | Workflow ID | string | yes | secret; must match ^[A-Z0-9_-]+$ |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
id | Workflow ID | string | sets {workflow} | |
image | Include Image | bool | yes | |
pa | Use Power Automate URL | bool | no | also powerautomate |
route | Power Automate Routing ID | string | also routeid; must match ^[0-9]+$ | |
sig | Signature | string | sets {signature} | |
template | Template Path | string | secret | |
ver | API Version | string | also api-version | |
wrap | Wrap Text | bool | yes |
Prefixed parameters:
:name=value: Template Tokens
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
workflow://host/wf/sig
workflows://host:443/workflow1b/signature/
workflow://host/3XXX5/iXXXU/?route=42
workflow://host:443/workflow1a/signature/?image=no
workflows://host/wf1/?sig=abc-def
workflows://host:443/signature/?id=workflow1c
workflows://host:443/workflow1b/signature/?ver=2016-06-01
workflow://host/3XXX5/iXXXU/?pa=yes&routeid=42
Rejected URLs:
workflow://
workflow://:@/
workflow://host/workflow
workflow://host:443/^(/signature
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'workflow://host/wf/sig'
Notes
Power Automate / Workflows for MS Teams (workflow://, workflows://): Adaptive Card messages through a workflow webhook.
?template= reads a local JSON file when the message is sent, or downloads an http(s):// one before the first send and keeps it.
Prowl
| Schemes | prowl:// |
| Cargo feature | service-prowl |
| Service | https://www.prowlapp.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 1,024 characters |
| Body length | 10,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}
{schema}://{apikey}/{providerkey}
{schema} is one of prowl://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret; must match ^[A-Za-z0-9]{40}$ | |
{providerkey} | Provider Key | string | no | secret; must match ^[A-Za-z0-9]{40}$ |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
priority | Priority | choice | 0 | one of -2, -1, 0, 1, 2 |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
prowl://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
prowl://wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww///
prowl://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
prowl://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa?priority=high
Rejected URLs:
prowl://
prowl://:@/
prowl://aaaaaaaaaaaaaaaaaaaa
prowl://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbb
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'prowl://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
Notes
Prowl (prowl://): push notifications through Prowl.
Pushbullet
| Schemes | pbul:// |
| Cargo feature | service-pushbullet |
| Service | https://www.pushbullet.com/ |
| Body formats | text (first is the default) |
| Attachments | yes |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | 1200 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{accesstoken}
{schema}://{accesstoken}/{targets}
{schema} is one of pbul://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{accesstoken} | Access Token | string | yes | secret | |
{target_channel} | Target Channel | string | no | prefix # | |
{target_device} | Target Device | string | no | ||
{target_email} | Target Email | no | |||
{targets} | Targets | list | no | any of target_channel, target_device, target_email; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
pbul://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
pbul://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/#channel/
pbul://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/ALL_DEVICES
pbul://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/device1/device2/
pbul://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/user@example.com/
pbul://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/user@example.com/abc@def.com/
pbul://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/device/#channel/user@example.com/
pbul://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/zdev/adev/zdev?to=mdev,adev
Rejected URLs:
pbul://
pbul://:@/
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'pbul://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
Notes
Pushbullet (pbul://): pushes through the Pushbullet API.
PushDeer
| Schemes | pushdeer://, pushdeers:// |
| Cargo feature | service-pushdeer |
| Service | https://www.pushdeer.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{pushkey}
{schema}://{host}/{pushkey}
{schema}://{host}:{port}/{pushkey}
{schema} is one of pushdeer://, pushdeers://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | no | ||
{port} | Port | int, 1 to 65535 | no | ||
{pushkey} | Pushkey | string | yes | secret; must match ^[a-z0-9]+$ |
Query parameters
No service-specific parameters.
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
pushdeer://aaaaaaaa
pushdeers://aaaaaaaa
pushdeer://localhost/aaaaaaaa
pushdeers://example.com:8443/AbC123
pushdeer://localhost/ignored/aaaaaaaa
Rejected URLs:
pushdeer://
pushdeers://
pushdeer://localhost/abc_def
pushdeer://abc-def
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'pushdeer://aaaaaaaa'
Notes
PushDeer (pushdeer://, pushdeers://): push notifications through PushDeer.
PushMe
| Schemes | pushme:// |
| Cargo feature | service-pushme |
| Service | https://push.i-i.me/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{token}
{schema} is one of pushme://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{token} | Token | string | yes | secret |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
status | Show Status | bool | yes | |
token | Token | string | sets {token}; also push_key |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
pushme://aaaaaa
pushme://hosttoken?token=qtoken
pushme://aaaaaa?format=markdown
pushme://?token=bbbbbb&status=yes
pushme://?push_key=pppppp&status=no
Rejected URLs:
pushme://
pushme://:@/
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'pushme://aaaaaa'
Notes
PushMe (pushme://): push notifications through PushMe.
Pushover
| Schemes | pover:// |
| Cargo feature | service-pushover |
| Service | https://pushover.net/ |
| Body formats | text, html, markdown (first is the default) |
| Attachments | yes |
| Title length | 250 characters |
| Body length | 1,024 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{user_key}@{token}
{schema}://{user_key}@{token}/{targets}
{schema} is one of pover://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{target_device} | Target Device | string | no | must match ^[a-z0-9_-]{1,25}$ | |
{target_group} | Target Group | string | no | prefix # | |
{targets} | Targets | list | no | any of target_device, target_group; separated by / | |
{token} | Access Token | string | yes | secret | |
{user_key} | User Key | string | yes | secret |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
e2ee | E2EE | bool | yes | |
expire | Expire | int, 0 to 10800 | 3600 | |
interval | Emergency Retry Interval | int, min 30 | 900 | |
key | Encryption Key | string | secret | |
priority | Priority | choice | 0 | one of -2, -1, 0, 1, 2 |
sound | Sound | string | pushover | must match ^[a-z]{1,12}$ |
to | Targets | list | sets {targets} | |
url | URL | string | ||
url_title | URL Title | string |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
pover://uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
pover://uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/DEVICE
pover://uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/dev/#g1
pover://uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/#gggggggggggggggggggggggggggggg/#group2/
pover://uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/DEVICE1/Device-with-dash/dddddddddddddddddddddddddddddd/
pover://uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa?to=DEVICE
pover://uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa?priority=-1
pover://uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/DEVICE/#grp?to=%23other
Rejected URLs:
pover://
pover://:@/
pover://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
pover://uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa?priority=emergency&interval=10
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'pover://uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
Notes
Pushover (pover://): push notifications through the Pushover API, with optional end-to-end encryption (?key=<64 hex>).
Differences with Apprise
- HTML that Apprise’s parser rejects (a malformed
<![declaration) is sent unreduced. - E2EE gzip members use stored deflate blocks with a zero mtime; they decompress identically.
- Split overflow: Apprise splits the source and sends each piece through its HTML reducer, while mercurio reduces each chunk once and splits the reduced HTML at line or word boundaries, closing open tags at a cut and reopening them in the next piece.
Pushplus
| Schemes | pushplus://, wecom:// |
| Cargo feature | service-pushplus |
| Service | https://www.pushplus.plus/ |
| Body formats | html (first is the default) |
| Attachments | no |
| Title length | 200 characters |
| Body length | 20,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | yes |
URL formats
{schema}://{token}
{schema}://{token}/{targets}
{schema} is one of pushplus://, wecom://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{targets} | Group Topics | list | no | separated by / | |
{token} | User Token | string | yes | secret; must match ^[a-z0-9_-]{32,64}$ |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
channel | Channel | choice | wechat (usually; depends on the URL) | also mode; one of wechat, webhook, cp, mail, sms |
name | Webhook Name | string | ||
to | Group Topics | list | sets {targets} | |
token | User Token | string | sets {token} | |
topic | Group Topics | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
wecom://abcdefghij0123456789abcdefghij01
pushplus://abcdefghij0123456789abcdefghij01
pushplus://myhook@abcdefghij0123456789abcdefghij01
pushplus://abcdefghij0123456789abcdefghij01/mygroup
pushplus://abcdefghij0123456789abcdefghij01/group1/group2
pushplus://other@abcdefghij0123456789abcdefghij01?name=myhook
wecom://abcdefghij0123456789abcdefghij01?channel=mail
pushplus://abcdefghij0123456789abcdefghij01?channel=mail
Rejected URLs:
pushplus://abcdefghij0123456789abcdefghij01?channel=fax
https://www.pushplus.plus/send?channel=mail
pushplus://short
pushplus://
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'wecom://abcdefghij0123456789abcdefghij01'
Notes
PushPlus (pushplus://, wecom://): messages through PushPlus.
Pushsafer
| Schemes | psafer://, psafers:// |
| Cargo feature | service-pushsafer |
| Service | https://www.pushsafer.com/ |
| Body formats | text (first is the default) |
| Attachments | yes |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | 1200 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{privatekey}
{schema}://{privatekey}/{targets}
{schema} is one of psafer://, psafers://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{privatekey} | Private Key | string | yes | secret | |
{target_device} | Target Device | string | no | ||
{target_email} | Target Email | string | no | ||
{targets} | Targets | list | no | any of target_device, target_email; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
priority | Priority | choice | one of -2, -1, 0, 1, 2 | |
sound | Sound | choice | one of silent, ahem, applause, arrow, baby, bell, bicycle, bike, boing, buzzer, camera, carhorn, … (78 values) | |
to | Targets | list | sets {targets} | |
vibration | Vibration | choice | one of 1, 2, 3 |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
psafer://eeeeeeeeeeeeeeeeeeee
psafers://eeeeeeeeeeeeeeeeeeee
psafer://eeeeeeeeeeeeeeeeeeee/1/2
psafer://eeeeeeeeeeeeeeeeeeee?sound=ok
psafers://eeeeeeeeeeeeeeeeeeee?sound=14
psafer://eeeeeeeeeeeeeeeeeeee?to=12,24,53
psafers://eeeeeeeeeeeeeeeeeeee?vibration=1
psafer://eeeeeeeeeeeeeeeeeeee?priority=emergency
Rejected URLs:
psafer://:@/
psafer://
psafers://
psafer://eeeeeeeeeeeeeeeeeeee?priority=invalid
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'psafer://eeeeeeeeeeeeeeeeeeee'
Notes
Pushsafer (psafer://, psafers://): push notifications through Pushsafer.
PushWard
| Schemes | pushward:// |
| Cargo feature | service-pushward |
| Service | https://pushward.app/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 256 characters |
| Body length | 3,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}
{schema} is one of pushward://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | Integration Key | string | yes | secret; must match ^hlk_[A-Za-z0-9]+$ |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
apikey | Integration Key | string | sets {apikey} | |
failure | Failure Level | choice | time-sensitive | one of passive, active, time-sensitive, critical |
info | Info Level | choice | active | one of passive, active, time-sensitive, critical |
level | Level | choice | one of passive, active, time-sensitive, critical | |
success | Success Level | choice | active | one of passive, active, time-sensitive, critical |
volume | Volume | float, 0 to 1 | ||
warning | Warning Level | choice | time-sensitive | one of passive, active, time-sensitive, critical |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
pushward://hlk_abc123
pushward://?apikey=hlk_abc123
pushward://hlk_abc123?level=critical&volume=0.8
pushward://hlk_abc123?info=passive&failure=crit
pushward://hlk_abc123?level=passive&info=critical
Rejected URLs:
pushward://
pushward://invalid
pushward://hlk_abc123?info=invalid
pushward://hlk_abc123?level=invalid
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'pushward://hlk_abc123'
Notes
PushWard (pushward://): push notifications through PushWard.
Differences with Apprise
- Apprise accepts
volume=nan, while mercurio does not.
Pushy
| Schemes | pushy:// |
| Cargo feature | service-pushy |
| Service | https://pushy.me/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 4,096 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}/{targets}
{schema} is one of pushy://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | Secret API Key | string | yes | secret | |
{target_device} | Target Device | string | no | prefix @ | |
{target_topic} | Target Topic | string | no | prefix # | |
{targets} | Targets | list | yes | any of target_device, target_topic; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
badge | Badge | int, min 0 | ||
key | Secret API Key | string | sets {apikey} | |
sound | Sound | string | ||
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
pushy://apikey/topic
pushy://apikey/@device
pushy://apikey/device/?badge=100
pushy://apikey/?to=@device
pushy://_/@device/#topic?key=apikey
pushy://apikey/device/?sound=alarm.aiff
Rejected URLs:
pushy://
pushy://:@/
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'pushy://apikey/topic'
Notes
Pushy (pushy://): push notifications through Pushy.
QQ Push
| Schemes | qq:// |
| Cargo feature | service-qq |
| Service | https://qmsg.zendee.cn/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | yes |
URL formats
{schema}://{token}
{schema} is one of qq://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{token} | User Token | string | yes | secret; must match ^[a-z0-9]{24,64}$ |
Query parameters
No service-specific parameters.
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
qq://abc123def456ghi789jkl012mno345pq
https://qmsg.zendee.cn/send/abc123def456ghi789jkl012mno345pq
HTTPS://QMSG.ZENDEE.CN/send/ABC123DEF456GHI789JKL012MNO345PQ
https://qmsg.zendee.cn/v3/send/abc123def456ghi789jkl012mno345pq
qq://?token=abc123def456ghi789jkl012mno345pq
qq://ignored/?token=abc123def456ghi789jkl012mno345pq
Rejected URLs:
qq://
qq://invalid!
qq://abc123
qq://fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'qq://abc123def456ghi789jkl012mno345pq'
Notes
QQ Push via Qmsg (qq://): POST https://qmsg.zendee.cn/v3/send/{key} with a msg form field; the reply’s success decides the outcome.
Differences with Apprise
- Apprise posts to the legacy
/send/{key}endpoint (which Qmsg is retiring) and trusts any 200, while mercurio posts to/v3/send/{key}and fails when the reply says"success": false.
| Schemes | reddit:// |
| Cargo feature | service-reddit |
| Service | https://reddit.com |
| Body formats | markdown (first is the default) |
| Attachments | no |
| Title length | 300 characters |
| Body length | 6,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{user}:{password}@{app_id}/{app_secret}/{targets}
{schema} is one of reddit://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{app_id} | Application ID | string | yes | secret; must match ^[a-z0-9_-]+$ | |
{app_secret} | Application Secret | string | yes | secret; must match ^[a-z0-9_-]+$ | |
{password} | Password | string | yes | secret | |
{target_subreddit} | Target Subreddit | string | no | ||
{targets} | Targets | list | yes | any of target_subreddit; separated by / | |
{user} | User Name | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
ad | Is Ad? | bool | no | |
flair_id | Flair ID | string | ||
flair_text | Flair Text | string | ||
kind | Kind | choice | auto | one of auto, self, link |
nsfw | NSFW | bool | no | |
resubmit | Resubmit Flag | bool | no | |
spoiler | Is Spoiler | bool | no | |
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
reddit://user:password@app-id/app-secret/mercurio
reddit://user:password@app-id/app-secret/mercurio/subreddit2
reddit://user:pass@id/secret/sub?kind=LINK
reddit://user:pass@id/secret/%23sub7/sub6/?flair_id=wonder&flair_text=not%20for%20you
reddit://user:pass@id/secret/sub/?ad=yes&nsfw=yes&replies=no&resubmit=yes&spoiler=yes&kind=self
reddit://?user=l2g&pass=pass&app_secret=abc123&app_id=54321&to=sub1,sub2
Rejected URLs:
reddit://
reddit://:@/
reddit://user@app_id/app_secret/
reddit://user:password@app-id/
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'reddit://user:password@app-id/app-secret/mercurio'
Notes
Reddit (reddit://): posts to subreddits through the Reddit API.
The OAuth access token is kept for the lifetime of the parsed URL (a non-persistent store entry) and replaced whenever a failed submit logs in again.
Differences with Apprise
- The token is dropped after
expires_in(Apprise computes the expiry but never checks it). X-RateLimit-Resetis read as the seconds left in the window, as Reddit documents it; Apprise reads it as a Unix time, so its back-off never waits. The budget is kept for the life of the URL, as in Apprise.- After a failed submit Apprise retries with the previous bearer token (stale headers), while mercurio retries with the fresh one.
Remote Syslog
| Schemes | rsyslog:// |
| Cargo feature | service-rsyslog |
| Service | https://tools.ietf.org/html/rfc5424 |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{host}
{schema}://{host}:{port}
{schema}://{host}/{facility}
{schema}://{host}:{port}/{facility}
{schema} is one of rsyslog://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{facility} | Facility | choice | yes | user | one of kern, user, mail, daemon, auth, syslog, lpr, news, uucp, cron, local0, local1, … (18 values) |
{host} | Hostname | string | yes | ||
{port} | Port | int, 1 to 65535 | no | 514 |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
facility | Facility | choice | sets {facility} | |
logpid | Log PID | bool | yes |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
rsyslog://localhost
rsyslog://localhost/kern
rsyslog://localhost/kern/cron
rsyslog://localhost:9000/d?logpid=no
rsyslog://localhost/?facility=local5
Rejected URLs:
rsyslog://localhost/?facility=invalid
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'rsyslog://localhost'
Notes
Remote syslog over UDP (rsyslog://): syslog messages to a remote host.
Payload: <PRI>- {pid} {message} (or <PRI>- {message} without logpid).
Differences with Apprise
- Apprise computes PRI as
level + facility * 8with already shifted facility constants (user.infobecomes<70>), while mercurio sends the RFC 5424 value (<14>).
Resend
| Schemes | resend:// |
| Cargo feature | service-resend |
| Service | https://resend.com |
| Body formats | html (first is the default) |
| Attachments | yes |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | 200 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}:{from_addr}
{schema}://{apikey}:{from_addr}/{targets}
{schema} is one of resend://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret; must match ^[A-Z0-9._-]+$ | |
{from_addr} | Source Email | yes | |||
{target_email} | Target Email | no | |||
{targets} | Targets | list | no | any of target_email; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
apikey | API Key | string | ||
bcc | Blind Carbon Copy | list | separated by , or space | |
cc | Carbon Copy | list | separated by , or space | |
from | From Address | string | ||
name | From Name | string | ||
reply | Reply To | list | separated by , or space | |
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
resend://abcd:user@example.com
resend://abcd:user@example.com/newuser1@example.com
resend://abcd:user@example.com/newuser9@example.com?format=text
resend://abcd:user@example.com/newuser2@example.com?name=Jessica
resend://abcd:user@example.com/newuser8@example.com?cc=l2g@nuxref.com
resend://abcd:user@example.com/newuser9@example.com?to=l2g@nuxref.com
resend://abcd:user@example.com/newuser7@example.com?bcc=l2g@nuxref.com
resend://abcd@newuser4%40example.com?name=Ralph&from=user2@example.ca
Rejected URLs:
resend://
resend://:@/
resend://abcd
resend://abcd@host
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'resend://abcd:user@example.com'
Notes
Resend (resend://): e-mail through the Resend API.
resend://{apikey}:{from_user}@{from_domain}[/{to_email}...] resend://{to_email_domain}?apikey=..&from=.. (the host becomes a target) ?name=..&cc=..&bcc=..&reply=..&to=..
Without targets the message goes to the sender.
Revolt
| Schemes | revolt:// |
| Cargo feature | service-revolt |
| Service | https://revolt.chat/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 100 characters |
| Body length | 2,000 characters |
| Body lines | unlimited |
| Request throttle | 3000 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{bot_token}/{targets}
{schema} is one of revolt://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{bot_token} | Bot Token | string | yes | secret | |
{target_channel} | Channel ID | string | yes | secret; must match ^[a-z0-9_-]+$ | |
{targets} | Targets | list | yes | any of target_channel; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
bot_token | Bot Token | string | sets {bot_token} | |
channel | Targets | list | sets {targets} | |
icon_url | Icon URL | string | ||
to | Targets | list | sets {targets} | |
url | Embed URL | string |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
revolt://iiiiiiiiiiiiiiiiiiiiiiii/tttttttttttttttttttttttt
revolt://iiiiiiiiiiiiiiiiiiiiiiii/zzz/aaa/bad!chan/?to=mmm
revolt://iiiiiiiiiiiiiiiiiiiiiiii/tttttttttttttttttttttttt?format=markdown
revolt://iiiiiiiiiiiiiiiiiiiiiiii/tttttttttttttttttttttttt?url=http://localhost
revolt://iiiiiiiiiiiiiiiiiiiiiiii/?to=tttttttttttttttttttttttt
revolt://iiiiiiiiiiiiiiiiiiiiiiii/?channel=tttttttttttttttttttttttt
revolt://iiiiiiiiiiiiiiiiiiiiiiii/tttttttttttttttttttttttt?format=text&url=http://localhost
revolt://iiiiiiiiiiiiiiiiiiiiiiii/tttttttttttttttttttttttt?icon_url=http://localhost/test.jpg
Rejected URLs:
revolt://
revolt://:@/
revolt://?channel=tttttttttttttttttttttttt
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'revolt://iiiiiiiiiiiiiiiiiiiiiiii/tttttttttttttttttttttttt'
Notes
Revolt (revolt://): messages to Revolt channels.
revolt://{bot_token}/{channel_id}[/{channel_id}...]
RingCentral
| Schemes | ringc:// |
| Cargo feature | service-ringcentral |
| Service | https://ringcentral.com/ |
| Body formats | text (first is the default) |
| Attachments | yes |
| Title length | no title (merged into the body) |
| Body length | 160 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{from_phone}:{token}@{client_id}/{secret}/
{schema}://{from_phone}:{token}@{client_id}/{secret}/{targets}
{schema}://{token}@{client_id}/{secret}/{from_phone}
{schema}://{token}@{client_id}/{secret}/{from_phone}/{targets}
{schema} is one of ringc://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{client_id} | Client ID | string | yes | secret; must match ^[a-z0-9_-]+$ | |
{from_phone} | From Phone No | string | yes | ||
{secret} | Client Secret | string | yes | secret; must match ^[a-z0-9_-]+$ | |
{target_phone} | Target Phone No | string | no | prefix + | |
{targets} | Targets | list | no | any of target_phone; separated by / | |
{token} | Token / Password | string | yes | secret |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
env | Environment | choice | prod | one of prod; sandbox is rejected: RingCentral retired its sandbox on 2025-01-01 |
from | From Phone No | string | sets {from_phone} | |
mode | Authentication Mode | choice | one of basic, jwt | |
secret | Client Secret | string | sets {secret} | |
source | From Phone No | string | sets {from_phone} | |
to | Targets | list | sets {targets} | |
token | Token / Password | string | sets {token} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
ringc://15551232000:password@clientid/secret
ringc://password@clientid/secret/15551232000/15551232001
ringc://15551232000:password@clientid/secret/15551232001
ringc://15551232000:password@clientid/secret?env=prod
ringc://15551232000:eyJ0eXAi.abc-def_1@clientid/secret?mode=jwt
ringc://x:y@clientid/secret?source=15551232000
ringc://x:y@clientid/oldsecret?secret=newsecret&from=15551232000&to=15551232009&token=tok
ringc://x@clientid/secret/15551232000?token=eyJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJodHRwczovL3BsYXRmb3JtLnJpbmdjZW50cmFsLmNvbSJ9.sig
Rejected URLs:
ringc://
ringc://15551232000:password@clientid
ringc://15551232000:password@client!id/secret
ringc://15551232000:password@clientid/sec!ret
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'ringc://15551232000:password@clientid/secret'
Notes
RingCentral (ringc://): SMS through the RingCentral API.
Logs in (OAuth password or JWT grant) and sends one SMS/MMS per target. A token with a positive lifetime is kept in memory (a non-persistent store entry) and reused until it expires; Target::close revokes it.
Differences with Apprise
?env=sandboxsends toplatform.devtest.ringcentral.comin Apprise, while mercurio rejects it: RingCentral retired that sandbox on 2025-01-01.
Rocket.Chat
| Schemes | rocket://, rockets:// |
| Cargo feature | service-rocketchat |
| Service | https://rocket.chat/ |
| Body formats | markdown (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 1,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{user}:{password}@{host}:{port}/{targets}
{schema}://{user}:{password}@{host}/{targets}
{schema}://{user}:{token}@{host}:{port}/{targets}
{schema}://{user}:{token}@{host}/{targets}
{schema}://{webhook}@{host}
{schema}://{webhook}@{host}:{port}
{schema}://{webhook}@{host}/{targets}
{schema}://{webhook}@{host}:{port}/{targets}
{schema} is one of rocket://, rockets://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{password} | Password | string | no | secret | |
{port} | Port | int, 1 to 65535 | no | ||
{target_channel} | Target Channel | string | no | prefix # | |
{target_room} | Target Room ID | string | no | ||
{target_user} | Target User | string | no | prefix @ | |
{targets} | Targets | list | no | any of target_channel, target_room, target_user; separated by / | |
{token} | API Token | string | no | secret | |
{user} | Username | string | no | ||
{webhook} | Webhook | string | no |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
avatar | Use Avatar | bool | no (usually; depends on the URL) | |
mode | Webhook Mode | choice | one of webhook, token, basic | |
to | Targets | list | sets {targets} | |
webhook | Webhook | string | sets {webhook} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
rocket://user:pass@localhost/room
rockets://user:pass@localhost/#channel
rocket://user:pass@localhost:8080/room/
rockets://web/token@localhost/@user/#channel/roomid
rockets://user:tttttttttttttttttttttttttttttttttttttttt@localhost/#channel/@bob/room1
rockets://web/token@localhost/?avatar=No
rockets://user:token@localhost/#channel?mode=token
rocket://user:pass@localhost/#channel1/#channel2/?avatar=Yes
Rejected URLs:
rocket://
rockets://
rocket://:@/
rocket://localhost
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'rocket://user:pass@localhost/room'
Notes
Rocket.Chat (rocket://, rockets://): messages to Rocket.Chat channels and users.
Webhook URLs (rocket://[user:]abc/def@host) put a / inside the userinfo; the raw URL is rewritten and parsed again.
Ryver
| Schemes | ryver:// |
| Cargo feature | service-ryver |
| Service | https://ryver.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 1,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | yes |
URL formats
{schema}://{organization}/{token}
{schema}://{botname}@{organization}/{token}
{schema} is one of ryver://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{botname} | Bot Name | string | no | ||
{organization} | Organization | string | yes | must match ^[A-Z0-9_-]{3,32}$ | |
{token} | Token | string | yes | secret; must match ^[A-Z0-9]{15}$ |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
image | Include Image | bool | yes | |
mode | Webhook Mode | choice | ryver | one of slack, ryver |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
ryver://mercurio/ckhrjW8w672m6HG
ryver://caronc@mercurio/ckhrjW8w672m6HG
https://mercurio.ryver.com/application/webhook/ckhrjW8w672m6HG
ryver://mercurio/ckhrjW8w672m6HG?image=no
ryver://mercurio/ckhrjW8w672m6HG?mode=slack
ryver://mercurio/ckhrjW8w672m6HG?webhook=slack
https://mercurio.ryver.com/application/webhook/ckhrjW8w672m6HG/?mode=slack&image=no
Rejected URLs:
ryver://
ryver://:@/
ryver://mercurio
ryver://mercurio/ckhrjW8w672m6HG?mode=invalid
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'ryver://mercurio/ckhrjW8w672m6HG'
Notes
Ryver (ryver://): messages to Ryver forums through webhooks.
SendGrid
| Schemes | sendgrid:// |
| Cargo feature | service-sendgrid |
| Service | https://sendgrid.com |
| Body formats | html (first is the default) |
| Attachments | yes |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | 200 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}:{from_email}
{schema}://{apikey}:{from_email}/{targets}
{schema} is one of sendgrid://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret; must match ^[A-Z0-9._-]+$ | |
{from_email} | Source Email | yes | |||
{target_email} | Target Email | no | |||
{targets} | Targets | list | no | any of target_email; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
bcc | Blind Carbon Copy | list | separated by , or space | |
cc | Carbon Copy | list | separated by , or space | |
template | Template | string | ||
to | Targets | list | sets {targets} |
Prefixed parameters:
+name=value: Template Data
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
sendgrid://abcd:user@example.com
sendgrid://abcd:user@example.com/newuser@example.com
sendgrid://abcd:user@example.com/newuser@example.com?+sub=value
sendgrid://abcd:user@example.com/newuser@example.com?format=text
sendgrid://abcd:user@example.com/newuser@example.com?cc=l2g@nuxref.com
sendgrid://abcd:user@example.com/newuser@example.com?to=l2g@nuxref.com
sendgrid://abcd:user@example.com/newuser@example.com?bcc=l2g@nuxref.com
sendgrid://abcd:user@example.com/newuser@example.com?cc=l2g@nuxref.com&bcc=l2g@nuxref.com
Rejected URLs:
sendgrid://
sendgrid://:@/
sendgrid://abcd
sendgrid://abcd@host
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'sendgrid://abcd:user@example.com'
Notes
SendGrid (sendgrid://): e-mail through the SendGrid API.
sendgrid://{apikey}:{from_email}[/{to_email}...][?cc=..&bcc=..&template=..&+key=value]
+key=value entries become the dynamic template data. Without targets the message goes to the sender.
SendPulse
| Schemes | sendpulse:// |
| Cargo feature | service-sendpulse |
| Service | https://sendpulse.com |
| Body formats | html, text (first is the default) |
| Attachments | yes |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | 200 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{user}@{host}/{client_secret}/
{schema}://{user}@{host}/{client_id}/{client_secret}/{targets}
{schema} is one of sendpulse://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{client_id} | Client ID | string | yes | secret; must match ^[A-Z0-9._-]+$ | |
{client_secret} | Client Secret | string | yes | secret; must match ^[A-Z0-9._-]+$ | |
{host} | Domain | string | yes | ||
{target_email} | Target Email | no | |||
{targets} | Targets | list | no | any of target_email; separated by / | |
{user} | User Name | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
bcc | Blind Carbon Copy | list | separated by , or space | |
cc | Carbon Copy | list | separated by , or space | |
from | From Email | string | ||
id | Client ID | string | sets {client_id} | |
secret | Client Secret | string | sets {client_secret} | |
template | Template ID | int | ||
to | Targets | list | sets {targets} |
Prefixed parameters:
+name=value: Template Data
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
sendpulse://user@example.com/client_id/cs1/
sendpulse://user@example.com/client_id/cs17/a@example.com/b@example.com
sendpulse://example.com/client_id/cs1/?user=chris
sendpulse://user@example.com/client_id/cs6/?to=invalid
sendpulse://chris@example.com/client_id/cs1/?from=Chris
sendpulse://user@example.com/client_id/cs1/?format=text
sendpulse://user@example.com/client_id/cs1/?template=123
sendpulse://user@example.com/client_id/cs2/?bcc=l2g@nuxref.com
Rejected URLs:
sendpulse://
sendpulse://:@/
sendpulse://abcd
sendpulse://abcd@host.com
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'sendpulse://user@example.com/client_id/cs1/'
Notes
SendPulse (sendpulse://): e-mail through the SendPulse API.
sendpulse://{user}@{domain}/{client_id}/{client_secret}[/{to_email}...] sendpulse://{to_domain}?id=..&secret=..&from=.. (?user= also accepted) ?from=..&cc=..&bcc=..&to=..&template={id}&+var=value
An OAuth access token (POST /oauth/access_token, client credentials) is obtained when the persistent store has none and kept there until it expires (expires_in minus 10 s, at most an hour). One e-mail is posted per target; a 401 triggers one re-login and retry.
ServerChan
| Schemes | schan:// |
| Cargo feature | service-serverchan |
| Service | https://sct.ftqq.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{token}
{schema} is one of schan://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{token} | Token | string | yes | secret; must match ^[a-z0-9-]+$ |
Query parameters
No service-specific parameters.
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
schan://12345678
schan://12345678/
schan://abcd/efgh/
schan://abcdEFGH123?format=markdown
Rejected URLs:
schan://
schan://a_bd_/
SCHAN://12345678
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'schan://12345678'
Notes
ServerChan (schan://): messages through ServerChan.
SerwerSMS
| Schemes | serwersms:// |
| Cargo feature | service-serwersms |
| Service | https://serwersms.pl |
| Body formats | text (first is the default) |
| Attachments | yes |
| Title length | no title (merged into the body) |
| Body length | 160 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{user}:{password}@{sender}/{targets}
{schema}://{user}:{password}@{sender}
{schema} is one of serwersms://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{password} | Password | string | yes | secret | |
{sender} | Sender Name | string | yes | must match ^[a-z0-9][a-z0-9 _-]{0,10}$ | |
{target_group} | Target Group ID | string | no | prefix # | |
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | no | any of target_group, target_phone; separated by / | |
{user} | Username | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
sender | Sender Name | string | sets {sender}; also from | |
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
serwersms://user:pass@Sender/48500600700
serwersms://user:pass@ignored/48500600700?from=FromName
serwersms://user:pass@ignored/48500600700?from=FromName&sender=Sndr%20X
Rejected URLs:
serwersms://
serwersms://user@Sender/48500600700
serwersms://:pass@Sender/48500600700
serwersms://user:pass@-Sender/48500600700
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'serwersms://user:pass@Sender/48500600700'
Notes
SerwerSMS (serwersms://): SMS through the SerwerSMS API.
Session Open Group Server
| Schemes | session://, sessions://, sogs:// |
| Cargo feature | service-sogs |
| Service | https://getsession.org/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 2,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{user}:{password}@{host}/{targets}
{schema}://{user}:{password}@{host}:{port}/{targets}
{schema} is one of session://, sessions://, sogs://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{password} | Seed | string | yes | secret | |
{port} | Port | int, 1 to 65535 | no | ||
{targets} | Rooms | list | no | separated by / | |
{user} | Public Key | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
key | Public Key | string | sets {user} | |
public_key | Public Key | string | sets {user} | |
seed | Seed | string | sets {password} | |
to | Rooms | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Rejected URLs:
sessions://host/test-room
sessions://bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb@host/test-room
sessions://ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@host/test-room
sessions://bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@host
Notes
Session Open Group Server (session://, sessions://, sogs://): messages to Session open group rooms.
Every request is authenticated with the X-SOGS-* headers: an Ed25519 signature (by the bot’s seed) over the server key, a random nonce, the timestamp, method, path and the BLAKE2b-512 hash of the body.
seven
| Schemes | seven:// |
| Cargo feature | service-seven |
| Service | https://www.seven.io |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 160 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}/{targets}
{schema} is one of seven://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret | |
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | yes | any of target_phone; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
flash | Flash | bool | no | |
label | Label | string | ||
source | Originating Address | string | also from | |
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
seven://aaaaaaaaaaaaaaaaaaaaaaaaa/15551232000
seven://33333333333333/15551232000/+44 20 7946 0958
seven://33333333333333/15551232000?flash=no
seven://33333333333333/15551232000?from=mercurio
seven://33333333333333/15551232000?source=mercurio
seven://33333333333333/15551232000?from=mercurio&flash=true
seven://33333333333333/15551232000?source=AR&flash=1&label=123
seven://33333333333333/15551232000?label=%20abc%20&from=%20me%20
Rejected URLs:
seven://
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'seven://aaaaaaaaaaaaaaaaaaaaaaaaa/15551232000'
Notes
Seven (seven://): SMS through the seven API.
Signal API
| Schemes | signal://, signals:// |
| Cargo feature | service-signalapi |
| Service | https://bbernhard.github.io/signal-cli-rest-api/ |
| Body formats | text (first is the default) |
| Attachments | yes |
| Title length | no title (merged into the body) |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{host}/{from_phone}
{schema}://{host}:{port}/{from_phone}
{schema}://{user}@{host}/{from_phone}
{schema}://{user}@{host}:{port}/{from_phone}
{schema}://{user}:{password}@{host}/{from_phone}
{schema}://{user}:{password}@{host}:{port}/{from_phone}
{schema}://{host}/{from_phone}/{targets}
{schema}://{host}:{port}/{from_phone}/{targets}
{schema}://{user}@{host}/{from_phone}/{targets}
{schema}://{user}@{host}:{port}/{from_phone}/{targets}
{schema}://{user}:{password}@{host}/{from_phone}/{targets}
{schema}://{user}:{password}@{host}:{port}/{from_phone}/{targets}
{schema} is one of signal://, signals://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{from_phone} | From Phone No | string | yes | must match ^\+?[0-9\s)(+-]+$ | |
{host} | Hostname | string | yes | ||
{password} | Password | string | no | secret | |
{port} | Port | int, 1 to 65535 | no | ||
{target_channel} | Target Group ID | string | no | prefix @; must match ^[a-z0-9_=-]+$ | |
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | no | any of target_channel, target_phone; separated by / | |
{user} | Username | string | no |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
batch | Batch Mode | bool | no | |
from | From Phone No | string | sets {from_phone} | |
status | Show Status | bool | no | |
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
signal://localhost/15551234567
signal://localhost/15551234567/123/15559876543
signal://user@localhost/15551234567/15559876543
signal://localhost:8080/+1 555 123 4567/15559876543
signals://user:pass@localhost/15551234567/15559876543
signal://localhost/15551234567/@abcd=/group.efgh/%40ijkl/15559876543
signal://localhost/15551234567/15559876543/15550001111/@grp?batch=yes
signal://localhost/15551234567?status=yes
Rejected URLs:
signal://
signal://localhost
signal://localhost/123
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'signal://localhost/15551234567'
Notes
Signal API (signal://, signals://): Signal messages through a signal-cli REST API server (bbernhard/signal-cli-rest-api).
Signalgrid
| Schemes | signalgrid:// |
| Cargo feature | service-signalgrid |
| Service | https://signalgrid.co/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{client_key}/{targets}
{schema} is one of signalgrid://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{client_key} | Client Key | string | yes | secret | |
{targets} | Channels | list | no | separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
client_key | Client Key | string | sets {client_key} | |
critical | Critical Notification | bool | no | |
to | Channels | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
signalgrid://CLIENTKEY/CHANNEL
signalgrid://CLIENTKEY/CHANNEL2/CHANNEL1
signalgrid://CLIENTKEY/A/A/b?to=b
signalgrid://CLIENTKEY/CHANNEL?critical=yes
signalgrid://IGNOREME/CHANNEL?client_key=REALKEY
signalgrid://CLIENTKEY/CHANNEL?to=CHANNEL2,CHANNEL3
Rejected URLs:
signalgrid://
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'signalgrid://CLIENTKEY/CHANNEL'
Notes
Signalgrid (signalgrid://): push notifications through Signalgrid.
SIGNL4
| Schemes | signl4:// |
| Cargo feature | service-signl4 |
| Service | https://signl4.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{secret}
{schema} is one of signl4://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{secret} | Secret | string | yes | secret |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
alerting_scenario | Alerting Scenario | string | ||
external_id | External ID | string | ||
filtering | Filtering | bool | no | |
location | Location | string | ||
service | Service | string | ||
status | Status | string |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
signl4://secret/
signl4://secret/?service=IoT
signl4://secret/?filtering=yes
signl4://?secret=secret2
signl4://secret/?alerting_scenario=singl4_ack
signl4://secret/?external_id=ar1234&status=new
signl4://secret/?location=40.6413111,-73.7781391
signl4://secret/?service=IoT&location=40.6413111,-73.7781391&alerting_scenario=multi_ack&filtering=yes&external_id=x1&status=resolved
Rejected URLs:
signl4://
signl4://:@/
signl4://%20%20/
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'signl4://secret/'
Notes
SIGNL4 (signl4://): alerts through SIGNL4.
Simplepush
| Schemes | spush://, simplepush:// |
| Cargo feature | service-simplepush |
| Service | https://simplepu.sh/ |
| Body formats | markdown (first is the default) |
| Attachments | yes |
| Title length | 300 characters |
| Body length | 7,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{token}
{schema}://{token}/{targets}
{schema}://{password}@{token}
{schema}://{password}@{token}/{targets}
{schema} is one of spush://, simplepush://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{password} | Password | string | no | secret | |
{target_member} | Target Member | string | no | prefix @ | |
{target_topic} | Target Topic | string | no | ||
{targets} | Targets | list | no | any of target_member, target_topic; separated by / | |
{token} | API Token | string | yes | secret |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
broadcast | Broadcast | bool | no | |
critical_volume | Volume | float, 0 to 1 | ||
links | Link | list | separated by , or space | |
priority | Priority | choice | one of 1, 2, 3, 4, 5 | |
shared | Shared | bool | no | |
sptag | Tag | string | ||
to | Targets | list | sets {targets} | |
topic_auth_token | Auth Token | string | secret |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
spush://AAAAAAAAAAAAAA
spush://secret@AAAAAAAAAAAAAA
spush://AAAAAAAAAAAAAA/alerts
simplepush://AAAAAAAAAAAAAA/alerts
spush://secret@AAAAAAAAAAAAAA/alerts
spush://spi_cred.RfD2e8N6R92NKuRlF1RHlK7HHe3g2-3pGtdcuc9hOw8/site/@Alice
spush://spi_cred.RfD2e8N6R92NKuRlF1RHlK7HHe3g2-3pGtdcuc9hOw8/@Alice/@Bob/site
spush://AAAAAAAAAAAAAA/?to=alerts,deploys
Rejected URLs:
spush://
spush://AAAAAAAAAAAAAA/alerts?priority=invalid
spush://AAAAAAAAAAAAAA/alerts?priority=10
spush://AAAAAAAAAAAAAA/alerts?priority=3.5
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'spush://AAAAAAAAAAAAAA'
Notes
Simplepush (spush://, simplepush://): push notifications through Simplepush, optionally encrypted.
Every message is sent as a task. Encryption is end-to-end:
- personal sends with a password: Argon2id (libsodium
crypto_pwhash, 3 passes, 64 MiB) over the password salted with the topic (or the account’s password salt), expanded with HKDF-SHA256 into a key; - organization sends with an integration token (
spi_<credential>.<seed>): the organization keys are wrapped to the token with NaClcrypto_box(X25519 + XSalsa20-Poly1305) and opened with the seed.
Fields, links and attachments are sealed with XChaCha20-Poly1305 (24 byte nonce + ciphertext + tag).
Sinch
| Schemes | sinch:// |
| Cargo feature | service-sinch |
| Service | https://sinch.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 160 characters |
| Body lines | unlimited |
| Request throttle | 200 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{service_plan_id}:{api_token}@{from_phone}
{schema}://{service_plan_id}:{api_token}@{from_phone}/{targets}
{schema} is one of sinch://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{api_token} | Auth Token | string | yes | secret; must match ^[a-f0-9]+$ | |
{from_phone} | From Phone No | string | yes | must match ^\+?[0-9\s)(+-]+$ | |
{service_plan_id} | Account SID | string | yes | secret; must match ^[a-f0-9]+$ | |
{short_code} | Target Short Code | string | no | must match ^[0-9]{5,6}$ | |
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | no | any of short_code, target_phone; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
from | From Phone No | string | sets {from_phone}; also source | |
region | Region | string | us | must match ^[a-z]{2}$ |
spi | Account SID | string | sets {service_plan_id} | |
to | Targets | list | sets {targets} | |
token | Auth Token | string | sets {api_token} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
sinch://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb@55555555555
sinch://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb@12345/44444444444
sinch://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb@55555555555/66666666666/77777777777
sinch://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb@33333333333/123/999999999999999/abcd/
sinch://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb@55555555555?region=EU
sinch://_?spi=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&token=bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb&from=55555555555
sinch://_?spi=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&token=bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb&source=55555555555
sinch://_?spi=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&token=bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb&from=55555555555&to=7777777777777
Rejected URLs:
sinch://
sinch://:@/
sinch://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@12345678
sinch://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb@_
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'sinch://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb@55555555555'
Notes
Sinch SMS (sinch://): SMS through the Sinch API.
Slack
| Schemes | slack:// |
| Cargo feature | service-slack |
| Service | https://slack.com/ |
| Body formats | markdown, text (first is the default) |
| Attachments | yes |
| Title length | 250 characters |
| Body length | 35,000 characters |
| Body lines | unlimited |
| Request throttle | 1200 ms between requests |
| Vendor URLs accepted | yes |
URL formats
{schema}://{token_a}/{token_b}/{token_c}
{schema}://{botname}@{token_a}/{token_b}/{token_c}
{schema}://{token_a}/{token_b}/{token_c}/{targets}
{schema}://{botname}@{token_a}/{token_b}/{token_c}/{targets}
{schema}://{access_token}/
{schema}://{access_token}/{targets}
{schema} is one of slack://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{access_token} | OAuth Access Token | string | yes | secret; must match ^(?:xoxe\.)?xox[abp]-[A-Z0-9-]+$ | |
{botname} | Bot Name | string | no | ||
{target_channels} | Target Channel | string | no | prefix # | |
{target_email} | Target Email | no | |||
{target_encoded_id} | Target Encoded ID | string | no | prefix + | |
{target_user} | Target User | string | no | prefix @ | |
{targets} | Targets | list | no | any of target_channels, target_email, target_encoded_id, target_user; separated by / | |
{token_a} | Token A | string | yes | secret; must match ^[A-Z0-9]+$ | |
{token_b} | Token B | string | yes | secret; must match ^[A-Z0-9]+$ | |
{token_c} | Token C | string | yes | secret; must match ^[A-Za-z0-9]+$ | |
{workflow_path} | Workflow Path | string | no | secret |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
blocks | Use Blocks | bool | no | |
footer | Include Footer | bool | yes | |
image | Include Image | bool | yes | |
mode | Message Mode | choice | one of hook, gov-hook, bot, workflow, trigger | |
template | Template Path | string | secret | |
timestamp | Include Timestamp | bool | yes | |
to | Targets | list | sets {targets} | |
token | OAuth Access Token | string | sets {access_token}, {token_a}, {token_b}, {token_c} |
Prefixed parameters:
:name=value: Template Tokens
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
slack://xoxb-1234-1234-abc124
slack://xoxb-1234-1234-abc124/#a/#b
slack://xoxb-1234-1234-abc124/#nuxref
slack://T1JJ3T3L2/A1BRTD4JD/TIiajkdnlazkcOXrIdevi7FQ/
slack://username@T1JJ3T3L2/A1BRTD4JD/TIiajkdnlazkcOXrIdevi7FQ
slack://T1JJ3T3L2/A1BRTD4JD/TIiajkdnlazkcOXrIdevi7FQ/+id/@id/plain
slack://T1JJ3T3L2/A1BRTD4JD/TIiajkdnlazkcOXrIdevi7FQ/#hmm/#-invalid-
https://hooks.slack.com/workflows/T1JJ3T3L2/Ft07XXXX/XXXXXXXX/YYYYYYYY
Rejected URLs:
slack://
slack://:@/
slack://T1JJ3T3L2
slack://T1JJ3T3L2/A1BRTD4JD/
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'slack://xoxb-1234-1234-abc124'
Notes
Slack (slack://): messages through incoming webhooks (hook, gov-hook), bot tokens (bot, with e-mail lookups and the external file-upload flow) and workflow webhooks (workflow, trigger).
E-mail lookups are cached for the lifetime of the parsed URL. On ?retry=, channels that accepted the message are skipped and their remembered channel ids still receive the attachments that have not been delivered yet.
Differences with Apprise
SMPP
| Schemes | smpp://, smpps:// |
| Cargo feature | service-smpp |
| Service | https://smpp.org/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{user}:{password}@{host}/{from_phone}/{targets}
{schema}://{user}:{password}@{host}:{port}/{from_phone}/{targets}
{schema} is one of smpp://, smpps://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{from_phone} | From Phone No | string | yes | must match ^[0-9\s)(+-]+$ | |
{host} | Host | string | yes | ||
{password} | Password | string | yes | secret | |
{port} | Port | int, 1 to 65535 | no | ||
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | yes | any of target_phone; separated by / | |
{user} | Username | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
from | From Phone No | string | sets {from_phone} | |
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
smpp://user:pass@host/1111111111/2222222222
smpps://user:pass@host/1111111111/2222222222
smpp://user:pass@host/1111111111/2222222222/+3333333333
smpp://user:pass@host/2222222222?from=1111111111
smpps://_?&from=1111111111&to=2222222222,3333333333&user=user&password=pw
Rejected URLs:
smpp://
smpp:///
smpp://@/
smpp://user@/
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'smpp://user:pass@host/1111111111/2222222222'
Notes
SMPP (smpp://, smpps://): SMS through an SMPP server, with a built-in SMPP v3.4 client: bind_transmitter, one submit_sm per segment and target, unbind.
PDUs: sequence numbers start at 2, registered_delivery=1, GSM 7-bit unpacked or UCS-2 with concatenation UDH above 160 / 140 octets, string fields truncated to the SMPP maxima.
Divergences: an explicit :port is honoured (otherwise 2775 / 3550); smpps:// uses TLS; submit_sm_resp statuses are checked.
Differences with Apprise
- An explicit
:portis honoured (Apprise always uses 2775 / 3550). smpps://uses TLS (Apprise opens a plain socket).submit_sm_respstatuses are checked (Apprise never reads them).
SMS Eagle
| Schemes | smseagle://, smseagles:// |
| Cargo feature | service-smseagle |
| Service | https://smseagle.eu |
| Body formats | text (first is the default) |
| Attachments | yes |
| Title length | no title (merged into the body) |
| Body length | 1,200 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{token}@{host}/{targets}
{schema}://{token}@{host}:{port}/{targets}
{schema} is one of smseagle://, smseagles://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{port} | Port | int, 1 to 65535 | no | ||
{target_contact} | Target Contact | string | no | prefix @; must match ^[a-z0-9_-]+$ | |
{target_group} | Target Group ID | string | no | prefix #; must match ^[a-z0-9_-]+$ | |
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | yes | any of target_contact, target_group, target_phone; separated by / | |
{token} | Access Token | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
batch | Batch Mode | bool | no | |
flash | Flash | bool | no | |
priority | Priority | choice | 0 | one of 0, 1 |
status | Show Status | bool | no | |
test | Test Only | bool | no | |
to | Targets | list | sets {targets} | |
token | Access Token | string | sets {token} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
smseagle://token@localhost/123456789
smseagles://token@localhost:8443/+12345678901
smseagle://token@localhost/123456789/987654321/111111111/@c1/@c2?batch=yes
smseagle://token@localhost/123456789?priority=high
smseagle://user:pass@localhost/123456789?token=abc&to=987654321
smseagle://token@localhost/123456789/@contact1/%23group1/#group2/contact2/!bad?status=yes&test=yes&flash=yes
Rejected URLs:
smseagle://
smseagle://localhost
smseagle://token@localhost/123456789?priority=invalid
smseagle://token@localhost/123456789?priority=5
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'smseagle://token@localhost/123456789'
Notes
SMSEagle (smseagle://, smseagles://): SMS through an SMSEagle device.
SMS Manager
| Schemes | smsmgr://, smsmanager:// |
| Cargo feature | service-smsmanager |
| Service | https://smsmanager.cz |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 160 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}@{targets}
{schema} is one of smsmgr://, smsmanager://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret | |
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | yes | any of target_phone; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
batch | Batch Mode | bool | no | |
from | From Phone No | string | also sender; must match ^\+?[0-9\s)(+-]+$ | |
gateway | Gateway | choice | high | one of high, economy, low, direct |
key | API Key | string | sets {apikey} | |
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
smsmgr://apikey@123456789
smsmanager://apikey@+420123456789/+420987654321
smsmgr://123456789?key=other
smsmgr://apikey@123456789?sender=Me
smsmgr://apikey@123456789/987654321/+420111222333?batch=yes
smsmgr://apikey@123456789?gateway=ECONOMY
smsmgr://apikey@123456789?sender=Me&from=You
smsmgr://apikey@123456789?from=MyLongSenderName
Rejected URLs:
smsmgr://
smsmgr://123456789
smsmgr://apikey@123456789?gateway=fast
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'smsmgr://apikey@123456789'
Notes
SMS Manager (smsmgr://, smsmanager://): SMS through the SMS Manager API.
SMSC
| Schemes | smsc:// |
| Cargo feature | service-smsc |
| Service | https://smsc.ru/ |
| Body formats | text (first is the default) |
| Attachments | yes |
| Title length | no title (merged into the body) |
| Body length | 160 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{user}:{password}@{targets}
{schema} is one of smsc://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{password} | Password | string | yes | secret | |
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | yes | any of target_phone; separated by / | |
{user} | Login | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
sender | Sender ID | string | ||
to | Targets | list | sets {targets} | |
translit | Transliterate | bool | no |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
smsc://login:password@+71234567890
smsc://login:password@+71234567890/+79876543210
smsc://login:password@+71234567890?translit=yes
smsc://login:password@+71234567890?sender=MySender
smsc://login:password@+71234567890?to=%2B79876543210
smsc://login:pass@+71234567890?sender=Biz&translit=yes
Rejected URLs:
smsc://
smsc://login@+71234567890
smsc://:password@+71234567890
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'smsc://login:password@+71234567890'
Notes
SMSC (smsc://): SMS through the SMSC API.
SMTP2Go
| Schemes | smtp2go:// |
| Cargo feature | service-smtp2go |
| Service | https://www.smtp2go.com/ |
| Body formats | html (first is the default) |
| Attachments | yes |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | 200 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{user}@{host}/{apikey}/
{schema}://{user}@{host}/{apikey}/{targets}
{schema} is one of smtp2go://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret | |
{host} | Domain | string | yes | ||
{targets} | Target Emails | list | no | separated by / | |
{user} | User Name | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
batch | Batch Mode | bool | no | |
bcc | Blind Carbon Copy | list | separated by , or space | |
cc | Carbon Copy | list | separated by , or space | |
name | From Name | string | ||
to | Target Emails | list | sets {targets} |
Prefixed parameters:
+name=value: Email Header
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
smtp2go://user@localhost.localdomain/key/test@example.com
smtp2go://user@localhost.localdomain/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbb-cccccccc
smtp2go://no-reply@example.com/key/user1@example.com/User2:user2@example.com?batch=yes
smtp2go://user@localhost.localdomain/key?name=Jo%20Doe
smtp2go://user@localhost.localdomain/key/Bob:bob@example.com?name=J%C3%B6rg
smtp2go://user@localhost.localdomain/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbb-cccccccc?format=markdown
smtp2go://user@localhost.localdomain/key?to=test@example.com
smtp2go://user@localhost.localdomain/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbb-cccccccc?+X-Customer-Campaign-ID=Mercurio
Rejected URLs:
smtp2go://
smtp2go://:@/
smtp2go://user@localhost.localdomain
smtp2go://localhost.localdomain/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbb-cccccccc
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'smtp2go://user@localhost.localdomain/key/test@example.com'
Notes
SMTP2Go (smtp2go://): e-mail through the SMTP2Go API.
smtp2go://{user}@{domain}/{apikey}[/{to_email}...] ?name=..&cc=..&bcc=..&batch=yes&to=..&+Header=v
+key=value entries become custom e-mail headers. Without targets the message goes to the sender.
Société Française du Radiotéléphone
| Schemes | sfr:// |
| Cargo feature | service-sfr |
| Service | https://www.sfr.fr/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 160 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{user}:{password}@{space_id}/{targets}
{schema} is one of sfr://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{password} | Service Password | string | yes | secret | |
{space_id} | Space ID | string | yes | secret | |
{target} | Recipient Phone Number | string | no | must match ^\+?[0-9\s)(+-]+$ | |
{targets} | Targets | list | yes | any of target; separated by / | |
{user} | Service ID | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
lang | Language | string | fr_FR | |
media | Media Type | string | SMSUnicode | one of SMS, SMSLong, SMSUnicode, SMSUnicodeLong |
sender | Sender Name | string | also from | |
timeout | Timeout | int | 2880 | |
to | Targets | list | sets {targets} | |
voice | TTS Voice | string | claire08s | one of claire08s, laura8k |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
sfr://service_id:service_password@000/0000000000
sfr://service_id:service_password@000/0000000000?media=SMS
sfr://service_id:service_password@000/0000000000?from=MyApp&timeout=30
sfr://service_id:service_password@000/0000000000?voice=laura8k&lang=en_US
sfr://srv:pwd@11111111/0000000000?sender=&from=B&timeout=%2012%20
sfr://srv:pwd@11111111/0000000000?sender=A&from=B&timeout=abc&media=SMSUnicodeLong
Rejected URLs:
sfr://
sfr://:@/
sfr://:service_password
sfr://testing:serv@ice_password
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'sfr://service_id:service_password@000/0000000000'
Notes
SFR (sfr://): SMS through SFR.
SparkPost
| Schemes | sparkpost:// |
| Cargo feature | service-sparkpost |
| Service | https://sparkpost.com/ |
| Body formats | html (first is the default) |
| Attachments | yes |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | 200 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{user}@{host}/{apikey}/
{schema}://{user}@{host}/{apikey}/{targets}
{schema} is one of sparkpost://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret | |
{host} | Domain | string | yes | ||
{targets} | Target Emails | list | no | separated by / | |
{user} | User Name | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
batch | Batch Mode | bool | no | |
bcc | Blind Carbon Copy | list | separated by , or space | |
cc | Carbon Copy | list | separated by , or space | |
name | From Name | string | ||
region | Region Name | choice | us | one of us, eu |
to | Target Emails | list | sets {targets} |
Prefixed parameters:
+name=value: Email Header:name=value: Template Tokens
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
sparkpost://user@localhost.localdomain/cccccccccccccccccccccccccccccccc
sparkpost://user@localhost.localdomain/iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii/test@example.com
sparkpost://user@localhost.localdomain/dddddddddddddddddddddddddddddddd?region=uS
sparkpost://user@localhost.localdomain/hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh?name=Jo%20Doe
sparkpost://user@localhost.localdomain/hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh/to@example.com?name=Doe,%20Jo
sparkpost://user@localhost.localdomain/cccccccccccccccccccccccccccccccc?format=markdown
sparkpost://user@localhost.localdomain/kkkk?to=test@example.com
sparkpost://user@localhost.localdomain/hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh?:name=Chris&:status=admin
Rejected URLs:
sparkpost://
sparkpost://:@/
sparkpost://user@localhost.localdomain
sparkpost://localhost.localdomain/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'sparkpost://user@localhost.localdomain/cccccccccccccccccccccccccccccccc'
Notes
SparkPost (sparkpost://): e-mail through the SparkPost API.
sparkpost://{user}@{domain}/{apikey}[/{to_email}...] ?region=us|eu&name=..&cc=..&bcc=..&batch=yes&+Header=v&:token=v
+key=value entries become e-mail headers, :key=value entries the substitution data. Without targets the message goes to the sender. HTTP 429 is retried (up to 3 attempts, 5 s apart).
Spike.sh
| Schemes | spike:// |
| Cargo feature | service-spike |
| Service | https://www.spike.sh/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | yes |
URL formats
{schema}://{token}
{schema} is one of spike://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{token} | Integration Key | string | yes | secret; must match ^[a-z0-9]{32}$ |
Query parameters
No service-specific parameters.
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
spike://1234567890abcdef1234567890abcdef
https://api.spike.sh/v1/alerts/1234567890abcdef1234567890abcdef
spike://?token=1234567890ABCDEF1234567890abcdef
Rejected URLs:
spike://
spike://invalid-key
https://api.spike.sh/v1/alerts/1234567890abcdef
spike://1234567890abcdef1234567890abcdef0
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'spike://1234567890abcdef1234567890abcdef'
Notes
Spike.sh (spike://): alerts through a Spike.sh integration.
Splunk On-Call
| Schemes | splunk://, victorops:// |
| Cargo feature | service-splunk |
| Service | https://www.splunk.com/en_us/products/on-call.html |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 60 characters |
| Body length | 400 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | yes |
URL formats
{schema}://{routing_key}@{apikey}
{schema}://{routing_key}@{apikey}/{entity_id}
{schema} is one of splunk://, victorops://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret; must match ^[A-Z0-9_-]+$ | |
{entity_id} | Entity ID | string | no | ||
{routing_key} | Target Routing Key | string | yes | must match ^[A-Z0-9_-]+$ |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
action | Action | choice | map | one of map, info, acknowledgement, warning, recovery, resolve, critical |
apikey | API Key | string | sets {apikey} | |
entity_id | Entity ID | string | sets {entity_id} | |
routing_key | Target Routing Key | string | sets {routing_key}; also route |
Prefixed parameters:
:name=value: Action Mapping
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
splunk://db@apikey
splunk://route@abc123/a/b/c/
splunk://route@abc123/entity_id
https://alert.victorops.com/integrations/generic/20131114/alert/apikey/routing_key
splunk://db@apikey?:f=ack
https://alert.victorops.com/integrations/generic/20131114/alert/apikey/routing_key/entity_id?action=crit
splunk://db@apikey?action=recovery
splunk://db@apikey?:warning=critical
Rejected URLs:
splunk://
splunk://:@/
splunk://routekey@%badapi%
splunk://abc123
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'splunk://db@apikey'
Notes
Splunk On-Call / VictorOps (splunk://, victorops://): incidents through the Splunk On-Call REST endpoint.
SpugPush
| Schemes | spugpush:// |
| Cargo feature | service-spugpush |
| Service | https://push.spug.cc/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | yes |
URL formats
{schema}://{token}
{schema} is one of spugpush://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{token} | Access Token | string | yes | secret; must match ^[a-zA-Z0-9_-]{32,64}$ |
Query parameters
No service-specific parameters.
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
spugpush://abc123def456ghi789jkl012mno345pq
spugpush://abc123def456ghi789jkl012mno345pq/
https://push.spug.cc/send/abc123def456ghi789jkl012mno345pq
HTTPS://PUSH.SPUG.CC/send/ABC123def456ghi789jkl012mno345pq
spugpush://?token=abc123def456ghi789jkl012mno345pq
spugpush://short/?token=abc123def456ghi789jkl012mno345pq
Rejected URLs:
https://push.spug.cc/send/abc
spugpush://abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij12345
spugpush://
spugpush://invalid!
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'spugpush://abc123def456ghi789jkl012mno345pq'
Notes
SpugPush (spugpush://): POST https://push.spug.cc/send/{token}.
Stackfield
| Schemes | stackfield:// |
| Cargo feature | service-stackfield |
| Service | https://www.stackfield.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 4,000 characters |
| Body lines | unlimited |
| Request throttle | 1000 ms between requests |
| Vendor URLs accepted | yes |
URL formats
{schema}://{token}
{schema} is one of stackfield://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{token} | Webhook Token | string | yes | secret; must match ^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$ |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
token | Webhook Token | string | sets {token} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
stackfield://abcdef01-2345-6789-abcd-ef0123456789
https://stackfield.com/apiwh/abcdef01-2345-6789-abcd-ef0123456789/
https://www.stackfield.com/apiwh/abcdef01-2345-6789-abcd-ef0123456789
stackfield://abcdef01-2345-6789-abcd-ef0123456789?format=html
http://www.stackfield.com/apiwh/abcdef01-2345-6789-abcd-ef0123456789?format=markdown
stackfield://abcdef01-2345-6789-abcd-ef0123456789?overflow=truncate
stackfield://?token=abcdef01-2345-6789-abcd-ef0123456789
Rejected URLs:
stackfield://
stackfield://not-a-valid-uuid
stackfield://11111111-2222-3333-4444-55555555555
stackfield://abcdef01-2345-6789-abcd-ef0123456789?token=bad
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'stackfield://abcdef01-2345-6789-abcd-ef0123456789'
Notes
Stackfield (stackfield://): messages to Stackfield rooms through webhooks.
Streamlabs
| Schemes | strmlabs:// |
| Cargo feature | service-streamlabs |
| Service | https://streamlabs.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 255 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{access_token}/
{schema} is one of strmlabs://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{access_token} | Access Token | string | yes | secret; must match ^[a-z0-9._-]{20,}$ |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
alert_type | Alert Type | choice | donation | one of follow, subscription, donation, host |
amount | Amount | int, min 0 | 0 | |
call | Call | choice | ALERTS | one of ALERTS, DONATIONS |
currency | Currency | string | USD | must match ^[A-Z]{3}$ |
duration | Duration | int, min 0 | 1000 | |
identifier | Identifier | string | defaults to the application id | |
image_href | Image Link | string | ||
name | Name | string | Anon (usually; depends on the URL) | must match ^[^\s].{1,24}$ |
sound_href | Sound Link | string | ||
special_text_color | Special Text Color | string | must match ^[A-Z]$ |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
strmlabs://eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIn0.c2lnbmF0dXJl
strmlabs://IcIcArukDQtuC1is1X1UdKZjTg118Lag2vScOmso/?call=donations
strmlabs://IcIcArukDQtuC1is1X1UdKZjTg118Lag2vScOmso/?alert_type=subscription
strmlabs://IcIcArukDQtuC1is1X1UdKZjTg118Lag2vScOmso/?call=donations&amount=2.5
strmlabs://IcIcArukDQtuC1is1X1UdKZjTg118Lag2vScOmso/?call=donations&amount=10¤cy=eur&name=Joe&identifier=me
Rejected URLs:
strmlabs://
strmlabs://a_bd_/
strmlabs://IcIcArukDQtuC1is1X1UdKZjTg118Lag2vScOmso/?currency=ABCD
strmlabs://IcIcArukDQtuC1is1X1UdKZjTg118Lag2vScOmso/?alert_type=invalid
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'strmlabs://eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIn0.c2lnbmF0dXJl'
Notes
Streamlabs (strmlabs://): API v2.0 alerts and donations.
POST https://streamlabs.com/api/v2.0/{alerts,donations} with the access token as a Bearer header (v2.0 refuses it in the body) and a JSON body.
Differences with Apprise
- Apprise posts forms to API v1.0 with
access_tokenin the body, while mercurio uses API v2.0 (Bearer header, JSON, empty options left out), since Streamlabs is disabling v1.0. - The donation
identifierdefaults to the application id andsound_hrefkeeps its case (Apprise upper-cases the URL).
Synology Chat
| Schemes | synology://, synologys:// |
| Cargo feature | service-synology |
| Service | https://www.synology.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{host}/{token}
{schema}://{host}:{port}/{token}
{schema}://{user}@{host}/{token}
{schema}://{user}@{host}:{port}/{token}
{schema}://{user}:{password}@{host}/{token}
{schema}://{user}:{password}@{host}:{port}/{token}
{schema} is one of synology://, synologys://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{password} | Password | string | no | secret | |
{port} | Port | int, 1 to 65535 | no | ||
{token} | Token | string | yes | secret | |
{user} | Username | string | no |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
file_url | Upload | string | ||
token | Token | string | sets {token} |
Prefixed parameters:
+name=value: HTTP Header
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
synology://localhost/token
synologys://localhost/token
synology://user:pass@localhost/token
synology://localhost/to%20ken/sub/dir
synologys://localhost:8080/token/path/
synologys://localhost?token=mytoken
synologys://localhost/?token=mytoken
synology://localhost/token?file_url=http://reddit.com/test.jpg
Rejected URLs:
synology://:@/
synology://
synologys://
synology://user@localhost
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'synology://localhost/token'
Notes
Synology Chat (synology://, synologys://): messages through Synology Chat incoming webhooks.
Differences with Apprise
- Apprise crashes on URLs without a path, while mercurio handles them.
Syslog
| Schemes | syslog:// |
| Cargo feature | service-syslog |
| Service | https://tools.ietf.org/html/rfc5424 |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://
{schema}://{facility}
{schema} is one of syslog://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{facility} | Facility | choice | no | user | one of kern, user, mail, daemon, auth, syslog, lpr, news, uucp, cron, local0, local1, … (18 values) |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
facility | Facility | choice | sets {facility} | |
logperror | Log to STDERR | bool | no | |
logpid | Log PID | bool | yes |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
syslog://
syslog://:@/
syslog://_/cron
syslog://kern?facility=d
syslog://_/?facility=local5
syslog://?logpid=no&logperror=yes
Rejected URLs:
syslog://_/?facility=invalid
syslog://notafacility
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'syslog://'
Notes
Local syslog (syslog://): writes messages to the local syslog.
Writes the BSD-style datagram libc syslog would (<PRI>Mmm dd hh:mm:ss ident[pid]: msg) to the local syslog socket (/var/run/syslog on macOS, /dev/log elsewhere).
Differences with Apprise
logperrorcopies the line to stderr likeLOG_PERROR.
Techulus Push
| Schemes | push:// |
| Cargo feature | service-techuluspush |
| Service | https://push.techulus.com |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 1,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}
{schema} is one of push://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret; must match ^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$ |
Query parameters
No service-specific parameters.
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
push://12345678-1234-4123-8123-123456789abc
Rejected URLs:
push://
push://:@/
push://abcdefg
push://12345678-1234-1123-8123-123456789abc
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'push://12345678-1234-4123-8123-123456789abc'
Notes
Techulus Push (push://): push notifications through Techulus Push.
Telegram
| Schemes | tgram:// |
| Cargo feature | service-telegram |
| Service | https://telegram.org/ |
| Body formats | html, markdown (first is the default) |
| Attachments | yes |
| Title length | no title (merged into the body) |
| Body length | 4,096 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{bot_token}
{schema}://{bot_token}/{targets}
{schema} is one of tgram://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{bot_token} | Bot Token | string | yes | secret; must match ^(bot)?(?P<key>[0-9]+:[a-z0-9_-]+)$ | |
{target_user} | Target Chat ID | string | no | must match ^((-?[0-9]{1,32})|([a-z_-][a-z0-9_-]+))$ | |
{targets} | Targets | list | no | any of target_user; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
album | Group Photo/Video Attachments | bool | no | |
content | Content Placement | choice | before | one of before, after |
detect | Detect Bot Owner | bool | yes | |
image | Include Image | bool | no | |
mdv | Markdown Version | choice | v1 | one of v1, v2 |
preview | Web Page Preview | bool | no | |
silent | Silent Notification | bool | no | |
template | Rich Message Template Path | string | secret | |
to | Targets | list | sets {targets} | |
topic | Topic Thread ID | int | also thread |
Prefixed parameters:
:name=value: Template Tokens
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
tgram://123456789:abcdefg_hijklmnop/
tgram://123456789:abcdefg_hijklmnop/1:5/2/
tgram://123456789:abcdefg_hijklmnop/lead2gold/
tgram://bottest@123456789:abcdefg_hijklmnop/lead2gold/
tgram://123456789:abcdefg_hijklmnop/id1/id2/23423/-30/
tgram://123456789:abcdefg_hijklmnop/9876:1234/9876:1111/id1:invalid/-55:0
tgram://123456789:abcdefg_hijklmnop/?topic=9
tgram://123456789:abcdefg_hijklmnop/12345/?album=yes
Rejected URLs:
tgram://123456789:abcdefg_hijklmnop/id1/?topic=invalid
tgram://123456789:abcdefg_hijklmnop/id1/?content=invalid
tgram://alpha:abcdefg_hijklmnop/lead2gold/
tgram://:@/
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'tgram://123456789:abcdefg_hijklmnop/'
Notes
Telegram (tgram://): messages through the Telegram Bot API.
Without a chat id the bot owner is detected with getUpdates once and kept in the persistent store (bot_owner).
Differences with Apprise
- HTML that Apprise’s parser rejects is sent unreduced.
Telnyx
| Schemes | telnyx:// |
| Cargo feature | service-telnyx |
| Service | https://telnyx.com |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 160 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}@{from_phone}
{schema}://{apikey}@{from_phone}/{targets}
{schema} is one of telnyx://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret | |
{from_phone} | From Phone No | string | yes | must match ^\+?[0-9\s)(+-]+$ | |
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | yes | any of target_phone; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
from | From Phone No | string | must match ^\+?[0-9\s)(+-]+$ | |
key | API Key | string | sets {apikey} | |
profile | Messaging Profile ID | string | ||
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
telnyx://apikey@15551232000
telnyx://apikey@15551232000/15551232001/+1 555 123 2002
telnyx://apikey@15551232000?profile=prof-123
telnyx://apikey@15551232001/15551232002?from=15551232000
telnyx://15551232000?key=thekey&to=15551232001
Rejected URLs:
telnyx://
telnyx://15551232000
telnyx://apikey@123
telnyx://apikey@15551232001?from=abc
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'telnyx://apikey@15551232000'
Notes
Telnyx (telnyx://): SMS through the Telnyx API.
Threema Gateway
| Schemes | threema:// |
| Cargo feature | service-threema |
| Service | https://gateway.threema.ch/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 3,500 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{gateway_id}@{secret}/{targets}
{schema} is one of threema://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{gateway_id} | Gateway ID | string | yes | secret | |
{secret} | API Secret | string | yes | secret | |
{target_email} | Target Email | no | |||
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{target_threema_id} | Target Threema ID | string | no | ||
{targets} | Targets | list | yes | any of target_email, target_phone, target_threema_id; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
from | Gateway ID | string | sets {gateway_id} | |
gwid | Gateway ID | string | sets {gateway_id} | |
secret | API Secret | string | sets {secret} | |
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
threema://*THEGWID@secret/ECHOECHO/
threema://*THEGWID@secret/user@example.com
threema://*THEGWID@secret/16134442222/16134443333/
threema://*THEGWID@secret/ECHOECHO/user@example.com/+1 613 444 2222/bad
threema:///?secret=secret&gwid=*THEGWID&to=16134442222
threema:///?secret=secret&from=*THEGWID&to=16134442222,ECHOECHO
Rejected URLs:
threema://
threema://@:
threema://user@secret
threema:///?gwid=*THEGWID&to=ECHOECHO
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'threema://*THEGWID@secret/ECHOECHO/'
Notes
Threema Gateway (threema://): messages through the Threema Gateway API.
Trigv
| Schemes | trigv://, trigvs:// |
| Cargo feature | service-trigv |
| Service | https://trigv.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 255 characters |
| Body length | 1,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{api_key}
{schema}://{api_key}/{targets}
{schema}://{api_key}@{host}/{targets}
{schema}://{api_key}@{host}:{port}/{targets}
{schema}://{api_key}@{host}
{schema} is one of trigv://, trigvs://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{api_key} | API Key | string | yes | secret; must match ^trgv_[a-zA-Z0-9]{8}_[a-zA-Z0-9]{32}$ | |
{host} | API Hostname | string | no | ||
{port} | Port | int, 1 to 65535 | no | ||
{target_channel} | Target Channel | string | no | ||
{targets} | Targets | list | no | any of target_channel; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
event_type | Event type | string | ||
image_url | Image URL | string | ||
priority | Priority (Pushover compatibility) | int | ||
to | Targets | list | sets {targets} | |
urgency | Urgency | choice | standard | one of standard, time_sensitive |
url | URL | string |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
trigvs://trgv_a1b2c3d4_0123456789abcdef0123456789abcdef
trigvs://trgv_a1b2c3d4_0123456789abcdef0123456789abcdef/general
trigvs://trgv_a1b2c3d4_0123456789abcdef0123456789abcdef/ops/alerts
trigv://trgv_a1b2c3d4_0123456789abcdef0123456789abcdef@trigv-platform.test/general
trigvs://trgv_a1b2c3d4_0123456789abcdef0123456789abcdef@trigv-platform.test:8443/general
trigvs://trgv_a1b2c3d4_0123456789abcdef0123456789abcdef/?priority=1
trigvs://trgv_a1b2c3d4_0123456789abcdef0123456789abcdef/alerts/?to=ops,escalation
trigvs://trgv_a1b2c3d4_0123456789abcdef0123456789abcdef/?urgency=TIME_SENSITIVE
Rejected URLs:
trigvs://
trigv://
trigvs://trgv_a1b2c3d4_0123456789abcdef0123456789abcdef/?urgency=now
trigvs://not-a-valid-key
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'trigvs://trgv_a1b2c3d4_0123456789abcdef0123456789abcdef'
Notes
Trigv (trigv://, trigvs://): notifications through Trigv.
Twilio
| Schemes | twilio:// |
| Cargo feature | service-twilio |
| Service | https://www.twilio.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 160 characters |
| Body lines | unlimited |
| Request throttle | 200 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{account_sid}:{auth_token}@{from_phone}
{schema}://{account_sid}:{auth_token}@{from_phone}/{targets}
{schema} is one of twilio://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{account_sid} | Account SID | string | yes | secret; must match ^AC[a-f0-9]+$ | |
{auth_token} | Auth Token | string | yes | secret; must match ^[a-z0-9]+$ | |
{from_phone} | From Phone No | string | yes | must match ^([a-z]+:)?\+?[0-9\s)(+-]+$ | |
{short_code} | Target Short Code | string | no | must match ^[0-9]{5,6}$ | |
{target_phone} | Target Phone No | string | no | prefix +; must match ^([a-z]+:)?[0-9\s)(+-]+$ | |
{targets} | Targets | list | no | any of short_code, target_phone; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
apikey | API Key | string | secret; must match ^SK[a-f0-9]+$ | |
from | From Phone No | string | sets {from_phone}; also source | |
method | Notification Method: sms or call | choice | sms | one of sms, call |
sid | Account SID | string | sets {account_sid} | |
to | Targets | list | sets {targets} | |
token | Auth Token | string | sets {auth_token} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
twilio://ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb@55555555555
twilio://ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb@12345/44444444444
twilio://ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb@98765/44444444444/w:55555555555/
twilio://ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb@33333333333/123/999999999999999/abcd/w:88888888888
twilio://ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb@55555555555?method=sms
twilio://ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb@15551233456/15559876543?method=call
twilio://ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb@15551233456/w:15559876543/15559876544?method=call
twilio://ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb@_/66666666666/t:77777777777?from=whatsapp:55555555555
Rejected URLs:
twilio://
twilio://:@/
twilio://ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@12345678
twilio://ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb@_
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'twilio://ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb@55555555555'
Notes
Twilio SMS / WhatsApp / voice calls (twilio://): messages and calls through the Twilio API.
Twist
| Schemes | twist:// |
| Cargo feature | service-twist |
| Service | https://twist.com |
| Body formats | markdown (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 1,000 characters |
| Body lines | unlimited |
| Request throttle | 200 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{password}:{email}
{schema}://{password}:{email}/{targets}
{schema} is one of twist://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{email} | yes | ||||
{password} | Password | string | yes | secret | |
{target_channel} | Target Channel | string | no | prefix # | |
{target_channel_id} | Target Channel ID | string | no | ||
{targets} | Targets | list | no | any of target_channel, target_channel_id; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
twist://password:user@example.com
twist://user@example.com/secret/42
twist://password:user@example.com/12345
twist://password:user@example.com?to=777
twist://password:user@example.com/12345?overflow=split
Rejected URLs:
twist://
twist://:@/
twist://user@example.com/
twist://password:user@exa_mple!.com
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'twist://password:user@example.com'
Notes
Twist (twist://): messages to Twist threads and channels.
The login session lives on the parsed URL: the token, workspace and channel lookups are kept between sends (channel names are resolved once). users/logout runs from Target::close.
| Schemes | x://, twitter://, tweet:// |
| Cargo feature | service-twitter |
| Service | https://twitter.com/ |
| Body formats | text (first is the default) |
| Attachments | yes |
| Title length | no title (merged into the body) |
| Body length | 10,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{ckey}/{csecret}/{akey}/{asecret}
{schema}://{ckey}/{csecret}/{akey}/{asecret}/{targets}
{schema} is one of x://, twitter://, tweet://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{akey} | Access Key | string | yes | secret | |
{asecret} | Access Secret | string | yes | secret | |
{ckey} | Consumer Key | string | yes | secret | |
{csecret} | Consumer Secret | string | yes | secret | |
{target_user} | Target User | string | no | prefix @ | |
{targets} | Targets | list | no | any of target_user; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
batch | Batch Mode | bool | yes | |
cache | Cache Results | bool | yes | |
mode | Message Mode | choice | dm (usually; depends on the URL) | one of dm, tweet |
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
tweet://ckey/csecret/akey/asecret
twitter://ckey/csecret/akey/asecret
twitter://ckey/csecret/akey/asecret/-/usera
x://ckey/csecret/akey/asecret?mode=dm
twitter://usera@ckey/csecret/akey/asecret?cache=no
twitter://ckey/csecret/akey/asecret?mode=tweet
twitter://ckey/csecret/akey/asecret/usera?mode=tweet
twitter://ckey/csecret/akey/asecret?mode=tweet&batch=no
Rejected URLs:
twitter://
twitter://:@/
twitter://consumer_key
twitter://consumer_key/consumer_secret/atoken1/
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'tweet://ckey/csecret/akey/asecret'
Notes
Twitter / X (x://, twitter://, tweet://): direct messages and public tweets through the X API v2, with image uploads; requests are signed with OAuth 1.0a HMAC-SHA1 (header signature, body never signed).
Differences with Apprise
Vapid Web Push Notifications
| Schemes | vapid:// |
| Cargo feature | service-vapid |
| Service | https://datatracker.ietf.org/doc/html/draft-thomson-webpush-vapid |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 4,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{subscriber}
{schema}://{subscriber}/{targets}
{schema} is one of vapid://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{subscriber} | API Key | string | yes | secret | |
{targets} | Targets | list | no | separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
from | API Key | string | sets {subscriber} | |
keyfile | PEM Private KeyFile | string | secret | |
mode | Mode | choice | chrome | one of chrome, firefox, edge, opera, apple |
subfile | Subscripion File | string | secret | |
to | Targets | list | sets {targets} | |
ttl | ttl | int, 0 to 60 | 0 |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Rejected URLs:
vapid://
vapid://:@/
vapid://invalid-subscriber
vapid://user@example.com/user1?ttl=-4000
Notes
Vapid / Web Push (vapid://): Web Push messages signed with VAPID keys.
Messages are encrypted per subscription with RFC 8291 (aes128gcm: ephemeral ECDH P-256, HKDF-SHA256, AES-128-GCM) and authorised with an RFC 8292 VAPID ES256 JWT addressed to each endpoint’s origin.
The private key (?keyfile=, PEM) and the subscriptions (?subfile=, JSON) are read from local files or downloaded from http(s):// URLs. Without ?keyfile=, a disk-backed persistent store holds them: private_key.pem (generated on first use, with public_key.pem) and subscriptions.json in the URL’s store directory. Expired (404/410) endpoints are kept in the store (retired, 30 days) and skipped.
Differences with Apprise
- Both files are re-read on every send.
- Expired endpoints are never pruned from the subscription file (Apprise rewrites a writable one) and no starter file is written.
Viber
| Schemes | viber:// |
| Cargo feature | service-viber |
| Service | https://www.viber.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 30,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{token}/{targets}
{schema} is one of viber://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{targets} | Receiver IDs | list | yes | separated by / | |
{token} | Authentication Token | string | yes | secret |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
avatar | Bot Avatar URL | string | ||
from | Bot Name | string | ||
to | Receiver IDs | list | sets {targets} | |
token | Authentication Token | string | sets {token} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
viber://token/targetx
viber://t1/t2?token=token
viber://token/t1/t2?from=Viber%20Bot
viber://?token=token&to=t5
viber://token/t3?avatar=https://example.com/a.png
Rejected URLs:
viber://
viber:///
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'viber://token/targetx'
Notes
Viber (viber://): messages through a Viber bot.
VoIPms
| Schemes | voipms:// |
| Cargo feature | service-voipms |
| Service | https://voip.ms |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 160 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{password}:{email}/{from_phone}/{targets}
{schema} is one of voipms://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{email} | User Email | yes | |||
{from_phone} | From Phone No | string | yes | must match ^\+?[0-9\s)(+-]+$ | |
{password} | Password | string | yes | secret | |
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | yes | any of target_phone; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
from | From Phone No | string | sets {from_phone} | |
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
voipms://password:user@example.com/15551232000
voipms://password:user@example.com/15551232001?from=15551232000&to=15551232002
Rejected URLs:
voipms://
voipms://user@example.com/15551232000
voipms://password:user@/15551232000
voipms://password:user@example.com
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'voipms://password:user@example.com/15551232000'
Notes
VoIP.ms (voipms://): SMS through the VoIP.ms API.
Vonage
| Schemes | vonage://, nexmo:// |
| Cargo feature | service-vonage |
| Service | https://dashboard.nexmo.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 160 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{apikey}:{secret}@{from_phone}
{schema}://{apikey}:{secret}@{from_phone}/{targets}
{schema} is one of vonage://, nexmo://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret; must match ^[a-z0-9]+$ | |
{from_phone} | From Phone No | string | yes | must match ^\+?[0-9\s)(+-]+$ | |
{secret} | API Secret | string | yes | secret; must match ^[a-z0-9]+$ | |
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | no | any of target_phone; separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
from | From Phone No | string | sets {from_phone}; also source | |
key | API Key | string | sets {apikey} | |
secret | API Secret | string | sets {secret} | |
to | Targets | list | sets {targets} | |
ttl | ttl | int, 20000 to 604800000 | 900000 |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
vonage://AChhhhhhhh:iiiiiiiiiiiiiiii@55555555555
nexmo://ACaaaaaaaa:bbbbbbbbbbbbbbbb@55555555555/66666666666/77777777777
vonage://ACffffffff:gggggggggggggggg@33333333333/123/999999999999999/abcd/
vonage://ACbbbbbbbb:cccccccccccccccc@33333333333/?ttl=30000
vonage://_?key=ACaaaaaaaa&secret=bbbbbbbbbbbbbbbb&from=55555555555
vonage://_?key=ACaaaaaaaa&secret=bbbbbbbbbbbbbbbb&source=55555555555
vonage://_?key=ACaaaaaaaa&secret=bbbbbbbbbbbbbbbb&from=55555555555&to=7777777777777
Rejected URLs:
vonage://
vonage://:@/
vonage://ACaaaaaaaa@12345678
vonage://ACaaaaaaaa:bbbbbbbbbbbbbbbb@333333333
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'vonage://AChhhhhhhh:iiiiiiiiiiiiiiii@55555555555'
Notes
Vonage, formerly Nexmo (vonage://, nexmo://): SMS through the Vonage API.
WeChat (WeCom)
| Schemes | wechat:// |
| Cargo feature | service-wechat |
| Service | https://work.weixin.qq.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 2,048 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{user}:{password}@{host}
{schema}://{user}:{password}@{host}/{targets}
{schema} is one of wechat://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Agent ID | string | yes | must match ^[0-9]+$ | |
{password} | App Secret | string | yes | secret | |
{target_department} | Target Department | string | no | prefix # | |
{target_tag} | Target Tag | string | no | prefix + | |
{target_user} | Target User | string | no | prefix @ | |
{targets} | Targets | list | no | any of target_department, target_tag, target_user; separated by / | |
{user} | Corp ID | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
to | Targets | list | sets {targets} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
wechat://corpid:secret@1000002/johndoe
wechat://corpid:secret@1000002/user1/user2/user3
wechat://corpid:secret@1000002/john/%23200/+3/bad!target
wechat://corpid:secret@1000002?to=@all
wechat://corpid:secret@1000002/@all?format=markdown
Rejected URLs:
wechat://
wechat://corpid
wechat://corpid:secret@
wechat://corpid:secret@notanumber
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'wechat://corpid:secret@1000002/johndoe'
Notes
WeChat / WeCom (wechat://): messages through the WeCom application API.
The access token is kept in the persistent store for expires_in minus five minutes (at least a minute) and dropped when the API reports it expired (errcode 40001, 40014, 42001).
WeCom Bot
| Schemes | wecombot:// |
| Cargo feature | service-wecombot |
| Service | https://weixin.qq.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | yes |
URL formats
{schema}://{key}
{schema} is one of wecombot://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{key} | Bot Webhook Key | string | yes | secret; must match ^[a-z0-9_-]+$ |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
key | Bot Webhook Key | string | sets {key} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
wecombot://botkey
wecombot://?key=botkey
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=BOTKEY
wecombot://other/?key=bot_key-2
https://qyapi.weixin.qq.com/cgi-bin/webhook/send/?key=BOTKEY&data=123
http://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=abc-123&format=markdown
Rejected URLs:
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?other=1
wecombot://
wecombot://:@/
wecombot://bot.key
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'wecombot://botkey'
Notes
WeCom Bot (wecombot://): messages through WeCom group bot webhooks.
| Schemes | whatsapp:// |
| Cargo feature | service-whatsapp |
| Service | https://developers.facebook.com/docs/whatsapp/cloud-api/get-started |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | no title (merged into the body) |
| Body length | 1,024 characters |
| Body lines | unlimited |
| Request throttle | 200 ms between requests |
| Vendor URLs accepted | no |
URL formats
{schema}://{token}@{from_phone_id}/{targets}
{schema}://{template}:{token}@{from_phone_id}/{targets}
{schema} is one of whatsapp://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{from_phone_id} | From Phone ID | string | yes | secret; must match ^[0-9]+$ | |
{language} | Language | string | no | en_US | must match ^[^0-9\s]+$ |
{target_group} | Target Group ID | string | no | prefix #; must match ^[0-9]{16,}$ | |
{target_phone} | Target Phone No | string | no | prefix +; must match ^[0-9\s)(+-]+$ | |
{targets} | Targets | list | yes | any of target_group, target_phone; separated by / | |
{template} | Template Name | string | no | must match ^[^\s]+$ | |
{token} | Access Token | string | yes | secret; must match ^[a-z0-9]+$ |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
from | From Phone ID | string | sets {from_phone_id}; also source | |
lang | Language | string | sets {language} | |
template | Template Name | string | sets {template} | |
to | Targets | list | sets {targets} | |
token | Access Token | string | sets {token} |
Prefixed parameters:
:name=value: Template Mapping
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
whatsapp://eeeeeeee@12345/44444444444
whatsapp://eeeeeeee@12345/123/44444444444/abcd/
whatsapp://eeeeeeee@12345/44444444444/120363043968066561@g.us
whatsapp://eeeeeeee@12345/44444444444?:1=test
whatsapp://template:eeeeeeee@12345/44444444444?lang=fr_CA
whatsapp://template:eeeeeeee@12345/44444444444?:1=test&:body=3&:type=2
whatsapp://_?token=eeeeeeee&source=54321&to=44444444444
whatsapp://eeeeeeee@12345/44444444444?template=template&lang=fr_CA&language=de_DE
Rejected URLs:
whatsapp://template:eeeeeeee@12345/44444444444?lang=1234
whatsapp://%20:eeeeeeee@12345/44444444444
whatsapp://template:eeeeeeee@12345/44444444444?:invalid=23
whatsapp://template:eeeeeeee@12345/44444444444?:body=
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'whatsapp://eeeeeeee@12345/44444444444'
Notes
WhatsApp Cloud API (whatsapp://): messages to WhatsApp numbers.
Windows Notification
| Schemes | windows:// |
| Cargo feature | service-windows |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | 2 lines |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://
{schema} is one of windows://.
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
duration | Duration | int, min 1 | 12 | |
image | Include Image | bool | yes | accepted, no effect |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
windows://
windows://_/
windows://_/?duration=1
windows://_/?image=False
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'windows://'
Notes
Windows balloon notifications (windows://): a tray-icon balloon tip with the title and body, shown for duration seconds.
There is no Win32 dependency: the sequence (tray icon, balloon tip, sleep, tear-down) runs through powershell.exe and System.Windows.Forms.NotifyIcon (ShowBalloonTip, Start-Sleep, Dispose). The script travels as -EncodedCommand so no quoting of user text reaches the command line.
Only Windows can display these: on other platforms delivery fails with Error::Unsupported.
Differences with Apprise
- Apprise uses the Win32 API, while mercurio runs
powershell.exe(System.Windows.Forms.NotifyIcon). - The tray icon is the stock application icon;
?image=is accepted and ignored. - On other platforms delivery fails with
Unsupported.
WPUSH
| Schemes | wpush:// |
| Cargo feature | service-wpush |
| Service | https://wpush.cn/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 255 characters |
| Body length | 10,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | yes |
URL formats
{schema}://{apikey}
{schema}://{apikey}/{targets}
{schema} is one of wpush://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{apikey} | API Key | string | yes | secret; must match ^WPUSH[a-z0-9]{27}$ | |
{targets} | Topics | list | no | separated by / |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
apikey | API Key | string | sets {apikey} | |
channel | Channel | list | separated by , or space; one of wechat, app, sms, mail, webhook, dingtalk, feishu, wechat_work, clawbot, qqbot | |
group | Group / Option Code | string | also option | |
to | Topics | list | sets {targets} | |
topic | Topics | list | sets {targets} | |
topic_code | Topics | list | sets {targets} | |
url | Click URL | string |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
wpush://WPUSHabcdefghijklmnopqrstuvwxyz0
wpush://WPUSHabcdefghijklmnopqrstuvwxyz0/topic2/topic1
wpush://WPUSHabcdefghijklmnopqrstuvwxyz0?channel=FEISHU
wpush://WPUSHabcdefghijklmnopqrstuvwxyz0?option=a&group=b
wpush://WPUSHabcdefghijklmnopqrstuvwxyz0?url=https://example.com/
wpush://WPUSHabcdefghijklmnopqrstuvwxyz0?channel=qqbot&group=123456
wpush://WPUSHabcdefghijklmnopqrstuvwxyz0?channel=qqbot&option=123456
wpush://?apikey=WPUSHabcdefghijklmnopqrstuvwxyz0
Rejected URLs:
wpush://
wpush://short
wpush://WPUSHabcdefghijklmnopqrstuvwxyz0?channel=invalid
wpush://WPUSHabcdefghijklmnopqrstuvwxyz0?group=123456&topic_code=mytopic
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'wpush://WPUSHabcdefghijklmnopqrstuvwxyz0'
Notes
WPUSH (wpush://): push notifications through WPUSH.
WxPusher
| Schemes | wxpusher:// |
| Cargo feature | service-wxpusher |
| Service | https://wxpusher.zjiecode.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{token}/{targets}
{schema} is one of wxpusher://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{target_topic} | Target Topic | int | no | ||
{target_user} | Target User ID | string | no | must match ^UID_[^\s]+$ | |
{targets} | Targets | list | yes | any of target_topic, target_user; separated by / | |
{token} | App Token | string | yes | secret; must match ^AT_[^\s]+$ |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
to | Targets | list | sets {targets} | |
token | App Token | string | sets {token} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
wxpusher://AT_appid/123/
wxpusher://AT_appid//UID_123/UID_abc/123456789/abc
wxpusher://AT_appid/UID_345/?format=markdown
wxpusher://123?token=AT_abc1234
wxpusher://?token=AT_abc1234&to=UID_abc
wxpusher://AT_appid/?to=22222222222,33333333333,555
Rejected URLs:
wxpusher://
wxpusher://:@/
wxpusher://invalid
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'wxpusher://AT_appid/123/'
Notes
WxPusher (wxpusher://): messages through WxPusher.
XML
| Schemes | xml://, xmls:// |
| Cargo feature | service-xml |
| Body formats | text, html, markdown (first is the default) |
| Attachments | yes |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{host}
{schema}://{host}:{port}
{schema}://{user}@{host}
{schema}://{user}@{host}:{port}
{schema}://{user}:{password}@{host}
{schema}://{user}:{password}@{host}:{port}
{schema} is one of xml://, xmls://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{password} | Password | string | no | secret | |
{port} | Port | int, 1 to 65535 | no | ||
{user} | Username | string | no |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
method | Fetch Method | choice | POST | one of POST, GET, DELETE, PUT, HEAD, PATCH, UPDATE, OPTIONS |
Prefixed parameters:
+name=value: HTTP Header-name=value: GET Params:name=value: Payload Extras
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
xml://localhost
xmls://user:pass@localhost:8080/path/to/hook
xml://localhost/?+X-Custom=yes&method=put
xml://localhost/?:Subject=Title&:Message=&:Extra=val&:bad!!key=x&:!!!=y
Rejected URLs:
xml://localhost/?method=invalid
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'xml://localhost'
Notes
XML webhook (xml://, xmls://): posts the notification as a SOAP/XML document to any HTTP endpoint.
XMPP
| Schemes | xmpp://, xmpps:// |
| Cargo feature | service-xmpp |
| Service | https://xmpp.org/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 32,768 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{user}:{password}@{host}
{schema}://{user}:{password}@{host}:{port}
{schema}://{user}:{password}@{host}/{targets}
{schema}://{user}:{password}@{host}:{port}/{targets}
{schema} is one of xmpp://, xmpps://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{host} | Hostname | string | yes | ||
{password} | Password | string | yes | secret | |
{port} | Port | int, 1 to 65535 | no | ||
{target_channels} | Target Channel | string | no | prefix # | |
{target_user} | Target User | string | no | ||
{targets} | Targets | list | no | any of target_channels, target_user; separated by / | |
{user} | User | string | yes |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
mode | Secure Mode | choice | starttls (usually; depends on the URL) | one of starttls, tls, none |
name | MUC Nickname | string | ||
roster | Get Roster | bool | no | |
scramplus | SCRAM-PLUS Channel Binding | bool | yes | |
subject | Use Subject | bool | no | |
to | Targets | list | sets {targets} | |
xmpp | XMPP Server | string |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
xmpp://user:pass@example.com
xmpps://user:pass@example.com
xmpp://user:pass@example.com/@bad
xmpp://user:pass@example.com/friend/other@example.org
xmpp://user:pass@example.com?mode=tls
xmpp://user:pass@example.com?xmpp=%20
xmpps://user:pass@example.com?mode=tls
xmpps://user:pass@example.com?verify=no
Rejected URLs:
xmpps://user:pass@example.com?mode=invalid
xmpp://us%20er:pass@example.com
xmpp://example.com
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'xmpp://user:pass@example.com'
Notes
A minimal one-shot XMPP client session (RFC 6120/6121, XEP-0045): stream negotiation, STARTTLS, SASL, resource binding, session, presence, optional roster fetch, MUC join, messages, stream close.
YouLMK
| Schemes | youlmk:// |
| Cargo feature | service-youlmk |
| Service | https://youlmk.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 120 characters |
| Body length | 2,000 characters |
| Body lines | unlimited |
| Request throttle | 1000 ms between requests |
| Vendor URLs accepted | yes |
URL formats
{schema}://{token}
{schema} is one of youlmk://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{token} | Token or Key | string | yes | secret; must match ^(ylk_[a-z0-9]{32}|k_[a-z0-9]{14})$ |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
failure | Failure Priority | choice | high | one of low, normal, high, critical |
group | Group | string | ||
image | Include Image | bool | no | |
info | Info Priority | choice | normal | one of low, normal, high, critical |
priority | Priority | choice | one of low, normal, high, critical | |
success | Success Priority | choice | normal | one of low, normal, high, critical |
token | Token or Key | string | sets {token} | |
url | Link | string | ||
url_label | Link Label | string | ||
warning | Warning Priority | choice | high | one of low, normal, high, critical |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
https://youlmk.com/k/k_7hq2nk3f9qd8w4
youlmk://ylk_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6
youlmk://ylk_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6?image=yes
https://www.youlmk.com/k/k_7hq2nk3f9qd8w4/?priority=low
youlmk://ylk_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6?url_label=lonely
youlmk://ylk_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6?priority=critical
youlmk://ylk_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6?failure=critical&info=low
youlmk://?token=ylk_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6
Rejected URLs:
youlmk://
youlmk://invalid
youlmk://ylk_tooshort
youlmk://ylk_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6?priority=invalid
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'https://youlmk.com/k/k_7hq2nk3f9qd8w4'
Notes
YouLMK (youlmk://): notifications through YouLMK.
Zoom
| Schemes | zoom:// |
| Cargo feature | service-zoom |
| Service | https://zoom.us/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 250 characters |
| Body length | 3,750 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | yes |
URL formats
{schema}://{webhook_id}/{token}
{schema} is one of zoom://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{token} | Verification Token | string | yes | secret | |
{webhook_id} | Webhook ID | string | yes | secret |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
mode | Mode | choice | full | one of simple, full; simple sends ?format=message with plain text |
token | Verification Token | string | sets {token} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
zoom://abc123/xyz456
zoom://abc123/xyz456?mode=full
https://inbots.zoom.us/incoming/hook/abc123?token=xyz456
https://integrations.zoom.us/chat/webhooks/incomingwebhook/abc123?token=xyz456
zoom://myhookid/?token=override123
zoom://myhookid/mytoken/?token=override123
https://inbots.zoom.us/incoming/hook/abc-1_2/?token=xyz456&mode=simple
Rejected URLs:
zoom://abc123/xyz456?mode=invalid
https://inbots.zoom.us/incoming/hook/abc123
zoom://
zoom://:@/
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'zoom://abc123/xyz456'
Notes
Zoom Team Chat incoming webhooks (zoom://).
POST https://integrations.zoom.us/chat/webhooks/incomingwebhook/{id} with the verification token in Authorization: either ?format=full with a JSON message card or ?format=message with the text as the body.
Differences with Apprise
- Apprise posts to
inbots.zoom.us/incoming/hook/{id}, while mercurio posts to the currentintegrations.zoom.us/chat/webhooks/incomingwebhook/{id}(?format=full;?format=messageformode=simple); native URLs on either host are accepted.
Zulip
| Schemes | zulip:// |
| Cargo feature | service-zulip |
| Service | https://zulipchat.com/ |
| Body formats | text (first is the default) |
| Attachments | no |
| Title length | 60 characters |
| Body length | 10,000 characters |
| Body lines | unlimited |
| Request throttle | none |
| Vendor URLs accepted | no |
URL formats
{schema}://{botname}@{organization}/{token}
{schema}://{botname}@{organization}/{token}/{targets}
{schema} is one of zulip://.
URL tokens
| Token | Meaning | Type | Required | Default | Notes |
|---|---|---|---|---|---|
{botname} | Bot Name | string | yes | must match ^[A-Z0-9_-]{1,32}$ | |
{organization} | Organization | string | yes | must match ^[A-Z0-9_-]{1,32}$ | |
{target_stream} | Target Stream | string | no | ||
{target_user} | Target User | no | |||
{targets} | Targets | list | no | any of target_stream, target_user; separated by / | |
{token} | Token | string | yes | secret; must match ^[A-Z0-9]{32}$ |
Query parameters
| Parameter | Meaning | Type | Default | Notes |
|---|---|---|---|---|
to | Targets | list | sets {targets} | |
token | Token | string | sets {token} |
The common URL parameters (format, overflow, verify, redirect, cto, rto, retry, wait, store, tag, tz, user, password, port, optional, emojis) apply as well.
Examples
Accepted URLs (tokens are fake):
zulip://bot-name-bot@mercurio/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
zulip://botname@mercurio/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/%23mystream
zulip://botname@mercurio/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/channel2/channel1
zulip://botname@mercurio/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/?to=channel1/channel2%23chan3
zulip://botname@mercurio/streamA?token=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
zulip://botname@mercurio/?token=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&to=channel1
Rejected URLs:
zulip://
zulip://:@/
zulip://mercurio
zulip://botname@mercurio
Send one from the command line:
mercurio -t 'Backup' -b 'Finished in 42s' 'zulip://bot-name-bot@mercurio/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
Notes
Zulip (zulip://): messages to Zulip streams and users through a bot.
Differences with Apprise
mercurio aims to accept every Apprise URL and configuration file; sending
byte-for-byte the same requests is not a goal. Each entry says what Apprise
does and what mercurio does instead. Every difference on this page is
intentional: it stays that way. Differences of a single service are
on its page (see the service list), taken from the
# Differences with Apprise section of its module docs; those are
intentional too, unless marked todo.
General
- Markdown. Apprise renders with the Python
markdownpackage, while mercurio renders CommonMark plus GFM tables (pulldown-cmark); ordinary Markdown gives the same HTML, edge cases differ (headings with seven or more#, some entities, list continuation lines). - Request throttle. Apprise waits 5.5 s between requests to the same
service (
NotifyBase.request_rate_per_sec), while mercurio keeps only the explicit per-plugin throttles and drops the inherited default. - Basic auth without a password. Apprise’s
requestssendsuser:None, while mercurio sendsuser:. - URL parser. Apprise checks hosts in
parse_urland turns+in query values into a space for Office 365, while mercurio leaves host checks to the services that connect and never turns+into a space. ?tag=on a URL. Apprise ignores it, while mercurio tags the URL for--tag/TagFilter; in a configuration file the values are added to the entry’s tags.- Emoji names. Apprise expands
:shortcode:from its own table, while mercurio uses GitHub’s gemoji names (theemojiscrate). They agree on 1,843 of Apprise’s 1,855 names; 10 give another emoji (:grinning:is 😀, not 😄;:beetle:🪲, not 🐞),:blond_woman:and:information_deskperson:stay as text, and about 70 gemoji names that Apprise lacks are expanded. %2Fin a URL path. Apprise decodes it into a separator, sojson://,xml://andform://request another path (its issue #1799), while mercurio keeps it encoded for those three, soa%2Fbstays one path segment. Other services decode it as Apprise does (xmpp JIDs, signalgrid channels).?tz=. Validated as in Apprise (the UTC family, any case, or the location alone such asparis; an unknown zone rejects the URL). E-mailDate:and syslog timestamps use it, else a YAMLasset:timezone(ortz), else the machine’s zone.?optional=. Parsed by both; no effect in mercurio.- Overflow. Apprise lets each plugin tune overflow (
overflow_*attributes), numbers split pieces ([01/03]) and may repeat the title, while mercurio uses one policy: title on the first piece only, no counters,truncatekeeps the first piecesplitwould produce. - Malformed HTML (for example a malformed
<![section). Apprise fails the notification, while mercurio fails too when the core converts it, but the Pushover and Telegram reducers send it unreduced. - Upstream bugs. Where Apprise’s behaviour is clearly a bug mercurio
does the correct thing; see the service entries for e-mail, IFTTT, IRC,
Mastodon, Plivo, PushWard, Reddit, Remote Syslog, SMPP and Synology Chat.
Also fixed without
an entry of their own: target order in Bark, ntfy and MQTT, LaMetric
sound=thunder, Slack gov webhook query parameters, Mattermost webhook ports, Matrix!id:Noneroom ids andnullGET bodies, Office 365 re-sending an expired token on login, Burst SMScountry=US, Twittermode=DM, VoIP.ms stopping on one bad reply, Home Assistantsvc:a,b,clists andstorage prunedeleting Apprise’s*.psdatafiles. - Not available. Pickling a loaded notifier, internationalised
messages (
i18n). Apprise’sasync_notifyisAsyncMercurio::notify.
CLI
- Default input format. Apprise’s CLI assumes
text, while mercurio passes the body through when-iis not given;-i textgives Apprise’s behaviour. -e. Apprise runs its full escape decoder, while the CLI decodes\n,\r,\tand\\only (Asset::interpret_escapesin the library runs the full decoder).-gwith URLs on the command line. Apprise ignores it and notifies all of them, while mercurio filters them by their?tag=values.- No services (nothing given, nothing configured) exits with 2.
- Not implemented:
-P/--plugin-path(register custom services from Rust),-D/--debug(use-vvv). -ddoes not print storage URL ids; usemercurio storage.check,serve,servicesare mercurio subcommands.
Server
- Alertmanager and Grafana webhooks. apprise-api needs a field mapping
and still cannot build a body from a list of alerts, while mercurio reads
their webhook payloads directly on
/notify(see Alertmanager and Grafana webhooks). - Web UI. apprise-api serves a web UI (
/, login/logout,/qr,/cfg/@, themes,APPRISE_API_ONLY), while mercurio has none: those paths are404and the setting is ignored. - Non-ASCII header values (UTF-8 titles in
X-Apprise-Title). apprise-api gets them as WSGI Latin-1 strings, while mercurio decodes them as UTF-8, as Latin-1 only when they are not valid UTF-8. - Basic Auth credentials. apprise-api decodes them as UTF-8, so a non-ASCII password from Apprise Mobile (which sends Latin-1) fails, while mercurio decodes them as UTF-8, as Latin-1 only when they are not valid UTF-8.
- Translated messages. apprise-api translates its error and status
messages by
Accept-Languageor cookie and setsContent-Language, while mercurio answers in English only. - Returned logs. Both return the library’s own log lines for the
request’s level and stream them live while sending. mercurio’s lines
have their own wording, redact URLs, and add one INFO or ERROR line per
finished service;
APPRISE_WEBHOOK_URLgets INFO and up. - Persistent storage. Both prune old persistent storage and logins
without a configuration once at start-up and then daily
(
APPRISE_PRUNE_ENABLED,APPRISE_PRUNE_INTERVAL_SECONDS,APPRISE_PRUNE_TIMEOUT_SECONDS,APPRISE_STORAGE_PRUNE_DAYS,APPRISE_AUTH_PRUNE_SECONDS): apprise-api in a separate container process, mercurio inside the server. The storage layout differs andAPPRISE_STORAGE_UID_LENGTHworks the same. - Workers. apprise-api sizes gunicorn by
APPRISE_WORKER_COUNT(twice the CPUs plus one by default), gives a workerAPPRISE_WORKER_TIMEOUTseconds (300 by default) and recycles it afterAPPRISE_WORKER_MAX_REQUESTSrequests, while mercurio reads the first two with its own meaning and defaults. Each worker stands for 128 requests in progress (4 workers, so 512, by default), and the timeout is how long a request head, and each piece of a body, may take to arrive (30 s by default). It has no worker processes to recycle, soAPPRISE_WORKER_MAX_REQUESTSand its jitter are ignored. - Request log. apprise-api logs requests through nginx (
combinedformat) plusNOTIFY - ip - ...warnings, while mercurio logs one line per request with its key, services, failures and error. - Unknown paths. apprise-api answers
404with an error message, while mercurio answers an empty404, before authentication; its405Allowheader omitsOPTIONS. - Metrics. apprise-api exports the full
django_prometheusset, while mercurio exports its HTTP metrics under the same names (request and response counts, latency overall and by view, body sizes, streaming responses) and, on Linux,prometheus_client’sprocess_*metrics. Django’s model, database, cache and migration metrics and Python’sgcandinfometrics have no equivalent. - Other settings. Plugin paths are ignored.
- Logins and times. apprise-api checks logins with Django’s default
hashers; without
argon2-cffiandbcrypt(not in its requirements) those arepbkdf2_sha256,pbkdf2_sha1andscrypt, and it writespbkdf2_sha256. It reports times in theTZzone, while mercurio reads both PBKDF2 forms and writespbkdf2_sha256; ascryptdigest, which apprise-api never writes, is rejected. Times are UTC. - JSON
/addwithoutformat. apprise-api rejects it, while mercurio detects TEXT or YAML. - Stored configurations cannot include local files; attachment fields
only accept
http(s)://URLs (a local path is a400).
Config and YAML
- Results. The loader matches Apprise on 326 of 329 recorded configurations and 424 of 431 YAML documents; the rest are below.
${NAME}in an e-mail port. Apprise’s e-mail parser drops the host and the marker with it, so the port is ignored, while mercurio keeps the entry pending and rejects a non-numeric value when it is resolved.- Self-referencing YAML anchor. Apprise rejects only that entry, while mercurio rejects the whole document.
- YAML parser (
saphyr-parserplus a composer instead of PyYAML): several documents (---), custom!tagsand collection keys are rejected; explicit? keyentries are not supported; timestamps stay strings;1,1.0andtrueare three distinct keys; tabs are accepted as separators and trailing whitespace;=is a plain string; a quoted continuation line less indented than its block is an error. asset:keys.storage_pathis accepted in configuration files (a mercurio extension; Apprise takes it only as a constructor argument);interpret_emojisis rejected with a warning; keys mercurio has no use for (interpret_escapes,async_mode,encoding,image_path_*, …) are accepted without effect; the defaults name mercurio (app_id: Mercurio).
Storage
- File format. Apprise writes gzip
cache.psdata, while mercurio writes plain JSONcache.json; neither reads the other’s file (prune and clear remove both). - Modes.
auto,flushandmemory(-SM,APPRISE_STORAGE_MODE,Asset::storage_mode) as in Apprise;flushwrites before each I/O step of a send rather than on every change. - Entry checksum. Each
cache.jsonentry carries a 6-character SHA-256 checksum ("!"), and entries that fail it are dropped on load, as in Apprise. The hashed text differs (Apprise hashes its Pythonrepr), so the checksums are not interchangeable; the files are not shared anyway. Caches written by earlier mercurio versions have no checksum and are dropped once. - Size cap. Apprise refuses
write()calls that would push a namespace past 1 MiB; mercurio has nowrite()API for named files, and Apprise’s cache itself is uncapped, so there is no cap. mercurio storage listshows every configured URL, including services that never store anything (unused); Apprise omits them.${NAME}template targets are rebuilt per call, so their in-memory store does not outlive the call.- Rate-limit state (Bluesky, Mastodon, Reddit, Twitter) is kept for the life of a URL, across sends, as in Apprise.
- Remote stores. Store I/O is local only.
Attachments
?+Header=on an attachment URL. Apprise sends it as a header and a query parameter, while mercurio only as a header.- Downloads. Apprise streams to a temporary file and stops early, while mercurio reads into memory and also stops once the body passes
attachment_max_size. - Split messages. Apprise plugins can pick the piece that carries the
attachments (
_attachment_send_index), while mercurio always sends them with the first piece.
Retries
- Policy. Apprise retries every failure
?retry=times after a fixed?wait=and ignoresRetry-After, while mercurio retries only rate limits (429, 503 withRetry-After) and transient failures (408, 5xx, DNS and connect errors). It stops on authentication errors, other 4xx and failures after the request was sent. It honoursRetry-Afterup to 300 s. ?wait=. Apprise defaults to 0, while mercurio defaults to 0.5 s. Both cap it at 20 s.- Unclassified failures.
Error::Servicefailures (for example a JSON body with"ok": false) andregister_schemeclosures are not retried. - Service hints. Apprise reads neither Telegram’s
parameters.retry_afternor Matrix’sretry_after_ms, while mercurio feeds both into the retry loop as the 429’s wait (Matrix once its own back-off gives up).
Services
- Microsoft Teams (
msteams://). Apprise’s retired plugin is not provided; useworkflows://. - Discontinued services. Apprise still ships plugins for services that
no longer run, while mercurio does not provide them, and their URLs fail as an
unknown scheme.
- Growl (
growl://): the project was retired in November 2020. - Guilded (
guilded://): Roblox shut it down on 19 December 2025. - Kumulos (
kumulos://): acquired by Optimove in 2022; the API hostmessages.kumulos.comno longer resolves. - Pushed (
pushed://): the API hostapi.pushed.cono longer resolves. - Pushjet (
pjet://,pjets://): the project is abandoned and its domain redirects to an unrelated site.
- Growl (