Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Introduction

a talaria (winged sandal)

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. -Da sends one after another.
  • A word send before 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:

  1. URLs on the command line. When -c is also given, the URLs win and a warning is logged (visible with -v).
  2. -c / --config files and URLs.
  3. $APPRISE_URLS: URLs separated by commas or whitespace.
  4. 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.

PartMeaning
SchemeSelects 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 :.
HostA 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).
PortOptional. Services that connect to the host reject a non-numeric port.
PathSplit 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.
QueryOptions. 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):

PrefixExampleMeaning for json://
+?+X-Token=abcadd or replace an HTTP header (case kept)
-?-page=2add a query parameter to the request URL
:?:message=textrename 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.

ParameterMeaningTypeDefaultNotes
formatBody format the service receiveschoiceone of text, html, markdown; default: the service’s own
overflowWhat to do with messages over the service’s limitschoiceupstreamone of upstream, truncate, split
verifyVerify TLS certificatesboolyes
redirectFollow HTTP redirectsboolyes
ctoConnect timeout, in secondsfloat5
rtoRead timeout, in secondsfloat30
retryExtra attempts after a retryable failureint, 0 to 100
waitPause before each retry, in secondsfloat, 0 to 200.5
storeUse the persistent store on diskboolyes
tagTags for --tag filteringlistseparated by , or space
tzTime zone namestringan unknown zone rejects the URL; e-mail and syslog dates use it
userUser name; replaces the one in the URLstring
passwordPassword; replaces the one in the URLstringalso pass; secret
portPort; replaces the one in the URLint, 1 to 65535
optionalOptionalboolnoaccepted, no effect
emojisReplace :shortcode: emojiboolnounless 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()):

ClassComes fromRetried
RateLimited { retry_after }HTTP 429; HTTP 503 with Retry-Afteryes, after max(wait, Retry-After)
TransientHTTP 408 and 5xx; DNS and connect failures (nothing was sent)yes, after wait
AuthHTTP 401, 403no
InvalidTargetother 4xx; URL, configuration and message errorsno
Unknowntimeouts or resets after the request was sent, failures the service reported, unexpected statusesno
  • An attempt with several errors (one per target) is retried only when every error is RateLimited or Transient.
  • Services that make several requests name the failing step first (login: HTTP 500: server error); the class is that of the underlying error.
  • Retry-After is read as seconds or as an IMF-fixdate HTTP date. Longer than mercurio::service::MAX_RETRY_AFTER (300 s) ends the retries instead of blocking. A 429 without it waits wait; Discord uses its X-RateLimit-Reset instead.
  • 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.
  • -v logs each retry (WARNING - ntfy: attempt 1/4 failed; trying again). In the library each attempt is in ReportEntry::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:

FormatUse it for
TEXTone URL per line, optional tags
YAMLsettings 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:

