Send Home Assistant alerts to WhatsApp
A rest_command and one automation. No phone number of your own, no
WhatsApp Business account, and nothing charged per contact.
The usual answer here is CallMeBot, and it is free and perfectly good at what it does. What it does is written on its own page: "The Free API is only for personal use", and the list of things it does not do opens with sending to other people. So the moment the alert needs to reach somebody else in the house, or a colleague, you are outside it — and the other routes are a self-hosted bridge holding your personal WhatsApp number open as a linked device, or Telegram instead.
This is a rest_command to an endpoint with its own registered number
and its own approved template. It messages your own verified people — you, and
whoever else in the house has verified a phone — which is all a home automation
needs.
1. Make a key
In the Jabee dashboard, go to Management then
Approvals and create an API key. It starts jak_. Copy
it now; it is not shown again.
Whoever is going to be messaged needs a verified phone, which they get by tapping a link in the dashboard and sending one message. Until somebody has done that there is nobody to deliver to.
2. Add the rest_command
The key goes in secrets.yaml, as the whole header value including the
word Bearer:
# secrets.yaml
jabee_authorization: "Bearer jak_your_key_here"
Then configuration.yaml:
rest_command:
jabee_alert:
url: https://api.jabee.ai/api/v1/alerts
method: POST
content_type: "application/json"
headers:
authorization: !secret jabee_authorization
payload: >
{{ {'title': title, 'body': body | default('')} | to_json }}
The | to_json is the part worth copying exactly. Building that JSON by
hand works until a sensor name has an apostrophe or a template renders a newline, and
then it fails in a way that is genuinely annoying to debug. Letting Home Assistant
serialise a dictionary makes that impossible.
Restart Home Assistant, then try it from Developer tools →
Actions: pick rest_command.jabee_alert and give it a title.
3. Call it from an automation
automation:
- alias: Tell me if the freezer is warming up
triggers:
- trigger: numeric_state
entity_id: sensor.freezer_temperature
above: -12
for: "00:15:00"
actions:
- action: rest_command.jabee_alert
data:
title: "Freezer is at {{ states('sensor.freezer_temperature') }}°C"
body: "Above -12 for fifteen minutes. Door left open?"
That is the 2024.10 spelling (triggers:, actions:,
action: for the call). The older trigger: /
action: / service: form still works and was never
deprecated, so an older configuration does not need rewriting.
The for: is not optional in spirit. A numeric sensor crossing a
threshold will cross it repeatedly, and without a duration you get a message every
time it wobbles.
What this is good for, and what it is not
Good for the handful of things that genuinely need to reach a phone that has notifications silenced: water on the floor, a freezer warming, the alarm, a camera seeing somebody at 3am, the boiler out in winter. WhatsApp gets through where a companion-app notification does not.
Not good for the ordinary stream — someone arrived home, washing finished, a light left on. Those belong in the companion app, which is free and unlimited. 500 a month sounds generous until a presence automation discovers it.
An honest comparison: for high-volume home notifications, a Telegram bot or ntfy costs nothing and has no allowance at all. The reason to put a few things on WhatsApp is that it is the app people actually have open.
Which phone it reaches
One per household, and it is yours: the account owner's verified number by default, or another handset you point alerts at in the dashboard, under Where alerts go. That phone verifies itself by sending one message to the Jabee number, carrying a code from the dashboard.
Anyone you send to has to have verified their phone with us first — a link in the dashboard and one message. There is no way to message a number that has not done that, which is deliberate: a shared number texting people who never asked for it is exactly what gets numbers banned.
One honest caveat: this is not a local integration
It is an HTTPS call to a hosted API, so it needs the internet and it is one more
thing that can be down. For a house that is otherwise local-only, that is a real
consideration — and the automation should not depend on the message succeeding.
rest_command failures appear in the log; they do not stop the rest of the
actions.
What it costs
$29 a month for 500 alerts and approvals together, then 3 cents each. The first three are free, so you can wire this up and watch a message arrive before paying for anything. No per-seat charge.
Charged per account, not per contact and not per person messaged, which is the comparison worth making against the per-recipient services this corner of the world usually reaches for. If it is only ever your own phone, note honestly that CallMeBot and ntfy do that for nothing — the whole comparison is here, including the cases where this page is the wrong answer.
Questions
How do I send a WhatsApp message from Home Assistant without CallMeBot?
With a rest_command posting to
https://api.jabee.ai/api/v1/alerts, the key in
secrets.yaml as the authorization header, and the payload
built with | to_json. Then call
rest_command.jabee_alert from an automation. No phone number of your
own, no WhatsApp Business account, no per-contact charge.
Why is my Home Assistant rest_command returning 400?
Usually hand-built JSON in the payload, broken by an apostrophe or a newline out
of a template — build a dictionary and pipe it through | to_json
instead. The other common cause is a title longer than 120 characters, which is
rejected rather than trimmed.
Is this better than a Telegram bot for Home Assistant notifications?
Only for the few alerts that must reach a phone with notifications silenced, because WhatsApp is the app people keep open. A Telegram bot or ntfy is free and unlimited, so the ordinary stream belongs there or in the companion app. Here there are 500 a month across the account.
Can other people in the house get the alerts?
Not on Jabee's number — alerts go to one verified phone per account. For several people, connect your own WhatsApp number and send from there. A shared number messaging people who never asked for it is what gets numbers banned, which is why this one only ever goes to a handset that asked for it.
Do I need a WhatsApp number or a Meta account?
No, neither, at any point. The message goes over Meta's official Cloud API on Jabee's registered number using Jabee's approved template, so you need an API key and nothing else. There is no number of yours involved, so there is nothing of yours to get banned.
What happens if nobody ever answers the messages?
Five notifications in a row that a handset never replies to and we stop sending to it, with an email to the account owner saying so. Sending any message to the Jabee number starts it again. One number's standing with Meta is shared by every business on it, which is why the rule exists.