SMSTunnel for Uptime Kuma
Monitor alerts by text, from your own phone and number
Down alerts that reach you by SMS
When a monitor goes down, or comes back up, Uptime Kuma hands the alert to your SMSTunnel account and your own Android phone texts it to you from your own number. A text still reaches you when a push notification doesn't, and each one costs one SMS on your phone's plan: no SMS provider in between.
1. Get your key
- 1. Install the SMSTunnel app from Google Play on your Android phone and sign in.
- 2. In your dashboard, open Apps → Add an app, pick Uptime Kuma, name it (for example "Uptime Kuma") and click Create the key.
- 3. Copy the key right away: it's shown only once. You can stop or delete the app there anytime, and Uptime Kuma can't send texts anymore.
Get the steps with your key in them
It opens Add an app with Uptime Kuma picked. Once the key is made, the dashboard shows every step and command with the key already filled in, ready to copy.
2. Add a Webhook notification
In Uptime Kuma, open Settings → Notifications → Set Up Notification and fill in:
| Field | Value |
|---|---|
| Notification Type | Webhook |
| Friendly Name | Anything that tells you who gets it, for example "SMS to me" |
| Post URL | https://smstunnel.io/api/v1/sms/send |
| HTTP Method | POST (newer versions show this field) |
| Request Body | Custom Body, with the body below |
| Additional Headers | Turn it on and paste the headers below |
{"to": "+14155550123", "message": {{ msg | json }}} {"Content-Type": "application/json", "X-API-Key": "sk_live_..."} -
Put your number in
to, with+and the country code. Keep{{ msg | json }}as it is: it puts Uptime Kuma's alert in the text, with the quotes the body needs. -
Keep the
Content-Typeline, so SMSTunnel reads the body as JSON, and replacesk_live_...with your key. -
Click Test: your phone texts "<Friendly Name> Testing" to that number.
If the key is wrong, Uptime Kuma shows an error with
401and "Invalid or expired API key". Then click Save.
3. Attach it to your monitors
- Tick it in the Notifications list when you add or edit a monitor. In the notification itself, Default enabled adds it to new monitors and Apply on all existing monitors to the ones you have.
- Several people? Add one Webhook notification per number, each with its own
to, and attach all of them. SMSTunnel sends one text to one number per request, so everyone gets their own text. Or use one webhook address, which texts up to 10 numbers.
What the texts look like
[My shop] [🔴 Down] timeout of 48000ms exceeded
[My shop] [✅ Up] 200 - OK One text for each alert, to each number: when a monitor goes down and when it comes back up.
Without a key: a webhook address
A webhook address is a secret URL that turns each call into a text to the numbers you save with it, sent by your own phone from your own number. The call only sets the words, never the number, so Uptime Kuma needs no key.
- 1. Install the SMSTunnel app from Google Play on your Android phone and sign in.
- 2. In your dashboard,
open Apps → Webhooks, click New webhook and pick Uptime Kuma.
That fills in the name and the text of the message,
{{msg}}. - 3. Add the numbers that should get the texts, with
+and the country code: up to 10, and each one gets its own text. Then click Create the webhook. - 4. Copy the address, which looks like
https://smstunnel.io/api/v1/webhook/<token>. Keep it secret, like a password: whoever has it can text these numbers from your phone, though never any other number.
Get the steps with your address in them
It opens New webhook with Uptime Kuma picked. Once the webhook is made, the dashboard shows its address and the Uptime Kuma steps with the address already in them, ready to copy, and Send a test, which texts the webhook's numbers.
- Calls an hour: 20 unless you set another number, up to 500. The limit counts calls, not texts: each call texts every number of the webhook, and a test from the dashboard counts too. Past the limit, calls are refused until the hour is over, so a storm of alerts can't use up your texts.
- You can copy the address again anytime, under Address and setup. If it gets out, New address in the webhook's menu replaces it, and the old one stops working at once.
- The text of the message picks the words out of each call. Texts are cut at 480 characters.
-
Or with the API, for scripts:
POST /api/v1/webhookswith your sign-in token, as the webhooks guide shows.
Then, in Uptime Kuma
Open Settings → Notifications → Set Up Notification and fill in:
- Notification Type
- Webhook
- Friendly Name
- Anything that tells you who gets it, for example "SMS to the team"
- Post URL
-
https://smstunnel.io/api/v1/webhook/<token>(your webhook's address) - Request Body
- Preset - application/json
- Additional Headers
- Leave it off: the address is the secret
-
Keep the webhook's text of the message
{{msg}}, which picking Uptime Kuma fills in: Uptime Kuma's alert already starts with the monitor's name, and without it the name shows twice. The texts then read as above. - Click Test to get a text right away ("<Friendly Name> Testing"), then Save, and tick the notification on the monitors that should text you.
Worth knowing
- A monitor that keeps flapping sends a text every time. Set Retries so a short blip isn't reported as down, and watch the resend setting ("Resend Notification if Down X times consecutively").
- 30 sends a minute. Past that, SMSTunnel answers 429 and Uptime Kuma logs the error.
- Emoji and length. Uptime Kuma puts an emoji in each alert, and a text with an emoji fits 70 characters per SMS instead of 160. Longer alerts go out as several joined parts; a text can be up to 1600 characters.
- Phone offline? The text waits and goes out as soon as the phone is back.
- Your key sits in Uptime Kuma's settings. Give Uptime Kuma its own app in SMSTunnel, so you can stop it without touching your other apps.
Build it with an AI assistant
Copy this prompt into Claude, ChatGPT, Cursor or Copilot and replace the part in [brackets]. Don't paste your API key into the chat: the prompt doesn't need it.
Help me get Uptime Kuma alerts as text messages from my own phone, with SMSTunnel.
About SMSTunnel (https://smstunnel.io): my own apps and tools hand text messages (SMS) to my SMSTunnel account, and my own Android phone sends them from my own number, on my own SIM and plan. The phone runs the SMSTunnel app from Google Play (https://play.google.com/store/apps/details?id=io.smstunnel.app), signed in to my account.
What I want: [describe what should send a text, to whom, and when]
How it works:
- No plugin: Uptime Kuma's built-in Webhook notification calls SMSTunnel's API. Settings → Notifications → Set Up Notification, Notification Type "Webhook".
- Post URL: https://smstunnel.io/api/v1/sms/send (HTTP Method POST, if the field is shown).
- Request Body: "Custom Body": {"to": "+14155550123", "message": {{ msg | json }}} — {{ msg | json }} is Uptime Kuma's alert text, already JSON-quoted. The number goes in "to", in international format.
- Additional Headers (turn it on): {"Content-Type": "application/json", "X-API-Key": "<my SMSTunnel key>"} — the Content-Type line is needed so SMSTunnel reads the body as JSON.
- One notification per phone number: SMSTunnel sends one text to one number per request. Attach the notifications to monitors in each monitor's Notifications list, or with "Default enabled" and "Apply on all existing monitors".
- Without a key: an SMSTunnel webhook address, made in my dashboard with Uptime Kuma picked, which sets the webhook's text of the message to {{msg}} (without it, the monitor's name shows twice). In the Webhook notification: Post URL = the address, Request Body "Preset - application/json", no Additional Headers. One notification texts up to 10 numbers saved in the webhook.
- Without a key: an SMSTunnel webhook address, https://smstunnel.io/api/v1/webhook/<token>. I make it in my dashboard (https://dashboard.smstunnel.io): Apps → Webhooks → New webhook, pick the tool that will call it (Grafana, Uptime Kuma, Healthchecks, Gatus, Alertmanager, Odoo Online, or Something else), add 1 to 10 numbers (each gets its own text), optionally a text of the message that pulls fields out of the JSON with {{path}}, like {{alarm.name}}, then Create the webhook and copy the address. A GET with ?message=… or a POST with JSON (its message, text, title or body field) texts those numbers; the call never sets the number. Texts are cut at 480 characters. "Calls an hour" (20 unless I set another number, up to 500) counts calls, not texts: each call texts every number, and calls past it are refused until the hour is over. The address can be copied again under Address and setup; New address replaces it if it leaks. Scripts can make one with POST https://smstunnel.io/api/v1/webhooks and my sign-in token instead.
- The Test button sends "<Friendly Name> Testing". A wrong key shows 401 "Invalid or expired API key"; 429 means too many requests (SMSTunnel allows 30 sends a minute).
- Alerts look like "[My shop] [🔴 Down] timeout of 48000ms exceeded" and "[My shop] [✅ Up] 200 - OK". A text can be up to 1600 characters. If my phone is offline, the text waits and goes out when it is back.
- The API key comes from my SMSTunnel dashboard (https://dashboard.smstunnel.io): Apps → Add an app → Create the key. It is shown only once and can send texts and check whether they went out.
Rules for your answer:
- Do not ask for my SMSTunnel password or API key and do not put a real key in your answer; I will not paste it in this chat.
- Phone numbers must be in international format (+ and the country code).
- Help me test it with my own number first.
- Only send texts people expect from me. No unsolicited texts.
- Help me avoid floods of texts from a monitor that keeps going up and down (Retries, resend settings). Responsible use
Built for alerts to yourself and your team. Sending unsolicited messages from a consumer SIM generally breaches mobile carrier terms of service.
Uptime Kuma is an open-source project by Louis Lam. SMSTunnel is a third-party integration and is not affiliated with, endorsed by, or sponsored by the Uptime Kuma project.