SourceExampleFormat
local path~/alerts.yml, ./alerts.confYAML when the name ends in .yml or .yaml, TEXT otherwise
file:// URLfile:///etc/alerts?format=yamlas above; ?format=text or ?format=yaml forces one
http://, https://https://config.example.com/get/teamYAML 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
LineMeaning
empty, # ..., ; ...ignored
URL or =URLa service without tags
tags=URLa service with tags, separated by commas and/or spaces
group = tag, taga tag group (no :// on the right-hand side)
include SOURCEanother 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 \n or \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 leading N: (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

KeyRequiredMeaning
versionnoMust be 1 (or 1.0) when present. Any other value rejects the file.
urlsyesThe list of services.
tag / tagsnoTags added to every entry of this file (a string with commas or spaces, or a list). tag wins when both are present.
groupsnoTag groups, see below.
includenoOther configuration sources, a string or a list. See Includes.
templateno${NAME} variables. See Templates.
assetnoApplication 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.

SettingBecomes
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 / tagsthe entry’s tags (not a query parameter)
user, password (or pass), host, portreplace those parts of the URL; special characters are encoded for you
+Name: value, -name: value, :name: valuethe 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
schemaignored
assetignored (it is a top-level key)

Rules:

  • A setting overrides the same parameter written in the URL.
  • Writing any + setting (or headers:) replaces all the URL’s own + parameters; the same holds for - (params:) and : (payload:).
  • user and password also 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, false are booleans (and become yes / no in 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".
  • ~ and null are null.

Tags

WhereSyntax
TEXT filedevops, critical=ntfy://alerts (commas and/or spaces before =)
YAML, one entrytag: devops, critical or tag: [devops, critical] under the URL
YAML, every entrytop-level tag: home
GroupsTEXT 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

CommandNotifies
no -gonly services without tags; every URL given on the command line
-g devopsservices tagged devops
-g "devops,critical" or -g "devops critical"services tagged devops and critical
-g devops -g criticalservices tagged devops or critical
-g "a,b" -g c(a and b) or c
-g allevery service, tagged or not
  • all as a filter matches everything; do not use it as a tag name.
  • Services tagged always join every tagged run (any -g), not the run without -g.
  • When nothing matches, mercurio prints no URLs matched the given tags and exits with code 3.
  • The library’s TagFilter::parse("a,b") and the HTTP server’s tag=a,b mean a or b; the server’s tag=a b means 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:

  1. The services matched through ops are grouped by the priority of their ops tag.
  2. The most urgent group is sent first. When all of it delivers, the others are not sent at all.
  3. When one of its services fails, the next group is sent, and so on.
  4. The call succeeds once a group delivers; the failures before it are still reported (ReportEntry::escalated in 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.

IncludeResolved as
relative/path.confrelative to the including file’s directory (for HTTP sources: the current directory)
/absolute/path.yml, ~/paththat file
file:///path?format=yamlthat 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.

CallerDefaultChange it with
CLI1: the files you name and the files they include-R N (-R 0 ignores include)
HTTP server1APPRISE_RECURSION_MAX
Library0: includes ignoredConfigOptions { 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:

  1. -tv NAME=VALUE (--template-var, repeatable), TemplateVars in the library or the server request’s template field.
  2. The default in template:.
  3. APPRISE_TEMPLATE_NAME in 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.

PositionAllowed
user, password, host, port, path, query values, settings under the URLyes
the scheme, tag / tags, a part the service’s parser discardsno: 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
KeyDefaultEffect
app_idMercurioUser-Agent and sender name for many services
app_descMercurio Notificationslonger description, used by some services
app_urlhttps://github.com/AlphaJack/mercuriolink in footers and buttons
themedefaultreplaces {THEME} in the image masks
image_url_maskhttps://alphajack.github.io/mercurio/assets/icons/logo.pngper-type images: {TYPE}, {XY}, {THEME}, {EXTENSION} are replaced; empty disables them
image_url_logohttps://alphajack.github.io/mercurio/assets/icons/logo.pngthe logo; empty disables it
default_extension.pngreplaces {EXTENSION}
default_html_color#888888colour when no type colour applies
default_ascii_chars[?]marker when no type marker applies
storage_pathnonepersistent store directory (~ expanded); the CLI’s default is --storage-path
image_path_masknoneicon file for desktop notifiers, same placeholders; empty sends none. Default: the bundled icon
pgp_autogenyesgenerate 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 -c sources or URLs on the command line.
  • They override the CLI’s --storage-path and the library’s Asset for 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 of base.

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.

PartCLIHTTP serverLibrary
Body-b TEXT or stdinbodyMessage::new(body)
Title-t TEXTtitle.title(..)
Type-n info|success|warning|failuretype.kind(NotifyType::..)
Input format-i text|html|markdownformat.format(NotifyFormat::..)
Attachments-a PATH|URLattach, multipart files.attach(..), AttachmentSet

A message needs a body or at least one attachment; a body-less message fails for services without attachment support.

TypeColourASCII 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) or Asset::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=no or Some(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:

  1. Format resolution: input format from the message, else Asset::body_format, else none (passthrough); service format as in ?format=.
  2. 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.
  3. Limits: the service’s limits or limits computed for this message (Matrix sizes them from the rendered content).
  4. Title merge: services without a title field (title_maxlen 0) get the title prepended: <b>title</b><br /> for HTML, # title for Markdown, title\r\n for text.
  5. Line cap: services with a line limit keep the first N lines.
  6. Overflow: upstream, truncate or split (Overflow).
  7. 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).
  8. Attachments go with the first piece; with overflow=truncate only 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.

InputMeaning
nonepassthrough: no conversion, no Markdown repair
textplain text; escaped when a service renders HTML or Markdown
markdownCommonMark (with GFM tables); rendered to HTML where needed
htmlHTML; 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 \ Totexthtmlmarkdown
textunchangedHTML-escaped, newlines become <br/>syntax characters backslash-escaped
htmltags removed, block elements become line breaks, entities decodedunchangedconverted to Markdown
markdownunchanged (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):

ServiceDialect
SlackSlack mrkdwn (*bold*, <url|text> links)
Google ChatGoogle Chat text formatting
TelegramTelegram HTML (reduced tag set) or MarkdownV1/V2
MatrixHTML (formatted_body); Slack-style text in Slack mode
PushoverPushover’s HTML subset
Signal APISignal styled text ranges
Evolution API (WhatsApp)WhatsApp formatting
KOOKKMarkdown
MastodonMastodon 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:

ModeBehaviour
upstream (default)send the whole message; the service enforces (or rejects) its own limit
truncatesend one message with as much of the body as fits; drop the rest
splitsend 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:

LimitMeaning
title_maxlenlongest title in characters; 0 means the service has no title field, so the title is merged into the body
body_maxlenlongest body in characters
body_max_line_countlines 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:

  1. a newline;
  2. a space or tab;
  3. punctuation followed by whitespace;
  4. 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

SourceExample
Local path/var/log/backup.log, ./report.pdf
file:// URLfile:///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

OptionMeaning
?name=report.pdffile name the recipient sees (base name only)
?mime=image/pngMIME type; must be a known type
?cache=yes|no|SECONDShow 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:

ServiceWhat is storedKept for
Telegramthe bot owner (bot_owner) when no chat id is givenuntil removed
Opsgenie, Jirarequest ids of open alerts60 days
Nextcloudgroup member lookups1 day
SendPulseaccess tokenexpires_in minus 10 s
WeChataccess tokenexpires_in minus 300 s; dropped on token errors
Office 365access token (memory only), sender from/name, rotated refresh tokentoken lifetime
Blueskyresolved DID and service endpoint, sessionsession 3590 s
Mattermostchannel ids (c:<channel>)20 days
Vapid (Web Push)generated key pair, subscriptions.json, retired (expired) endpointsretired: 30 days
Matrixlogin 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, Jellyfinsession or tokenlifetime 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 age30 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_URLS or 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 -g is given).
  • prune: remove store files not modified for -SPD days (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:

RuleEffect
?:subject=titlethe subject field becomes title
?:debug=the debug field is removed
?:type=warningtype is set to warning
?:event.items[0].text=bodya 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):

FieldFrom
titleGrafana’s title; otherwise Alertmanager’s default subject, e.g. [FIRING:2] HighCPU (prod critical)
bodyGrafana’s message; otherwise one line per alert, [FIRING] name: summary, with the description below it
typesuccess 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

tagNotifies
absentstored configuration: entries without tags; stateless: everything
devopsentries 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)
alleverything

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, /move are {"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_MODEFiles
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
disablednone; 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), /status and /details;
  • anything else is 401 with WWW-Authenticate.

Each key has one access mode:

AccessEffect
userits login may read, change and clear the configuration; tags optional; may send stateless notifications with X-Apprise-Config-ID
lockedits login may only notify, with a specific tag (not all); content hidden
publicanyone may POST /notify/{key} with a specific tag; everything else needs a login
disabledonly 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

CodeMeaning
200sent, saved, deleted, moved or the requested data
204nothing stored for the key (/get, /cfg/{key}, /del, /json/urls)
400bad payload, key, header, tag, template, format or attachment; no URLs; no body and no attachment
401Basic Auth missing or wrong
403refused by a mode, the lock or the key’s access
404unknown path or key; no stored configuration for /notify/{key}
405known path, wrong method
406X-Apprise-Recursion-Count above the limit
409/move to a key that is taken
413request body over the limit (attachment size plus 1 MiB, at least 8 MiB)
417/status found a problem (CONFIG_PERMISSION_ISSUE, STORE_PERMISSION_ISSUE)
424at least one notification failed; nothing matched the tag
500the configuration or login could not be saved or read
503too 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

  1. Parse. parse() splits a URL into a ParsedUrl (lenient: tokens may contain :, / or @), finds the ServiceDef for the scheme (service_for_scheme) and calls its parser. The parser validates the URL and returns a typed Notify value, wrapped in a Target.
  2. Prepare. Target::prepare runs the message pipeline: payload cap, escapes, format conversion (NotifyFormat), title merging and overflow handling (OverflowMode: upstream, truncate, split). The result is one or more Prepared pieces.
  3. Plan. Notify::plan turns each piece into a Plan: HTTP requests with continuations that inspect the responses, socket sessions, datagrams, local commands. No I/O happens here (Target::plan does steps 2 and 3).
  4. Execute. Target::send_async walks the plan on an AsyncTransport (TokioTransport by default) and Target::send on a blocking Transport (BlockingTransport, testing::FakeTransport in tests, or your own), both with ?retry= / ?wait= handling based on ErrorClass. Target::send_attempts and Target::send_attempts_async return every attempt.

Around this core:

  • Runtime services: a per-notifier Registry, with Registry::register_scheme for a closure and Registry::register for a full ServiceDef.
  • Configuration: Config loads TEXT and YAML files from paths, http(s):// or memory, with include, tags and TemplateVars.
  • Tags: Tag and TagFilter (all, always, AND/OR groups).
  • store: the per-target PersistentStore (tokens, sessions, delivery tracking).
  • Attachments: AttachmentSet loads files, http(s):// and memory:// sources into Attachments.
  • 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:

FeatureDescriptionTurns on
defaultEvery service, the async API on tokio and the bundled time zones.all-services, transport-tokio, bundle-timezones
all-servicesEvery service-* feature.162 service-* features
bundle-timezonesThe 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-tokioTokio transport: TokioTransport and AsyncMercurio::new (tokio + rustls).
transport-blockingBlocking transport: BlockingTransport and Mercurio::new (ureq).
testingCompile the fixture runner (testing::fixtures); testing::FakeTransport is always available.
service-deltachat-pgpOpenPGP signing and encryption (?pgp=) for Delta Chat.service-deltachat
service-email-pgpOpenPGP signing and encryption (?pgp=) for e-mail.service-email
service-matrix-e2eeMatrix 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.

ServiceSchemesAttachmentsFormatsFeature
46elks46elks://, elks://notextservice-fortysixelks
800.comeight00com://yestextservice-eighthundredcom
Africas Talkingatalk://notextservice-africastalking
Apprise APIapprise://, apprises://yestext, html, markdownservice-appriseapi
Aprsaprs://notextservice-aprs
AWS Simple Email Service (SES)ses://yeshtmlservice-ses
AWS Simple Notification Service (SNS)sns://notextservice-sns
Barkbark://, barks://notextservice-bark
Bird (MessageBird)msgbird://notextservice-messagebird
blink(1)blink1://notextservice-blink1
BlueSkybsky://, bluesky://yestextservice-bluesky
Brevobrevo://yeshtml, textservice-brevo
BulkSMSbulksms://notextservice-bulksms
BulkVSbulkvs://notextservice-bulkvs
Burst SMSburstsms://notextservice-burstsms
Chanifychanify://notextservice-chanify
Cisco Webex Teamswxteams://, webex://yesmarkdownservice-webexteams
Clickatellclickatell://notextservice-clickatell
ClickSendclicksend://notextservice-clicksend
Couriercourier://notext, html, markdownservice-courier
D7 Networksd7sms://notextservice-d7networks
Dapnetdapnet://notextservice-dapnet
DBus Notificationqt://, kde://, dbus://notextservice-dbus
Delta Chatdeltachat://, deltachats://yestextservice-deltachat
DingTalkdingtalk://notext, markdownservice-dingtalk
Discorddiscord://yestext, markdownservice-discord
Dot.dot://yestextservice-dot
E-Mailmailto://, mailtos://yeshtml, textservice-email
Embyemby://, embys://notextservice-emby
Enigma2enigma2://, enigma2s://notextservice-enigma2
Evolution APIevolution://, evolutions://nomarkdownservice-evolution
Exotelexotel://notextservice-exotel
Feishufeishu://notextservice-feishu
Filefile://yestext, html, markdownservice-file
Firebase Cloud Messagingfcm://notextservice-fcm
Flockflock://notextservice-flock
Flowtriqflowtriq://, flowtriqs://notextservice-flowtriq
Fluxerfluxer://, fluxers://yestextservice-fluxer
Formform://, forms://yestext, html, markdownservice-form
Free-Mobilefreemobile://notextservice-freemobile
GLib Notificationglib://, gio://notextservice-glib
Gnome Notificationgnome://notextservice-gnome
GoAlertgoalert://, goalerts://nomarkdownservice-goalert
Google Chatgchat://nomarkdownservice-googlechat
Gotifygotify://, gotifys://notextservice-gotify
GroupMegroupme://yestextservice-groupme
HomeAssistanthassio://, hassios://notextservice-homeassistant
httpSMShttpsms://notextservice-httpsms
HumHubhumhub://, humhubs://yestextservice-humhub
IFTTTifttt://notextservice-ifttt
IRCirc://, ircs://notextservice-irc
Jellyfinjellyfin://, jellyfins://notextservice-jellyfin
Jirajira://, opsgenie://notextservice-jira
Joinjoin://notextservice-join
JSONjson://, jsons://yestext, html, markdownservice-json
Kavenegarkavenegar://notextservice-kavenegar
Knockknock://notext, html, markdownservice-knock
Kodi/XBMCkodi://, xbmc://, kodis://, xbmcs://notextservice-kodi
Kookkook://yesmarkdownservice-kook
LaMetriclametric://, lametrics://notextservice-lametric
Lark (Feishu)lark://notextservice-lark
Lautherlauther://notextservice-lauther
Lineline://notextservice-line
Loggerlogger://notextservice-logger
MacOSX Notificationmacosx://notextservice-macosx
MailerSendmailersend://yeshtml, textservice-mailersend
Mailgunmailgun://yeshtmlservice-mailgun
Mastodonmastodon://, toot://, mastodons://, toots://yestextservice-mastodon
Matrixmatrix://, matrixs://yestext, html, markdownservice-matrix
Mattermostmmost://, mmosts://yestextservice-mattermost
Misskeymisskey://, misskeys://notextservice-misskey
Mobile Messagemobilemessage://, mobilemsg://notextservice-mobilemessage
MQTT Notificationmqtt://, mqtts://notextservice-mqtt
MSG91msg91://notextservice-msg91
Nextcloudncloud://, nclouds://notextservice-nextcloud
Nextcloud Talknctalk://, nctalks://notextservice-nextcloudtalk
Noticanotica://, noticas://notextservice-notica
Notifiarrnotifiarr://notextservice-notifiarr
Notifyrenotifyre://yestextservice-notifyre
Novunovu://notext, html, markdownservice-novu
ntfyntfy://, ntfys://yestextservice-ntfy
Octopushoctopush://notextservice-octopush
Office 365azure://, o365://yeshtmlservice-office365
OneBotonebot://, onebots://yestextservice-onebot
OneSignalonesignal://notextservice-onesignal
Pager Dutypagerduty://notextservice-pagerduty
PagerTreepagertree://notextservice-pagertree
Parse Platformparsep://, parseps://notextservice-parseplatform
Pingletpinglet://, pinglets://notextservice-pinglet
Pingrampingram://notext, htmlservice-pingram
Plivoplivo://notextservice-plivo
Postmarkpostmark://yeshtmlservice-postmark
Power Automate / Workflows (for MSTeams)workflow://, workflows://nomarkdownservice-workflows
Prowlprowl://notextservice-prowl
Pushbulletpbul://yestextservice-pushbullet
PushDeerpushdeer://, pushdeers://notextservice-pushdeer
PushMepushme://notextservice-pushme
Pushoverpover://yestext, html, markdownservice-pushover
Pushpluspushplus://, wecom://nohtmlservice-pushplus
Pushsaferpsafer://, psafers://yestextservice-pushsafer
PushWardpushward://notextservice-pushward
Pushypushy://notextservice-pushy
QQ Pushqq://notextservice-qq
Redditreddit://nomarkdownservice-reddit
Remote Syslogrsyslog://notextservice-rsyslog
Resendresend://yeshtmlservice-resend
Revoltrevolt://notextservice-revolt
RingCentralringc://yestextservice-ringcentral
Rocket.Chatrocket://, rockets://nomarkdownservice-rocketchat
Ryverryver://notextservice-ryver
SendGridsendgrid://yeshtmlservice-sendgrid
SendPulsesendpulse://yeshtml, textservice-sendpulse
ServerChanschan://notextservice-serverchan
SerwerSMSserwersms://yestextservice-serwersms
Session Open Group Serversession://, sessions://, sogs://notextservice-sogs
sevenseven://notextservice-seven
Signal APIsignal://, signals://yestextservice-signalapi
Signalgridsignalgrid://notextservice-signalgrid
SIGNL4signl4://notextservice-signl4
Simplepushspush://, simplepush://yesmarkdownservice-simplepush
Sinchsinch://notextservice-sinch
Slackslack://yesmarkdown, textservice-slack
SMPPsmpp://, smpps://notextservice-smpp
SMS Eaglesmseagle://, smseagles://yestextservice-smseagle
SMS Managersmsmgr://, smsmanager://notextservice-smsmanager
SMSCsmsc://yestextservice-smsc
SMTP2Gosmtp2go://yeshtmlservice-smtp2go
Société Française du Radiotéléphonesfr://notextservice-sfr
SparkPostsparkpost://yeshtmlservice-sparkpost
Spike.shspike://notextservice-spike
Splunk On-Callsplunk://, victorops://notextservice-splunk
SpugPushspugpush://notextservice-spugpush
Stackfieldstackfield://notextservice-stackfield
Streamlabsstrmlabs://notextservice-streamlabs
Synology Chatsynology://, synologys://notextservice-synology
Syslogsyslog://notextservice-syslog
Techulus Pushpush://notextservice-techuluspush
Telegramtgram://yeshtml, markdownservice-telegram
Telnyxtelnyx://notextservice-telnyx
Threema Gatewaythreema://notextservice-threema
Trigvtrigv://, trigvs://notextservice-trigv
Twiliotwilio://notextservice-twilio
Twisttwist://nomarkdownservice-twist
Twitterx://, twitter://, tweet://yestextservice-twitter
Vapid Web Push Notificationsvapid://notextservice-vapid
Viberviber://notextservice-viber
VoIPmsvoipms://notextservice-voipms
Vonagevonage://, nexmo://notextservice-vonage
WeChat (WeCom)wechat://notextservice-wechat
WeCom Botwecombot://notextservice-wecombot
WhatsAppwhatsapp://notextservice-whatsapp
Windows Notificationwindows://notextservice-windows
WPUSHwpush://notextservice-wpush
WxPusherwxpusher://notextservice-wxpusher
XMLxml://, xmls://yestext, html, markdownservice-xml
XMPPxmpp://, xmpps://notextservice-xmpp
YouLMKyoulmk://notextservice-youlmk
Zoomzoom://notextservice-zoom
Zulipzulip://notextservice-zulip

46elks

Schemes46elks://, elks://
Cargo featureservice-fortysixelks
Servicehttps://46elks.com
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length160 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedyes

URL formats

{schema}://{user}:{password}@{from_phone}
{schema}://{user}:{password}@{from_phone}/{targets}

{schema} is one of 46elks://, elks://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{from_phone}From Phone Nostringyes
{password}API Passwordstringyessecret
{target_phone}Target Phonestringno
{targets}Targetslistnoany of target_phone; separated by /
{user}API Usernamestringyes

Query parameters

ParameterMeaningTypeDefaultNotes
fromFrom Phone Nostringsets {from_phone}
toTargetslistsets {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

Schemeseight00com://
Cargo featureservice-eighthundredcom
Servicehttps://www.800.com
Body formatstext (first is the default)
Attachmentsyes
Title lengthno title (merged into the body)
Body length600 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{token}@{from_phone}
{schema}://{token}@{from_phone}/{targets}

{schema} is one of eight00com://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{from_phone}From Phone Nostringyesmust match ^\+?[0-9\s)(+-]+$
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistnoany of target_phone; separated by /
{token}API Tokenstringyessecret

Query parameters

ParameterMeaningTypeDefaultNotes
fromFrom Phone Nostring
toTargetslistsets {targets}
tokenAPI Tokenstringsets {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

Schemesatalk://
Cargo featureservice-africastalking
Servicehttps://africastalking.com/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length160 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{appuser}@{apikey}/{targets}

{schema} is one of atalk://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret; must match ^[A-Z0-9_-]+$
{appuser}App User Namestringyesmust match ^[A-Z0-9_-]+$
{target_phone}Target Phonestringno
{targets}Targetslistyesany of target_phone; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
apikeyAPI Keystringsets {apikey}
batchBatch Modeboolno
fromFromstringAFRICASTKNG
modeSMS Modechoicebulksmsone of bulksms, premium, sandbox
toTargetslistsets {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

Schemesapprise://, apprises://
Cargo featureservice-appriseapi
Servicehttps://github.com/caronc/apprise-api
Body formatstext, html, markdown (first is the default)
Attachmentsyes
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedyes

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

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{password}Passwordstringnosecret
{port}Portint, 1 to 65535no
{token}Tokenstringyessecret; must match ^[A-Z0-9_-]{1,128}$
{user}Usernamestringno

Query parameters

ParameterMeaningTypeDefaultNotes
methodQuery Methodchoiceformone of form, json
tagsTagsstring
toTokenstringsets {token}
versionAPI Versionchoice2also 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

Schemesaprs://
Cargo featureservice-aprs
Servicehttps://www.aprs2.net/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length67 characters
Body linesunlimited
Request throttle800 ms between requests
Vendor URLs acceptedno

URL formats

{schema}://{user}:{password}@{targets}

{schema} is one of aprs://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{password}Passwordstringyessecret
{target_callsign}Target Callsignstringnomust match ^[a-z0-9]{2,5}(-[a-z0-9]{1,2})?$
{targets}Targetslistyesany of target_callsign; separated by /
{user}User Namestringyes

Query parameters

ParameterMeaningTypeDefaultNotes
delayResend Delayfloat, 0 to 50.0
localeLocalechoiceEUROone of NOAM, SOAM, EURO, ASIA, AUNZ, ROTA
toTarget Callsignstring

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 # logresp line (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)

Schemesses://
Cargo featureservice-ses
Servicehttps://aws.amazon.com/ses/
Body formatshtml (first is the default)
Attachmentsyes
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{access_key_id}Access Key IDstringyessecret
{from_email}From Emailemailyes
{region}Regionstringyesmust match ^[a-z]{2}-[a-z-]+?-[0-9]+$
{secret_access_key}Secret Access Keystringyessecret
{targets}Target Emailslistnoseparated by /
{token}Session Tokenstringnosecret

Query parameters

ParameterMeaningTypeDefaultNotes
accessAccess Key IDstringsets {access_key_id}
bccBlind Carbon Copylistseparated by , or space
ccCarbon Copylistseparated by , or space
fromFrom Emailemailsets {from_email}
keyAccess Key IDstringsets {access_key_id}
nameFrom Namestring
regionRegionstringsets {region}
replyReply To Emailstring
secretSecret Access Keystringsets {secret_access_key}
toTarget Emailslistsets {targets}
tokenSession Tokenstringsets {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&region=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)

Schemessns://
Cargo featureservice-sns
Servicehttps://aws.amazon.com/sns/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length160 characters
Body linesunlimited
Request throttle2500 ms between requests
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{access_key_id}Access Key IDstringyessecret
{region}Regionstringyesmust match ^[a-z]{2}-[a-z-]+?-[0-9]+$
{secret_access_key}Secret Access Keystringyessecret
{target_phone_no}Target Phone Nostringnomust match ^[0-9\s)(+-]+$
{target_topic}Target Topicstringnoprefix #; must match ^[A-Za-z0-9_-]+$
{targets}Targetslistyesany of target_phone_no, target_topic; separated by /
{token}Session Tokenstringnosecret

Query parameters

ParameterMeaningTypeDefaultNotes
accessAccess Key IDstringsets {access_key_id}
keyAccess Key IDstringsets {access_key_id}
modeModechoicesms (usually; depends on the URL)one of sms, topic
regionRegionstringsets {region}
secretSecret Access Keystringsets {secret_access_key}
toTargetslistsets {targets}
tokenSession Tokenstringsets {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&region=US-WEST-2&to=12223334444
sns://?access=T1JJ3T3L2&secret=A1BRTD4JD/TIiajkdnlazkcevi7FQ&region=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

Schemesbark://, barks://
Cargo featureservice-bark
Servicehttps://github.com/Finb/Bark
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{password}Passwordstringnosecret
{port}Portint, 1 to 65535no
{target_device}Target Devicestringnosecret
{targets}Targetslistyessecret; any of target_device; separated by /
{user}Usernamestringno

Query parameters

ParameterMeaningTypeDefaultNotes
badgeBadgeint, min 0
callCallboolno
categoryCategorystring
clickClickstring
groupGroupstring
iconIcon URLstring
imageInclude Imageboolyes
keyEncryption Keystringsecret
levelLevelchoiceone of active, timeSensitive, passive, critical
soundSoundchoiceone 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)
toTargetslistsets {targets}
volumeVolumeint, 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)

Schemesmsgbird://
Cargo featureservice-messagebird
Servicehttps://bird.com/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length160 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{apikey}/{source}
{schema}://{apikey}/{source}/{targets}

{schema} is one of msgbird://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret; must match ^bk_[a-z0-9]+_[a-z0-9_-]+$
{source}Source Phone Nostringyesprefix +; must match ^[0-9\s)(+-]+$
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistnoany of target_phone; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
categoryCategorychoicetransactionalone of transactional, marketing, authentication, service
fromSource Phone Nostringsets {source}
toTargetslistsets {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/messages API with a 25-character key, while mercurio uses Bird’s SMS API ({region}.platform.bird.com/v1/sms/messages, bk_... key as Bearer, JSON from/to/text/category, new ?category=); classic keys, which stop working on 2026-12-31, are rejected.

blink(1)

Schemesblink1://
Cargo featureservice-blink1
Servicehttps://blink1.thingm.com/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://
{schema}://{serial}/

{schema} is one of blink1://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{serial}Serial Numberstringno

Query parameters

ParameterMeaningTypeDefaultNotes
durationDuration (ms)int, 0 to 3000005000
fadeFade Time (ms)int, 0 to 100000
lednLED Numberchoice0one 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

Schemesbsky://, bluesky://
Cargo featureservice-bluesky
Servicehttps://bluesky.us/
Body formatstext (first is the default)
Attachmentsyes
Title lengthno title (merged into the body)
Body length280 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{user}@{password}

{schema} is one of bsky://, bluesky://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{password}Passwordstringyessecret
{user}Usernamestringyes

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

Schemesbrevo://
Cargo featureservice-brevo
Servicehttps://www.brevo.com/
Body formatshtml, text (first is the default)
Attachmentsyes
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttle200 ms between requests
Vendor URLs acceptedno

URL formats

{schema}://{apikey}:{from_email}
{schema}://{apikey}:{from_email}/{targets}

{schema} is one of brevo://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret; must match ^[a-zA-Z0-9._-]+$
{from_email}Source Emailemailyes
{target_email}Target Emailemailno
{targets}Targetslistnoany of target_email; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
bccBlind Carbon Copylistseparated by , or space
ccCarbon Copylistseparated by , or space
replyReply To Emailstring
toTargetslistsets {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

Schemesbulksms://
Cargo featureservice-bulksms
Servicehttps://bulksms.com/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length160 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{token_id}:{token_secret}@{targets}

{schema} is one of bulksms://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{target_group}Target Groupstringnoprefix @; must match ^[A-Z0-9 _-]+$
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistyesany of target_group, target_phone; separated by /
{token_id}Tokenstringyes
{token_secret}Secretstringyessecret

Query parameters

ParameterMeaningTypeDefaultNotes
batchBatch Modeboolno
fromFrom Phone Nostringmust match ^\+?[0-9\s)(+-]+$
routeRoute GroupchoiceSTANDARDone of ECONOMY, STANDARD, PREMIUM
toTargetslistsets {targets}
unicodeUnicode Charactersboolyes

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

Schemesbulkvs://
Cargo featureservice-bulkvs
Servicehttps://www.bulkvs.com/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length160 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{user}:{password}@{from_phone}/{targets}
{schema}://{user}:{password}@{from_phone}

{schema} is one of bulkvs://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{from_phone}From Phone Nostringyesmust match ^\+?[0-9\s)(+-]+$
{password}Passwordstringyessecret
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistyesany of target_phone; separated by /
{user}User Namestringyes

Query parameters

ParameterMeaningTypeDefaultNotes
batchBatch Modeboolno
fromFrom Phone Nostringmust match ^\+?[0-9\s)(+-]+$
toTargetslistsets {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

Schemesburstsms://
Cargo featureservice-burstsms
Servicehttps://burstsms.com/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length160 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{apikey}:{secret}@{sender_id}/{targets}

{schema} is one of burstsms://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret; must match ^[a-z0-9]+$
{secret}API Secretstringyessecret; must match ^[a-z0-9]+$
{sender_id}Sender IDstringyes
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistyesany of target_phone; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
batchBatch Modeboolno
countryCountrychoiceusone of au, nz, gb, us
fromSender IDstringsets {sender_id}; also source
keyAPI Keystringsets {apikey}
secretAPI Secretstringsets {secret}
toTargetslistsets {targets}
validityvalidityint0

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

Schemeschanify://
Cargo featureservice-chanify
Servicehttps://chanify.net/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{token}

{schema} is one of chanify://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{token}Tokenstringyessecret; must match ^[A-Z0-9._-]+$

Query parameters

ParameterMeaningTypeDefaultNotes
tokenTokenstringsets {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

Schemeswxteams://, webex://
Cargo featureservice-webexteams
Servicehttps://webex.teams.com/
Body formatsmarkdown (first is the default)
Attachmentsyes
Title lengthno title (merged into the body)
Body length1,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedyes

URL formats

{schema}://{token}
{schema}://{access_token}/{targets}

{schema} is one of wxteams://, webex://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{access_token}Bot Access Tokenstringyessecret
{targets}Room IDslistnoseparated by /
{token}Webhook Tokenstringyessecret; must match ^[a-z0-9]{80,160}$

Query parameters

ParameterMeaningTypeDefaultNotes
modeModechoiceone of webhook, bot
toRoom IDslistsets {targets}
tokenWebhook Tokenstringsets {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

Schemesclickatell://
Cargo featureservice-clickatell
Servicehttps://www.clickatell.com/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{apikey}/{targets}
{schema}://{source}@{apikey}/{targets}

{schema} is one of clickatell://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Tokenstringyessecret
{source}From Phone Nostringnomust match ^[0-9\s)(+-]+$
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistyesany of target_phone; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
fromFrom Phone Nostringsets {source}
toTargetslistsets {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

Schemesclicksend://
Cargo featureservice-clicksend
Servicehttps://clicksend.com/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length160 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{user}:{apikey}@{targets}

{schema} is one of clicksend://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistyesany of target_phone; separated by /
{user}User Namestringyes

Query parameters

ParameterMeaningTypeDefaultNotes
batchBatch Modeboolno
keyAPI Keystringsets {apikey}
toTargetslistsets {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

Schemescourier://
Cargo featureservice-courier
Servicehttps://www.courier.com/
Body formatstext, html, markdown (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

courier://{auth_token}/{targets}

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{auth_token}Auth Tokenstringyessecret
{targets}Recipientslistyesseparated by /; e-mail, +phone or user id

Query parameters

ParameterMeaningTypeDefaultNotes
channelsRouting Channelslistseparated by , or space
hostAPI Hoststringapi.courier.comhost[:port][/path] or a full http(s):// URL
templateTemplatestringtemplate id or alias; title and body go to data
toRecipientslistsets {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 full http(s):// URL) overrides the API base (default https://api.courier.com).
  • ?to=a,b adds recipients.
  • ?template={id|alias} sends a template instead of inline content; the title and body are then only available as data.title/data.body.
  • ?channels=email,sms sets routing: {"method": "single", "channels": [...]}.
  • :key=value adds key to message.data; +Header=value adds 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

Schemesd7sms://
Cargo featureservice-d7networks
Servicehttps://d7networks.com/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length160 characters
Body linesunlimited
Request throttle200 ms between requests
Vendor URLs acceptedno

URL formats

{schema}://{token}@{targets}

{schema} is one of d7sms://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistyesany of target_phone; separated by /
{token}API Access Tokenstringyessecret

Query parameters

ParameterMeaningTypeDefaultNotes
batchBatch Modeboolno
sourceOriginating Addressstringalso from
toTargetslistsets {targets}
unicodeUnicode Charactersboolno

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

Schemesdapnet://
Cargo featureservice-dapnet
Servicehttps://hampager.de/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length80 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{user}:{password}@{targets}

{schema} is one of dapnet://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{password}Passwordstringyessecret
{target_callsign}Target Callsignstringnomust match ^[a-z0-9]{2,5}(-[a-z0-9]{1,2})?$
{targets}Targetslistyesany of target_callsign; separated by /
{user}User Namestringyes

Query parameters

ParameterMeaningTypeDefaultNotes
batchBatch Modeboolno
priorityPrioritychoice0one of 0, 1
toTarget Callsignstring
txgroupsTransmitter Groupsstringdl-allsecret

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

Schemesqt://, kde://, dbus://
Cargo featureservice-dbus
Servicehttp://www.freedesktop.org/Software/dbus/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body lines10 lines
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://

{schema} is one of qt://, kde://, dbus://.

Query parameters

ParameterMeaningTypeDefaultNotes
imageInclude Imageboolyes
urgencyUrgencychoice1also priority; one of 0, 1, 2
xX-Axisint, min 0
yY-Axisint, 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_data pixels (GdkPixbuf), while mercurio passes the icon file as app_icon.

Delta Chat

Schemesdeltachat://, deltachats://
Cargo featureservice-deltachat
Servicehttps://delta.chat/
Body formatstext (first is the default)
Attachmentsyes
Title lengthno title (merged into the body)
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{host}Domainstringyes
{password}Passwordstringnosecret
{port}Portint, 1 to 65535no
{target_email}Target Emailstringno
{targets}Targetslistnoany of target_email; separated by /
{user}User Namestringno

Query parameters

ParameterMeaningTypeDefaultNotes
bccBlind Carbon Copylistseparated by , or space
ccCarbon Copylistseparated by , or space
fromFrom Emailstring
inlineInline Attachmentsboolno
modeSecure Modechoicestarttls (usually; depends on the URL)one of starttls, ssl, insecure
nameFrom Namestring
pgpPGP Security Modechoicenoone 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
pgpprvPGP Private Key Pathstringsecret; path, file:// or http(s)://; default: the storage folder
pgppubPGP Public Key Pathstringsecret; path, file:// or http(s)://; default: the storage folder
replyReply Tolistseparated by , or space
smtpSMTP Serverstring
toTo Emailstring
wkdWeb Key Directoryboolno

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 (feature service-deltachat-pgp), with the subject Chat: when signing and Chat: Encrypted message when encrypting, the Autocrypt header and key generation included.

DingTalk

Schemesdingtalk://
Cargo featureservice-dingtalk
Servicehttps://www.dingtalk.com/
Body formatstext, markdown (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{token}/
{schema}://{token}/{targets}/
{schema}://{secret}@{token}/
{schema}://{secret}@{token}/{targets}/

{schema} is one of dingtalk://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{secret}Secretstringnosecret; must match ^[a-z0-9]+$
{target_phone_no}Target Phone Nostringno
{targets}Targetslistnoany of target_phone_no; separated by /
{token}Tokenstringyessecret; must match ^[a-z0-9]+$

Query parameters

ParameterMeaningTypeDefaultNotes
secretSecretstringsets {secret}
toTargetslistsets {targets}
tokenTokenstringsets {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

Schemesdiscord://
Cargo featureservice-discord
Servicehttps://discord.com/
Body formatstext, markdown (first is the default)
Attachmentsyes
Title length250 characters
Body length1,750 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedyes

URL formats

{schema}://{webhook_id}/{webhook_token}
{schema}://{botname}@{webhook_id}/{webhook_token}

{schema} is one of discord://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{botname}Bot Namestringno
{webhook_id}Webhook IDstringyessecret
{webhook_token}Webhook Tokenstringyessecret

Query parameters

ParameterMeaningTypeDefaultNotes
avatarAvatar Imageboolyes
avatar_urlAvatar URLstring
batchBatch Attachmentsboolyes
emojisInterpret Emojisboolyesno escapes every :name: so Discord shows it as text
fieldsUse Fieldsboolyes
flagsDiscord Flagsint, min 0
footerDisplay Footerboolno
footer_logoFooter Logoboolyes
hrefURLstringalso url
imageInclude Imageboolno
pingPing Users/Roleslistseparated by , or space
templateTemplate Pathstringsecret
threadThread IDstring
ttsText To Speechboolno

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.

Schemesdot://
Cargo featureservice-dot
Servicehttps://dot.mindreset.tech
Body formatstext (first is the default)
Attachmentsyes
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{apikey}@{device_id}/

{schema} is one of dot://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret
{device_id}Device Serial Numberstringyes

Query parameters

ParameterMeaningTypeDefaultNotes
borderBorderint, 0 to 10 (usually; depends on the URL)
dither_kernelDither KernelchoiceFLOYD_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_typeDither TypechoiceDIFFUSION (usually; depends on the URL)one of DIFFUSION, ORDERED, NONE
iconIcon Base64 (Text API)string
imageImage Base64 (Image API)string
linkLinkstring
modeAPI Modechoicetext (usually; depends on the URL)one of text, image
refreshRefresh Nowboolyes
signatureText Signaturestring
task_keyTask Keystring

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.

E-Mail

Schemesmailto://, mailtos://
Cargo featureservice-email
Body formatshtml, text (first is the default)
Attachmentsyes
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{host}Domainstringyes
{password}Passwordstringnosecret
{port}Portint, 1 to 65535no
{target_email}Target Emailstringno
{targets}Targetslistnoany of target_email; separated by /
{user}User Namestringno

Query parameters

ParameterMeaningTypeDefaultNotes
bccBlind Carbon Copylistseparated by , or space
ccCarbon Copylistseparated by , or space
fromFrom Emailstring
inlineInline Attachmentsboolno
modeSecure Modechoicestarttls (usually; depends on the URL)one of starttls, ssl, insecure
nameFrom Namestring
pgpPGP Security Modechoiceno (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
pgpprvPGP Private Key Pathstringsecret; path, file:// or http(s)://; default: the storage folder
pgppubPGP Public Key Pathstringsecret; path, file:// or http(s)://; default: the storage folder
replyReply Tolistseparated by , or space
smtpSMTP Serverstring
toTo Emailstring
wkdWeb Key Directoryboolno

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 (feature service-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 on ring, and covers those two.
  • ?pgp=encrypt (and ?pgp=sign when 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=yes asks 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 the openpgpkey. one fails; the openpgpkey. 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.asc and <local>-prv.asc to the storage folder (asset: pgp_autogen: no turns it off).
  • ?reply= with several targets raised on the second target in Apprise, while mercurio sends it.

Emby

Schemesemby://, embys://
Cargo featureservice-emby
Servicehttps://emby.media/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{host}
{schema}://{host}:{port}
{schema}://{user}:{password}@{host}
{schema}://{user}:{password}@{host}:{port}

{schema} is one of emby://, embys://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{password}Passwordstringnosecret
{port}Portint, 1 to 65535no8096
{user}Usernamestringno

Query parameters

ParameterMeaningTypeDefaultNotes
modalModalboolno

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

Schemesenigma2://, enigma2s://
Cargo featureservice-enigma2
Servicehttps://dreambox.de/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length1,000 characters
Body linesunlimited
Request throttle500 ms between requests
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{fullpath}Pathstringno
{host}Hostnamestringyes
{password}Passwordstringnosecret
{port}Portint, 1 to 65535no
{user}Usernamestringno

Query parameters

ParameterMeaningTypeDefaultNotes
timeoutServer Timeoutint, min -113

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

Schemesevolution://, evolutions://
Cargo featureservice-evolution
Servicehttps://github.com/EvolutionAPI/evolution-api
Body formatsmarkdown (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{apikey}@{host}/{instance}/{targets}
{schema}://{apikey}@{host}:{port}/{instance}/{targets}

{schema} is one of evolution://, evolutions://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret
{host}Hostnamestringyes
{instance}Instance Namestringyes
{port}Portint, 1 to 65535no
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistnoany of target_phone; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
toTargetslistsets {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

Schemesexotel://
Cargo featureservice-exotel
Servicehttps://exotel.com/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length2,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{sid}:{token}@{from_phone}
{schema}://{sid}:{token}@{from_phone}/{targets}

{schema} is one of exotel://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{from_phone}From Phone No / Sender IDstringyesmust match ^(?:(?=.{3,16}$)(?=.*[A-Z.-])[A-Z0-9][A-Z0-9.-]*|[0-9]{6}|\+?[0-9\s)(+-]{9,})$
{sid}Account SIDstringyessecret
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistnoany of target_phone; separated by /
{token}Tokenstringyessecret

Query parameters

ParameterMeaningTypeDefaultNotes
apikeyAPI Keystringalso key; secret
batchBatch Modeboolno
fromFrom Phone No / Sender IDstringsets {from_phone}
priorityPrioritychoicenormalone of normal, high
regionRegion Namechoiceusone of us, in
sidAccount SIDstringsets {sid}
toTargetslistsets {targets}
tokenTokenstringsets {token}
unicodeUnicode Charactersboolyes

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

Schemesfeishu://
Cargo featureservice-feishu
Servicehttps://open.feishu.cn/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length19,985 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{token}

{schema} is one of feishu://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{token}Tokenstringyessecret; must match ^[A-Z0-9_-]+$

Query parameters

ParameterMeaningTypeDefaultNotes
tokenTokenstringsets {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

Schemesfile://
Cargo featureservice-file
Body formatstext, html, markdown (first is the default)
Attachmentsyes
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{path}

{schema} is one of file://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{path}File Pathstringyes

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

Schemesfcm://
Cargo featureservice-fcm
Servicehttps://firebase.google.com
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length1,024 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{project}/{targets}?keyfile={keyfile}

{schema} is one of fcm://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{keyfile}OAuth2 KeyFilestringyessecret
{project}Project IDstringno
{target_device}Target Devicestringno
{target_topic}Target Topicstringnoprefix #
{targets}Targetslistyesany of target_device, target_topic; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
colorNotification Colorstringno
imageInclude Imageboolno (usually; depends on the URL)
image_urlCustom Image URLstring
modeModechoiceoauth2one of oauth2; legacy is rejected: that API was shut down in July 2024
priorityModechoiceone of min, low, normal, high, max
toTargetslistsets {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

Schemesflock://
Cargo featureservice-flock
Servicehttps://flock.com/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedyes

URL formats

{schema}://{token}
{schema}://{botname}@{token}
{schema}://{botname}@{token}/{targets}
{schema}://{token}/{targets}

{schema} is one of flock://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{botname}Bot Namestringno
{targets}Targetslistnoany of to_channel, to_user; separated by /
{to_channel}To Channel IDstringnoprefix #; must match ^[A-Z0-9_]+$
{to_user}To User IDstringnoprefix @; must match ^[A-Z0-9_]+$
{token}Access Keystringyessecret; must match ^[a-z0-9-]+$

Query parameters

ParameterMeaningTypeDefaultNotes
imageInclude Imageboolyes
toTargetslistsets {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

Schemesflowtriq://, flowtriqs://
Cargo featureservice-flowtriq
Servicehttps://flowtriq.com
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{apikey}@{host}/{path}/
{schema}://{apikey}@{host}:{port}/{path}/

{schema} is one of flowtriq://, flowtriqs://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret
{host}Hostnamestringyes
{path}Webhook Pathstringyes
{port}Portint, 1 to 65535no

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

Schemesfluxer://, fluxers://
Cargo featureservice-fluxer
Servicehttps://fluxer.app/
Body formatstext (first is the default)
Attachmentsyes
Title length250 characters
Body length1,750 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedyes

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

TokenMeaningTypeRequiredDefaultNotes
{botname}Bot Namestringno
{host}Hostnamestringno
{path}Pathstringno/api/
{port}Portint, 1 to 65535no
{webhook_id}Webhook IDstringyessecret; must match ^[0-9]{10,}$
{webhook_token}Webhook Tokenstringyessecret; must match ^[A-Za-z0-9_\-]{16,}$

Query parameters

ParameterMeaningTypeDefaultNotes
avatarAvatar Imageboolyes
avatar_urlAvatar URLstring
fieldsUse Fieldsboolyes
flagsDiscord Flagsint, min 0
footerDisplay Footerboolno
footer_logoFooter Logoboolyes
hrefURLstringalso url
imageInclude Imageboolno
modeModechoicecloud (usually; depends on the URL)one of cloud, private
nameBot Namestringsets {botname}
pathPathstringsets {path}
pingPing Users/Roleslistseparated by , or space
threadThread IDstring
thread_nameThread Namestring
ttsText To Speechboolno

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

Schemesform://, forms://
Cargo featureservice-form
Body formatstext, html, markdown (first is the default)
Attachmentsyes
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{password}Passwordstringnosecret
{port}Portint, 1 to 65535no
{user}Usernamestringno

Query parameters

ParameterMeaningTypeDefaultNotes
attach-asAttach File Asstringfile*
methodFetch MethodchoicePOSTone 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

Schemesfreemobile://
Cargo featureservice-freemobile
Servicehttps://mobile.free.fr/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length160 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{user}@{password}

{schema} is one of freemobile://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{password}Passwordstringyessecret
{user}Usernamestringyes

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

Schemesglib://, gio://
Cargo featureservice-glib
Servicehttps://lazka.github.io/pgi-docs/Gio-2.0/classes/DBusProxy.html
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body lines10 lines
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://

{schema} is one of glib://, gio://.

Query parameters

ParameterMeaningTypeDefaultNotes
imageInclude Imageboolyes
urgencyUrgencychoice1also priority; one of 0, 1, 2
xX-Axisint, min 0
yY-Axisint, 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_data pixels (GdkPixbuf), while mercurio passes the icon file as app_icon.

Gnome Notification

Schemesgnome://
Cargo featureservice-gnome
Servicehttps://www.gnome.org/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length32,768 characters
Body lines10 lines
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://

{schema} is one of gnome://.

Query parameters

ParameterMeaningTypeDefaultNotes
imageInclude Imageboolyes
urgencyUrgencychoice1also 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-pid hint and the icon as image-data pixels, while mercurio passes the icon file as app_icon.

GoAlert

Schemesgoalert://, goalerts://
Cargo featureservice-goalert
Servicehttps://goalert.me/
Body formatsmarkdown (first is the default)
Attachmentsno
Title length1,024 characters
Body length6,144 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{path}Pathstringno/
{port}Portint, 1 to 65535no
{targets}Integration Keyslistyessecret; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
actionActionchoicemapone of map, trigger, close
dedupDeduplication Keystring
toIntegration Keyslistsets {targets}
tokenIntegration Keyslistsets {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

Schemesgchat://
Cargo featureservice-googlechat
Servicehttps://chat.google.com/
Body formatsmarkdown (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length4,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedyes

URL formats

{schema}://{workspace}/{webhook_key}/{webhook_token}
{schema}://{workspace}/{webhook_key}/{webhook_token}/{thread_key}

{schema} is one of gchat://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{thread_key}Thread Keystringnosecret
{webhook_key}Webhook Keystringyessecret
{webhook_token}Webhook Tokenstringyessecret
{workspace}Workspacestringyessecret

Query parameters

ParameterMeaningTypeDefaultNotes
keyWebhook Keystringsets {webhook_key}
threadThread Keystringsets {thread_key}; also threadkey
tokenWebhook Tokenstringsets {webhook_token}
workspaceWorkspacestringsets {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

Schemesgotify://, gotifys://
Cargo featureservice-gotify
Servicehttps://github.com/gotify/server
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{path}Pathstringno/
{port}Portint, 1 to 65535no
{token}Tokenstringyessecret

Query parameters

ParameterMeaningTypeDefaultNotes
priorityPrioritychoice5one 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

Schemesgroupme://
Cargo featureservice-groupme
Servicehttps://groupme.com/
Body formatstext (first is the default)
Attachmentsyes
Title lengthno title (merged into the body)
Body length1,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{bot_id}
{schema}://{bot_id}/{token}

{schema} is one of groupme://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{bot_id}Bot IDstringyessecret
{token}Access Tokenstringnosecret

Query parameters

ParameterMeaningTypeDefaultNotes
bot_idBot IDstringsets {bot_id}
tokenAccess Tokenstringsets {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

Schemeshassio://, hassios://
Cargo featureservice-homeassistant
Servicehttps://www.home-assistant.io/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{accesstoken}Long-Lived Access Tokenstringyessecret
{host}Hostnamestringyes
{password}Passwordstringnosecret
{port}Portint, 1 to 65535no
{target_device}Target Devicestringno
{targets}Targetslistnoany of target_device; separated by /
{user}Usernamestringno

Query parameters

ParameterMeaningTypeDefaultNotes
batchBatch Modeboolno
nidNotification IDstringmust match ^[a-z0-9_-]+$
prefixPath Prefixstring
toTargetslistsets {targets}
tokenLong-Lived Access Tokenstringsets {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

Schemeshttpsms://
Cargo featureservice-httpsms
Servicehttps://httpsms.com
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length160 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{apikey}@{from_phone}
{schema}://{apikey}@{from_phone}/{targets}

{schema} is one of httpsms://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret
{from_phone}From Phone Nostringyesmust match ^\+?[0-9\s)(+-]+$
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistyesany of target_phone; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
fromFrom Phone Nostringmust match ^\+?[0-9\s)(+-]+$
keyAPI Keystringsets {apikey}
toTargetslistsets {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

Schemeshumhub://, humhubs://
Cargo featureservice-humhub
Servicehttps://www.humhub.com/
Body formatstext (first is the default)
Attachmentsyes
Title lengthno title (merged into the body)
Body length4,000 characters
Body linesunlimited
Request throttle20 ms between requests
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{password}Passwordstringnosecret
{port}Portint, 1 to 65535no
{targets}Targetslistnoseparated by /
{user}Token or Usernamestringyessecret

Query parameters

ParameterMeaningTypeDefaultNotes
toTargetslistsets {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

Schemesifttt://
Cargo featureservice-ifttt
Servicehttps://ifttt.com/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedyes

URL formats

{schema}://{webhook_id}/{events}

{schema} is one of ifttt://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{events}Eventslistyesseparated by /
{webhook_id}Webhook IDstringyessecret

Query parameters

ParameterMeaningTypeDefaultNotes
toEventslistsets {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

Schemesirc://, ircs://
Cargo featureservice-irc
Servicehttps://ircv3.net/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length380 characters
Body linesunlimited
Request throttle20 ms between requests
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{password}Passwordstringnosecret
{port}Portint, 1 to 65535no
{target_channel}Target Channelstringnoprefix #
{target_user}Target Userstringnoprefix @
{targets}Targetslistyesany of target_channel, target_user; separated by /
{user}Userstringno

Query parameters

ParameterMeaningTypeDefaultNotes
joinJoin Channelsboolyes
modeAuth Modechoiceserver (usually; depends on the URL)one of znc, server, nickserv, none
nameReal Namestring
nickNicknamestring
toTargetslistsets {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 nickserv mode 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

Schemesjellyfin://, jellyfins://
Cargo featureservice-jellyfin
Servicehttps://jellyfin.org/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{host}
{schema}://{host}:{port}
{schema}://{user}:{password}@{host}
{schema}://{user}:{password}@{host}:{port}

{schema} is one of jellyfin://, jellyfins://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{password}Passwordstringnosecret
{port}Portint, 1 to 65535no8096
{user}Usernamestringno

Query parameters

ParameterMeaningTypeDefaultNotes
modalModalboolno

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

Schemesjira://, opsgenie://
Cargo featureservice-jira
Servicehttps://atlassian.com/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length15,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{apikey}
{schema}://{user}@{apikey}
{schema}://{apikey}/{targets}
{schema}://{user}@{apikey}/{targets}

{schema} is one of jira://, opsgenie://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret
{target_escalation}Target Escalationstringnoprefix ^
{target_schedule}Target Schedulestringnoprefix *
{target_team}Target Teamstringnoprefix #
{target_user}Target Userstringnoprefix @
{targets}Targetslistnoany of target_escalation, target_schedule, target_team, target_user; separated by /
{user}Usernamestringno

Query parameters

ParameterMeaningTypeDefaultNotes
actionActionchoicemapone of map, new, close, delete, acknowledge, note
aliasAliasstring
batchBatch Modeboolno
entityEntitystring
priorityPrioritychoice3one of 1, 2, 3, 4, 5
regionRegion Namechoiceusone of us, eu
tagsTagsstring
toTargetslistsets {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 the jira service to Jira Service Management Operations (Apprise posts them to api(.eu).opsgenie.com, which shuts down on 2027-04-05); the key must come from a JSM Operations API integration. ?region=eu no longer changes the host.

Join

Schemesjoin://
Cargo featureservice-join
Servicehttps://joaoapps.com/join/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length1,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{apikey}/{targets}

{schema} is one of join://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret; must match ^[a-z0-9]{32}$
{device}Device IDstringnomust match ^[a-z0-9]{32}$
{device_name}Device Namestringno
{group}Groupchoicenoone of all, android, chrome, windows10, phone, tablet, pc
{targets}Targetslistyesany of device, device_name, group; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
imageInclude Imageboolyes
priorityPrioritychoice0one of -2, -1, 0, 1, 2
toTargetslistsets {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

Schemesjson://, jsons://
Cargo featureservice-json
Body formatstext, html, markdown (first is the default)
Attachmentsyes
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{password}Passwordstringnosecret
{port}Portint, 1 to 65535no
{user}Usernamestringno

Query parameters

ParameterMeaningTypeDefaultNotes
methodFetch MethodchoicePOSTone 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

Schemeskavenegar://
Cargo featureservice-kavenegar
Servicehttps://kavenegar.com/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length160 characters
Body linesunlimited
Request throttle200 ms between requests
Vendor URLs acceptedno

URL formats

{schema}://{apikey}/{targets}
{schema}://{source}@{apikey}/{targets}

{schema} is one of kavenegar://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret; must match ^[a-z0-9]+$
{source}Source Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistyesany of target_phone; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
fromSource Phone Nostringsets {source}
toTargetslistsets {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

Schemesknock://
Cargo featureservice-knock
Servicehttps://knock.app/
Body formatstext, html, markdown (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

knock://{api_key}/{workflow_key}/{targets}

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{api_key}API Keystringyessecret
{targets}Recipientslistyesseparated by /; user id, e-mail or +phone
{workflow_key}Workflow Keystringyes

Query parameters

ParameterMeaningTypeDefaultNotes
actorActorstring
cancelCancellation Keystring
hostAPI Hoststringapi.knock.apphost[:port][/path] or a full http(s):// URL
tenantTenantstring
toRecipientslistsets {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 full http(s):// URL) overrides the API base (default https://api.knock.app).
  • ?to=a,b adds recipients; ?actor=.., ?tenant=.. and ?cancel=.. (cancellation_key) are passed through.
  • :key=value adds key to the workflow data; +Header=value adds 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

Schemeskodi://, xbmc://, kodis://, xbmcs://
Cargo featureservice-kodi
Servicehttp://kodi.tv/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body lines2 lines
Request throttlenone
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{password}Passwordstringnosecret
{port}Portint, 1 to 65535no
{user}Usernamestringno

Query parameters

ParameterMeaningTypeDefaultNotes
durationDurationint, min 112
imageInclude Imageboolyes

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

Schemeskook://
Cargo featureservice-kook
Servicehttps://www.kookapp.cn/
Body formatsmarkdown (first is the default)
Attachmentsyes
Title lengthno title (merged into the body)
Body length5,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedyes

URL formats

{schema}://{token}
{schema}://{token}/{targets}

{schema} is one of kook://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{targets}Targetslistnoseparated by /
{token}Tokenstringyessecret

Query parameters

ParameterMeaningTypeDefaultNotes
modeModechoicebotone of bot, webhook
toTargetslistsets {targets}
tokenTokenstringsets {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

Schemeslametric://, lametrics://
Cargo featureservice-lametric
Servicehttps://lametric.com
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length32,768 characters
Body linesunlimited
Request throttle200 ms between requests
Vendor URLs acceptedyes

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

TokenMeaningTypeRequiredDefaultNotes
{apikey}Device API Keystringnosecret
{app_id}App IDstringnosecret
{app_token}App Access Tokenstringnomust match ^[A-Z0-9]{80,}==$
{app_ver}App Versionstringno1must match ^[1-9][0-9]*$
{host}Hostnamestringno
{port}Portint, 1 to 65535no8080
{user}Usernamestringno

Query parameters

ParameterMeaningTypeDefaultNotes
apikeyDevice API Keystringsets {apikey}
app_idApp IDstringsets {app_id}
app_verApp Versionstringsets {app_ver}
cyclesCyclesint, min 01
iconCustom Iconstring
icon_typeIcon Typechoicenoneone of info, alert, none
modeModechoicedevice (usually; depends on the URL)one of cloud, device
priorityPrioritychoiceinfoone of info, warning, critical
soundSoundstring

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)

Schemeslark://
Cargo featureservice-lark
Servicehttps://open.larksuite.com/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedyes

URL formats

{schema}://{token}

{schema} is one of lark://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{token}Bot Tokenstringyessecret; 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

Schemeslauther://
Cargo featureservice-lauther
Servicehttps://lauther.app/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length2,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{token}

{schema} is one of lauther://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{token}Tokenstringyessecret; must match ^lpt_[a-z0-9]+$

Query parameters

ParameterMeaningTypeDefaultNotes
clickClick URLstring
colorColorstring
groupGroupstring
iconIcon URLstring
priorityPrioritychoice0one of -2, -1, 0, 1, 2
routeRoutestring
soundSoundstring
tokenTokenstringsets {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

Schemesline://
Cargo featureservice-line
Servicehttps://line.me/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length5,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{token}/{targets}

{schema} is one of line://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{target_user}Target Userstringno
{targets}Targetslistyesany of target_user; separated by /
{token}Access Tokenstringyessecret

Query parameters

ParameterMeaningTypeDefaultNotes
imageInclude Imageboolyes
toTargetslistsets {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

Schemeslogger://
Cargo featureservice-logger
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

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

Schemesmacosx://
Cargo featureservice-macosx
Servicehttps://github.com/julienXX/terminal-notifier
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body lines10 lines
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://

{schema} is one of macosx://.

Query parameters

ParameterMeaningTypeDefaultNotes
clickOpen/Click URLstring
imageInclude Imageboolyes
senderSenderstring
soundSoundstring
versionTerminal-Notifier Versionchoiceone 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 through PATH (Apprise gives up).
  • On other platforms delivery fails with Unsupported (Apprise does not load the plugin there).

MailerSend

Schemesmailersend://
Cargo featureservice-mailersend
Servicehttps://www.mailersend.com/
Body formatshtml, text (first is the default)
Attachmentsyes
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttle200 ms between requests
Vendor URLs acceptedno

URL formats

{schema}://{apikey}:{from_email}
{schema}://{apikey}:{from_email}/{targets}

{schema} is one of mailersend://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret; must match ^[a-zA-Z0-9._-]+$
{from_email}Source Emailemailyes
{target_email}Target Emailemailno
{targets}Targetslistnoany of target_email; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
bccBlind Carbon Copylistseparated by , or space
ccCarbon Copylistseparated by , or space
replyReply Tostring
toTargetslistsets {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

Schemesmailgun://
Cargo featureservice-mailgun
Servicehttps://www.mailgun.com/
Body formatshtml (first is the default)
Attachmentsyes
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttle200 ms between requests
Vendor URLs acceptedno

URL formats

{schema}://{user}@{host}/{apikey}/
{schema}://{user}@{host}/{apikey}/{targets}

{schema} is one of mailgun://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret
{host}Domainstringyes
{target_email}Target Emailemailno
{targets}Targetslistnoany of target_email; separated by /
{user}User Namestringyes

Query parameters

ParameterMeaningTypeDefaultNotes
batchBatch Modeboolno
bccBlind Carbon Copylistseparated by , or space
ccCarbon Copylistseparated by , or space
nameFrom Namestringalso from
regionRegion Namechoiceusone of us, eu
toTargetslistsets {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

Schemesmastodon://, toot://, mastodons://, toots://
Cargo featureservice-mastodon
Servicehttps://joinmastodon.org
Body formatstext (first is the default)
Attachmentsyes
Title lengthno title (merged into the body)
Body length500 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{port}Portint, 1 to 65535no
{target_user}Target Userstringnoprefix @
{targets}Targetslistnoany of target_user; separated by /
{token}Access Tokenstringyes

Query parameters

ParameterMeaningTypeDefaultNotes
batchBatch Modeboolyes
keyIdempotency-Keystring
languageLanguage Codestring
pingPing Users/Tagslistseparated by , or space
sensitiveSensitive Attachmentsboolno
spoilerSpoiler Textstring
toTargetslistsets {targets}
tokenAccess Tokenstringsets {token}
visibilityVisibilitychoicedefault (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 reads X-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

Schemesmatrix://, matrixs://
Cargo featureservice-matrix
Servicehttps://matrix.org/
Body formatstext, html, markdown (first is the default)
Attachmentsyes
Title length250 characters
Body length65,000 characters
Body linesunlimited
Request throttle500 ms between requests
Vendor URLs acceptedyes

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

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{password}Passwordstringnosecret
{port}Portint, 1 to 65535no
{target_room_alias}Target Room Aliasstringnoprefix #
{target_room_id}Target Room IDstringnoprefix !
{target_user}Target Userstringnoprefix @
{targets}Targetslistnoany of target_room_alias, target_room_id, target_user; separated by /
{token}Access Tokenstringyessecret
{user}Usernamestringno

Query parameters

ParameterMeaningTypeDefaultNotes
autoverifyAutomatic Device Verificationboolno
discoveryServer Discoveryboolyes
e2eeEnd-to-End Encryptionboolyes
hsreqForce Home Server on Room IDsboolyes
imageInclude Imageboolno
modeWebhook Modechoiceoff (usually; depends on the URL)one of off, matrix, slack, t2bot, hookshot
msgtypeMessage Typechoicetextone of text, notice
pathWebhook Pathstring/webhook
toTargetslistsets {targets}
tokenAccess Tokenstringsets {token}
versionMatrix API Versionchoice3also v; one of 2, 3
keystoreKey store directorystringkeeps 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

Schemesmmost://, mmosts://
Cargo featureservice-mattermost
Servicehttps://mattermost.com/
Body formatstext (first is the default)
Attachmentsyes
Title lengthno title (merged into the body)
Body length4,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedyes

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

TokenMeaningTypeRequiredDefaultNotes
{fullpath}Pathstringno
{host}Hostnamestringyes
{port}Portint, 1 to 65535no
{target_channel}Target Channelstringnoprefix #
{target_channel_id}Target Channel IDstringno
{targets}Targetslistnoany of target_channel, target_channel_id; separated by /
{token}Tokenstringyessecret
{user}Userstringno

Query parameters

ParameterMeaningTypeDefaultNotes
botnameUserstringsets {user}
channelTargetslistsets {targets}
channelsTargetslistsets {targets}
icon_urlIcon URLstring
imageInclude Imageboolyes
modeModechoicewebhook (usually; depends on the URL)one of webhook, bot
teamUserstringsets {user}
toTargetslistsets {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

Schemesmisskey://, misskeys://
Cargo featureservice-misskey
Servicehttps://misskey-hub.net/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length512 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{token}@{host}
{schema}://{token}@{host}:{port}

{schema} is one of misskey://, misskeys://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{port}Portint, 1 to 65535no
{token}Access Tokenstringyes

Query parameters

ParameterMeaningTypeDefaultNotes
tokenAccess Tokenstringsets {token}
visibilityVisibilitychoicepublicone 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

Schemesmobilemessage://, mobilemsg://
Cargo featureservice-mobilemessage
Servicehttps://mobilemessage.com.au/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length1,530 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{user}:{password}@{sender}/{targets}

{schema} is one of mobilemessage://, mobilemsg://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{password}API Passwordstringyessecret
{sender}Sender IDstringyesmust match ^\+?[a-z0-9][a-z0-9 ()_.-]{1,19}$
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistyesany of target_phone; separated by /
{user}API Usernamestringyes

Query parameters

ParameterMeaningTypeDefaultNotes
batchBatch Modeboolyes
fromSender IDstringsets {sender}
max_partsMax Message Partsint, 1 to 9910
refCustom Referencestring
toTargetslistsets {targets}
unicodeUnicode Charactersboolno

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

Schemesmqtt://, mqtts://
Cargo featureservice-mqtt
Servicehttps://mqtt.org/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length268,435,455 characters
Body linesunlimited
Request throttle500 ms between requests
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{password}Passwordstringyessecret
{port}Portint, 1 to 65535no
{targets}Targetslistnoany of topic; separated by /
{topic}Target Queuestringyes
{user}User Namestringyes

Query parameters

ParameterMeaningTypeDefaultNotes
client_idClient IDstring
qosQOSint, 0 to 20
retainRetain Messagesboolno
sessionUse Sessionboolno
toTargetslistsets {targets}
versionVersionchoicev3.1.1one 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_session to paho for every version, which paho rejects for v5).
  • TLS uses the bundled Mozilla roots or the SSL_CERT_FILE bundle (Apprise refuses verified mqtts:// 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

Schemesmsg91://
Cargo featureservice-msg91
Servicehttps://msg91.com
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length160 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{template}@{authkey}/{targets}

{schema} is one of msg91://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{authkey}Authentication Keystringyessecret; must match ^[a-z0-9]+$
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistyesany of target_phone; separated by /
{template}Template IDstringyessecret; must match ^[a-z0-9 _-]+$

Query parameters

ParameterMeaningTypeDefaultNotes
short_urlShort URLboolno
toTargetslistsets {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

Schemesncloud://, nclouds://
Cargo featureservice-nextcloud
Servicehttps://nextcloud.com/
Body formatstext (first is the default)
Attachmentsno
Title length255 characters
Body length4,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{password}Passwordstringnosecret
{port}Portint, 1 to 65535no
{target_group}Target Groupstringnoprefix #
{target_user}Target Userstringnoprefix @
{targets}Targetslistyesany of target_group, target_user; separated by /
{user}Usernamestringno

Query parameters

ParameterMeaningTypeDefaultNotes
toTargetslistsets {targets}
url_prefixURL Prefixstring
versionVersionint, min 121

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

Schemesnctalk://, nctalks://
Cargo featureservice-nextcloudtalk
Servicehttps://nextcloud.com/talk
Body formatstext (first is the default)
Attachmentsno
Title length255 characters
Body length31,745 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{password}Passwordstringyessecret
{port}Portint, 1 to 65535no
{secret}Secretstringyessecret
{target_room_id}Room IDstringno
{targets}Targetslistyesany of target_room_id; separated by /
{user}Usernamestringyes

Query parameters

ParameterMeaningTypeDefaultNotes
secretSecretstringsets {secret}
silentSilent Notificationboolno
url_prefixURL Prefixstring

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

Schemesnotica://, noticas://
Cargo featureservice-notica
Servicehttps://notica.us/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedyes

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

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringno
{password}Passwordstringnosecret
{path}Pathstringno/
{port}Portint, 1 to 65535no
{token}Tokenstringyessecret; must match ^\?*(?P<token>[^/]+)\s*$
{user}Usernamestringno

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

Schemesnotifiarr://
Cargo featureservice-notifiarr
Servicehttps://notifiarr.com/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttle40 ms between requests
Vendor URLs acceptedno

URL formats

{schema}://{apikey}/{targets}

{schema} is one of notifiarr://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}Tokenstringyessecret
{target_channel}Target Channelstringnoprefix #
{targets}Targetslistyesany of target_channel; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
apikeyTokenstringsets {apikey}; also key
eventDiscord Event IDint
imageInclude Imageboolno
sourceSourcestringalso from
toTargetslistsets {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

Schemesnotifyre://
Cargo featureservice-notifyre
Servicehttps://notifyre.com/
Body formatstext (first is the default)
Attachmentsyes
Title lengthno title (merged into the body)
Body length160 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{apikey}/{targets}

{schema} is one of notifyre://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistnoany of target_phone; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
campaignCampaign Namestring
fromSource Phone Nostring
headerFax Headerstring
hqHigh Qualityboolyes
modeModechoicesmsone of sms, fax
refClient Referencestring
templateTemplate Namestring
toTargetslistsets {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

Schemesnovu://
Cargo featureservice-novu
Servicehttps://novu.co/
Body formatstext, html, markdown (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

novu://{api_key}/{workflow_id}/{targets}

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{api_key}API Keystringyessecret
{targets}Subscriberslistyesseparated by /; subscriber id, e-mail or +phone
{workflow_id}Workflow IDstringyes

Query parameters

ParameterMeaningTypeDefaultNotes
hostAPI Hoststringself-hosted API, host[:port][/path] or a full http(s):// URL; wins over region
regionRegionchoiceusone of us, eu
toSubscriberslistsets {targets}
transactionTransaction IDstring

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=eu uses https://eu.api.novu.co (default https://api.novu.co).
  • ?host=novu.example.com[:port][/path] (or a full http(s):// URL) points at a self-hosted Novu API; it wins over region.
  • ?to=a,b adds subscribers; ?transaction=.. sets transactionId.
  • :key=value adds key to the trigger payload; +Header=value adds 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

Schemesntfy://, ntfys://
Cargo featureservice-ntfy
Servicehttps://ntfy.sh/
Body formatstext (first is the default)
Attachmentsyes
Title length200 characters
Body length7,600 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedyes

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

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringno
{password}Passwordstringnosecret
{port}Portint, 1 to 65535no
{targets}Targetslistyesany of topic; separated by /
{token}Tokenstringnosecret
{topic}Topicstringnomust match ^[a-z0-9_-]{1,64}$
{user}Usernamestringno

Query parameters

ParameterMeaningTypeDefaultNotes
actionsActionsstring
attachAttachstring
authAuthentication Typechoicebasic (usually; depends on the URL)one of basic, token
avatar_urlAvatar URLstring
clickClickstring
delayDelaystring
emailEmailstring
filenameAttach Filenamestring
imageInclude Imageboolyes
modeModechoiceprivate (usually; depends on the URL)one of cloud, private
priorityPrioritychoicedefaultone of max, high, default, low, min
toTargetslistsets {targets}
tokenTokenstringsets {token}
xtagsTagsstringalso 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

Schemesoctopush://
Cargo featureservice-octopush
Servicehttps://octopush.com/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length1,224 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{api_login}/{api_key}/{targets}
{schema}://{sender}:{api_login}/{api_key}/{targets}

{schema} is one of octopush://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{api_key}API Keystringyessecret
{api_login}API Loginemailyessecret
{sender}Senderstringno
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistnoany of target_phone; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
batchBatch Modeboolno
keyAPI Keystringsets {api_key}
loginAPI Loginemailsets {api_login}
purposePurposechoicealertone of alert, wholesale
repliesAccept Repliesboolno
toTargetslistsets {targets}
typeTypechoicesms_premiumone 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

Schemesazure://, o365://
Cargo featureservice-office365
Servicehttps://office.com/
Body formatshtml (first is the default)
Attachmentsyes
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttle200 ms between requests
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{client_id}Client IDstringyessecret; must match ^[a-z0-9-]+$
{secret}Client Secretstringyessecret
{source}Account Email or Object IDstringyes
{target_email}Target Emailemailno
{targets}Targetslistnoany of target_email; separated by /
{tenant}Tenant Domainstringyessecret; must match ^[a-z0-9-]+$

Query parameters

ParameterMeaningTypeDefaultNotes
bccBlind Carbon Copylistseparated by , or space
ccCarbon Copylistseparated by , or space
modeModechoiceorg (usually; depends on the URL)one of org, personal
oauth_idClient IDstringsets {client_id}
oauth_secretClient Secretstringsets {secret}
reply_toReply Tolistseparated by , or space
savesentSave to Sent Itemsboolyes
toTargetslistsets {targets}
fromAccount Email or Object IDstringsets {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

Schemesonebot://, onebots://
Cargo featureservice-onebot
Servicehttps://github.com/botuniverse/onebot-11
Body formatstext (first is the default)
Attachmentsyes
Title lengthno title (merged into the body)
Body length4,500 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{port}Portint, 1 to 65535no
{target_group}Target Group IDstringnoprefix #; must match ^[0-9]{1,19}$
{target_user}Target User IDstringnoprefix @; must match ^[0-9]{1,19}$
{targets}Targetslistnoany of target_group, target_user; separated by /
{token}Access Tokenstringnosecret

Query parameters

ParameterMeaningTypeDefaultNotes
toTargetslistsets {targets}
tokenAccess Tokenstringsets {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

Schemesonesignal://
Cargo featureservice-onesignal
Servicehttps://onesignal.com
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{app}@{apikey}/{targets}
{schema}://{template}:{app}@{apikey}/{targets}

{schema} is one of onesignal://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret
{app}App IDstringyessecret
{target_email}Target Emailemailno
{target_player}Target Player IDstringno
{target_segment}Include Segmentstringnoprefix #
{target_user}Target Userstringnoprefix @
{targets}Targetslistyesany of target_email, target_player, target_segment, target_user; separated by /
{template}Templatestringnosecret

Query parameters

ParameterMeaningTypeDefaultNotes
batchBatch Modeboolno
contentsEnable Contentsboolyes
decodeDecode Template Argsboolno
imageInclude Imageboolyes
languageLanguagestringenalso lang
subtitleSubtitlestring
templateTemplatestringsets {template}
toTargetslistsets {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

Schemespagerduty://
Cargo featureservice-pagerduty
Servicehttps://pagerduty.com/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{integrationkey}@{apikey}
{schema}://{integrationkey}@{apikey}/{source}
{schema}://{integrationkey}@{apikey}/{source}/{component}

{schema} is one of pagerduty://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret
{component}ComponentstringnoNotification
{integrationkey}Integration Keystringyessecret
{source}Sourcestringnodefaults to the app id

Query parameters

ParameterMeaningTypeDefaultNotes
classClassstring
clickClickstring
groupGroupstring
imageInclude Imageboolyes
regionRegion Namechoiceusone of us, eu
severitySeveritychoiceone 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

Schemespagertree://
Cargo featureservice-pagertree
Servicehttps://pagertree.com/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{integration}

{schema} is one of pagertree://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{integration}Integration IDstringyessecret

Query parameters

ParameterMeaningTypeDefaultNotes
actionActionchoicecreateone of create, acknowledge, resolve
tagsTagsstring
thirdpartyThird Party IDstring
urgencyUrgencychoiceone 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

Schemesparsep://, parseps://
Cargo featureservice-parseplatform
Servicehttps://parseplatform.org/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{app_id}:{master_key}@{host}
{schema}://{app_id}:{master_key}@{host}:{port}

{schema} is one of parsep://, parseps://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{app_id}App IDstringyessecret
{host}Hostnamestringyes
{master_key}Master Keystringyessecret
{port}Portint, 1 to 65535no

Query parameters

ParameterMeaningTypeDefaultNotes
app_idApp IDstringsets {app_id}
deviceDevicechoiceallone of all, ios, android
master_keyMaster Keystringsets {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

Schemespinglet://, pinglets://
Cargo featureservice-pinglet
Servicehttps://pinglet.co.uk/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length3,000 characters
Body linesunlimited
Request throttle500 ms between requests
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{namespace}Namespacestringyes
{path}Pathstringno/
{port}Portint, 1 to 65535no
{token}API Keystringyessecret
{topic}Topicstringyes

Query parameters

ParameterMeaningTypeDefaultNotes
priorityPrioritychoicenormalone of silent, normal, urgent
tokenAPI Keystringsets {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

Schemespingram://
Cargo featureservice-pingram
Servicehttps://www.pingram.io/
Body formatstext, html (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttle200 ms between requests
Vendor URLs acceptedno

URL formats

{schema}://{apikey}/{targets}
{schema}://{type}@{apikey}/{targets}

{schema} is one of pingram://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret; must match ^pingram_(sk|pk)_[\w.-]+$
{target_email}Target Emailemailno
{target_id}Target IDstringnoprefix @
{target_sms}Target SMSstringno
{targets}Targetslistnoany of target_email, target_id, target_sms; separated by /
{type}Message Typestringnomust match ^[A-Z0-9_-]+$; defaults to the app id

Query parameters

ParameterMeaningTypeDefaultNotes
apikeyAPI Keystringsets {apikey}
bccBlind Carbon Copylistseparated by , or space
ccCarbon Copylistseparated by , or space
channelsChannelslistseparated by , or space; one of call, email, inapp, mobile_push, slack, sms, web_push
fromFrom Emailstring
modeModechoiceone of message, template
regionRegion Namechoiceusone of us, ca, eu
toTargetslistsets {targets}
typeMessage Typestringsets {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

Schemesplivo://
Cargo featureservice-plivo
Servicehttps://plivo.com
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length140 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{auth_id}@{token}/{source}
{schema}://{auth_id}@{token}/{source}/{targets}

{schema} is one of plivo://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{auth_id}Auth IDstringyesmust match ^[a-z0-9]{20,30}$
{source}Source Phone Nostringyesprefix +; must match ^[0-9\s)(+-]+$
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistnoany of target_phone; separated by /
{token}Auth Tokenstringyesmust match ^[a-z0-9]{30,50}$

Query parameters

ParameterMeaningTypeDefaultNotes
batchBatch Modeboolno
fromSource Phone Nostringsets {source}
idAuth IDstringsets {auth_id}
toTargetslistsets {targets}
tokenAuth Tokenstringsets {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

Schemespostmark://
Cargo featureservice-postmark
Servicehttps://postmarkapp.com/
Body formatshtml (first is the default)
Attachmentsyes
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttle1200 ms between requests
Vendor URLs acceptedno

URL formats

{schema}://{apikey}:{from_email}
{schema}://{apikey}:{from_email}/{targets}

{schema} is one of postmark://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret
{from_email}Source Emailemailyes
{target_email}Target Emailemailno
{targets}Targetslistnoany of target_email; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
bccBlind Carbon Copylistseparated by , or space
ccCarbon Copylistseparated by , or space
nameFrom Namestring
replyReply To Emaillistseparated by , or space
toTargetslistsets {targets}
fromSource Emailemailsets {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)

Schemesworkflow://, workflows://
Cargo featureservice-workflows
Servicehttps://www.microsoft.com/power-platform/products/power-automate
Body formatsmarkdown (first is the default)
Attachmentsno
Title length250 characters
Body length1,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedyes

URL formats

{schema}://{host}/{workflow}/{signature}
{schema}://{host}:{port}/{workflow}/{signature}

{schema} is one of workflow://, workflows://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{port}Portint, 1 to 65535no
{signature}Signaturestringyessecret; must match ^[a-z0-9_-]+$
{workflow}Workflow IDstringyessecret; must match ^[A-Z0-9_-]+$

Query parameters

ParameterMeaningTypeDefaultNotes
idWorkflow IDstringsets {workflow}
imageInclude Imageboolyes
paUse Power Automate URLboolnoalso powerautomate
routePower Automate Routing IDstringalso routeid; must match ^[0-9]+$
sigSignaturestringsets {signature}
templateTemplate Pathstringsecret
verAPI Versionstringalso api-version
wrapWrap Textboolyes

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

Schemesprowl://
Cargo featureservice-prowl
Servicehttps://www.prowlapp.com/
Body formatstext (first is the default)
Attachmentsno
Title length1,024 characters
Body length10,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{apikey}
{schema}://{apikey}/{providerkey}

{schema} is one of prowl://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret; must match ^[A-Za-z0-9]{40}$
{providerkey}Provider Keystringnosecret; must match ^[A-Za-z0-9]{40}$

Query parameters

ParameterMeaningTypeDefaultNotes
priorityPrioritychoice0one 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

Schemespbul://
Cargo featureservice-pushbullet
Servicehttps://www.pushbullet.com/
Body formatstext (first is the default)
Attachmentsyes
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttle1200 ms between requests
Vendor URLs acceptedno

URL formats

{schema}://{accesstoken}
{schema}://{accesstoken}/{targets}

{schema} is one of pbul://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{accesstoken}Access Tokenstringyessecret
{target_channel}Target Channelstringnoprefix #
{target_device}Target Devicestringno
{target_email}Target Emailemailno
{targets}Targetslistnoany of target_channel, target_device, target_email; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
toTargetslistsets {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

Schemespushdeer://, pushdeers://
Cargo featureservice-pushdeer
Servicehttps://www.pushdeer.com/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{pushkey}
{schema}://{host}/{pushkey}
{schema}://{host}:{port}/{pushkey}

{schema} is one of pushdeer://, pushdeers://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringno
{port}Portint, 1 to 65535no
{pushkey}Pushkeystringyessecret; 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

Schemespushme://
Cargo featureservice-pushme
Servicehttps://push.i-i.me/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{token}

{schema} is one of pushme://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{token}Tokenstringyessecret

Query parameters

ParameterMeaningTypeDefaultNotes
statusShow Statusboolyes
tokenTokenstringsets {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

Schemespover://
Cargo featureservice-pushover
Servicehttps://pushover.net/
Body formatstext, html, markdown (first is the default)
Attachmentsyes
Title length250 characters
Body length1,024 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{user_key}@{token}
{schema}://{user_key}@{token}/{targets}

{schema} is one of pover://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{target_device}Target Devicestringnomust match ^[a-z0-9_-]{1,25}$
{target_group}Target Groupstringnoprefix #
{targets}Targetslistnoany of target_device, target_group; separated by /
{token}Access Tokenstringyessecret
{user_key}User Keystringyessecret

Query parameters

ParameterMeaningTypeDefaultNotes
e2eeE2EEboolyes
expireExpireint, 0 to 108003600
intervalEmergency Retry Intervalint, min 30900
keyEncryption Keystringsecret
priorityPrioritychoice0one of -2, -1, 0, 1, 2
soundSoundstringpushovermust match ^[a-z]{1,12}$
toTargetslistsets {targets}
urlURLstring
url_titleURL Titlestring

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

Schemespushplus://, wecom://
Cargo featureservice-pushplus
Servicehttps://www.pushplus.plus/
Body formatshtml (first is the default)
Attachmentsno
Title length200 characters
Body length20,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedyes

URL formats

{schema}://{token}
{schema}://{token}/{targets}

{schema} is one of pushplus://, wecom://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{targets}Group Topicslistnoseparated by /
{token}User Tokenstringyessecret; must match ^[a-z0-9_-]{32,64}$

Query parameters

ParameterMeaningTypeDefaultNotes
channelChannelchoicewechat (usually; depends on the URL)also mode; one of wechat, webhook, cp, mail, sms
nameWebhook Namestring
toGroup Topicslistsets {targets}
tokenUser Tokenstringsets {token}
topicGroup Topicslistsets {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

Schemespsafer://, psafers://
Cargo featureservice-pushsafer
Servicehttps://www.pushsafer.com/
Body formatstext (first is the default)
Attachmentsyes
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttle1200 ms between requests
Vendor URLs acceptedno

URL formats

{schema}://{privatekey}
{schema}://{privatekey}/{targets}

{schema} is one of psafer://, psafers://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{privatekey}Private Keystringyessecret
{target_device}Target Devicestringno
{target_email}Target Emailstringno
{targets}Targetslistnoany of target_device, target_email; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
priorityPrioritychoiceone of -2, -1, 0, 1, 2
soundSoundchoiceone of silent, ahem, applause, arrow, baby, bell, bicycle, bike, boing, buzzer, camera, carhorn, … (78 values)
toTargetslistsets {targets}
vibrationVibrationchoiceone 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

Schemespushward://
Cargo featureservice-pushward
Servicehttps://pushward.app/
Body formatstext (first is the default)
Attachmentsno
Title length256 characters
Body length3,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{apikey}

{schema} is one of pushward://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}Integration Keystringyessecret; must match ^hlk_[A-Za-z0-9]+$

Query parameters

ParameterMeaningTypeDefaultNotes
apikeyIntegration Keystringsets {apikey}
failureFailure Levelchoicetime-sensitiveone of passive, active, time-sensitive, critical
infoInfo Levelchoiceactiveone of passive, active, time-sensitive, critical
levelLevelchoiceone of passive, active, time-sensitive, critical
successSuccess Levelchoiceactiveone of passive, active, time-sensitive, critical
volumeVolumefloat, 0 to 1
warningWarning Levelchoicetime-sensitiveone 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

Schemespushy://
Cargo featureservice-pushy
Servicehttps://pushy.me/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length4,096 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{apikey}/{targets}

{schema} is one of pushy://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}Secret API Keystringyessecret
{target_device}Target Devicestringnoprefix @
{target_topic}Target Topicstringnoprefix #
{targets}Targetslistyesany of target_device, target_topic; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
badgeBadgeint, min 0
keySecret API Keystringsets {apikey}
soundSoundstring
toTargetslistsets {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

Schemesqq://
Cargo featureservice-qq
Servicehttps://qmsg.zendee.cn/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedyes

URL formats

{schema}://{token}

{schema} is one of qq://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{token}User Tokenstringyessecret; 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.

Reddit

Schemesreddit://
Cargo featureservice-reddit
Servicehttps://reddit.com
Body formatsmarkdown (first is the default)
Attachmentsno
Title length300 characters
Body length6,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{user}:{password}@{app_id}/{app_secret}/{targets}

{schema} is one of reddit://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{app_id}Application IDstringyessecret; must match ^[a-z0-9_-]+$
{app_secret}Application Secretstringyessecret; must match ^[a-z0-9_-]+$
{password}Passwordstringyessecret
{target_subreddit}Target Subredditstringno
{targets}Targetslistyesany of target_subreddit; separated by /
{user}User Namestringyes

Query parameters

ParameterMeaningTypeDefaultNotes
adIs Ad?boolno
flair_idFlair IDstring
flair_textFlair Textstring
kindKindchoiceautoone of auto, self, link
nsfwNSFWboolno
resubmitResubmit Flagboolno
spoilerIs Spoilerboolno
toTargetslistsets {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-Reset is 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

Schemesrsyslog://
Cargo featureservice-rsyslog
Servicehttps://tools.ietf.org/html/rfc5424
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{host}
{schema}://{host}:{port}
{schema}://{host}/{facility}
{schema}://{host}:{port}/{facility}

{schema} is one of rsyslog://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{facility}Facilitychoiceyesuserone of kern, user, mail, daemon, auth, syslog, lpr, news, uucp, cron, local0, local1, … (18 values)
{host}Hostnamestringyes
{port}Portint, 1 to 65535no514

Query parameters

ParameterMeaningTypeDefaultNotes
facilityFacilitychoicesets {facility}
logpidLog PIDboolyes

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 * 8 with already shifted facility constants (user.info becomes <70>), while mercurio sends the RFC 5424 value (<14>).

Resend

Schemesresend://
Cargo featureservice-resend
Servicehttps://resend.com
Body formatshtml (first is the default)
Attachmentsyes
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttle200 ms between requests
Vendor URLs acceptedno

URL formats

{schema}://{apikey}:{from_addr}
{schema}://{apikey}:{from_addr}/{targets}

{schema} is one of resend://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret; must match ^[A-Z0-9._-]+$
{from_addr}Source Emailemailyes
{target_email}Target Emailemailno
{targets}Targetslistnoany of target_email; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
apikeyAPI Keystring
bccBlind Carbon Copylistseparated by , or space
ccCarbon Copylistseparated by , or space
fromFrom Addressstring
nameFrom Namestring
replyReply Tolistseparated by , or space
toTargetslistsets {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

Schemesrevolt://
Cargo featureservice-revolt
Servicehttps://revolt.chat/
Body formatstext (first is the default)
Attachmentsno
Title length100 characters
Body length2,000 characters
Body linesunlimited
Request throttle3000 ms between requests
Vendor URLs acceptedno

URL formats

{schema}://{bot_token}/{targets}

{schema} is one of revolt://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{bot_token}Bot Tokenstringyessecret
{target_channel}Channel IDstringyessecret; must match ^[a-z0-9_-]+$
{targets}Targetslistyesany of target_channel; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
bot_tokenBot Tokenstringsets {bot_token}
channelTargetslistsets {targets}
icon_urlIcon URLstring
toTargetslistsets {targets}
urlEmbed URLstring

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

Schemesringc://
Cargo featureservice-ringcentral
Servicehttps://ringcentral.com/
Body formatstext (first is the default)
Attachmentsyes
Title lengthno title (merged into the body)
Body length160 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{client_id}Client IDstringyessecret; must match ^[a-z0-9_-]+$
{from_phone}From Phone Nostringyes
{secret}Client Secretstringyessecret; must match ^[a-z0-9_-]+$
{target_phone}Target Phone Nostringnoprefix +
{targets}Targetslistnoany of target_phone; separated by /
{token}Token / Passwordstringyessecret

Query parameters

ParameterMeaningTypeDefaultNotes
envEnvironmentchoiceprodone of prod; sandbox is rejected: RingCentral retired its sandbox on 2025-01-01
fromFrom Phone Nostringsets {from_phone}
modeAuthentication Modechoiceone of basic, jwt
secretClient Secretstringsets {secret}
sourceFrom Phone Nostringsets {from_phone}
toTargetslistsets {targets}
tokenToken / Passwordstringsets {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=sandbox sends to platform.devtest.ringcentral.com in Apprise, while mercurio rejects it: RingCentral retired that sandbox on 2025-01-01.

Rocket.Chat

Schemesrocket://, rockets://
Cargo featureservice-rocketchat
Servicehttps://rocket.chat/
Body formatsmarkdown (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length1,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{password}Passwordstringnosecret
{port}Portint, 1 to 65535no
{target_channel}Target Channelstringnoprefix #
{target_room}Target Room IDstringno
{target_user}Target Userstringnoprefix @
{targets}Targetslistnoany of target_channel, target_room, target_user; separated by /
{token}API Tokenstringnosecret
{user}Usernamestringno
{webhook}Webhookstringno

Query parameters

ParameterMeaningTypeDefaultNotes
avatarUse Avatarboolno (usually; depends on the URL)
modeWebhook Modechoiceone of webhook, token, basic
toTargetslistsets {targets}
webhookWebhookstringsets {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

Schemesryver://
Cargo featureservice-ryver
Servicehttps://ryver.com/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length1,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedyes

URL formats

{schema}://{organization}/{token}
{schema}://{botname}@{organization}/{token}

{schema} is one of ryver://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{botname}Bot Namestringno
{organization}Organizationstringyesmust match ^[A-Z0-9_-]{3,32}$
{token}Tokenstringyessecret; must match ^[A-Z0-9]{15}$

Query parameters

ParameterMeaningTypeDefaultNotes
imageInclude Imageboolyes
modeWebhook Modechoiceryverone 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

Schemessendgrid://
Cargo featureservice-sendgrid
Servicehttps://sendgrid.com
Body formatshtml (first is the default)
Attachmentsyes
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttle200 ms between requests
Vendor URLs acceptedno

URL formats

{schema}://{apikey}:{from_email}
{schema}://{apikey}:{from_email}/{targets}

{schema} is one of sendgrid://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret; must match ^[A-Z0-9._-]+$
{from_email}Source Emailemailyes
{target_email}Target Emailemailno
{targets}Targetslistnoany of target_email; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
bccBlind Carbon Copylistseparated by , or space
ccCarbon Copylistseparated by , or space
templateTemplatestring
toTargetslistsets {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

Schemessendpulse://
Cargo featureservice-sendpulse
Servicehttps://sendpulse.com
Body formatshtml, text (first is the default)
Attachmentsyes
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttle200 ms between requests
Vendor URLs acceptedno

URL formats

{schema}://{user}@{host}/{client_secret}/
{schema}://{user}@{host}/{client_id}/{client_secret}/{targets}

{schema} is one of sendpulse://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{client_id}Client IDstringyessecret; must match ^[A-Z0-9._-]+$
{client_secret}Client Secretstringyessecret; must match ^[A-Z0-9._-]+$
{host}Domainstringyes
{target_email}Target Emailemailno
{targets}Targetslistnoany of target_email; separated by /
{user}User Namestringyes

Query parameters

ParameterMeaningTypeDefaultNotes
bccBlind Carbon Copylistseparated by , or space
ccCarbon Copylistseparated by , or space
fromFrom Emailstring
idClient IDstringsets {client_id}
secretClient Secretstringsets {client_secret}
templateTemplate IDint
toTargetslistsets {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

Schemesschan://
Cargo featureservice-serverchan
Servicehttps://sct.ftqq.com/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{token}

{schema} is one of schan://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{token}Tokenstringyessecret; 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

Schemesserwersms://
Cargo featureservice-serwersms
Servicehttps://serwersms.pl
Body formatstext (first is the default)
Attachmentsyes
Title lengthno title (merged into the body)
Body length160 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{user}:{password}@{sender}/{targets}
{schema}://{user}:{password}@{sender}

{schema} is one of serwersms://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{password}Passwordstringyessecret
{sender}Sender Namestringyesmust match ^[a-z0-9][a-z0-9 _-]{0,10}$
{target_group}Target Group IDstringnoprefix #
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistnoany of target_group, target_phone; separated by /
{user}Usernamestringyes

Query parameters

ParameterMeaningTypeDefaultNotes
senderSender Namestringsets {sender}; also from
toTargetslistsets {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

Schemessession://, sessions://, sogs://
Cargo featureservice-sogs
Servicehttps://getsession.org/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length2,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{user}:{password}@{host}/{targets}
{schema}://{user}:{password}@{host}:{port}/{targets}

{schema} is one of session://, sessions://, sogs://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{password}Seedstringyessecret
{port}Portint, 1 to 65535no
{targets}Roomslistnoseparated by /
{user}Public Keystringyes

Query parameters

ParameterMeaningTypeDefaultNotes
keyPublic Keystringsets {user}
public_keyPublic Keystringsets {user}
seedSeedstringsets {password}
toRoomslistsets {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

Schemesseven://
Cargo featureservice-seven
Servicehttps://www.seven.io
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length160 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{apikey}/{targets}

{schema} is one of seven://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistyesany of target_phone; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
flashFlashboolno
labelLabelstring
sourceOriginating Addressstringalso from
toTargetslistsets {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

Schemessignal://, signals://
Cargo featureservice-signalapi
Servicehttps://bbernhard.github.io/signal-cli-rest-api/
Body formatstext (first is the default)
Attachmentsyes
Title lengthno title (merged into the body)
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{from_phone}From Phone Nostringyesmust match ^\+?[0-9\s)(+-]+$
{host}Hostnamestringyes
{password}Passwordstringnosecret
{port}Portint, 1 to 65535no
{target_channel}Target Group IDstringnoprefix @; must match ^[a-z0-9_=-]+$
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistnoany of target_channel, target_phone; separated by /
{user}Usernamestringno

Query parameters

ParameterMeaningTypeDefaultNotes
batchBatch Modeboolno
fromFrom Phone Nostringsets {from_phone}
statusShow Statusboolno
toTargetslistsets {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

Schemessignalgrid://
Cargo featureservice-signalgrid
Servicehttps://signalgrid.co/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{client_key}/{targets}

{schema} is one of signalgrid://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{client_key}Client Keystringyessecret
{targets}Channelslistnoseparated by /

Query parameters

ParameterMeaningTypeDefaultNotes
client_keyClient Keystringsets {client_key}
criticalCritical Notificationboolno
toChannelslistsets {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

Schemessignl4://
Cargo featureservice-signl4
Servicehttps://signl4.com/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{secret}

{schema} is one of signl4://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{secret}Secretstringyessecret

Query parameters

ParameterMeaningTypeDefaultNotes
alerting_scenarioAlerting Scenariostring
external_idExternal IDstring
filteringFilteringboolno
locationLocationstring
serviceServicestring
statusStatusstring

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

Schemesspush://, simplepush://
Cargo featureservice-simplepush
Servicehttps://simplepu.sh/
Body formatsmarkdown (first is the default)
Attachmentsyes
Title length300 characters
Body length7,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{token}
{schema}://{token}/{targets}
{schema}://{password}@{token}
{schema}://{password}@{token}/{targets}

{schema} is one of spush://, simplepush://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{password}Passwordstringnosecret
{target_member}Target Memberstringnoprefix @
{target_topic}Target Topicstringno
{targets}Targetslistnoany of target_member, target_topic; separated by /
{token}API Tokenstringyessecret

Query parameters

ParameterMeaningTypeDefaultNotes
broadcastBroadcastboolno
critical_volumeVolumefloat, 0 to 1
linksLinklistseparated by , or space
priorityPrioritychoiceone of 1, 2, 3, 4, 5
sharedSharedboolno
sptagTagstring
toTargetslistsets {targets}
topic_auth_tokenAuth Tokenstringsecret

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 NaCl crypto_box (X25519 + XSalsa20-Poly1305) and opened with the seed.

Fields, links and attachments are sealed with XChaCha20-Poly1305 (24 byte nonce + ciphertext + tag).

Sinch

Schemessinch://
Cargo featureservice-sinch
Servicehttps://sinch.com/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length160 characters
Body linesunlimited
Request throttle200 ms between requests
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{api_token}Auth Tokenstringyessecret; must match ^[a-f0-9]+$
{from_phone}From Phone Nostringyesmust match ^\+?[0-9\s)(+-]+$
{service_plan_id}Account SIDstringyessecret; must match ^[a-f0-9]+$
{short_code}Target Short Codestringnomust match ^[0-9]{5,6}$
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistnoany of short_code, target_phone; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
fromFrom Phone Nostringsets {from_phone}; also source
regionRegionstringusmust match ^[a-z]{2}$
spiAccount SIDstringsets {service_plan_id}
toTargetslistsets {targets}
tokenAuth Tokenstringsets {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

Schemesslack://
Cargo featureservice-slack
Servicehttps://slack.com/
Body formatsmarkdown, text (first is the default)
Attachmentsyes
Title length250 characters
Body length35,000 characters
Body linesunlimited
Request throttle1200 ms between requests
Vendor URLs acceptedyes

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

TokenMeaningTypeRequiredDefaultNotes
{access_token}OAuth Access Tokenstringyessecret; must match ^(?:xoxe\.)?xox[abp]-[A-Z0-9-]+$
{botname}Bot Namestringno
{target_channels}Target Channelstringnoprefix #
{target_email}Target Emailemailno
{target_encoded_id}Target Encoded IDstringnoprefix +
{target_user}Target Userstringnoprefix @
{targets}Targetslistnoany of target_channels, target_email, target_encoded_id, target_user; separated by /
{token_a}Token Astringyessecret; must match ^[A-Z0-9]+$
{token_b}Token Bstringyessecret; must match ^[A-Z0-9]+$
{token_c}Token Cstringyessecret; must match ^[A-Za-z0-9]+$
{workflow_path}Workflow Pathstringnosecret

Query parameters

ParameterMeaningTypeDefaultNotes
blocksUse Blocksboolno
footerInclude Footerboolyes
imageInclude Imageboolyes
modeMessage Modechoiceone of hook, gov-hook, bot, workflow, trigger
templateTemplate Pathstringsecret
timestampInclude Timestampboolyes
toTargetslistsets {targets}
tokenOAuth Access Tokenstringsets {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

Schemessmpp://, smpps://
Cargo featureservice-smpp
Servicehttps://smpp.org/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{from_phone}From Phone Nostringyesmust match ^[0-9\s)(+-]+$
{host}Hoststringyes
{password}Passwordstringyessecret
{port}Portint, 1 to 65535no
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistyesany of target_phone; separated by /
{user}Usernamestringyes

Query parameters

ParameterMeaningTypeDefaultNotes
fromFrom Phone Nostringsets {from_phone}
toTargetslistsets {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 :port is honoured (Apprise always uses 2775 / 3550).
  • smpps:// uses TLS (Apprise opens a plain socket).
  • submit_sm_resp statuses are checked (Apprise never reads them).

SMS Eagle

Schemessmseagle://, smseagles://
Cargo featureservice-smseagle
Servicehttps://smseagle.eu
Body formatstext (first is the default)
Attachmentsyes
Title lengthno title (merged into the body)
Body length1,200 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{token}@{host}/{targets}
{schema}://{token}@{host}:{port}/{targets}

{schema} is one of smseagle://, smseagles://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{port}Portint, 1 to 65535no
{target_contact}Target Contactstringnoprefix @; must match ^[a-z0-9_-]+$
{target_group}Target Group IDstringnoprefix #; must match ^[a-z0-9_-]+$
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistyesany of target_contact, target_group, target_phone; separated by /
{token}Access Tokenstringyes

Query parameters

ParameterMeaningTypeDefaultNotes
batchBatch Modeboolno
flashFlashboolno
priorityPrioritychoice0one of 0, 1
statusShow Statusboolno
testTest Onlyboolno
toTargetslistsets {targets}
tokenAccess Tokenstringsets {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

Schemessmsmgr://, smsmanager://
Cargo featureservice-smsmanager
Servicehttps://smsmanager.cz
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length160 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{apikey}@{targets}

{schema} is one of smsmgr://, smsmanager://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistyesany of target_phone; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
batchBatch Modeboolno
fromFrom Phone Nostringalso sender; must match ^\+?[0-9\s)(+-]+$
gatewayGatewaychoicehighone of high, economy, low, direct
keyAPI Keystringsets {apikey}
toTargetslistsets {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

Schemessmsc://
Cargo featureservice-smsc
Servicehttps://smsc.ru/
Body formatstext (first is the default)
Attachmentsyes
Title lengthno title (merged into the body)
Body length160 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{user}:{password}@{targets}

{schema} is one of smsc://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{password}Passwordstringyessecret
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistyesany of target_phone; separated by /
{user}Loginstringyes

Query parameters

ParameterMeaningTypeDefaultNotes
senderSender IDstring
toTargetslistsets {targets}
translitTransliterateboolno

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

Schemessmtp2go://
Cargo featureservice-smtp2go
Servicehttps://www.smtp2go.com/
Body formatshtml (first is the default)
Attachmentsyes
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttle200 ms between requests
Vendor URLs acceptedno

URL formats

{schema}://{user}@{host}/{apikey}/
{schema}://{user}@{host}/{apikey}/{targets}

{schema} is one of smtp2go://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret
{host}Domainstringyes
{targets}Target Emailslistnoseparated by /
{user}User Namestringyes

Query parameters

ParameterMeaningTypeDefaultNotes
batchBatch Modeboolno
bccBlind Carbon Copylistseparated by , or space
ccCarbon Copylistseparated by , or space
nameFrom Namestring
toTarget Emailslistsets {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

Schemessfr://
Cargo featureservice-sfr
Servicehttps://www.sfr.fr/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length160 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{user}:{password}@{space_id}/{targets}

{schema} is one of sfr://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{password}Service Passwordstringyessecret
{space_id}Space IDstringyessecret
{target}Recipient Phone Numberstringnomust match ^\+?[0-9\s)(+-]+$
{targets}Targetslistyesany of target; separated by /
{user}Service IDstringyes

Query parameters

ParameterMeaningTypeDefaultNotes
langLanguagestringfr_FR
mediaMedia TypestringSMSUnicodeone of SMS, SMSLong, SMSUnicode, SMSUnicodeLong
senderSender Namestringalso from
timeoutTimeoutint2880
toTargetslistsets {targets}
voiceTTS Voicestringclaire08sone 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

Schemessparkpost://
Cargo featureservice-sparkpost
Servicehttps://sparkpost.com/
Body formatshtml (first is the default)
Attachmentsyes
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttle200 ms between requests
Vendor URLs acceptedno

URL formats

{schema}://{user}@{host}/{apikey}/
{schema}://{user}@{host}/{apikey}/{targets}

{schema} is one of sparkpost://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret
{host}Domainstringyes
{targets}Target Emailslistnoseparated by /
{user}User Namestringyes

Query parameters

ParameterMeaningTypeDefaultNotes
batchBatch Modeboolno
bccBlind Carbon Copylistseparated by , or space
ccCarbon Copylistseparated by , or space
nameFrom Namestring
regionRegion Namechoiceusone of us, eu
toTarget Emailslistsets {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

Schemesspike://
Cargo featureservice-spike
Servicehttps://www.spike.sh/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedyes

URL formats

{schema}://{token}

{schema} is one of spike://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{token}Integration Keystringyessecret; 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

Schemessplunk://, victorops://
Cargo featureservice-splunk
Servicehttps://www.splunk.com/en_us/products/on-call.html
Body formatstext (first is the default)
Attachmentsno
Title length60 characters
Body length400 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedyes

URL formats

{schema}://{routing_key}@{apikey}
{schema}://{routing_key}@{apikey}/{entity_id}

{schema} is one of splunk://, victorops://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret; must match ^[A-Z0-9_-]+$
{entity_id}Entity IDstringno
{routing_key}Target Routing Keystringyesmust match ^[A-Z0-9_-]+$

Query parameters

ParameterMeaningTypeDefaultNotes
actionActionchoicemapone of map, info, acknowledgement, warning, recovery, resolve, critical
apikeyAPI Keystringsets {apikey}
entity_idEntity IDstringsets {entity_id}
routing_keyTarget Routing Keystringsets {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

Schemesspugpush://
Cargo featureservice-spugpush
Servicehttps://push.spug.cc/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedyes

URL formats

{schema}://{token}

{schema} is one of spugpush://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{token}Access Tokenstringyessecret; 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

Schemesstackfield://
Cargo featureservice-stackfield
Servicehttps://www.stackfield.com/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length4,000 characters
Body linesunlimited
Request throttle1000 ms between requests
Vendor URLs acceptedyes

URL formats

{schema}://{token}

{schema} is one of stackfield://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{token}Webhook Tokenstringyessecret; must match ^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$

Query parameters

ParameterMeaningTypeDefaultNotes
tokenWebhook Tokenstringsets {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

Schemesstrmlabs://
Cargo featureservice-streamlabs
Servicehttps://streamlabs.com/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length255 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{access_token}/

{schema} is one of strmlabs://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{access_token}Access Tokenstringyessecret; must match ^[a-z0-9._-]{20,}$

Query parameters

ParameterMeaningTypeDefaultNotes
alert_typeAlert Typechoicedonationone of follow, subscription, donation, host
amountAmountint, min 00
callCallchoiceALERTSone of ALERTS, DONATIONS
currencyCurrencystringUSDmust match ^[A-Z]{3}$
durationDurationint, min 01000
identifierIdentifierstringdefaults to the application id
image_hrefImage Linkstring
nameNamestringAnon (usually; depends on the URL)must match ^[^\s].{1,24}$
sound_hrefSound Linkstring
special_text_colorSpecial Text Colorstringmust 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&currency=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_token in the body, while mercurio uses API v2.0 (Bearer header, JSON, empty options left out), since Streamlabs is disabling v1.0.
  • The donation identifier defaults to the application id and sound_href keeps its case (Apprise upper-cases the URL).

Synology Chat

Schemessynology://, synologys://
Cargo featureservice-synology
Servicehttps://www.synology.com/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{password}Passwordstringnosecret
{port}Portint, 1 to 65535no
{token}Tokenstringyessecret
{user}Usernamestringno

Query parameters

ParameterMeaningTypeDefaultNotes
file_urlUploadstring
tokenTokenstringsets {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

Schemessyslog://
Cargo featureservice-syslog
Servicehttps://tools.ietf.org/html/rfc5424
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://
{schema}://{facility}

{schema} is one of syslog://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{facility}Facilitychoicenouserone of kern, user, mail, daemon, auth, syslog, lpr, news, uucp, cron, local0, local1, … (18 values)

Query parameters

ParameterMeaningTypeDefaultNotes
facilityFacilitychoicesets {facility}
logperrorLog to STDERRboolno
logpidLog PIDboolyes

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

  • logperror copies the line to stderr like LOG_PERROR.

Techulus Push

Schemespush://
Cargo featureservice-techuluspush
Servicehttps://push.techulus.com
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length1,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{apikey}

{schema} is one of push://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret; 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

Schemestgram://
Cargo featureservice-telegram
Servicehttps://telegram.org/
Body formatshtml, markdown (first is the default)
Attachmentsyes
Title lengthno title (merged into the body)
Body length4,096 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{bot_token}
{schema}://{bot_token}/{targets}

{schema} is one of tgram://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{bot_token}Bot Tokenstringyessecret; must match ^(bot)?(?P<key>[0-9]+:[a-z0-9_-]+)$
{target_user}Target Chat IDstringnomust match ^((-?[0-9]{1,32})|([a-z_-][a-z0-9_-]+))$
{targets}Targetslistnoany of target_user; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
albumGroup Photo/Video Attachmentsboolno
contentContent Placementchoicebeforeone of before, after
detectDetect Bot Ownerboolyes
imageInclude Imageboolno
mdvMarkdown Versionchoicev1one of v1, v2
previewWeb Page Previewboolno
silentSilent Notificationboolno
templateRich Message Template Pathstringsecret
toTargetslistsets {targets}
topicTopic Thread IDintalso 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

Schemestelnyx://
Cargo featureservice-telnyx
Servicehttps://telnyx.com
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length160 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{apikey}@{from_phone}
{schema}://{apikey}@{from_phone}/{targets}

{schema} is one of telnyx://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret
{from_phone}From Phone Nostringyesmust match ^\+?[0-9\s)(+-]+$
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistyesany of target_phone; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
fromFrom Phone Nostringmust match ^\+?[0-9\s)(+-]+$
keyAPI Keystringsets {apikey}
profileMessaging Profile IDstring
toTargetslistsets {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

Schemesthreema://
Cargo featureservice-threema
Servicehttps://gateway.threema.ch/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length3,500 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{gateway_id}@{secret}/{targets}

{schema} is one of threema://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{gateway_id}Gateway IDstringyessecret
{secret}API Secretstringyessecret
{target_email}Target Emailemailno
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{target_threema_id}Target Threema IDstringno
{targets}Targetslistyesany of target_email, target_phone, target_threema_id; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
fromGateway IDstringsets {gateway_id}
gwidGateway IDstringsets {gateway_id}
secretAPI Secretstringsets {secret}
toTargetslistsets {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

Schemestrigv://, trigvs://
Cargo featureservice-trigv
Servicehttps://trigv.com/
Body formatstext (first is the default)
Attachmentsno
Title length255 characters
Body length1,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{api_key}API Keystringyessecret; must match ^trgv_[a-zA-Z0-9]{8}_[a-zA-Z0-9]{32}$
{host}API Hostnamestringno
{port}Portint, 1 to 65535no
{target_channel}Target Channelstringno
{targets}Targetslistnoany of target_channel; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
event_typeEvent typestring
image_urlImage URLstring
priorityPriority (Pushover compatibility)int
toTargetslistsets {targets}
urgencyUrgencychoicestandardone of standard, time_sensitive
urlURLstring

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

Schemestwilio://
Cargo featureservice-twilio
Servicehttps://www.twilio.com/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length160 characters
Body linesunlimited
Request throttle200 ms between requests
Vendor URLs acceptedno

URL formats

{schema}://{account_sid}:{auth_token}@{from_phone}
{schema}://{account_sid}:{auth_token}@{from_phone}/{targets}

{schema} is one of twilio://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{account_sid}Account SIDstringyessecret; must match ^AC[a-f0-9]+$
{auth_token}Auth Tokenstringyessecret; must match ^[a-z0-9]+$
{from_phone}From Phone Nostringyesmust match ^([a-z]+:)?\+?[0-9\s)(+-]+$
{short_code}Target Short Codestringnomust match ^[0-9]{5,6}$
{target_phone}Target Phone Nostringnoprefix +; must match ^([a-z]+:)?[0-9\s)(+-]+$
{targets}Targetslistnoany of short_code, target_phone; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
apikeyAPI Keystringsecret; must match ^SK[a-f0-9]+$
fromFrom Phone Nostringsets {from_phone}; also source
methodNotification Method: sms or callchoicesmsone of sms, call
sidAccount SIDstringsets {account_sid}
toTargetslistsets {targets}
tokenAuth Tokenstringsets {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

Schemestwist://
Cargo featureservice-twist
Servicehttps://twist.com
Body formatsmarkdown (first is the default)
Attachmentsno
Title length250 characters
Body length1,000 characters
Body linesunlimited
Request throttle200 ms between requests
Vendor URLs acceptedno

URL formats

{schema}://{password}:{email}
{schema}://{password}:{email}/{targets}

{schema} is one of twist://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{email}Emailemailyes
{password}Passwordstringyessecret
{target_channel}Target Channelstringnoprefix #
{target_channel_id}Target Channel IDstringno
{targets}Targetslistnoany of target_channel, target_channel_id; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
toTargetslistsets {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.

Twitter

Schemesx://, twitter://, tweet://
Cargo featureservice-twitter
Servicehttps://twitter.com/
Body formatstext (first is the default)
Attachmentsyes
Title lengthno title (merged into the body)
Body length10,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{ckey}/{csecret}/{akey}/{asecret}
{schema}://{ckey}/{csecret}/{akey}/{asecret}/{targets}

{schema} is one of x://, twitter://, tweet://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{akey}Access Keystringyessecret
{asecret}Access Secretstringyessecret
{ckey}Consumer Keystringyessecret
{csecret}Consumer Secretstringyessecret
{target_user}Target Userstringnoprefix @
{targets}Targetslistnoany of target_user; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
batchBatch Modeboolyes
cacheCache Resultsboolyes
modeMessage Modechoicedm (usually; depends on the URL)one of dm, tweet
toTargetslistsets {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

Schemesvapid://
Cargo featureservice-vapid
Servicehttps://datatracker.ietf.org/doc/html/draft-thomson-webpush-vapid
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length4,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{subscriber}
{schema}://{subscriber}/{targets}

{schema} is one of vapid://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{subscriber}API Keystringyessecret
{targets}Targetslistnoseparated by /

Query parameters

ParameterMeaningTypeDefaultNotes
fromAPI Keystringsets {subscriber}
keyfilePEM Private KeyFilestringsecret
modeModechoicechromeone of chrome, firefox, edge, opera, apple
subfileSubscripion Filestringsecret
toTargetslistsets {targets}
ttlttlint, 0 to 600

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

Schemesviber://
Cargo featureservice-viber
Servicehttps://www.viber.com/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length30,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{token}/{targets}

{schema} is one of viber://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{targets}Receiver IDslistyesseparated by /
{token}Authentication Tokenstringyessecret

Query parameters

ParameterMeaningTypeDefaultNotes
avatarBot Avatar URLstring
fromBot Namestring
toReceiver IDslistsets {targets}
tokenAuthentication Tokenstringsets {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

Schemesvoipms://
Cargo featureservice-voipms
Servicehttps://voip.ms
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length160 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{password}:{email}/{from_phone}/{targets}

{schema} is one of voipms://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{email}User Emailemailyes
{from_phone}From Phone Nostringyesmust match ^\+?[0-9\s)(+-]+$
{password}Passwordstringyessecret
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistyesany of target_phone; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
fromFrom Phone Nostringsets {from_phone}
toTargetslistsets {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

Schemesvonage://, nexmo://
Cargo featureservice-vonage
Servicehttps://dashboard.nexmo.com/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length160 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{apikey}:{secret}@{from_phone}
{schema}://{apikey}:{secret}@{from_phone}/{targets}

{schema} is one of vonage://, nexmo://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret; must match ^[a-z0-9]+$
{from_phone}From Phone Nostringyesmust match ^\+?[0-9\s)(+-]+$
{secret}API Secretstringyessecret; must match ^[a-z0-9]+$
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistnoany of target_phone; separated by /

Query parameters

ParameterMeaningTypeDefaultNotes
fromFrom Phone Nostringsets {from_phone}; also source
keyAPI Keystringsets {apikey}
secretAPI Secretstringsets {secret}
toTargetslistsets {targets}
ttlttlint, 20000 to 604800000900000

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)

Schemeswechat://
Cargo featureservice-wechat
Servicehttps://work.weixin.qq.com/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length2,048 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{user}:{password}@{host}
{schema}://{user}:{password}@{host}/{targets}

{schema} is one of wechat://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{host}Agent IDstringyesmust match ^[0-9]+$
{password}App Secretstringyessecret
{target_department}Target Departmentstringnoprefix #
{target_tag}Target Tagstringnoprefix +
{target_user}Target Userstringnoprefix @
{targets}Targetslistnoany of target_department, target_tag, target_user; separated by /
{user}Corp IDstringyes

Query parameters

ParameterMeaningTypeDefaultNotes
toTargetslistsets {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

Schemeswecombot://
Cargo featureservice-wecombot
Servicehttps://weixin.qq.com/
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedyes

URL formats

{schema}://{key}

{schema} is one of wecombot://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{key}Bot Webhook Keystringyessecret; must match ^[a-z0-9_-]+$

Query parameters

ParameterMeaningTypeDefaultNotes
keyBot Webhook Keystringsets {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.

WhatsApp

Schemeswhatsapp://
Cargo featureservice-whatsapp
Servicehttps://developers.facebook.com/docs/whatsapp/cloud-api/get-started
Body formatstext (first is the default)
Attachmentsno
Title lengthno title (merged into the body)
Body length1,024 characters
Body linesunlimited
Request throttle200 ms between requests
Vendor URLs acceptedno

URL formats

{schema}://{token}@{from_phone_id}/{targets}
{schema}://{template}:{token}@{from_phone_id}/{targets}

{schema} is one of whatsapp://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{from_phone_id}From Phone IDstringyessecret; must match ^[0-9]+$
{language}Languagestringnoen_USmust match ^[^0-9\s]+$
{target_group}Target Group IDstringnoprefix #; must match ^[0-9]{16,}$
{target_phone}Target Phone Nostringnoprefix +; must match ^[0-9\s)(+-]+$
{targets}Targetslistyesany of target_group, target_phone; separated by /
{template}Template Namestringnomust match ^[^\s]+$
{token}Access Tokenstringyessecret; must match ^[a-z0-9]+$

Query parameters

ParameterMeaningTypeDefaultNotes
fromFrom Phone IDstringsets {from_phone_id}; also source
langLanguagestringsets {language}
templateTemplate Namestringsets {template}
toTargetslistsets {targets}
tokenAccess Tokenstringsets {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

Schemeswindows://
Cargo featureservice-windows
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body lines2 lines
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://

{schema} is one of windows://.

Query parameters

ParameterMeaningTypeDefaultNotes
durationDurationint, min 112
imageInclude Imageboolyesaccepted, 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

Schemeswpush://
Cargo featureservice-wpush
Servicehttps://wpush.cn/
Body formatstext (first is the default)
Attachmentsno
Title length255 characters
Body length10,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedyes

URL formats

{schema}://{apikey}
{schema}://{apikey}/{targets}

{schema} is one of wpush://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{apikey}API Keystringyessecret; must match ^WPUSH[a-z0-9]{27}$
{targets}Topicslistnoseparated by /

Query parameters

ParameterMeaningTypeDefaultNotes
apikeyAPI Keystringsets {apikey}
channelChannellistseparated by , or space; one of wechat, app, sms, mail, webhook, dingtalk, feishu, wechat_work, clawbot, qqbot
groupGroup / Option Codestringalso option
toTopicslistsets {targets}
topicTopicslistsets {targets}
topic_codeTopicslistsets {targets}
urlClick URLstring

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

Schemeswxpusher://
Cargo featureservice-wxpusher
Servicehttps://wxpusher.zjiecode.com/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{token}/{targets}

{schema} is one of wxpusher://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{target_topic}Target Topicintno
{target_user}Target User IDstringnomust match ^UID_[^\s]+$
{targets}Targetslistyesany of target_topic, target_user; separated by /
{token}App Tokenstringyessecret; must match ^AT_[^\s]+$

Query parameters

ParameterMeaningTypeDefaultNotes
toTargetslistsets {targets}
tokenApp Tokenstringsets {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

Schemesxml://, xmls://
Cargo featureservice-xml
Body formatstext, html, markdown (first is the default)
Attachmentsyes
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{password}Passwordstringnosecret
{port}Portint, 1 to 65535no
{user}Usernamestringno

Query parameters

ParameterMeaningTypeDefaultNotes
methodFetch MethodchoicePOSTone 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

Schemesxmpp://, xmpps://
Cargo featureservice-xmpp
Servicehttps://xmpp.org/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length32,768 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

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

TokenMeaningTypeRequiredDefaultNotes
{host}Hostnamestringyes
{password}Passwordstringyessecret
{port}Portint, 1 to 65535no
{target_channels}Target Channelstringnoprefix #
{target_user}Target Userstringno
{targets}Targetslistnoany of target_channels, target_user; separated by /
{user}Userstringyes

Query parameters

ParameterMeaningTypeDefaultNotes
modeSecure Modechoicestarttls (usually; depends on the URL)one of starttls, tls, none
nameMUC Nicknamestring
rosterGet Rosterboolno
scramplusSCRAM-PLUS Channel Bindingboolyes
subjectUse Subjectboolno
toTargetslistsets {targets}
xmppXMPP Serverstring

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

Schemesyoulmk://
Cargo featureservice-youlmk
Servicehttps://youlmk.com/
Body formatstext (first is the default)
Attachmentsno
Title length120 characters
Body length2,000 characters
Body linesunlimited
Request throttle1000 ms between requests
Vendor URLs acceptedyes

URL formats

{schema}://{token}

{schema} is one of youlmk://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{token}Token or Keystringyessecret; must match ^(ylk_[a-z0-9]{32}|k_[a-z0-9]{14})$

Query parameters

ParameterMeaningTypeDefaultNotes
failureFailure Prioritychoicehighone of low, normal, high, critical
groupGroupstring
imageInclude Imageboolno
infoInfo Prioritychoicenormalone of low, normal, high, critical
priorityPrioritychoiceone of low, normal, high, critical
successSuccess Prioritychoicenormalone of low, normal, high, critical
tokenToken or Keystringsets {token}
urlLinkstring
url_labelLink Labelstring
warningWarning Prioritychoicehighone 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

Schemeszoom://
Cargo featureservice-zoom
Servicehttps://zoom.us/
Body formatstext (first is the default)
Attachmentsno
Title length250 characters
Body length3,750 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedyes

URL formats

{schema}://{webhook_id}/{token}

{schema} is one of zoom://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{token}Verification Tokenstringyessecret
{webhook_id}Webhook IDstringyessecret

Query parameters

ParameterMeaningTypeDefaultNotes
modeModechoicefullone of simple, full; simple sends ?format=message with plain text
tokenVerification Tokenstringsets {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 current integrations.zoom.us/chat/webhooks/incomingwebhook/{id} (?format=full; ?format=message for mode=simple); native URLs on either host are accepted.

Zulip

Schemeszulip://
Cargo featureservice-zulip
Servicehttps://zulipchat.com/
Body formatstext (first is the default)
Attachmentsno
Title length60 characters
Body length10,000 characters
Body linesunlimited
Request throttlenone
Vendor URLs acceptedno

URL formats

{schema}://{botname}@{organization}/{token}
{schema}://{botname}@{organization}/{token}/{targets}

{schema} is one of zulip://.

URL tokens

TokenMeaningTypeRequiredDefaultNotes
{botname}Bot Namestringyesmust match ^[A-Z0-9_-]{1,32}$
{organization}Organizationstringyesmust match ^[A-Z0-9_-]{1,32}$
{target_stream}Target Streamstringno
{target_user}Target Useremailno
{targets}Targetslistnoany of target_stream, target_user; separated by /
{token}Tokenstringyessecret; must match ^[A-Z0-9]{32}$

Query parameters

ParameterMeaningTypeDefaultNotes
toTargetslistsets {targets}
tokenTokenstringsets {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 markdown package, 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 requests sends user:None, while mercurio sends user:.
  • URL parser. Apprise checks hosts in parse_url and 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 (the emojis crate). 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.
  • %2F in a URL path. Apprise decodes it into a separator, so json://, xml:// and form:// request another path (its issue #1799), while mercurio keeps it encoded for those three, so a%2Fb stays 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 as paris; an unknown zone rejects the URL). E-mail Date: and syslog timestamps use it, else a YAML asset: timezone (or tz), 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, truncate keeps the first piece split would 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:None room ids and null GET bodies, Office 365 re-sending an expired token on login, Burst SMS country=US, Twitter mode=DM, VoIP.ms stopping on one bad reply, Home Assistant svc:a,b,c lists and storage prune deleting Apprise’s *.psdata files.
  • Not available. Pickling a loaded notifier, internationalised messages (i18n). Apprise’s async_notify is AsyncMercurio::notify.

CLI

  • Default input format. Apprise’s CLI assumes text, while mercurio passes the body through when -i is not given; -i text gives Apprise’s behaviour.
  • -e. Apprise runs its full escape decoder, while the CLI decodes \n, \r, \t and \\ only (Asset::interpret_escapes in the library runs the full decoder).
  • -g with 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).
  • -d does not print storage URL ids; use mercurio storage.
  • check, serve, services are 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 are 404 and 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-Language or cookie and sets Content-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_URL gets 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 and APPRISE_STORAGE_UID_LENGTH works the same.
  • Workers. apprise-api sizes gunicorn by APPRISE_WORKER_COUNT (twice the CPUs plus one by default), gives a worker APPRISE_WORKER_TIMEOUT seconds (300 by default) and recycles it after APPRISE_WORKER_MAX_REQUESTS requests, 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, so APPRISE_WORKER_MAX_REQUESTS and its jitter are ignored.
  • Request log. apprise-api logs requests through nginx (combined format) plus NOTIFY - ip - ... warnings, while mercurio logs one line per request with its key, services, failures and error.
  • Unknown paths. apprise-api answers 404 with an error message, while mercurio answers an empty 404, before authentication; its 405 Allow header omits OPTIONS.
  • Metrics. apprise-api exports the full django_prometheus set, 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’s process_* metrics. Django’s model, database, cache and migration metrics and Python’s gc and info metrics have no equivalent.
  • Other settings. Plugin paths are ignored.
  • Logins and times. apprise-api checks logins with Django’s default hashers; without argon2-cffi and bcrypt (not in its requirements) those are pbkdf2_sha256, pbkdf2_sha1 and scrypt, and it writes pbkdf2_sha256. It reports times in the TZ zone, while mercurio reads both PBKDF2 forms and writes pbkdf2_sha256; a scrypt digest, which apprise-api never writes, is rejected. Times are UTC.
  • JSON /add without format. 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 a 400).

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-parser plus a composer instead of PyYAML): several documents (---), custom !tags and collection keys are rejected; explicit ? key entries are not supported; timestamps stay strings; 1, 1.0 and true are 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_path is accepted in configuration files (a mercurio extension; Apprise takes it only as a constructor argument); interpret_emojis is 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 JSON cache.json; neither reads the other’s file (prune and clear remove both).
  • Modes. auto, flush and memory (-SM, APPRISE_STORAGE_MODE, Asset::storage_mode) as in Apprise; flush writes before each I/O step of a send rather than on every change.
  • Entry checksum. Each cache.json entry 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 Python repr), 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 no write() API for named files, and Apprise’s cache itself is uncapped, so there is no cap.
  • mercurio storage list shows 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 ignores Retry-After, while mercurio retries only rate limits (429, 503 with Retry-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 honours Retry-After up to 300 s.
  • ?wait=. Apprise defaults to 0, while mercurio defaults to 0.5 s. Both cap it at 20 s.
  • Unclassified failures. Error::Service failures (for example a JSON body with "ok": false) and register_scheme closures are not retried.
  • Service hints. Apprise reads neither Telegram’s parameters.retry_after nor Matrix’s retry_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; use workflows://.
  • 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 host messages.kumulos.com no longer resolves.
    • Pushed (pushed://): the API host api.pushed.co no longer resolves.
    • Pushjet (pjet://, pjets://): the project is abandoned and its domain redirects to an unrelated site.