Quickstart

Ship your first Drumbeats monitor in under five minutes. Create a monitor, copy the Ping URL, wire it into your job, route alerts.

This guide takes you from zero to a working Drumbeats monitor in five minutes. By the end you have a monitor that watches a real job, a notification channel that alerts your team, and the test commands needed to verify the wiring.

Step 1 — Create a monitor in the dashboard

Open the dashboard and click New Monitor. Pick the type that matches what you are tracking:

  • Cron — jobs on a fixed schedule (e.g. 0 2 * nightly backups).
  • Heartbeat — jobs that repeat every N minutes (e.g. a worker loop polling every 5 minutes).
  • Event-driven — jobs that run on demand (e.g. queue workers, webhook handlers, one-off scripts).
  • Uptime — public HTTP endpoints (e.g. API health checks). Drumbeats polls these on your behalf, no ping needed.

Name the monitor, set the schedule (for Cron / Heartbeat) and grace period, then save.

Drumbeats new cron monitor form on staging — cron expression input, grace period selector, timezone dropdown, and name field
Drumbeats new cron monitor form on staging — cron expression input, grace period selector, timezone dropdown, and name field

Step 2 — Copy your Ping URL

Open the monitor and copy the Ping URL from the URLs panel:

plaintext
https://api.drumbeats.io/v1/ping/<your-monitor-id>
https://api.drumbeats.io/v1/ping/<your-monitor-id>

That URL is everything Drumbeats needs. There is no authentication on ping endpoints — possession of the URL is the secret.

Monitor settings tab showing the Ping URL and the slug-based alternate URL, with the monitor configuration and notification channels panels alongside
Monitor settings tab showing the Ping URL and the slug-based alternate URL, with the monitor configuration and notification channels panels alongside

Step 3 — Wire the ping into your job

Send a start ping when the job begins and a success or failure ping when it ends. Drumbeats correlates them by run_id (any unique string per execution) and stores both events on the same run record.

Bash
RUN_ID="job-$(date +%s)"
API="https://api.drumbeats.io/v1/ping/<monitor-id>"

curl -sf "$API/start?run_id=$RUN_ID"

/usr/bin/backup.sh

if [ $? -eq 0 ]; then
  curl -sf "$API/success?run_id=$RUN_ID"
else
  curl -sf "$API/failure?run_id=$RUN_ID"
fi
RUN_ID="job-$(date +%s)"
API="https://api.drumbeats.io/v1/ping/<monitor-id>"

curl -sf "$API/start?run_id=$RUN_ID"

/usr/bin/backup.sh

if [ $? -eq 0 ]; then
  curl -sf "$API/success?run_id=$RUN_ID"
else
  curl -sf "$API/failure?run_id=$RUN_ID"
fi
Python
import os, uuid, requests

API = "https://api.drumbeats.io/v1/ping/<monitor-id>"
run_id = f"job-{uuid.uuid4()}"

requests.get(f"{API}/start", params={"run_id": run_id})
try:
    run_my_job()
    requests.get(f"{API}/success", params={"run_id": run_id})
except Exception as exc:
    requests.post(f"{API}/failure", params={"run_id": run_id}, json={"payload": str(exc)})
    raise
import os, uuid, requests

API = "https://api.drumbeats.io/v1/ping/<monitor-id>"
run_id = f"job-{uuid.uuid4()}"

requests.get(f"{API}/start", params={"run_id": run_id})
try:
    run_my_job()
    requests.get(f"{API}/success", params={"run_id": run_id})
except Exception as exc:
    requests.post(f"{API}/failure", params={"run_id": run_id}, json={"payload": str(exc)})
    raise
Node.js
import { randomUUID } from "node:crypto";

const API = "https://api.drumbeats.io/v1/ping/<monitor-id>";
const runId = `job-${randomUUID()}`;

await fetch(`${API}/start?run_id=${runId}`);
try {
  await runMyJob();
  await fetch(`${API}/success?run_id=${runId}`);
} catch (err) {
  await fetch(`${API}/failure?run_id=${runId}`);
  throw err;
}
import { randomUUID } from "node:crypto";

const API = "https://api.drumbeats.io/v1/ping/<monitor-id>";
const runId = `job-${randomUUID()}`;

await fetch(`${API}/start?run_id=${runId}`);
try {
  await runMyJob();
  await fetch(`${API}/success?run_id=${runId}`);
} catch (err) {
  await fetch(`${API}/failure?run_id=${runId}`);
  throw err;
}

The Ping API accepts both GET and POST. POST is the right call when you want to attach a payload (error message, stdout, metrics) — see Ping API: payloads.

Step 4 — Route alerts to a notification channel

A monitor without a notification group cannot alert anyone. Three substeps:

  1. Settings → Notification Channels. Connect a channel: Slack, Email, Telegram, Discord, Webhook, or enable Browser Push for your account.
  2. Notification Groups. Create a group and add the channels you just connected. A group can mix channel types — alerts fan out to all members in parallel.
  3. Monitor → Notifications tab. Assign the group. The monitor immediately starts routing incidents to the group.

See Notification channels for per-channel setup details and Alert logic for cooldown and retry behaviour.

[SCREENSHOT: notifications/channels — Slack / Email / Telegram channel setup screen]

Step 5 — Test the end-to-end flow

Trigger a failure manually:

bash
curl https://api.drumbeats.io/v1/ping/<monitor-id>/failure
curl https://api.drumbeats.io/v1/ping/<monitor-id>/failure

The alert should arrive in your channel within seconds. Then send a success ping to resolve the incident:

bash
curl https://api.drumbeats.io/v1/ping/<monitor-id>/success
curl https://api.drumbeats.io/v1/ping/<monitor-id>/success

If nothing arrives, walk through Push troubleshooting or check the Incidents tab on the monitor — Drumbeats logs every channel delivery attempt.

Next steps