NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #1321 most downloaded on PyPI
Push Notifications that work with just about every platform!
Last release today
03 Oct 2026
Ships fairly regularly
a new release about every 5 weeks
Nearly every release is documented
notes for 57 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
9 years old
76 releases · first in 2017
Since the release of v2.0.0 there were some issues raised that I feel were major enough to to warrant a small update release. The big one is the handl
Since the release of v2.0.0 there were some issues raised that I feel were major enough to to warrant a small update release. The big one is the handlng of markdown text.
I had merged a few enhancements too; so they're thrown in this mini release as well.
Apprise is available on PyPI through pip:
# Install Apprise v2.0.1 from PyPI
pip install apprise==2.0.1If you use uv:
# Install the apprise command
uv tool install apprise==2.0.1Full Changelog: v2.0.0...v2.0.1
One column per quarter.
If you are a developer embedding Apprise in your own project, please read the Breaking Changes section below before upgrading. If you are not ready to…
🎉 Welcome to Apprise v2.0.0! 🎉
This is the first official release of Apprise v2. It's a big one. Much of how Apprise works under the hood was rebuilt, and many features people have asked for over the years are finally here:
AppriseResult object returned from every notify() callNote: ⚠️ This is a breaking release for anyone using Apprise v1.x. If you are a developer embedding Apprise in your own project, please read the Breaking Changes section below before upgrading. If you are not ready to move yet, pin your pyproject.toml or requirements.txt to apprise >=1.0.0, <2.0.0. The v1 codebase lives on in the apprise-v1-release branch. I will keep patching it for security issues and bugs where practical for a year or two, but v2.x is the way forward.
notify() now returns an AppriseResult object instead of True/False/None
bool(result) still gives you True/False, so most existing if apobj.notify(...): checks keep working. None can't come back from bool(), so a "nothing matched" result now reads as False.SUCCESS (0) - every service was notified successfully (the old True)FAILURE (1) - the notification failed (the old False)NOMATCH (3) - nothing matched the tags given, or no services were loaded (the old None)PARTIAL (4) - some services succeeded but at least one failed (v1 returned False here)TIMEOUT (5) - a service didn't finish before its time limit (new in v2)format you send with, so it no longer rewrites your content when the service can already accept it as-is.?format=.AppriseException family, so developers can catch everything in one place.ValueError, a disk problem is still an OSError), so existing try/except blocks keep working.APPRISE_CONFIG environment variable is now APPRISE_CONFIG_PATH. The old name still works for now, but prints a deprecation warning.use_pgp= and ?pgpkey= (deprecated back in v1) have been removed. Use pgp_mode= and ?pgppub= instead.?format=) now fail with a clear error message instead of quietly doing something unexpected.deltachat://) support added in #1666wpush://) support added by @anhao in #1721youlmk://) support added by @elilat in #1726telnyx://) support added by @anandghegde in #1731msgtype to markdown so they actually get delivered by @xtqxk in #1733language= and keeps it in url() by @MaxFreedomPollard in #1720url() by @MaxFreedomPollard in #1732attach= filename detection fixed, and filename= is kept in url() by @SulimanAbdulrazzaq in #1744* characters, in #1666${NAME} placeholders to keep secrets (API keys, passwords) out of your config file. Declare the names you use in a new template: section, then supply the values any of these ways:
--template-var api_key=abc123 (or -tv)APPRISE_TEMPLATE_API_KEY=abc123template: sectionapobj.notify(body='test', template={'api_key': 'abc123'})2:alerts. Using --tag alerts notifies your first priority group, and only moves on to the next group if something failed. Handy for "text me only if the email didn't go through". You can still target one group exactly with --tag "2:alerts".?retry= now keeps track of what already went out. If you're sending to 3 people and only 1 fails, the retry only re-sends to the one that failed instead of spamming everyone again. Retries can also be set on the fly with --tag "alerts:3".--limit 10 caps the entire run--service-limit 5 caps each service on its own (defaults to 60 seconds)--disable-async if you prefer the old one-at-a-time behavior.await apobj.async_notify().apprise:// service (for talking to an Apprise API server) no longer puts your configuration ID in the web address, which keeps it out of server access logsterminal-notifier in #1724
terminal-notifier wrapper followed in #1742apprise-v1-release for anyone who needs to stay on v1Apprise is available on PyPI through pip:
# Install Apprise v2.0.0 from PyPI
pip install apprise==2.0.0If you use uv, you can install the apprise command in its own isolated environment, or add Apprise to your uv project:
# Install the apprise command
uv tool install apprise==2.0.0
# Or add it to your own project
uv add "apprise>=2.0.0,<3.0.0"Not ready for v2 yet? Stay on the v1 series with:
pip install "apprise>=1.0.0,<2.0.0"Full Changelog: v1.13.1...v2.0.0
v2.x will be awesome, but it WILL introduce breaking changes your software may need to adapt to. I will still continue supporting the v1.x branch shou…
Just a small update to fix a small stability issue with Attachments under some circumstances and the few PR's made by others in one more small bundle.
Note: ⚠️ This will be the last version of Apprise v1.x (this time i mean it 😉 ) . Future releases will be under Apprise v2.x. Again, I strongly want to urge Developers: please make sure you pin your projects.toml or requirements.txt to apprise >=1.0.0, <2.0.0. v2.x will be awesome, but it WILL introduce breaking changes your software may need to adapt to. I will still continue supporting the v1.x branch should security issues arise for at year or two, but eventually v2.x would be the way to go.
n/a
Apprise is available on PyPI through pip:
# Install Apprise v1.13.1 from PyPI
pip install apprise==1.13.1Full Changelog: v1.13.0...v1.13.1
v2.x will be awesome, but it will introduce breaking changes your software may need to adapt to. I will still continue supporting the v1.x branch shou…
This update clears out our backlog of resolved bugs and introduces a few new services. While it’s a standard maintenance release, we want to give a massive shoutout to our community. The level of support we've received for this update is truly incredible; there were more commits/PRs from you than there were from me and that has never happend before 🙂 . Your contributions are deeply appreciated! Seriously!
Note: ⚠️ This will be the last version of Apprise v1.x. Future releases will be under Apprise v2.x. This means: Developers, please make sure you pin your projects.toml or requirements.txt to apprise >=1.0.0, <2.0.0. v2.x will be awesome, but it will introduce breaking changes your software may need to adapt to. I will still continue supporting the v1.x branch should security issues arise for at year or two, but eventually v2.x would be the way to go.
Apprise is available on PyPI through pip:
# Install Apprise v1.13.0 from PyPI
pip install apprise==1.13.0Full Changelog: v1.12.0...v1.13.0
Apprise now supports more than 150 services! HTML -> Markdown Support now built into Apprise. But otherwise this is just a monthly release bundling al
Apprise now supports more than 150 services! HTML -> Markdown Support now built into Apprise. But otherwise this is just a monthly release bundling all of the bugfixes, enhancments and new services that have accumulated since the last. https://appriseit.com under went a few renovations of it's own; new icons; a much improved and more useful URL Builder and and improved the search functionality on Service List section.
Apprise is available on PyPI through pip:
# Install Apprise v1.12.0 from PyPI
pip install apprise==1.12.0
Full Changelog: https://github.com/caronc/apprise/compare/v1.11.0...v1.12.0
Apprise now supports more than 150 services! HTML -> Markdown Support now built into Apprise. But otherwise this is just a monthly release bundling all of the bugfixes, enhancments and new services that have accumulated since the last. https://appriseit.com under went a few renovations of it's own; new icons; a much improved and more useful URL Builder and and improved the search functionality on Service List section.
Apprise is available on PyPI through pip:
# Install Apprise v1.12.0 from PyPI
pip install apprise==1.12.0Full Changelog: v1.11.0...v1.12.0
A big win for this release is priortization of grouped/tagged content. Basically, this release allows you to tag multiple items and provide a weight t
A big win for this release is priortization of grouped/tagged content. Basically, this release allows you to tag multiple items and provide a weight to them. Apprise will attempt to notify the highest priority/weighted services first (of same level), and only if this level fails will it try the next. Tagging is no longer just a tag. It's now weight:tag too; for example 100:friends associates the weight of 100 with the tag friends. You can still continue to notify friends with your Apprise calls, but if there are weight categories, then these will be factored into the order. Highest priority (weighted) tags have a lower integer value (zero being the higest priority). Only the next priority will be notified if the first fails.
This releae also allows you to set up a notifiation service to gracefully fail and not have Apprise itself report a failure. This is useful for situations where you notify several end points and you really don't care if they're unavailable or not. Apprise wil do it's usual best effort to send the notification, but not treat it as a failure if it can't get through. Use optional=yes on your Apprise URL.
Thirdly, this release introduces retries! You can now have Apprise attempt to notify your endpoint a second, or a third, (up to 10x) tries before giving up and deeming it unable to send the notification. Use retry=X on your Apprise URL
Apprise is available on PyPI through pip:
# Install Apprise v1.11.0 from PyPI
pip install apprise==1.11.0
Full Changelog: https://github.com/caronc/apprise/compare/v1.10.0...v1.11.0
A big win for this release is priortization of grouped/tagged content. Basically, this release allows you to tag multiple items and provide a weight to them. Apprise will attempt to notify the highest priority/weighted services first (of same level), and only if this level fails will it try the next. Tagging is no longer just a tag. It's now weight:tag too; for example 100:friends associates the weight of 100 with the tag friends. You can still continue to notify friends with your Apprise calls, but if there are weight categories, then these will be factored into the order. Highest priority (weighted) tags have a lower integer value (zero being the higest priority). Only the next priority will be notified if the first fails.
This releae also allows you to set up a notifiation service to gracefully fail and not have Apprise itself report a failure. This is useful for situations where you notify several end points and you really don't care if they're unavailable or not. Apprise wil do it's usual best effort to send the notification, but not treat it as a failure if it can't get through. Use optional=yes on your Apprise URL.
Thirdly, this release introduces retries! You can now have Apprise attempt to notify your endpoint a second, or a third, (up to 10x) tries before giving up and deeming it unable to send the notification. Use retry=X on your Apprise URL
Apprise is available on PyPI through pip:
# Install Apprise v1.11.0 from PyPI
pip install apprise==1.11.0Full Changelog: v1.10.0...v1.11.0
The big wow factor of this release would be the huge effort put into Matrix E2EE built into Apprise without adding overhead to the plugin itself. Huge
The big wow factor of this release would be the huge effort put into Matrix E2EE built into Apprise without adding overhead to the plugin itself. Huge props to those that helped out. Other than that, a few more services have been added (137 supported now 🚀 ).
The official documentation website (https://appriseit.com) got a nice cleanup; the Service listings are now searchable; some nice tweaks to the URL Builder as well.
tags= conflicted with tags= in Apprise)Apprise is available on PyPI through pip:
# Install Apprise v1.10.0 from PyPI
pip install apprise==1.10.0Full Changelog: v1.9.9...v1.10.0
This is a mini release, but it fixes some issues with XMPP and adds other improvements to how the plugins are defined. This release will complete all
This is a mini release, but it fixes some issues with XMPP and adds other improvements to how the plugins are defined. This release will complete all the steps needed to open up the new URL Builder.
Specifically URL Builder Preparration:
Apprise is available on PyPI through pip:
# Install Apprise v1.9.9 from PyPI
pip install apprise==1.9.9
Full Changelog: https://github.com/caronc/apprise/compare/v1.9.8...v1.9.9
This is a mini release, but it fixes some issues with XMPP and adds other improvements to how the plugins are defined. This release will complete all the steps needed to open up the new URL Builder.
Specifically URL Builder Preparration:
Apprise is available on PyPI through pip:
# Install Apprise v1.9.9 from PyPI
pip install apprise==1.9.9Full Changelog: v1.9.8...v1.9.9
It's been a few months now; Apprise is due for a release containing all of the issues that have been resolved. I feel the big highlights of this relea
It's been a few months now; Apprise is due for a release containing all of the issues that have been resolved. I feel the big highlights of this release are IRC, Fluxer, and the return of XMPP support!
Continue to refer to https://AppriseIt.com for your documentation needs.
n/a
Apprise is available on PyPI through pip:
# Install Apprise v1.9.8 from PyPI
pip install apprise==1.9.8
Full Changelog: https://github.com/caronc/apprise/compare/v1.9.7...v1.9.8
It's been a few months now; Apprise is due for a release containing all of the issues that have been resolved. I feel the big highlights of this release are IRC, Fluxer, and the return of XMPP support!
Continue to refer to https://AppriseIt.com for your documentation needs.
n/a
Apprise is available on PyPI through pip:
# Install Apprise v1.9.8 from PyPI
pip install apprise==1.9.8Full Changelog: v1.9.7...v1.9.8
Big changes of this release is we're back at 100% test coverage plus a new documentation source: https://AppriseIt.com
Big changes of this release is we're back at 100% test coverage plus a new documentation source: https://AppriseIt.com
Apprise is available on PyPI through pip:
# Install Apprise v1.9.7 from PyPI
pip install apprise==1.9.7
Full Changelog: https://github.com/caronc/apprise/compare/v1.9.6...v1.9.7
Big changes of this release is we're back at 100% test coverage plus a new documentation source: https://AppriseIt.com
Apprise is available on PyPI through pip:
# Install Apprise v1.9.7 from PyPI
pip install apprise==1.9.7Full Changelog: v1.9.6...v1.9.7
46elks support in https://github.com/caronc/apprise/pull/1438
<code> blocks wrapped in <pre> for syntax highlighting by @hmnd in https://github.com/caronc/apprise/pull/1423Apprise is available on PyPI through pip:
# Install Apprise v1.9.6 from PyPI
pip install apprise==1.9.6
Full Changelog: https://github.com/caronc/apprise/compare/v1.9.5...v1.9.6
<code> blocks wrapped in <pre> for syntax highlighting by @hmnd in #1423Apprise is available on PyPI through pip:
# Install Apprise v1.9.6 from PyPI
pip install apprise==1.9.6Full Changelog: v1.9.5...v1.9.6
This is just a small release to bundle accumulated changes since v1.9.4.
This is just a small release to bundle accumulated changes since v1.9.4.
n/a
Apprise is available on PyPI through pip:
# Install Apprise v1.9.5 from PyPI
pip install apprise==1.9.5
Full Changelog: https://github.com/caronc/apprise/compare/v1.9.4...v1.9.5
This is just a small release to bundle accumulated changes since v1.9.4.
n/a
Apprise is available on PyPI through pip:
# Install Apprise v1.9.5 from PyPI
pip install apprise==1.9.5Full Changelog: v1.9.4...v1.9.5
It has been some time since I pushed a release; so this one just bundles all of the outstanding fixes/enhancments together.
It has been some time since I pushed a release; so this one just bundles all of the outstanding fixes/enhancments together.
This release introduces a major refactor of the code base to modernize it (for Python v3.9+). The change added more then 13,000 lines of code and refactored 70,000 lines. It took a very, very long time to do, but I'm happy how things turned out. It should make it easier for others to adapt and add to the code base. This change also greatly improved the type hinting offered by the library. I debated marking this release v2.0.0 due to the signifgance of it, but will just bump the minor to catch any fallout from the change I may have overlooked.
Please don't hesitate to open a ticket if you find any issus at all.
Add Codecov Test Analytics by @katia-sentry in #1321
Removed LunaSea as it's services are offline as of April 30th, 2025 in #1362
🔥 Apprise Build System Modernization (PEP 621 / RPM CI) in #1368
setup.py with pyproject.toml (setuptools.build_meta backend)[project.keywords]BSD-2-Clause)tox -e release for full packaging lifecycle.coverage files now consistently written to root; parallel coverage disabled for simpler merging${{ matrix.os }}-${{ matrix.python-version }}-${{ matrix.tox_env }}tox.ini now supports clean qa, minimal, and release testing workflowsruff linter applied to entire code-base.pyi files dropped and type hinting integrated into main code baseEL9 RPM build container public; workflow fixed to accommodate in #1375
Apprise is available on PyPI through pip:
# Install Apprise v1.9.4 from PyPI
pip install apprise==1.9.4Full Changelog: v1.9.3...v1.9.4
It has been some time since I pushed a release; so this one just bundles all of the outstanding fixes/enhancments together.
It has been some time since I pushed a release; so this one just bundles all of the outstanding fixes/enhancments together.
Apprise is available on PyPI through pip:
# Install Apprise v1.9.3 from PyPI
pip install apprise==1.9.3
Full Changelog: https://github.com/caronc/apprise/compare/v1.9.2...v1.9.3
This is a mini release to tuck some of the recent changes requested so they're available to all.
This is a mini release to tuck some of the recent changes requested so they're available to all.
Apprise is available on PyPI through pip:
# Install Apprise v1.9.2 from PyPI
pip install apprise==1.9.2
Full Changelog: https://github.com/caronc/apprise/compare/v1.9.1...v1.9.2
Dropped Python v3.7 GH Action Test Support (deprecated) https://github.com/caronc/apprise/pull/1224
This is a very long over-due release that includes all of the accumulated changes in Apprise. Happy Holidays!
?verify=no provided in Apprise URLs. This still continues to work with the previously pinned version of paho-mqtt < 2.0) but not with the newer versions. (see https://github.com/caronc/apprise/issues/802 for more details).Apprise is available on PyPI through pip:
# Install Apprise v1.9.1 from PyPI
pip install apprise==1.9.1
Full Changelog: https://github.com/caronc/apprise/compare/v1.9.0...v1.9.1
The largest change introduced in this build is the new Persistent Storage setup which will greatly reduce and optimize a lot of existing and new suppo
The largest change introduced in this build is the new Persistent Storage setup which will greatly reduce and optimize a lot of existing and new supported plugins.
?format=markdown&mdv=v2 to your URL to change this.Apprise is available on PyPI through pip:
# Install Apprise v1.9.0 from PyPI
pip install apprise==1.9.0
Full Changelog: https://github.com/caronc/apprise/compare/v1.8.1...v1.9.0
setup.py deprecation workaround with --use-pep517
A lot of new changes; this release was long overdue. It was really great to see so much user contribution this time around! Very impressive and much appreciated! :tada:
Apprise is available on PyPI through pip:
# Install Apprise v1.8.1 from PyPI
pip install apprise==1.8.1
Full Changelog: https://github.com/caronc/apprise/compare/v1.8.0...v1.8.1
:point_up: Attention Developers: there is a potential Breaking Change in this release. CLI users will not be impacted.
:point_up: Attention Developers: there is a potential Breaking Change in this release. CLI users will not be impacted.
PR #1119 involved the refactoring of all the internal file/module structure of the Apprise library. The hope is I didn't break anything in your source code :pray: . The change was required in order to remain compatible with Python v3.11+ in conjunction with library importing and how it works under the hood. More details on the specific issue can be found here demonstrating it. The Python Issue I opened in reguards to this made it clear I needed to adapt the fix on my side and conform to a better file based structure.
The side effect of this massive change developers may see (if any at all) is just the way your import calls are made. If you always followed the examples provided on this GitHub project, you'll have no issues at all. However, if you got clever and leveraged some of the under-the-hood compontents Apprise is built upon, then you may have an issue. The good news is the ONLY thing impacted is the way you imported your libraries (they just slightly moved around). An example of this is someone who may have had:
# For example:
from apprise.plugins.NotifyEmail import NotifyEmail
# This has changed to :
from apprise.plugins.email import NotifyEmail
# All other object functionality has not changed at all
Documented imports still work perfectly (both before and after this major refactor) such as:
from apprise import Apprise
from apprise import AppriseAsset
# etc...
n/a
http:// attachment URLs (#1122)
cache= become case sensitive too (e.g Cache= will no longer be parsed).ClassName.py to not include a class ClassName inside. Python has issues with import and unittest references when this is done. unittests break completely in Python v3.11 using this method making this massive refactoring essential.clicksend:// authentication bugfix in https://github.com/caronc/apprise/pull/1121apprise//) token length by @isometimescode in https://github.com/caronc/apprise/pull/1120Apprise is available on PyPI through pip:
# Install Apprise v1.8.0 rom PyPI
pip install apprise==1.8.0
Chantify Support added in #1098
delay= switch to aprs:// plugin (#1107)host parsed from user login (if present) for Emails in https://github.com/caronc/apprise/pull/1095Apprise is available on PyPI through pip:
# Install Apprise v1.7.6 from PyPI
pip install apprise==1.7.6
Free-Mobile Support added in #1090
Apprise is available on PyPI through pip:
# Install Apprise v1.7.5 from PyPI
pip install apprise==1.7.5
.conf configuration file support added to CLI. This PR also resolved some documentation ambiguity in https://github.com/caronc/apprise/pull/1080
.conf configuration file support added to CLI. This PR also resolved some documentation ambiguity in https://github.com/caronc/apprise/pull/1080Apprise is available on PyPI through pip:
# Install Apprise v1.7.4 from PyPI
pip install apprise==1.7.4
Another minor release to push some outstanding bug-fixes that have accumulated and patched over the past month
Another minor release to push some outstanding bug-fixes that have accumulated and patched over the past month
mailto:// comcast.net email template added (#1059)mailto:// improved custom email server handling (5ae212fbafb94a3d03c61739d2e81f7502595902)
to= and from_addr= are no longer required in most circumstances and can be automatically determined based on basic information provided.ntfy:// markdown support added (#1056)
?format=markdown to format the content accordinglypaho-mqtt v2.0 was released and it's documentation for v1.6.1 was completely incompatible with it. For the stability of the mqtt:// plugin, paho-mqtt has been pinned to the stable v1.x release (#1065)yaml files (#1069) - Thank you @samueltardieu
.yml and .yaml files by default (#1073)macosx:// - Update terminal-notifier notify_paths (#1052) - Thank you @joergschultzelutterApprise is available on PyPI through pip:
# Install Apprise v1.7.3 from PyPI
pip install apprise==1.7.3
This was just a second small release add some improvements and bug fixes
This was just a second small release add some improvements and bug fixes
See the release notes for Apprise v1.7.0 to see all of the bells and whistles now available!
overflow features split and truncate (#1035 & #1038)Apprise is available on PyPI through pip:
# Install Apprise v1.7.2 from PyPI
pip install apprise==1.7.2
This was just a small release to patch a small bug (#1032) preventing Apprise v1.7.0 from being compatible with the Apprise API.
This was just a small release to patch a small bug (#1032) preventing Apprise v1.7.0 from being compatible with the Apprise API.
See the release notes for Apprise v1.7.0 to see all of the bells and whistles now available!
Apprise is available on PyPI through pip:
# Install Apprise v1.7.1 from PyPI
pip install apprise==1.7.1
APRS (Automated Packet Reporting System) Ham Radio Support added. (#1005); thanks @joergschultzelutter
:slightly_smiling_face: (as an example) in your apprise message body and have it swap to :slightly_smiling_face:In your Apprise URL, simply add the parameter emojis=yes and they will be ran against that service only:
# The below would run the title and body through the emoji engine to produce their unicode
# emoji equivalent..
# :rocket: would become 🚀 and :+1: would become 👍
apprise --title=":+1: Great work everyone!" \
--body="So proud of you all! :rocket:." \
"myschema://credentials?emojis=yes"
You can also ensure that the emoji engine is always turned on via the CLI using the switch --interpret-emojis or it's synonymous equivalent -j
# again ... :rocket: would become 🚀 and :+1: would become 👍
apprise --title=":+1: Great work everyone!" \
--body="So proud of you all! :rocket:." \
--interpret-emojis
"myschema://credentials"
In your Apprise Asset object, just set emojis=True. This becomes a bit more of a global switch and turns on the emoji support for all notifications regardless if the emojis=yes is set on the URL.
import apprise
# if set to True:
# Emoji Engine is enabled by default (but can be over-ridden on a per-url base ?emojis=no
# if set to False:
# Emoji Engine is never enabled (regardless of URL definition)
# if set to None (Default):
# Emoji Engine is enabled on demand (per URL definition only)
asset = apprise.AppriseAsset(emojis=True)
apobj = apprise.Apprise(asset=asset)
# The below will be passed through the emoji engine because the asset enabled it
# by default
apobj.add("myschema://credentials")
# The below will never use the emoji engine, regardless if it is enabled or not:
apobj.add("myschema://credentials?emojis=no")
?emojis=no, then the engine will never be applied against it.tgram://) supports topics inline per target specified (#1028)
tgram://{bot_token}/tgram://{bot_token}/{chat_id}/tgram://{bot_token}/{chat_id1}/{chat_id2}/{chat_id3}/tgram://{bot_token}/{chat_id}:{topic}/tgram://{bot_token}/{chat_id1}:topic1}/{chat_id2}:{topic2}/{chat_id3}:{topic3}/tgram://{bot_token}/{chat_id1}/{chat_id2}:{topic2}/{chat_id3}/discord://) support for user and role ping support (#1004).
<@123><@&456>@everyoneApprise is available on PyPI through pip:
# Install Apprise v1.7.0 from PyPI
pip install apprise==1.7.0
mqtt:// added log entry on successful transmission for both consistency and to align with other plugins
mqtt:// added log entry on successful transmission for both consistency and to align with other plugins (#946)
Refactored URLBase() object to prepare for API Webhook support in the Apprise API (#973)
A global change to handles user= directive a better and auto-solves ambiguous situations where the URL looks like this: schema://username@hostname?user=username2 (#947).
In the past the username would get lost and be trumped with username2. This is fine, but to may Apprise more versatile, Now in these circumstances Apprise will interpret it as: schema://password@hostname?user=username. This change does not disrupt other common formatting such as:
schema://username:password@hostnameschema://username@hostnameschema://hostname?user=username&password=passwordDefault Attachment maximum attachment size changed from 5MB to 1GB (be3baed7e3d33bae973f1714df4ebbf65aa33f85). This just makes it easier to use the API and CLI without issues. It lets the upstream service complain if the attachment is too large instead of Apprise restricting you.
xml:// custom URL parsing better handles customized XML elements (inserted, renamed and deleted); (#945).
Configuration now supports Groups. You can now assign pre-defined tags to groups and trigger your notifications off of them. (#967)
Groups are processed at the end, so there is no requirement to define it at the front or end of your configuration files.
Group definitions stack as well (so defining the same group again with append any entries to what was already assigned.
You can assign more groups to groups
You can assign multiple groups in one single declaration
Here is a simple TEXT example:
# assign "tag1" and "tag2" to the group "group"
group = tag1, tag2
# Group assigned to a group plus another tag
groupA = group, tag3
# Support multi-assignments (also stackable)
# both groupB and groupC would acquire tag1 and tag4
groupB, groupC = tag1, tag4
# Append another tag into a group already defined
group = tag4
# Just some URLs defined as examples
tag1 = mailto://credentials
tag2 = mailto://credentials
tag3 = mailto://credentials
tag4 = mailto://credentials
If you were to send your notification to the tag group it would in fact trigger both tag1, tag2, and tag4:
apprise -g 'group' -b "Test Message!"
Here is a simple YAML example:
# You must define a groups section
groups:
group: tag1, tag2
groupA: group, tag3
group: tag4
# Support multi assignments:
groupB, groupC: tag1, tag4
# Another way you can define your groups:
groupD:
- tagX: Place an optional comment here; this is ignored and only tagX is retrieved
- tagY: Another spot to place an optional comment
# You can also just list them:
groupG:
- tag1
- tag3
- group
# Define your tags as usual here:
urls:
- json://localhost:
- tag: tag1
- form://localhost:
- tag: tag2
- mailto://credentials:
- tag: tag3
- mailto://credentials:
- tag: tag4
x:// in addition to tweet:// and twitter:// to align with re-branding (#971)?v=2 to your Apprise URL to use the older API for now. (#970)Apprise is available on PyPI through pip:
# Install Apprise v1.6.0 from PyPI
pip install apprise==1.6.0
Python 3.11 getdefaultlocale() deprecation warnings now handled
rsyslog:// split from the original syslog:// Servicehref= variable that can be set on the Apprise URL which allows you to leverage the embed part of the API and turn your title into a hyperlink to the specified location. You can also use url= (as an alias to href=) (#927)body if at least 1 attachment was provided. This expands the use of Apprise to not constrict you to always include a body when the only intent you had was to post an attachment.
# For the CLI you are still required to set the `--body` to "", but this no longer
# generates an error
apprise --attach="/path/to/attachment.zip --body ""
Apprise.details() improvements
attachment_support variable added (#916)# as an example ...
import apprise
import pickle
# Instantiate our object
apobj = apprise.Apprise()
# Add our URLs
apobj.add("json://localhost")
apobj.add("xml://localhost")
apobj.add("form://localhost")
apobj.add("mailto://user:pass@localhost")
# Now serialize our object for any purpose
serialized = pickle.dumps(apobj)
# do what you will; write this to disk, send it to a remote
# server, etc.
# We can re-load our serialized content and turn it back into
# and object like so:
apobj_n2 = pickle.loads(serialized)
getdefaultlocale() deprecation warnings now handled (#754) placed in the Title/Subject of some notifications; this has now been fixed. (#914)gettext() no longer installs _ into the global namespace, but instead keeps the _ at an apprise module scope. (#821)Apprise is available on PyPI through pip:
# Install Apprise v1.5.0 from PyPI
pip install apprise==1.5.0
Use UTC Aware Timezones throughout code to eliminate (Naive Time Based) deprecation warnings for Python v3.12
pover://) (#843)ntfy://) now correctly displays attached images inline (#892)matrix://) bugfix with the internal URL generation when a port is not provided. (#900)tgram://) correctly places attachments in thread when specified (#893)Apprise is available on PyPI through pip:
# Install Apprise v1.4.5 from PyPI
pip install apprise==1.4.5
Apprise API apprise:// attachment support added! :rocket: . (#873 and #877)
apprise:// attachment support added! :rocket: . (#873 and #877)
apprise -vv -b "Test" "apprise://localhost/config_id" \
--attach=/path/to/something.jpeg
:value=key and add data into the payload of the custom supported Apprise endpoints (JSON, FORM and XML). But now you can change the mapping of the fixed ones that were always present. Hence :message=body would cause the payload to no longer put the message passed by apprise in the hard-coded message field. In this example, the payload would appear under a new tag called body. <br/><br/>You can also set the values to be empty if you want to strip them from the payload. For example :version= would eliminate the version (previously hard-coded) payload element from the response./etc/apprise among other paths added to the default search for configuration files when the apprise CLI tool is used.tgram:// Topic ID Support Added (#854)slack:// Channel Support (#856)
<!channel|desc> & <!channel>len(Service) calls #874
async re-factoring improvements; the overhead of creating a thread-pool is now bypassed if it is detected that only one (1) notification is required to be sent. (#846).py files hand-written) handling improvements. No longer is every file found interpreted. It must be a .py file (#853)Apprise is available on PyPI through pip:
# Install Apprise v1.4.0 from PyPI
pip install apprise==1.4.0
This could show up as a breaking change for some people who leveraged async_notify() in the past. Please read below.
ntfy:// added support for Icons now.
avatar_url= keyword argument to point to their own custom one (#822)ntfy:// support for Authentication Tokens (in addition to user/pass) (#830)form// has a new parameter called attach-as which allows you to over-ride the meta field id (such as file01, file02, etc) assigned to files (attachments) in the payload. (#827)
meta01, or document, etc. Setting this value does not have any impact until 1 or more attachments are also part of the payload.?attach-as=document, or ?attach-as=meta*. the * allows for support of multiple files. Apprise will spit out a warning if you don't provide a * when over-riding this AND you send more then 1 attachment up.async section of the Apprise code. (#817) - Thank you @YoRyan :rocket:
async_notify() in the past. Please read below.webex:// updated to support the new API servers used by them (#815)async Re-factoringThe async_notify() handling was completely re-factored in this release. The changes properly implement the function as how it was intended to work. Previously the design was arranged in such a way to remain backwards compatible with Python v2.
After this release the following works for those who want to leverage it:
from apprise import Apprise
async my_async_function():
# Now you can use the async_notify() call
await apobj.async_notify(
body='what a great notification service!',
title='my notification title',
)
Note: There is no breaking change to those using the notify() call however the the asynchronous handling was changed beneath it.
mqtt:// unsigned certificates can skip their verification if the user chooses to verify=No to behave like other services (#825)python3-certifi to Apprise RPM (093cc272b15b70e9e5d1101e2ea4878e6947d225)form:// now no longer throws an exception when an attachment is provided (#826)Apprise is available on PyPI through pip:
# Install Apprise v1.3.0 from PyPI
pip install apprise==1.3.0
This release just includes some minor enhancements and bug-fixes to bundle that accumulated since v1.2.0.
This release just includes some minor enhancements and bug-fixes to bundle that accumulated since v1.2.0.
n/a
macosx:// added support for click= keyword argument to support hyperlinks (#789)
-open in the terminal-notifier underlining toolmailto:// better handling of emails that contain a + in their username (#779)mailto:// re-factored bulk email transfers to re-use already open connection ( #774) - thanks @amotld7sms:// ) to support its new API (not backwards compatible with previous) (#791)slack:// correctly returns success message when applicable (#777)Apprise is available on PyPI through pip:
# Install Apprise v1.2.1 from PyPI
pip install apprise==1.2.1
mailto:// handling of name= and from= are now synonymous.
mailto:// handling of name= and from= are now synonymous. (#738)gchat:// supports threadKey argument (#753)pagerduty:// allows manual over-ride of severity= option (which prevents the Apprise auto-assignment from kicking in). (#726)mailto:// efficiency improvements (#679)slack:// URL Markdown support added (#737)mailto:// handles outlook.com domains correctly now (#755)discord:// improved markdown support (#718)yaml files correctly parse rto and cto correctly (#751)nctalk:// improvements to fix it's handling with API. (#669)opsgenie:// bugfix introduced in Apprise v1.1.0 resolved (#688)Apprise is available on PyPI through pip:
# Install Apprise v1.2.0 from PyPI
pip install apprise==1.2.0
SMSEagle Notification Support Added
# Redhat/Rocky/ALMA/Scientific/Oracle Linux 9 instructions:
sudo dnf config-manager --set-enabled crb
sudo dnf install epel-release epel-next-release
# Now install Apprise
sudo dnf install apprise
signal:// to support groups ending with an = (equal) symbol (#670)opsgenie:// no longer double stacks body in larger messages (#655)bark:// correctly handles custom ports (#672)mailto:// delivery improvements to better follow mail guidelines (less likely to get email identified as spam) (#660)pagerduty:// bug-fix to correct sendingApprise is available on PyPI through pip:
# Install Apprise v1.1.0 from PyPI
pip install apprise==1.1.0
:rocket: Finally after 2 years the v1.0.0 release is a reality; the code has been deemed stable enough!
:rocket: Finally after 2 years the v1.0.0 release is a reality; the code has been deemed stable enough!
@notify decorator and trigger their own notifications that they define.vonage:// support (in replace of legacy nexmo:// (#605)Apprise is available on PyPI through pip:
# Install Apprise v1.0.0 from PyPI
pip install apprise==1.0.0
Bark Notification Support Added
-) (#581)Apprise is available on PyPI through pip:
# Install Apprise v0.9.9 from PyPI
pip install apprise==0.9.9
Ntfy Support added. (#524 and #571)
always special tag added. Any notifications tagged with this will always be notified regardless of additional tag filters provided there-after. It's like placing a trump card onto one or more notification defined notification services to ensure they are always triggered.<br/> was inserted into all new messages (and is unsupported by the upstream service.Apprise is available on PyPI through pip:
# Install Apprise v0.9.8.3 from PyPI
pip install apprise==0.9.8.3
Nothing published for this version
Nothing published for this version
Nothing published for this version
Custom FORM Posts Support added.
?method=get then payload is placed in the URL parameters (encoded) instead of payload/response./opt/homebrew/bin/terminal-notify added to search path added of MacOSX Notification (#509)?method= option allowing you to change the default (from POST) to GET, DELETE, PUT, and HEAD).image_url, priority, and color.mailto://user:pass@qq.com and Apprise will look after the rest for youmailto://user:pass@163.com and Apprise will look after the rest for youn/a
Apprise is available on PyPI through pip:
# Install Apprise v0.9.7 from PyPI
pip install apprise==0.9.7
This is an alternative to the --config= allowing you to still signal an Apprise API server to trigger notifications you have stored their
--config= allowing you to still signal an Apprise API server to trigger notifications you have stored theirurl= and url_title= as part of the Apprise URLsilent mode or disable web page previews. (#466)
silent=yes and/or preview=no as part of the Apprise URLmsgtype=notice as part of the Apprise URL to switch the type over--details (-l) which prints a nice detailed list of what plugins are currently loaded based on the OS environment. It also prints details of what is required to make non working plugins active. Here is an example of the output (as it is now) on the CLI: <br/>cryptography is no longer a package requirement of Apprise (#483)--interpret-escapes (-e) now works without --title specified (#471)avatar_url in .url() callsslixmppApprise is available on PyPI through pip:
# Install Apprise v0.9.6 from PyPI
pip install apprise==0.9.6
Note that the MQTT Plugin depends on paho-mqtt having been pre-installed: `bash pip install paho-mqtt `
pip install paho-mqtt
?format=html on the Apprise URL?version=21) if one is specified.?format=html on the Apprise URLApprise is available on PyPI through pip:
# Install Apprise v0.9.5.1 from PyPI
pip install apprise==0.9.5.1
Apprise.async_notify() function for developers who want to directly leverage the async calls. async_notify() works the same way as notify() (except mo
Apprise.async_notify() function for developers who want to directly leverage the async calls. async_notify() works the same way as notify() (except more efficient). This only works for Python v3.x users (#397)basic mode updated to work correctly with new restrictions put in place (to prevent people from assuming another's identity). (#419)to) now parse correctly (#404)Apprise is available on PyPI through pip:
# Install Apprise v0.9.4 from PyPI
pip install apprise==0.9.4
Re-factored Telegram HTML Escape handling (#358 and #373)
n/a
n/a
Apprise is available on PyPI through pip:
# Install Apprise v0.9.3 from PyPI
pip install apprise==0.9.3
Fixed path issue with Home Assistant notifications
n/a
n/a
Apprise is available on PyPI through pip:
# Install Apprise v0.9.2 from PyPI
pip install apprise==0.9.2
Slack can now accept email targets. This will perform a lookup on the workspace to see if the user exists and notify them if they do. This feature onl
email targets. This will perform a lookup on the workspace to see if the user exists and notify them if they do. This feature only works if you've configured a Slack bot.--interpret-escapes (-e). (#349)
\n and \r and have them translate into their equivalent ascii newline and carriage return charactersslixmpp library for Python v3.7+ users (#240)Apprise is available on PyPI through pip:
# Install Apprise v0.9.1 from PyPI
pip install apprise==0.9.1
Google Firebase Cloud Messaging (FCM) Support added.
%keyword% which gets swapped with it's corresponding value once the email gets prepared.mailto://) updated to support Email Headers passed in through the Apprise URL.notify() and extrapolate the generated logs from each call. This is very useful when notifying more than 1 service and trying to determine where something may have gone wrong. Content can be captured to both memory and files. More details can be found here, #306 and PR #311.@zohomail.com domainSTARTTLS (port 567) now vs SSL on 465_) are now accepted in hostnames during parsing (even though technically they aren't allowed) - #324APPRISE_URLS: When defined, you can pre-provide apprise with a set of one or more URLs it can use to notify by default.APPRISE_CONFIG: You can set this to the absolute path of an Apprise Configuration File (either TEXT or YAML based).--config or -c) is also specified as it will be ignored--tag or -g) is also specified as it will be ignoredAPPRISE_URLS
--tag or -g) is also specified as it will be ignoredAPPRISE_CONFIGuser_key and token have been eliminated in Apprise. These have been left for the upstream server (in this case Pushover) to validate instead. #313stream instead of channel #330Apprise is available on PyPI through pip:
# Install Apprise v0.9.0 from PyPI
pip install apprise==0.9.0
Microsoft Teams Templating (#292)! The ability to provide your own MessageCard instead of using the built in one. The templating engine requires no ad
MessageCard instead of using the built in one. The templating engine requires no additional includes and additionally supports dynamic tokens that you can pass in through the Apprise URL; see #299 for details.mailto:// Plugin (#303)cloud mode support fixed (#293)Apprise is available on PyPI through pip:
# Install Apprise v0.8.9 from PyPI
pip install apprise==0.8.9
Removed deprecated code along with their paired notices that have been all lingering for more than a year now
--disable-async or -Da on the command line to disable this and go back to the legacy synchronous method which much slower when dealing with more then one notification.AppriseAsset(async_mode=False) before passing the asset into the Apprise() object to disable this.include allowing further (Apprise) configuration files to be parsed. (#226) :rocket:
include http://localhost/path/to/more/configuration/entries
# No limit to the number of includes you specify
include file:///path/to/another/configuration/file/on/your/system
include:
- http://localhost/path/to/more/configuration/entries
# No limit to the number of includes you specify
- file:///path/to/another/configuration/file/on/your/system
include value:
include entries are disabled unless the developer sets recursion to a value greater than it's default of zero (0) when initializing a AppriseConfig() object. e.g: AppriseConfig(recursion=1). A value of 1 allows 1 level of includes to work. However, if the configuration include also contains an include statement, it would be ignored. You can increase the level of recursion to whatever you wish.apprise tool by default has a recursion of one (1) allowing one level of include statements to be executed. This can be altered by setting the --recursion-depth=<value> (-R <value>) switch.include statements have restrictions on the content being included. For example, a file:// can include another file://. But a http:// can not include a file://. A file:// can however include a http://. All of this has been put in place for security reasons. A server hosting Apprise through a website by default will never allow a user to include local files into the configuration. Developers can disable this feature by setting insecure_includes to True when initializing a AppriseConfig() object. e.g: AppriseConfig(recursion=1, insecure_includes=True).Full Name user@domain.comFull Name: user@domain.comFull Name <user@domain.com>Full Name : <user@domain.com>
<br/>Services that can utilize the Full Name will make it part of the To or Cc delivery if specified (accompanied with the email it's associated with)./bin directory to repository which just contains a few test tools that make it easier to test the code in development.
apprise: a way of executing the code straight after pulling down the source code. This really helps in testing new features being developed right within the very branch you're working in.test.sh: a simple script you can use to run the unit tests and/or even a very specific one (or set of them).checkdone.sh: a simple script that runs a few checks against the entire code checked out to verify if there are any errors (instead of waiting for the Travis-Ci to inevitably catch them)icon= URL argument so that you can over-ride the default icon assigned and instead choose from any of the ones provided on their website here.Apprise.url() (#275)Apprise is available on PyPI through pip:
# Install Apprise v0.8.8 from PyPI
pip install apprise==0.8.8
LaMetric Time/Clock Support added.
cto= parameter on your Apprise URL.rto= parameter on your Apprise URL.--verbose switch (-v)kodi://[2001:0db8:85a3:0000:0000:8a2e:0370:7334]). However at this time Apprise can safely detect URLs that do not include the square brackets ([]) and improvises by adding them for you.Missing Notification Header Issue Resolved (#251)
gntp library also removed from Apprise an is a separate dependency instead:# The following will allow you to use Growl Notifications again (for those using it)
pip install gntp
# This has also already been added to the `requirements.txt` file
# Apprise puts out information to the screen reminding those that have not done this
# and are attempting to use Growl to run the pip command below as well.
Apprise is available on PyPI through pip:
# Install Apprise v0.8.7 from PyPI
pip install apprise==0.8.7
MacOSX Plugin. A simple wrapper to terminal-notifier found here: julienXX/terminal-notifier.
New Notification Services:
terminal-notifier found here: julienXX/terminal-notifier. (#216)Features:
avatar_url parameter allowing you to override the one set by apprise.Bugfixes:
Apprise is also available on PyPI through pip:
# Install Apprise v0.8.6 from PyPI
pip install apprise==0.8.6
XMPP Plugin completely refactored/rewritten to now work correctly
Features:
sleekxmpp is available on your system.Bugfixes:
Apprise is also available on PyPI through pip:
# Install Apprise v0.8.5 from PyPI
pip install apprise==0.8.5
AppriseConfig object now supports a new function called add_config() which allows you to directly add configuration (into the object) v.s. always havi
New Notification Services:
Features:
Bugfixes:
Apprise is also available on PyPI through pip:
# Install Apprise v0.8.4 from PyPI
pip install apprise==0.8.4
Supports file attachments as well.
New Notification Services:
Enhancements:
Apprise is also available on PyPI through pip:
# Install Apprise v0.8.3 from PyPI
pip install apprise==0.8.3
*AppriseAttachment()* class added for working with attachments using the API.
--attach (-a) added to CLI allowing users to attach content from both the internet and/or local files to the supported services (See #173 for details). Currently the supported services are:
Apprise is also available on PyPI through pip:
# Install Apprise v0.8.2 from PyPI
pip install apprise==0.8.2
Re-factored how most services are instantiated. All QA moved to to class initialization and not during the sending process. This allows users to know
--dry-run (-d) switch added that allow you to determine what services will be notified without actually performing the notification.Apprise is also available on PyPI through pip:
# Install Apprise v0.8.1 from PyPI
pip install apprise==0.8.1
No longer uses/references pushjet library; is complete standalone now which dropped the code base by 800+ lines of code and one less dependency in req
pushjet library; is complete standalone now which dropped the code base by 800+ lines of code and one less dependency in requirements.txt.format=markdown (Issue #149)Apprise is also available on PyPI through pip:
# Install Apprise v0.8.0 from PyPI
pip install apprise==0.8.0
No longer uses/references Tweepy library; is complete standalone now
Apprise is also available on PyPI through pip:
# Install Apprise v0.7.9 from PyPI
pip install apprise==0.7.9
This is a minor release that fixes an bug in cases where the i18n localization language can't be detected and apprise just flat out crashes. This issu
This is a minor release that fixes an bug in cases where the i18n localization language can't be detected and apprise just flat out crashes. This issue is prominent in (docker driven) containers references since not all of them create POSIX compatible environments.
The following enhancement was also accomodated:
Apprise is also available on PyPI through pip:
# Install Apprise v0.7.8 from PyPI
pip install apprise==0.7.8
Your coding agent can read these notes before it upgrades. Set up the MCP server →