ping·dan
Documentation

Quickstart

pingdan monitors HTTP endpoints on a fixed schedule, evaluates a set of assertions against each response, and alerts you when something fails. Here's the whole flow:

  1. Create an account and open your dashboard.
  2. Add an endpoint: paste a URL and pick the HTTP method.
  3. Choose a check interval and what makes a check pass.
  4. Attach an alert channel so you hear about failures.

Creating a monitor

A monitor is one URL we call on a schedule. Each monitor has a request (method + URL), a schedule (interval + timeout), and validation rules. Start with the basics:

Method:   GET
URL:      https://api.example.com/healthz
Interval: 1 min
Timeout:  10s
Expected: 200
Tip: point monitors at a dedicated /healthz endpoint that checks your own dependencies (database, cache, downstream APIs).

Check intervals

Choose any interval from 1 minute up to 7 days — pick a number and a unit (minutes, hours or days), or use a quick preset like 5 min, 1 hr or 1 day.

The timeout controls how long we wait for a response before recording a failure.

Assertions

Assertions decide whether a check passes. Each one reads a source, applies a comparison, and checks against a target. Available sources:

  • status_code — the HTTP response status
  • response_time — latency in milliseconds
  • header — a response header by name
  • body — the full response body
  • json_path — a value resolved from a JSON body

Comparisons include equals, not-equals, greater-than, less-than, contains, not-contains and matches (regex).

JSON path

Use dotted paths to drill into a JSON response. Given this body:

{ "status": "ok", "items": [ { "id": 42 } ] }

The path status resolves to ok, and items.0.id resolves to 42. Combine with any comparison, e.g. assert json_path items.0.id equals 42.

Failure thresholds

To avoid alerting on a single transient blip, a monitor only flips to down after a configurable number of consecutive failed checks. Set it to 1 for instant alerts, or higher to filter noise.

Alert channels

Attach one or more channels to a monitor. When it goes down — and again when it recovers — pingdan notifies each attached channel. SSL-expiry warnings use the same channel set.

  • EmailAdd an address. The deployment must have RESEND_API_KEY set, and EMAIL_FROM should be a verified sender.
  • TelegramPaste a chat ID. The deployment must have TELEGRAM_BOT_TOKEN set; use getUpdates after messaging the bot to find your chat ID.
  • SlackCreate an incoming webhook and paste the hooks.slack.com URL.
  • DiscordCreate a channel webhook and paste the discord.com/api/webhooks URL.
  • Microsoft TeamsCreate a Power Automate workflow with a Teams webhook trigger and paste the HTTPS workflow URL.
  • Generic webhookPaste an HTTP(S) URL. Optionally add a signing secret for HMAC verification.
  • PagerDutyCreate an Events API v2 integration and paste its routing key.
  • ntfyEnter a topic, optionally a custom server URL and bearer token. The default server is https://ntfy.sh.
  • PushoverPaste a user or group key. The deployment must have PUSHOVER_APP_TOKEN set.
  • Twilio SMSPaste an E.164 phone number such as +15551234567. The deployment must have TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN and TWILIO_FROM set.
  • OpsgeniePaste an API integration key and choose the US or EU region.

Manage channels from the Alerts page. Use Send test after adding credentials so delivery errors surface before an incident. Channels that need deployment credentials only appear in the create form after those environment variables are configured.

Channel setup guides

Each guide ends with the exact value you paste into pingdan. For environment-backed channels, set the deployment variables first, restart the API service, then refresh the Alerts page so the channel type appears.

Email with Resend

Durable alerts, audit trails, and teams that already triage incidents from a shared inbox.

Deployment env

  • RESEND_API_KEY — Resend API key with permission to send email.
  • EMAIL_FROM — verified sender such as Pingdan Alerts <[email protected]>.

Pingdan fields

Setup steps

  1. In Resend, add and verify a sending domain.
  2. Create an API key, ideally scoped for sending email.
  3. Set RESEND_API_KEY and EMAIL_FROM on the pingdan API service, then restart it.
  4. Open Alerts, create an Email channel, enter the recipient, and send a test alert.

Example

RESEND_API_KEY=re_xxxxxxxxx
EMAIL_FROM="Pingdan Alerts <[email protected]>"

Email address: [email protected]

Telegram

Fast mobile push alerts to yourself or a shared on-call group.

Deployment env

  • TELEGRAM_BOT_TOKEN — token from @BotFather.

