Documentation
Complete guide to setting up website monitoring with PingZen. API documentation, code examples, and best practices.
Authentication
All API requests require authentication. You can use either a personal API key (recommended for integrations) or a JWT token.
Recommended API Key (Recommended)
Create a personal API key from your profile menu. Use the X-API-Key header:
curl -H "X-API-Key: YOUR_API_KEY" \
https://pingzen.dev/api/v1/monitorsTo create an API key: Click on your profile → API Keys → Create New Key

JWT Token
For web applications, you can use JWT tokens from the /auth/login endpoint:
curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
https://pingzen.dev/api/v1/monitorsEndpoints
Complete list of all available API endpoints
Request Examples
Detailed cURL examples
List all monitors
curl -H "X-API-Key: YOUR_API_KEY" \
https://pingzen.dev/api/v1/monitors?workspace_id=1Create a new monitor
curl -X POST https://pingzen.dev/api/v1/monitors \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "My Site", "url": "https://example.com", "protocol": "https", "workspace_id": 1, "interval_seconds": 60}'Get monitor details
curl -H "X-API-Key: YOUR_API_KEY" \
https://pingzen.dev/api/v1/monitors/123Update monitor configuration
curl -X PATCH https://pingzen.dev/api/v1/monitors/123 \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"interval_seconds": 30, "name": "Updated Name"}'Delete a monitor
curl -X DELETE https://pingzen.dev/api/v1/monitors/123 \
-H "X-API-Key: YOUR_API_KEY"Create a heartbeat monitor for cron jobs and scheduled tasks. Returns a unique ping URL and secret.
curl -X POST https://pingzen.dev/api/v1/heartbeats \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Daily Backup", "expected_interval_seconds": 86400, "grace_period_seconds": 600}'Send a heartbeat ping via GET request. Simplest integration — just add to crontab or end of script. No authentication required.
# Simplest: chain with && so ping fires only on success
0 3 * * * /usr/local/bin/backup.sh && curl -fsS -m 10 https://pingzen.dev/api/v1/ping/YOUR_PING_KEY/YOUR_SLUG
# Or just a standalone ping
curl https://pingzen.dev/api/v1/ping/aBcDeFgHiJkLmNoPqR/daily-backupReport job lifecycle signals (start/success/fail) with optional payload and duration. Use X-Secret header for authentication.
# Report success with payload and duration
curl -X POST https://pingzen.dev/api/v1/ping/aBcDeFgHiJkLmNoPqR/daily-backup/success \
-H "X-Secret: YOUR_SECRET" \
-H "Content-Type: application/json" \
-d '{"duration_ms": 45000, "payload": {"rows": 500000}}'
# Report failure — triggers instant alert (no waiting for missed interval)
curl -X POST https://pingzen.dev/api/v1/ping/aBcDeFgHiJkLmNoPqR/daily-backup/fail \
-H "X-Secret: YOUR_SECRET" \
-H "Content-Type: application/json" \
-d '{"payload": {"error": "disk full"}}'
# One-liner for cron: success OR fail
/usr/local/bin/backup.sh \
&& curl -fsS -m 10 https://pingzen.dev/api/v1/ping/aBcDeFgHiJkLmNoPqR/daily-backup/success \
|| curl -fsS -m 10 https://pingzen.dev/api/v1/ping/aBcDeFgHiJkLmNoPqR/daily-backup/failCode Examples
🐍 Python Example
import requests
# Get your API key from: Profile → API Keys → Create New Key
PINGZEN_API_KEY = "YOUR_API_KEY"
BASE_URL = "https://pingzen.dev/api/v1"
headers = {
"X-API-Key": PINGZEN_API_KEY,
"Content-Type": "application/json"
}
# Create a monitor
monitor_data = {
"name": "My Website",
"url": "https://example.com",
"protocol": "https",
"interval_seconds": 60,
"workspace_id": 1
}
response = requests.post(
f"{BASE_URL}/monitors",
headers=headers,
json=monitor_data
)
print(response.json())
# Get all monitors
monitors = requests.get(
f"{BASE_URL}/monitors",
headers=headers
).json()
for monitor in monitors:
print(f"{monitor['name']}: {monitor['status']}")⚡ JavaScript Example
// Get your API key from: Profile → API Keys → Create New Key
const PINGZEN_API_KEY = 'pz_abc12345_...';
const BASE_URL = 'https://pingzen.dev/api/v1';
const headers = {
'X-API-Key': PINGZEN_API_KEY,
'Content-Type': 'application/json'
};
// Create a monitor
async function createMonitor() {
const response = await fetch(`${BASE_URL}/monitors`, {
method: 'POST',
headers: headers,
body: JSON.stringify({
name: 'My Website',
url: 'https://example.com',
protocol: 'https',
interval_seconds: 60,
workspace_id: 1
})
});
const data = await response.json();
console.log(data);
}
// Get all monitors
async function getMonitors() {
const response = await fetch(`${BASE_URL}/monitors`, {
headers: headers
});
const monitors = await response.json();
monitors.forEach(monitor => {
console.log(`${monitor.name}: ${monitor.status}`);
});
}
createMonitor();
getMonitors();Heartbeat / Cron Monitoring Examples
Monitor cron jobs, scheduled tasks, and background processes. Create a heartbeat monitor, then send pings from your scripts to confirm they ran.
🖥️ Bash / Cron Job
#!/bin/bash
# === Pattern 1: Chain with && (recommended for cron) ===
# curl runs ONLY if backup succeeds (exit code 0)
# If backup fails — no ping — PingZen alerts after grace period
#
# 0 2 * * * /usr/local/bin/backup.sh && curl -fsS -m 10 https://pingzen.dev/api/v1/ping/YOUR_PING_KEY/YOUR_SLUG
# === Pattern 2: Report both success AND failure (best) ===
# /success on success, /fail on failure — instant alert, no waiting
#
# 0 2 * * * /usr/local/bin/backup.sh \
# && curl -fsS -m 10 https://pingzen.dev/api/v1/ping/YOUR_PING_KEY/YOUR_SLUG/success \
# || curl -fsS -m 10 https://pingzen.dev/api/v1/ping/YOUR_PING_KEY/YOUR_SLUG/fail
# === Pattern 3: Full script with duration and payload ===
PING_KEY="YOUR_PING_KEY"
SLUG="daily-backup"
SECRET="YOUR_SECRET"
PING_URL="https://pingzen.dev/api/v1/ping/$PING_KEY/$SLUG"
SECONDS=0 # Bash built-in timer
# Your backup logic
pg_dump mydb > /backups/mydb_$(date +%F).sql
if [ $? -eq 0 ]; then
# Report success with duration
curl -fsS -m 10 -X POST "$PING_URL/success" \
-H "X-Secret: $SECRET" \
-H "Content-Type: application/json" \
-d "{\"duration_ms\": $((SECONDS * 1000))}"
else
# Report failure — instant alert
curl -fsS -m 10 -X POST "$PING_URL/fail" \
-H "X-Secret: $SECRET" \
-H "Content-Type: application/json" \
-d "{\"payload\": {\"error\": \"pg_dump failed\"}}"
fi
# === Simplest — just GET (no auth, no payload) ===
# curl https://pingzen.dev/api/v1/ping/YOUR_PING_KEY/YOUR_SLUG🐍 Python Heartbeat
import requests
PINGZEN_API_KEY = "YOUR_API_KEY"
BASE_URL = "https://pingzen.dev/api/v1"
headers = {
"X-API-Key": PINGZEN_API_KEY,
"Content-Type": "application/json"
}
# Create a heartbeat monitor
heartbeat = requests.post(
f"{BASE_URL}/heartbeats",
headers=headers,
json={
"name": "Daily Backup",
"expected_interval_seconds": 86400,
"grace_period_seconds": 600
}
).json()
ping_key = heartbeat["ping_key"] # Workspace secret key
slug = heartbeat["slug"]
secret = heartbeat["secret"] # Save this — shown only once!
ping_url = f"{BASE_URL}/ping/{ping_key}/{slug}"
print(f"Ping URL: {ping_url}")
# Send a ping at the end of your script
requests.post(
f"{ping_url}/success",
headers={"X-Secret": secret, "Content-Type": "application/json"},
json={"duration_ms": 12000, "payload": {"status": "ok"}}
)⚡ JavaScript Heartbeat
const PINGZEN_API_KEY = 'pz_abc12345_...';
const BASE_URL = 'https://pingzen.dev/api/v1';
// Create a heartbeat monitor
async function createHeartbeat() {
const response = await fetch(`${BASE_URL}/heartbeats`, {
method: 'POST',
headers: {
'X-API-Key': PINGZEN_API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'Nightly Report',
expected_interval_seconds: 86400,
grace_period_seconds: 600
})
});
const data = await response.json();
const pingKey = data.ping_key; // Workspace secret key
const slug = data.slug;
console.log('Ping URL:', `${BASE_URL}/ping/${pingKey}/${slug}`);
console.log('Secret:', data.secret); // Save — shown only once!
}
// Send heartbeat ping from your cron job
async function sendPing(pingKey, slug, secret) {
await fetch(`${BASE_URL}/ping/${pingKey}/${slug}/success`, {
method: 'POST',
headers: {
'X-Secret': secret,
'Content-Type': 'application/json'
},
body: JSON.stringify({
duration_ms: 5000,
payload: { rows_processed: 1000 }
})
});
}OpenAPI & AI Agents
PingZen provides machine-readable specifications for AI agent integration and automation tools.
Rate Limits
| Plan | Requests/Hour | Burst Limit |
|---|---|---|
| Free | 100/hour | 10/minute |
Common Questions
What protocols can I monitor?
PingZen supports 23 protocols: HTTP/HTTPS, WebSocket (WS/WSS), TCP, UDP, ICMP Ping, gRPC, DNS, WHOIS, SSL certificates, Email (SMTP/IMAP/POP3), FTP/FTPS, DNSBL, PageSpeed, SOCKS5, MTProxy, API Check, and Transaction. You can monitor websites, APIs, servers, databases, and any network service.
How fast can I get alerts?
Telegram alerts are delivered within 1-2 seconds of detection. Slack and Discord notifications arrive almost instantly. You can configure multiple alert channels for redundancy.
Can I organize monitors by project?
Yes! PingZen supports workspaces, which let you organize monitors by project, environment, or team. Each workspace can have its own alert configurations and team members.
Is there an API for automation?
Absolutely. PingZen provides a full REST API with OpenAPI documentation. You can create, update, and delete monitors programmatically.
How do status pages work?
Status pages are public, branded pages showing your services' uptime. You can display real-time status and allow customers to subscribe for updates.
What happens if I reach my monitor limit?
We'll notify you when approaching your limit. You can pause some monitors or contact us for increased capacity. We never stop monitoring without warning, ensuring your critical services stay protected.
Ready to stop missing downtime?
Join thousands of teams who trust PingZen. Setup takes 30 seconds.