Pingmoss docs
Everything Pingmoss does today, with examples you can paste. If something is not on this page, Pingmoss does not do it yet.
On this page: Quick start · HTTP monitors · Cron heartbeats · Alerts · Status pages · Plan limits · Your account key · UptimeRobot import · What Pingmoss does not do yet
Quick start
- Open the dashboard and choose Create account. You get a secret account key that starts with
pmk_. Save it in a password manager. It is the only way to log in. - Add an HTTP monitor (a URL and the status code you expect) or a cron heartbeat (you get a ping URL).
- Add an alert channel: a webhook, Discord, Slack or Telegram. Use Send test alert to check it.
- Optional: create a status page and pick which monitors appear on it.
HTTP monitors
- Pingmoss sends a GET request to your URL every 1 to 60 minutes (the shortest interval depends on your plan) and compares the response status with the one you expect (default 200). Redirects are not followed, so a 301 counts as 301.
- Timeout is configurable from 1000 to 30000 ms (default 10000).
- A failed check is retried once straight away. Only when the retry also fails is the monitor marked down and an incident opened. When a check passes again, the incident closes. You get one alert when it goes down and one when it recovers.
- Only http and https URLs on ports 80, 443, 8080 and 8443. Private, loopback and cloud metadata addresses are rejected.
- Checks run from Cloudflare's network, one location per check. Requests use the user agent
Pingmoss/0.1 (+https://pingmoss.pages.dev).
Cron heartbeats
Each heartbeat has a secret URL like https://pingmoss.pages.dev/hb/YOUR_TOKEN, a period (how often your job runs, 1 minute to 31 days) and a grace time. Any GET, POST or HEAD request to the URL counts as a ping and the response is OK. If no ping arrives within period plus grace since the last ping, the heartbeat is marked late and you get an alert. The next ping closes the incident and sends one recovery alert.
Pingmoss has a single ping endpoint. There are no separate start or fail signals yet, so ping only when the job succeeds (the examples below do that).
curl
curl -fsS -m 10 --retry 3 https://pingmoss.pages.dev/hb/YOUR_TOKEN
crontab
# m h dom mon dow command
5 3 * * * /usr/local/bin/backup.sh && curl -fsS -m 10 --retry 3 https://pingmoss.pages.dev/hb/YOUR_TOKEN > /dev/null
GitHub Actions
on:
schedule:
- cron: "0 * * * *"
jobs:
job:
runs-on: ubuntu-latest
steps:
- run: ./do-the-work.sh
- name: Ping Pingmoss
if: success()
run: curl -fsS -m 10 --retry 3 ${{ secrets.PINGMOSS_HB_URL }}
Store the ping URL as a repository secret named PINGMOSS_HB_URL.
systemd timer
# /etc/systemd/system/backup.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
ExecStartPost=/usr/bin/curl -fsS -m 10 --retry 3 https://pingmoss.pages.dev/hb/YOUR_TOKEN
ExecStartPost only runs when ExecStart succeeded. Pair it with a backup.timer unit as usual.
Python
import urllib.request
def main():
... # your job
main()
req = urllib.request.Request("https://pingmoss.pages.dev/hb/YOUR_TOKEN", headers={"User-Agent": "my-cron-job/1.0"})
urllib.request.urlopen(req, timeout=10)
Set your own User-Agent as shown. Cloudflare, which serves Pingmoss, blocks urllib's default one with a 403. The requests library works without changes.
Node.js (18 or later)
await runJob();
await fetch("https://pingmoss.pages.dev/hb/YOUR_TOKEN", { signal: AbortSignal.timeout(10000) });
Alert channels
Add channels in the dashboard under Alert channels. Every channel gets every alert for your account. Events: down and up for HTTP monitors, late and recovered for heartbeats, and test from the test button. Each delivery is retried once after 1.5 seconds and logged in the dashboard.
- Webhook: any http(s) URL. Pingmoss sends a JSON POST (below).
- Discord: a channel webhook URL (
https://discord.com/api/webhooks/...). Sends a plain message. - Slack: an incoming webhook URL (
https://hooks.slack.com/services/...). - Telegram: your own bot token from BotFather and a chat id (a number like
-100123...or@channelname). Add the bot to the chat first.
Webhook payload
Headers: content-type: application/json, user-agent: Pingmoss-Alerts/0.2. Body:
{
"source": "pingmoss",
"event": "down",
"kind": "monitor",
"id": 42,
"name": "API health",
"detail": "expected 200, got 503",
"incident_id": 1234,
"at": 1792969945,
"at_iso": "2026-10-26T00:32:25.000Z",
"text": "[Pingmoss] DOWN: Monitor \"API health\" (expected 200, got 503) at 2026-10-26 00:32 UTC"
}
event is one of down, up, late, recovered, test. kind is monitor or heartbeat. at is Unix seconds. incident_id is null for test alerts. Any 2xx response counts as delivered.
Status pages
A status page lives at https://pingmoss.pages.dev/s/your-slug. It shows the current state of the monitors and heartbeats you pick, 90 days of daily uptime bars and incidents from the last 14 days. Set it to unlisted to keep it out of search engines. See the demo status page. Custom domains and branding are not available yet.
Plan limits
| Free | Indie (coming soon) | Pro (coming soon) | |
|---|---|---|---|
| Price | $0 | US$9/month | US$19/month |
| Monitors (HTTP and heartbeats combined) | 5 | 25 | 100 |
| Shortest HTTP check interval | 5 minutes | 1 minute | 1 minute |
| Status pages | 1 | 3 | 10 |
| Alert channels | 3 | 10 | 25 |
Payments are not built yet, so every account is on Free and the paid plans cannot be bought. Heartbeat periods are 1 minute to 31 days on every plan.
How your account key works
Pingmoss does not send email yet, so accounts have no email or password. When you create an account you get one secret key (pmk_ followed by a long random code). We store only a keyed hash of it and cannot show it again or recover it. Paste it to log in on any device. If you lose it, the account cannot be recovered. You can delete your account and all its data from the dashboard at any time. A contact email field exists but nothing is sent to it.
Importing from UptimeRobot
- In UptimeRobot, open Integrations & API and copy your read-only API key.
- In the Pingmoss dashboard, paste it under Import from UptimeRobot and choose Preview monitors. Pingmoss uses the key for that one request (UptimeRobot API v3, falling back to v2) and then discards it. It is not stored or logged.
- Check the preview table. HTTP(s) monitors import as HTTP monitors. Keyword monitors can be imported as plain HTTP status checks (the keyword is not checked). Ping, port, DNS, UDP, API and other types are skipped with a reason. Intervals are rounded up to whole minutes and to your plan's minimum.
- Tick the ones you want and choose Import selected. Your plan limit and the URL safety rules apply to every row.
UptimeRobot heartbeat monitors cannot be moved automatically because the ping URL is different. If you select one, Pingmoss creates a new heartbeat with the same period and shows you its new ping URL. Update your job to call it.
What Pingmoss does not do yet
- No email alerts, and no SMS or phone call alerts.
- Checks run from a single location. There is no multi-region confirmation.
- No keyword, ping, port, DNS, SSL expiry or domain expiry checks.
- No start or fail signals for heartbeats, and no ping logs.
- No custom domains or branding for status pages.
- No payments, teams or shared logins.
- No account recovery if you lose your key.
- It is a young service with no track record yet. Keep a second monitor on anything critical.
Try it on the Free plan
5 monitors, 5 minute checks, 1 status page, chat and webhook alerts. No email address or card needed: you get a secret account key.