Pingdan fields

  • Telegram chat ID — private chat ID, group ID, or supergroup ID.

Setup steps

  1. Open Telegram, message @BotFather, run /newbot, and copy the token.
  2. Set TELEGRAM_BOT_TOKEN on the pingdan API service and restart it.
  3. Message the bot once, or add it to the target group and send a message there.
  4. Visit https://api.telegram.org/botYOUR_TOKEN/getUpdates and copy the chat.id. Group IDs are often negative.
  5. Create a Telegram channel in pingdan with that chat ID and send a test alert.

Example

TELEGRAM_BOT_TOKEN=123456789:AA...

Telegram chat ID: -1001234567890

Slack

Team-visible incident rooms and operations channels.

Deployment env

None. This channel only needs values from the provider UI.

Pingdan fields

  • Slack webhook URL — a URL beginning with https://hooks.slack.com/.

Setup steps

  1. Create or open a Slack app for your workspace.
  2. Enable Incoming Webhooks for the app.
  3. Add a new webhook to the workspace and choose the channel that should receive alerts.
  4. Copy the webhook URL, create a Slack channel in pingdan, and send a test alert.

Example

Slack webhook URL:
https://hooks.slack.com/services/T00000000/B00000000/xxxxxxxx

Discord

Community, game, or small-team servers that use Discord channels for operations.

Deployment env

None. This channel only needs values from the provider UI.

Pingdan fields

  • Discord webhook URL — a channel webhook URL from Discord.

Setup steps

  1. Open the Discord server, go to Server Settings, then Integrations.
  2. Create a webhook, choose the text channel, and give it a recognizable name.
  3. Copy the webhook URL.
  4. Create a Discord channel in pingdan and send a test alert.

Example

Discord webhook URL:
https://discord.com/api/webhooks/1234567890/xxxxxxxx

Microsoft Teams

Microsoft 365 teams that want alerts in a Teams channel or chat.

Deployment env

None. This channel only needs values from the provider UI.

Pingdan fields

  • Power Automate webhook URL — the HTTPS URL generated by a Teams Workflows trigger.

Setup steps

  1. In Teams, create a Workflow that receives an HTTP request through a webhook URL.
  2. Configure the workflow to post the incoming message or Adaptive Card to the target channel or chat.
  3. Copy the generated webhook URL.
  4. Create a Teams channel in pingdan and send a test alert.

Example

Power Automate webhook URL:
https://prod-00.westus.logic.azure.com/workflows/.../triggers/manual/paths/invoke?...

Generic webhook

Custom incident automation, internal tools, ticketing glue, and providers with HTTP ingestion.

Deployment env

None. This channel only needs values from the provider UI.

Pingdan fields

  • Webhook URL — any reachable http or https endpoint.
  • Signing secret — optional HMAC secret for verifying pingdan requests.

Setup steps

  1. Create an endpoint that accepts POST requests with a JSON body.
  2. If you use a signing secret, verify the raw request body against X-Pingdan-Signature.
  3. Create a Generic webhook channel in pingdan with the URL and optional secret.
  4. Send a test alert, then attach the channel to monitors that should trigger automation.

Example

Webhook URL: https://example.com/pingdan-alerts
Signing secret: whsec_keep_this_private

PagerDuty

Production paging, escalation policies, and automatic incident resolution on recovery.

Deployment env

None. This channel only needs values from the provider UI.

Pingdan fields

  • Routing key — the Events API v2 integration key for a PagerDuty service.

Setup steps

  1. In PagerDuty, create or open the service that should own pingdan incidents.
  2. Add an Events API v2 integration to that service.
  3. Copy the integration key; PagerDuty also calls this the routing key.
  4. Create a PagerDuty channel in pingdan and send a test alert. pingdan triggers and resolves the test incident automatically.

Example

Routing key: 0123456789abcdef0123456789abcdef

ntfy

Simple mobile push alerts, self-hosted notification topics, or lightweight personal on-call.

Deployment env

None. This channel only needs values from the provider UI.

Pingdan fields

  • Topic — the ntfy topic to publish to.
  • Server — optional server URL; leave blank to use https://ntfy.sh.
  • Access token — optional bearer token for private topics or self-hosted servers.

Setup steps

  1. Choose a topic name, or create a private topic on your ntfy server.
  2. Subscribe to the topic in the ntfy mobile app, web app, or CLI.
  3. If the topic is protected, create an access token and paste it into pingdan.
  4. Create an ntfy channel in pingdan and send a test alert.

