Документация
Полное руководство по настройке мониторинга сайтов с PingZen. Документация API, примеры кода и лучшие практики.
Аутентификация
Все API запросы требуют аутентификации. Доступны два метода: персональный API ключ (для большинства интеграций) и JWT токен (для веб-приложений и эндпоинтов, не поддерживающих ключ).
API ключ
Создайте персональный API ключ в меню профиля. Используйте заголовок X-API-Key:
curl -H "X-API-Key: YOUR_API_KEY" \
https://pingzen.dev/api/v1/monitorsЧтобы создать API ключ: Нажмите на профиль → API ключи → Создать новый ключ
Где X-API-Key работает, а где требуется JWT
Важно
На текущий момент X-API-Key принимают только эндпоинты мониторов (CRUD, pause/resume, reorder, основные статистики и timeline). Все остальные эндпоинты — /workspaces, /alerts, /incidents, /status-pages, /monitor-groups, /probes, /heartbeats (кроме no-auth /ping/...), /maintenance, /feedback, /dashboard, /web-push, /scheduled-reports, /webhooks, /webhook-checks, /api-checks, /api-keys, /auth/*, /analytics, /telegram-bot, /alert-channel-configs — на текущий момент требуют JWT-токен. Это расхождение с историческим обещанием доки; мы его постепенно закрываем.
Что попадает под X-API-Key прямо сейчас:
/api/v1/monitorsCRUD (GET/POST/PATCH/DELETE), /reorder, /pause, /resume, /reset-stats, /results, /timeline, /status-ranges, /response-time-distribution, /cert-chain, /dnsbl-providers/api/v1/ping/:ping_key/:slugбез аутентификации (по ping_key) — для heartbeat'овВнутри /monitors/* пока требуют JWT (известное расхождение, чиним): GET /:id/stats, POST /:id/check, GET /:id/sla, GET /:id/sla/export/csv|pdf, GET /:id/dnsbl/provider-history, POST /test.
JWT Token
Для веб-приложений и эндпоинтов, не поддерживающих API-ключ, используйте JWT из /auth/login:
# 1. Получить токен (передайте email и пароль)
ACCESS=$(curl -sS -X POST https://pingzen.dev/api/v1/auth/login \
-H 'Content-Type: application/json' \
-d '{"email":"you@example.com","password":"…"}' \
| python3 -c 'import json,sys; print(json.load(sys.stdin)["access_token"])')
# 2. Использовать в Authorization: Bearer
curl -H "Authorization: Bearer $ACCESS" https://pingzen.dev/api/v1/workspacesAccess-токен живёт 15 минут; для долгоживущих интеграций используйте refresh_token из того же ответа и эндпоинт /auth/refresh.
Эндпоинты
Полный список всех доступных API эндпоинтов.
Мониторы
Управление мониторами (22 эндпоинта, сгруппированы по назначению).
CRUD
/api/v1/monitors— Список ваших мониторов/api/v1/monitors— Создать монитор/api/v1/monitors/:id— Детали монитора/api/v1/monitors/:id— Обновить монитор/api/v1/monitors/:id— Удалить мониторУправление
/api/v1/monitors/:id/pause— Поставить на паузу/api/v1/monitors/:id/resume— Снять с паузы/api/v1/monitors/:id/check— Ручной запуск проверки (JWT)/api/v1/monitors/:id/reset-stats— Сбросить накопленную статистику (требует confirm)/api/v1/monitors/reorder— Изменить порядок отображения/api/v1/monitors/test— Проверить конфиг без сохранения (JWT)Статистика и история
/api/v1/monitors/:id/stats— Сводная статистика (JWT)/api/v1/monitors/:id/results— История отдельных результатов проверок/api/v1/monitors/:id/timeline— Таймлайн изменения статуса/api/v1/monitors/:id/status-ranges— Run-length-encoded интервалы статусов/api/v1/monitors/:id/response-time-distribution— Перцентили времени ответа (P50/P90/P95/P99)/api/v1/monitors/:id/sla— SLA-отчёт (JWT)/api/v1/monitors/:id/sla/export/csv— Экспорт SLA в CSV (JWT)/api/v1/monitors/:id/sla/export/pdf— Экспорт SLA в PDF (JWT)Диагностика
/api/v1/monitors/:id/cert-chain— Live-инспекция TLS-цепочки сертификатов/api/v1/monitors/:id/dnsbl/provider-history— DNSBL: история по провайдерам (JWT)/api/v1/monitors/dnsbl-providers— Список дефолтных DNSBL-провайдеровАлерты
Настройка уведомлений.
/api/v1/alerts— List alerts/api/v1/alerts— Create alert/api/v1/alerts/:id— Update alert/api/v1/alerts/:id— Delete alert/api/v1/alerts/:id/test— Send test alert/api/v1/alerts/:id/toggle— Toggle alert active/inactive/api/v1/alerts/:id/history— Get alert delivery history/api/v1/alerts/history— Вся история доставки алёртов (по workspace)/api/v1/alerts/channels/availability— Доступные каналы доставки (Telegram, Discord, Email, Slack, …)/api/v1/alerts/test-send— Отправить тестовое сообщение в произвольный канал (без сохранения алёрта)Инциденты
Управление инцидентами.
/api/v1/incidents— List incidents/api/v1/incidents/:id— Get incident details/api/v1/incidents/:id— Update incident/api/v1/incidents/:id/updates— Add status update/api/v1/incidents/:id/resolve— Resolve incident/api/v1/incidents/:id— Delete incidentСтраницы статуса
Публичные страницы статуса.
/api/v1/status-pages— List status pages/api/v1/status-pages— Create status page/api/v1/status-pages/:id— Get status page/api/v1/status-pages/:id— Update status page/api/v1/status-pages/:id— Delete status page/api/v1/status-pages/:id/monitors— Добавить монитор на статус-страницу/api/v1/status-pages/:id/monitors/:monitor_id— Убрать монитор со статус-страницы/api/v1/public/status/:slug— Public status (no auth)Воркспейсы
Управление рабочими пространствами.
/api/v1/workspaces— Список ваших воркспейсов/api/v1/workspaces/default— Получить ваш воркспейс по умолчанию (быстрый способ узнать workspace_id)/api/v1/workspaces/summary— Краткий список (id, name) — удобно для дропдаунов/api/v1/workspaces— Создать воркспейс/api/v1/workspaces/:id— Обновить воркспейс/api/v1/workspaces/:id— Удалить воркспейс/api/v1/workspaces/:id/set-default— Сделать воркспейс по умолчанию/api/v1/workspaces/:id/regenerate-ping-key— Перегенерировать ping_key (старые ссылки heartbeat-пингов перестанут работать)Хартбиты (Cron)
Мониторинг cron-задач.
/api/v1/heartbeats— List heartbeat monitors/api/v1/heartbeats— Create heartbeat monitor/api/v1/heartbeats/:id— Get heartbeat monitor details/api/v1/heartbeats/:id— Update heartbeat monitor/api/v1/heartbeats/:id— Delete heartbeat monitor/api/v1/heartbeats/:id/pause— Pause heartbeat monitor/api/v1/heartbeats/:id/resume— Resume heartbeat monitor/api/v1/heartbeats/:id/regenerate-secret— Regenerate authentication secret/api/v1/heartbeats/:id/stats— Get heartbeat statistics (uptime, ping counts)/api/v1/heartbeats/:id/pings— Get ping history (paginated)/api/v1/ping/:ping_key/:slug— Record ping via GET (no auth, for simple cron jobs)/api/v1/ping/:ping_key/:slug— Record ping via POST (no auth, with optional payload)/api/v1/ping/:ping_key/:slug/start— Record job start signal (no auth)/api/v1/ping/:ping_key/:slug/success— Record job success signal (no auth)/api/v1/ping/:ping_key/:slug/fail— Record job failure signal (no auth)API ключи
Управление API ключами.
/api/v1/api-keys— List API keys/api/v1/api-keys— Create API key/api/v1/api-keys/:id— Revoke API keyОбслуживание
Окна обслуживания.
/api/v1/maintenance— List maintenance windows/api/v1/maintenance— Create maintenance window/api/v1/maintenance/:id— Get maintenance window details/api/v1/maintenance/:id— Update maintenance window/api/v1/maintenance/:id— Delete maintenance window/api/v1/maintenance/:id/cancel— Cancel maintenanceГруппы мониторов
Управление группами (12 эндпоинтов, сгруппированы по назначению).
CRUD групп
/api/v1/monitor-groups— Список групп мониторов/api/v1/monitor-groups— Создать группу/api/v1/monitor-groups/:id— Детали группы/api/v1/monitor-groups/:id— Обновить группу (имя, описание, paused-флаг)/api/v1/monitor-groups/:id— Удалить группуСвязи (мониторы и теги)
/api/v1/monitor-groups/:id/monitors— Добавить мониторы в группу/api/v1/monitor-groups/:id/monitors— Убрать мониторы из группы/api/v1/monitor-groups/:id/tags— Добавить теги/api/v1/monitor-groups/:id/tags— Убрать тегиСтатус и статистика
/api/v1/monitor-groups/stats— Агрегированная статистика по всем группам/api/v1/monitor-groups/:id/status— Агрегированный статус группы/api/v1/monitor-groups/:id/status— Обновить агрегированный статусTelegram группы
Алерты в Telegram группы.
/api/v1/telegram-groups— List linked Telegram groups/api/v1/telegram-groups/link— Generate deep-link URL for Telegram group/api/v1/telegram-groups/:id— Unlink Telegram groupОтчёты по расписанию
Автоматические email отчёты.
/api/v1/scheduled-reports— List scheduled reports/api/v1/scheduled-reports— Create scheduled report/api/v1/scheduled-reports/:id— Get report details/api/v1/scheduled-reports/:id— Update scheduled report/api/v1/scheduled-reports/:id— Delete scheduled report/api/v1/scheduled-reports/:id/pause— Pause report/api/v1/scheduled-reports/:id/resume— Resume report/api/v1/scheduled-reports/:id/run— Запустить отчёт вручную/api/v1/scheduled-reports/:id/toggle— Переключить активность (pause/resume в одной ручке)/api/v1/scheduled-reports/:id/runs— История запусков отчётаКонфигурация каналов
Учётные данные каналов (SMTP, Twilio и т.д.).
/api/v1/alert-channel-configs— List channel configurations/api/v1/alert-channel-configs— Create channel config/api/v1/alert-channel-configs/:id— Обновить конфиг канала/api/v1/alert-channel-configs/:id— Delete channel config/api/v1/alert-channel-configs/:id/test— Отправить тестовое сообщение в этот конфиг/api/v1/alert-channel-configs/:id/activate— Включить (если был auto-disabled после серии ошибок)/api/v1/alert-channel-configs/:id/deactivate— Временно выключить без удаления/api/v1/alert-channel-configs/channels/:channel— Активный конфиг для канала (telegram, discord, slack, …)Дашборд
Агрегированная статистика.
/api/v1/dashboard/stats— Aggregated dashboard statistics/api/v1/dashboard/uptime-summary— Сводка uptime по всем мониторам/api/v1/dashboard/alerts-summary— Alerts summary/api/v1/dashboard/incidents— Сводка по инцидентам/api/v1/dashboard/combined— All dashboard data in one callВебхуки (исходящие)
Доставка событий через вебхуки (12 эндпоинтов, сгруппированы по назначению).
CRUD вебхуков
/api/v1/webhooks— Список вебхуков/api/v1/webhooks— Создать вебхук/api/v1/webhooks/:id— Детали вебхука/api/v1/webhooks/:id— Обновить вебхук/api/v1/webhooks/:id— Удалить вебхукДействия
/api/v1/webhooks/:id/test— Отправить тестовый payload/api/v1/webhooks/:id/secret— Перегенерировать HMAC-секрет подписи (старая подпись перестанет приниматься у вас на стороне)Доставки и DLQ
/api/v1/webhooks/:id/deliveries— История доставок/api/v1/webhooks/:id/stats— Сводная статистика по доставкам (успехи/ошибки/p50/p95)/api/v1/webhooks/:id/dlq— Очередь несоставшихся доставок (Dead Letter Queue)/api/v1/webhooks/:id/dlq/:dlq_id/retry— Повторить попытку доставки из DLQ/api/v1/webhooks/:id/dlq/:dlq_id/resolve— Пометить запись DLQ как разрешённую (без retry)Справочник
/api/v1/webhooks/events— Доступные типы событий (используются при создании вебхука)Вебхук-чеки (входящие)
Приём входящих вебхуков от внешних сервисов (10 эндпоинтов + 1 публичный приёмник, сгруппированы по назначению).
CRUD проверок
/api/v1/webhook-checks— Список входящих webhook-проверок/api/v1/webhook-checks— Создать входящую проверку/api/v1/webhook-checks/:id— Детали проверки/api/v1/webhook-checks/:id— Обновить проверку/api/v1/webhook-checks/:id— Удалить проверкуУправление проверками
/api/v1/webhook-checks/:id/pause— Поставить проверку на паузу/api/v1/webhook-checks/:id/resume— Снять проверку с паузы/api/v1/webhook-checks/:id/regenerate-secret— Перегенерировать секрет (старая HMAC-подпись от source перестанет приниматься)События и статистика
/api/v1/webhook-checks/:id/events— События входящих webhook-проверок/api/v1/webhook-checks/:id/stats— Сводная статистика по incoming-проверкеПубличный приёмник (без auth)
/api/v1/webhook-check/:slug— Записать факт доставки (этот URL дают внешнему сервису)Обратная связь
Отзывы и запросы на фичи.
/api/v1/feedback— Submit feedback/api/v1/feedback— List feedback/api/v1/feedback/:id— Get feedback details/api/v1/feedback/:id/status— Update feedback status (admin)/api/v1/feedback/:id— Delete feedback (admin)Web Push
Push-уведомления в браузере.
/api/v1/web-push/vapid-public-key— Get VAPID public key/api/v1/web-push/subscribe— Subscribe to push notifications/api/v1/web-push/unsubscribe— Unsubscribe from push notificationsПроба
Идентификация и IP-адреса пробы.
/api/v1/probe/ips— Get probe IP addresses (public, no auth)Примеры запросов
Детальные примеры с cURL.
List monitors
curl -H "X-API-Key: YOUR_API_KEY" \
https://pingzen.dev/api/v1/monitors?workspace_id=1Как узнать ваш workspace_id
Поле workspace_id обязательно в payload’е при создании монитора, алёрта, отчёта и статус-страницы. Получить его можно двумя способами.
Способ 1: через UI (быстрее всего). Откройте страницу воркспейсов — ID каждого воркспейса виден в карточке. У большинства пользователей он равен 1.
Способ 2: через API (для CI/скриптов). Эндпоинты /api/v1/workspaces* пока требуют JWT, а не X-API-Key (см. раздел «Где X-API-Key работает» выше). Шаги:
# 1. Логин — получить access_token
ACCESS=$(curl -sS -X POST https://pingzen.dev/api/v1/auth/login \
-H 'Content-Type: application/json' \
-d '{"email":"you@example.com","password":"…"}' \
| python3 -c 'import json,sys; print(json.load(sys.stdin)["access_token"])')
# 2. Воркспейс по умолчанию (тот, что pre-selected в UI)
curl -sS -H "Authorization: Bearer $ACCESS" \
https://pingzen.dev/api/v1/workspaces/default
# → {"id": 42, "name": "My Workspace", "is_default": true, ...}
# 3. Или короткий список всех (id, name) для дропдаунов
curl -sS -H "Authorization: Bearer $ACCESS" \
https://pingzen.dev/api/v1/workspaces/summaryОднострочник «логин → достать id default’а» для CI:
ACCESS=$(curl -sS -X POST https://pingzen.dev/api/v1/auth/login \
-H 'Content-Type: application/json' \
-d "{\"email\":\"$EMAIL\",\"password\":\"$PASS\"}" \
| python3 -c 'import json,sys; print(json.load(sys.stdin)["access_token"])')
WORKSPACE_ID=$(curl -sS -H "Authorization: Bearer $ACCESS" \
https://pingzen.dev/api/v1/workspaces/default \
| python3 -c 'import json,sys; print(json.load(sys.stdin)["id"])')
echo "$WORKSPACE_ID" # → 42Дальше $WORKSPACE_ID подставляется в payload POST /api/v1/monitors ниже (это уже X-API-Key-эндпоинт).
Create a 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
curl -H "X-API-Key: YOUR_API_KEY" \
https://pingzen.dev/api/v1/monitors/123Update monitor
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": 60, "name": "Updated Name"}'Минимальный interval_seconds зависит от плана: FREE — 60s, платные — 30s. Значение ниже плана вернёт 422 с подробным сообщением.
Delete monitor
curl -X DELETE https://pingzen.dev/api/v1/monitors/123 \
-H "X-API-Key: YOUR_API_KEY"Create a heartbeat monitor
Create a heartbeat monitor for cron jobs and scheduled tasks. Returns a unique ping URL и секрет. /heartbeats CRUD пока требует JWT (см. “Где X-API-Key работает”); workspace_id передаётся как query-параметр, а не в body:
curl -X POST "https://pingzen.dev/api/v1/heartbeats?workspace_id=$WORKSPACE_ID" \
-H "Authorization: Bearer $ACCESS" \
-H "Content-Type: application/json" \
-d '{"name": "Daily Backup", "expected_interval_seconds": 86400, "grace_period_seconds": 600}'Send heartbeat ping (GET)
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-backupHeartbeat lifecycle signals
Report 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/failПримеры кода
Пример на Python
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: [...], total, page, page_size})
data = requests.get(
f"{BASE_URL}/monitors",
headers=headers,
params={"workspace_id": 1}, # scope ваш воркспейс
).json()
for monitor in data["monitors"]:
print(f"{monitor['name']}: {monitor['status']}")Пример на JavaScript
// 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 (ответ — {monitors: [...], total, page, page_size})
async function getMonitors() {
const response = await fetch(
`${BASE_URL}/monitors?workspace_id=1`, // scope ваш воркспейс
{ headers: headers },
);
const data = await response.json();
data.monitors.forEach(monitor => {
console.log(`${monitor.name}: ${monitor.status}`);
});
}
createMonitor();
getMonitors();Примеры мониторинга Heartbeat / Cron
Мониторинг cron-задач, запланированных задач и фоновых процессов. Создайте heartbeat-монитор, затем отправляйте пинги из ваших скриптов для подтверждения их выполнения.
Bash / Cron задача
#!/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\"}}"
fiHeartbeat на Python
import requests
BASE_URL = "https://pingzen.dev/api/v1"
# CRUD /heartbeats пока требует JWT (X-API-Key ещё не поддержан).
# Логинимся один раз, дальше переиспользуем токен; обновлять через
# /auth/refresh после 15 минут.
login = requests.post(
f"{BASE_URL}/auth/login",
json={"email": "you@example.com", "password": "..."},
).json()
ACCESS = login["access_token"]
WORKSPACE_ID = requests.get(
f"{BASE_URL}/workspaces/default",
headers={"Authorization": f"Bearer {ACCESS}"},
).json()["id"]
# Создаём heartbeat (workspace_id передаётся как query, не в body)
heartbeat = requests.post(
f"{BASE_URL}/heartbeats",
params={"workspace_id": WORKSPACE_ID},
headers={"Authorization": f"Bearer {ACCESS}", "Content-Type": "application/json"},
json={
"name": "Daily Backup",
"expected_interval_seconds": 86400,
"grace_period_seconds": 600,
},
).json()
ping_key = heartbeat["ping_key"] # ключ воркспейса
slug = heartbeat["slug"]
secret = heartbeat["secret"] # показывается ОДИН раз — сохраните
ping_url = f"{BASE_URL}/ping/{ping_key}/{slug}"
print(f"Ping URL: {ping_url}")
# Из cron-скрипта пингуем (для самого пинга авторизация не нужна,
# X-Secret аутентифицирует только lifecycle-сигналы success/fail)
requests.post(
f"{ping_url}/success",
headers={"X-Secret": secret, "Content-Type": "application/json"},
json={"duration_ms": 12000, "payload": {"status": "ok"}},
)Heartbeat на JavaScript
const BASE_URL = 'https://pingzen.dev/api/v1';
// CRUD /heartbeats currently requires JWT (X-API-Key not yet supported).
// Login once, reuse the token; refresh via /auth/refresh after 15 minutes.
async function login(email, password) {
const res = await fetch(`${BASE_URL}/auth/login`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email, password }),
});
return (await res.json()).access_token;
}
async function defaultWorkspaceId(access) {
const res = await fetch(`${BASE_URL}/workspaces/default`, {
headers: { 'Authorization': `Bearer ${access}` },
});
return (await res.json()).id;
}
// workspace_id передаётся в query, не в body
async function createHeartbeat(access, workspaceId) {
const response = await fetch(
`${BASE_URL}/heartbeats?workspace_id=${workspaceId}`,
{
method: 'POST',
headers: {
'Authorization': `Bearer ${access}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'Nightly Report',
expected_interval_seconds: 86400,
grace_period_seconds: 600,
}),
},
);
const data = await response.json();
console.log('Ping URL:', `${BASE_URL}/ping/${data.ping_key}/${data.slug}`);
console.log('Secret:', data.secret); // показывается один раз — сохраните
return data;
}
// Из cron'а: пинг не требует JWT, X-Secret аутентифицирует сигнал
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-агенты
PingZen предоставляет машиночитаемые спецификации для интеграции с AI-агентами и инструментами автоматизации.
Лимиты запросов
| Тариф | Запросов в час | Burst Limit |
|---|---|---|
| Free | 100/hour | 10/minute |
Частые вопросы
Какие протоколы можно мониторить?
PingZen поддерживает 23 протокола: HTTP/HTTPS, WebSocket (WS/WSS), TCP, UDP, ICMP Ping, gRPC, DNS, WHOIS, SSL сертификаты, Email (SMTP/IMAP/POP3), FTP/FTPS, DNSBL, PageSpeed, SOCKS5, MTProxy, API Check и Transaction. Вы можете мониторить сайты, API, серверы, базы данных и любые сетевые сервисы.
Как быстро приходят оповещения?
Telegram оповещения доставляются в течение 1-2 секунд после обнаружения. Slack и Discord уведомления приходят практически мгновенно. Вы можете настроить несколько каналов оповещений для резервирования.
Можно ли организовать мониторы по проектам?
Да! PingZen поддерживает рабочие пространства, которые позволяют организовать мониторы по проектам, окружениям или командам. Каждое рабочее пространство может иметь свои настройки оповещений и участников.
Есть ли API для автоматизации?
Абсолютно. PingZen предоставляет полный REST API с OpenAPI документацией. Вы можете создавать, обновлять и удалять мониторы программно.
Как работают статус-страницы?
Статус-страницы — это публичные брендированные страницы, показывающие аптайм ваших сервисов. Вы можете отображать статус в реальном времени и позволить клиентам подписаться на обновления.
Что происходит, если я достигну лимита мониторов?
Мы уведомим вас при приближении к лимиту. Вы можете приостановить некоторые мониторы или связаться с нами для увеличения лимита. Мы никогда не останавливаем мониторинг без предупреждения, обеспечивая защиту ваших критически важных сервисов.
Готовы перестать пропускать даунтаймы?
Присоединяйтесь к тысячам команд, которые доверяют PingZen. Настройка за 30 секунд.