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

  1. 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.
  2. Add an HTTP monitor (a URL and the status code you expect) or a cron heartbeat (you get a ping URL).
  3. Add an alert channel: a webhook, Discord, Slack or Telegram. Use Send test alert to check it.
  4. Optional: create a status page and pick which monitors appear on it.

HTTP monitors

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

FreeIndie (coming soon)Pro (coming soon)
Price$0US$9/monthUS$19/month
Monitors (HTTP and heartbeats combined)525100
Shortest HTTP check interval5 minutes1 minute1 minute
Status pages1310
Alert channels31025

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

  1. In UptimeRobot, open Integrations & API and copy your read-only API key.
  2. 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.
  3. 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.
  4. 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

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.

Create a free account Read the docs