Example

Topic: production-alerts
Server: https://ntfy.sh
Access token: tk_xxxxxxxxx

Pushover

Personal or small-team push alerts across phone, tablet, and desktop clients.

Deployment env

  • PUSHOVER_APP_TOKEN — application token registered in Pushover.

Pingdan fields

  • User key — your Pushover user key or a Pushover delivery group key.

Setup steps

  1. Create or open your Pushover account and install the client on the devices that should receive alerts.
  2. Copy your user key from the Pushover dashboard, or create a delivery group and copy its group key.
  3. Register an application in Pushover and copy its API token.
  4. Set PUSHOVER_APP_TOKEN on the pingdan API service, restart it, then create a Pushover channel and send a test alert.

Example

PUSHOVER_APP_TOKEN=po_app_xxxxxxxxx

User key: po_user_xxxxxxxxx

Twilio SMS

Last-resort SMS for critical failures where chat or push may be missed.

Deployment env

  • TWILIO_ACCOUNT_SID — Twilio Account SID.
  • TWILIO_AUTH_TOKEN — Twilio Auth Token.
  • TWILIO_FROM — Twilio phone number in E.164 format.

Pingdan fields

  • Phone number — recipient in E.164 format, for example +15551234567.

Setup steps

  1. In Twilio, get an SMS-capable sender number.
  2. Copy the Account SID and Auth Token from the Twilio Console.
  3. Set TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, and TWILIO_FROM on the pingdan API service, then restart it.
  4. Create a Twilio SMS channel in pingdan with the recipient phone number and send a test alert.

Example

TWILIO_ACCOUNT_SID=ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
TWILIO_AUTH_TOKEN=your_auth_token
TWILIO_FROM=+15550000000

Phone number: +15551234567

Opsgenie

Opsgenie alert routing, on-call schedules, and automatic close on recovery.

Deployment env

None. This channel only needs values from the provider UI.

Pingdan fields

  • API key — API integration key with permission to create and close alerts.
  • Region — choose US or EU.

Setup steps

  1. In Opsgenie, create an API integration for the team or account that should receive alerts.
  2. Copy the integration API key. Prefer an integration key over a general account-management API key.
  3. Choose the matching pingdan region: US for api.opsgenie.com, EU for api.eu.opsgenie.com.
  4. Create an Opsgenie channel in pingdan and send a test alert. pingdan creates and closes the test alert automatically.

Example

API key: 01234567-89ab-cdef-0123-456789abcdef
Region: us

Webhook payload

Generic webhooks receive the full structured alert as JSON. A typical endpoint-down payload looks like this:

{
  "event": "endpoint.down",
  "endpoint": {
    "id": "9d4b2d3c-...",
    "name": "Production API",
    "url": "https://api.example.com/healthz"
  },
  "check": {
    "statusCode": 503,
    "checkedAt": "2026-07-10T08:30:00Z"
  },
  "subject": "[pingdan] Production API — DOWN",
  "body": "Endpoint: Production API\nURL: https://api.example.com/healthz\nState: DOWN\nStatus: 503\nAt: 2026-07-10T08:30:00Z"
}

SSL alerts use event: "ssl.expiring" and include an ssl object with daysLeft and expiresAt. Recovery alerts use event: "endpoint.recovered".

If you set a webhook secret, pingdan signs the exact request body with HMAC-SHA256 and sends X-Pingdan-Signature: sha256=<hex>. In Node.js, verification is:

import crypto from "node:crypto";

const expected = "sha256=" + crypto
  .createHmac("sha256", process.env.PINGDAN_WEBHOOK_SECRET)
  .update(rawRequestBody)
  .digest("hex");

const received = Buffer.from(signature ?? "");
const trusted = Buffer.from(expected);
if (received.length !== trusted.length || !crypto.timingSafeEqual(received, trusted)) {
  throw new Error("bad signature");
}

Webhook recipes

Tools with flexible webhook ingestion can use the generic webhook channel directly:

  • Better Stack — create an incoming webhook integration in Better Stack, copy its ingest URL, add a pingdan Generic webhook channel, and attach it to monitors. Use the payload's event and endpoint.id fields for routing or deduplication rules.
  • Grafana OnCall — create an HTTP webhook integration, paste the generated URL into a pingdan Generic webhook channel, and map endpoint.down to firing and endpoint.recovered to resolved in the integration template.