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:
- Create an account and open your dashboard.
- Add an endpoint: paste a URL and pick the HTTP method.
- Choose a check interval and what makes a check pass.
- 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/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 statusresponse_time— latency in millisecondsheader— a response header by namebody— the full response bodyjson_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.
- Email — Add an address. The deployment must have RESEND_API_KEY set, and EMAIL_FROM should be a verified sender.
- Telegram — Paste a chat ID. The deployment must have TELEGRAM_BOT_TOKEN set; use getUpdates after messaging the bot to find your chat ID.
- Slack — Create an incoming webhook and paste the hooks.slack.com URL.
- Discord — Create a channel webhook and paste the discord.com/api/webhooks URL.
- Microsoft Teams — Create a Power Automate workflow with a Teams webhook trigger and paste the HTTPS workflow URL.
- Generic webhook — Paste an HTTP(S) URL. Optionally add a signing secret for HMAC verification.
- PagerDuty — Create an Events API v2 integration and paste its routing key.
- ntfy — Enter a topic, optionally a custom server URL and bearer token. The default server is https://ntfy.sh.
- Pushover — Paste a user or group key. The deployment must have PUSHOVER_APP_TOKEN set.
- Twilio SMS — Paste an E.164 phone number such as +15551234567. The deployment must have TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN and TWILIO_FROM set.
- Opsgenie — Paste 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 asPingdan Alerts <[email protected]>.
Pingdan fields
Email address— the recipient, for example[email protected].
Setup steps
- In Resend, add and verify a sending domain.
- Create an API key, ideally scoped for sending email.
- Set
RESEND_API_KEYandEMAIL_FROMon the pingdan API service, then restart it. - 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
- Open Telegram, message
@BotFather, run/newbot, and copy the token. - Set
TELEGRAM_BOT_TOKENon the pingdan API service and restart it. - Message the bot once, or add it to the target group and send a message there.
- Visit
https://api.telegram.org/botYOUR_TOKEN/getUpdatesand copy thechat.id. Group IDs are often negative. - Create a Telegram channel in pingdan with that chat ID and send a test alert.
Example
TELEGRAM_BOT_TOKEN=123456789:AA...
Telegram chat ID: -1001234567890Slack
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 withhttps://hooks.slack.com/.
Setup steps
- Create or open a Slack app for your workspace.
- Enable Incoming Webhooks for the app.
- Add a new webhook to the workspace and choose the channel that should receive alerts.
- 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/xxxxxxxxDiscord
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
- Open the Discord server, go to Server Settings, then Integrations.
- Create a webhook, choose the text channel, and give it a recognizable name.
- Copy the webhook URL.
- Create a Discord channel in pingdan and send a test alert.
Example
Discord webhook URL:
https://discord.com/api/webhooks/1234567890/xxxxxxxxMicrosoft 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
- In Teams, create a Workflow that receives an HTTP request through a webhook URL.
- Configure the workflow to post the incoming message or Adaptive Card to the target channel or chat.
- Copy the generated webhook URL.
- 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 reachablehttporhttpsendpoint.Signing secret— optional HMAC secret for verifying pingdan requests.
Setup steps
- Create an endpoint that accepts
POSTrequests with a JSON body. - If you use a signing secret, verify the raw request body against
X-Pingdan-Signature. - Create a Generic webhook channel in pingdan with the URL and optional secret.
- 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_privatePagerDuty
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
- In PagerDuty, create or open the service that should own pingdan incidents.
- Add an Events API v2 integration to that service.
- Copy the integration key; PagerDuty also calls this the routing key.
- Create a PagerDuty channel in pingdan and send a test alert. pingdan triggers and resolves the test incident automatically.
Example
Routing key: 0123456789abcdef0123456789abcdefntfy
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 usehttps://ntfy.sh.Access token— optional bearer token for private topics or self-hosted servers.
Setup steps
- Choose a topic name, or create a private topic on your ntfy server.
- Subscribe to the topic in the ntfy mobile app, web app, or CLI.
- If the topic is protected, create an access token and paste it into pingdan.
- Create an ntfy channel in pingdan and send a test alert.
Example
Topic: production-alerts
Server: https://ntfy.sh
Access token: tk_xxxxxxxxxPushover
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
- Create or open your Pushover account and install the client on the devices that should receive alerts.
- Copy your user key from the Pushover dashboard, or create a delivery group and copy its group key.
- Register an application in Pushover and copy its API token.
- Set
PUSHOVER_APP_TOKENon 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_xxxxxxxxxTwilio 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
- In Twilio, get an SMS-capable sender number.
- Copy the Account SID and Auth Token from the Twilio Console.
- Set
TWILIO_ACCOUNT_SID,TWILIO_AUTH_TOKEN, andTWILIO_FROMon the pingdan API service, then restart it. - 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: +15551234567Opsgenie
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— chooseUSorEU.
Setup steps
- In Opsgenie, create an API integration for the team or account that should receive alerts.
- Copy the integration API key. Prefer an integration key over a general account-management API key.
- Choose the matching pingdan region:
USforapi.opsgenie.com,EUforapi.eu.opsgenie.com. - 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: usWebhook 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
eventandendpoint.idfields 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.downto firing andendpoint.recoveredto resolved in the integration template.