Get a key, create a monitor, start getting checks. No registration. Your key is your account.
Go to pingdog.net and click "Get my free monitoring key". Your key starts with pdk_. Save it — it is not stored anywhere else.
curl -X POST https://api.pingdog.net/api/monitors \
-H "X-API-Key: pdk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "My API",
"type": "http",
"url": "https://api.example.com/health",
"interval_seconds": 300
}'
curl https://api.pingdog.net/api/monitors/pdk_KEYHASH \
-H "X-API-Key: pdk_YOUR_KEY"
PingDog supports 7 check types. The type field in the monitor object controls which logic is used.
| Type value | What it checks | Unique? |
|---|---|---|
http | HTTP/HTTPS status code, response time, body match | |
tcp | TCP port open, connect time | |
dns | DNS resolution time, resolved IPs | |
ssl | Certificate validity, days until expiry | |
rpc | Block height, sync status, staleness | Only PingDog |
a2a | Agent card discovery, capabilities, ping | Only PingDog |
mcp | WebSocket connect, tools/list, response time | Only PingDog |
Makes an HTTP request and validates the response. Optional: match a string in the response body.
{
"type": "http",
"url": "https://api.example.com/health",
"method": "GET", // GET or POST
"expect_status": 200, // default 200
"expect_body": "\"ok\":true" // optional substring match
}
Attempts a TCP connection to the host and port. Pass the target as tcp://host:port.
{
"type": "tcp",
"url": "tcp://db.example.com:5432"
}
Resolves the hostname and checks the answer. Useful for detecting DNS hijacking or propagation failures.
{
"type": "dns",
"url": "https://example.com" // hostname extracted automatically
}
Connects via TLS and reads the certificate expiry date. You are alerted when ssl_days_left falls below thresholds (30d, 7d, 1d on Pro+).
{
"type": "ssl",
"url": "https://example.com"
}
Calls eth_blockNumber on the RPC endpoint and checks: valid JSON-RPC response, block height is a valid hex number, and the block is not stale (moving forward over time).
{
"type": "rpc",
"url": "https://mainnet.infura.io/v3/YOUR_KEY"
}
Result fields include: block_number, is_syncing, is_stale (true if the block did not advance vs previous check).
Performs a 3-step health check on an A2A-compatible AI agent:
/.well-known/agent-card.json — must return valid JSONname, capabilities, and endpoint fields{
"type": "a2a",
"url": "https://agent.example.com"
}
Connects via WebSocket and verifies the MCP server can list its tools. The check times out if the connection fails or tools/list returns no response within the timeout window.
{
"type": "mcp",
"url": "wss://mcp.example.com/ws"
}
Base URL: https://api.pingdog.net
All requests require the header X-API-Key: pdk_YOUR_KEY.
Request body:
{
"name": "My API", // required
"type": "http", // required: http|tcp|dns|ssl|rpc|a2a|mcp
"url": "https://...", // required
"interval_seconds": 300, // 300|60|30 (tier-limited)
"timeout_ms": 10000, // optional, default 10000
"method": "GET", // http only: GET|POST
"expect_status": 200, // http only
"expect_body": "ok", // http only, substring match
"regions": ["ca", "de"], // optional: ca|de|sg|uk
"webhook_url": "https://...", // optional alert destination
"telegram_chat_id": "-100123456" // optional
}
keyHash is SHA-256 of your key (hex, first 16 chars). Available in the account page.limit (default 100, max 1000), location (filter by region).PingDog runs checks from multiple geographic locations simultaneously. A service is only declared DOWN when a majority of locations agree it is unreachable.
This prevents false positives from transient routing issues, DNS hiccups, or regional packet loss that only affects one location.
Alerts fire when consensus declares a state change (UP → DOWN or DOWN → UP).
Set webhook_url on any monitor. PingDog will POST the following JSON body:
{
"monitor_id": "abc123",
"monitor_name": "My API",
"status": "down", // "up" or "down"
"locations": ["ca", "de", "sg"],
"latency_ms": null,
"error": "Connection refused",
"timestamp": "2026-04-12T14:23:00Z"
}
Get a bot token from @BotFather and find your chat ID using @userinfobot. Set telegram_chat_id on any monitor. PingDog will send a message like:
🔴 DOWN — My API
Confirmed from: Canada, Germany, Singapore
Error: Connection refused
Time: 2026-04-12 14:23 UTC
Every account gets a public status page at:
https://pingdog.net/status.html?k=YOUR_KEY_HASH
Share this URL with customers. It shows all monitors you marked public, with green/red dot indicators, uptime percentage, and response time trend.
Monitors are private by default. Set "public": true on any monitor to include it on the status page.
PingDog is a Progressive Web App. On mobile, open pingdog.net and tap "Add to Home Screen" — it installs like a native app with offline support.
On desktop Chrome: click the install icon in the address bar.
Free tier is free forever, no payment needed. To upgrade to Pro or Business:
Cancel at any time by revoking the USDC/USDT approval in your wallet. No forms, no emails.
const res = await fetch('https://api.pingdog.net/api/monitors', {
method: 'POST',
headers: {
'X-API-Key': 'pdk_YOUR_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'My RPC Node',
type: 'rpc',
url: 'https://mainnet.infura.io/v3/KEY',
interval_seconds: 60,
}),
});
const monitor = await res.json();
console.log(monitor.id);
import httpx
resp = httpx.post(
"https://api.pingdog.net/api/monitors",
headers={"X-API-Key": "pdk_YOUR_KEY"},
json={
"name": "My A2A Agent",
"type": "a2a",
"url": "https://agent.example.com",
"interval_seconds": 300,
},
)
print(resp.json())
curl https://api.pingdog.net/api/monitors/YOUR_KEY_HASH \
-H "X-API-Key: pdk_YOUR_KEY" | jq .