Перейти к основному содержимому

Документация

Полное руководство по настройке мониторинга сайтов с 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 прямо сейчас:

GET/api/v1/monitorsCRUD (GET/POST/PATCH/DELETE), /reorder, /pause, /resume, /reset-stats, /results, /timeline, /status-ranges, /response-time-distribution, /cert-chain, /dnsbl-providers
POST/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/workspaces

Access-токен живёт 15 минут; для долгоживущих интеграций используйте refresh_token из того же ответа и эндпоинт /auth/refresh.

Эндпоинты

Полный список всех доступных API эндпоинтов.

Мониторы

Управление мониторами (22 эндпоинта, сгруппированы по назначению).

CRUD

GET/api/v1/monitors— Список ваших мониторов
POST/api/v1/monitors— Создать монитор
GET/api/v1/monitors/:id— Детали монитора
PATCH/api/v1/monitors/:id— Обновить монитор
DELETE/api/v1/monitors/:id— Удалить монитор

Управление

POST/api/v1/monitors/:id/pause— Поставить на паузу
POST/api/v1/monitors/:id/resume— Снять с паузы
POST/api/v1/monitors/:id/check— Ручной запуск проверки (JWT)
POST/api/v1/monitors/:id/reset-stats— Сбросить накопленную статистику (требует confirm)
PUT/api/v1/monitors/reorder— Изменить порядок отображения
POST/api/v1/monitors/test— Проверить конфиг без сохранения (JWT)

Статистика и история

GET/api/v1/monitors/:id/stats— Сводная статистика (JWT)
GET/api/v1/monitors/:id/results— История отдельных результатов проверок
GET/api/v1/monitors/:id/timeline— Таймлайн изменения статуса
GET/api/v1/monitors/:id/status-ranges— Run-length-encoded интервалы статусов
GET/api/v1/monitors/:id/response-time-distribution— Перцентили времени ответа (P50/P90/P95/P99)
GET/api/v1/monitors/:id/sla— SLA-отчёт (JWT)
GET/api/v1/monitors/:id/sla/export/csv— Экспорт SLA в CSV (JWT)
GET/api/v1/monitors/:id/sla/export/pdf— Экспорт SLA в PDF (JWT)

Диагностика

GET/api/v1/monitors/:id/cert-chain— Live-инспекция TLS-цепочки сертификатов
GET/api/v1/monitors/:id/dnsbl/provider-history— DNSBL: история по провайдерам (JWT)
GET/api/v1/monitors/dnsbl-providers— Список дефолтных DNSBL-провайдеров

Алерты

Настройка уведомлений.

GET/api/v1/alerts— List alerts
POST/api/v1/alerts— Create alert
PATCH/api/v1/alerts/:id— Update alert
DELETE/api/v1/alerts/:id— Delete alert
POST/api/v1/alerts/:id/test— Send test alert
POST/api/v1/alerts/:id/toggle— Toggle alert active/inactive
GET/api/v1/alerts/:id/history— Get alert delivery history
GET/api/v1/alerts/history— Вся история доставки алёртов (по workspace)
GET/api/v1/alerts/channels/availability— Доступные каналы доставки (Telegram, Discord, Email, Slack, …)
POST/api/v1/alerts/test-send— Отправить тестовое сообщение в произвольный канал (без сохранения алёрта)

Инциденты

Управление инцидентами.

GET/api/v1/incidents— List incidents
GET/api/v1/incidents/:id— Get incident details
PUT/api/v1/incidents/:id— Update incident
POST/api/v1/incidents/:id/updates— Add status update
POST/api/v1/incidents/:id/resolve— Resolve incident
DELETE/api/v1/incidents/:id— Delete incident

Страницы статуса

Публичные страницы статуса.

GET/api/v1/status-pages— List status pages
POST/api/v1/status-pages— Create status page
GET/api/v1/status-pages/:id— Get status page
PUT/api/v1/status-pages/:id— Update status page
DELETE/api/v1/status-pages/:id— Delete status page
POST/api/v1/status-pages/:id/monitors— Добавить монитор на статус-страницу
DELETE/api/v1/status-pages/:id/monitors/:monitor_id— Убрать монитор со статус-страницы
GET/api/v1/public/status/:slug— Public status (no auth)

Воркспейсы

Управление рабочими пространствами.

GET/api/v1/workspaces— Список ваших воркспейсов
GET/api/v1/workspaces/default— Получить ваш воркспейс по умолчанию (быстрый способ узнать workspace_id)
GET/api/v1/workspaces/summary— Краткий список (id, name) — удобно для дропдаунов
POST/api/v1/workspaces— Создать воркспейс
PUT/api/v1/workspaces/:id— Обновить воркспейс
DELETE/api/v1/workspaces/:id— Удалить воркспейс
POST/api/v1/workspaces/:id/set-default— Сделать воркспейс по умолчанию
POST/api/v1/workspaces/:id/regenerate-ping-key— Перегенерировать ping_key (старые ссылки heartbeat-пингов перестанут работать)

Хартбиты (Cron)

Мониторинг cron-задач.

GET/api/v1/heartbeats— List heartbeat monitors
POST/api/v1/heartbeats— Create heartbeat monitor
GET/api/v1/heartbeats/:id— Get heartbeat monitor details
PATCH/api/v1/heartbeats/:id— Update heartbeat monitor
DELETE/api/v1/heartbeats/:id— Delete heartbeat monitor
POST/api/v1/heartbeats/:id/pause— Pause heartbeat monitor
POST/api/v1/heartbeats/:id/resume— Resume heartbeat monitor
POST/api/v1/heartbeats/:id/regenerate-secret— Regenerate authentication secret
GET/api/v1/heartbeats/:id/stats— Get heartbeat statistics (uptime, ping counts)
GET/api/v1/heartbeats/:id/pings— Get ping history (paginated)
GET/api/v1/ping/:ping_key/:slug— Record ping via GET (no auth, for simple cron jobs)
POST/api/v1/ping/:ping_key/:slug— Record ping via POST (no auth, with optional payload)
POST/api/v1/ping/:ping_key/:slug/start— Record job start signal (no auth)
POST/api/v1/ping/:ping_key/:slug/success— Record job success signal (no auth)
POST/api/v1/ping/:ping_key/:slug/fail— Record job failure signal (no auth)

API ключи

Управление API ключами.

GET/api/v1/api-keys— List API keys
POST/api/v1/api-keys— Create API key
DELETE/api/v1/api-keys/:id— Revoke API key

Обслуживание

Окна обслуживания.

GET/api/v1/maintenance— List maintenance windows
POST/api/v1/maintenance— Create maintenance window
GET/api/v1/maintenance/:id— Get maintenance window details
PUT/api/v1/maintenance/:id— Update maintenance window
DELETE/api/v1/maintenance/:id— Delete maintenance window
POST/api/v1/maintenance/:id/cancel— Cancel maintenance

Группы мониторов

Управление группами (12 эндпоинтов, сгруппированы по назначению).

CRUD групп

GET/api/v1/monitor-groups— Список групп мониторов
POST/api/v1/monitor-groups— Создать группу
GET/api/v1/monitor-groups/:id— Детали группы
PUT/api/v1/monitor-groups/:id— Обновить группу (имя, описание, paused-флаг)
DELETE/api/v1/monitor-groups/:id— Удалить группу

Связи (мониторы и теги)

POST/api/v1/monitor-groups/:id/monitors— Добавить мониторы в группу
DELETE/api/v1/monitor-groups/:id/monitors— Убрать мониторы из группы
POST/api/v1/monitor-groups/:id/tags— Добавить теги
DELETE/api/v1/monitor-groups/:id/tags— Убрать теги

Статус и статистика

GET/api/v1/monitor-groups/stats— Агрегированная статистика по всем группам
GET/api/v1/monitor-groups/:id/status— Агрегированный статус группы
PUT/api/v1/monitor-groups/:id/status— Обновить агрегированный статус

Telegram группы

Алерты в Telegram группы.

GET/api/v1/telegram-groups— List linked Telegram groups
POST/api/v1/telegram-groups/link— Generate deep-link URL for Telegram group
DELETE/api/v1/telegram-groups/:id— Unlink Telegram group

Отчёты по расписанию

Автоматические email отчёты.

GET/api/v1/scheduled-reports— List scheduled reports
POST/api/v1/scheduled-reports— Create scheduled report
GET/api/v1/scheduled-reports/:id— Get report details
PUT/api/v1/scheduled-reports/:id— Update scheduled report
DELETE/api/v1/scheduled-reports/:id— Delete scheduled report
POST/api/v1/scheduled-reports/:id/pause— Pause report
POST/api/v1/scheduled-reports/:id/resume— Resume report
POST/api/v1/scheduled-reports/:id/run— Запустить отчёт вручную
POST/api/v1/scheduled-reports/:id/toggle— Переключить активность (pause/resume в одной ручке)
GET/api/v1/scheduled-reports/:id/runs— История запусков отчёта

Конфигурация каналов

Учётные данные каналов (SMTP, Twilio и т.д.).

GET/api/v1/alert-channel-configs— List channel configurations
POST/api/v1/alert-channel-configs— Create channel config
PATCH/api/v1/alert-channel-configs/:id— Обновить конфиг канала
DELETE/api/v1/alert-channel-configs/:id— Delete channel config
POST/api/v1/alert-channel-configs/:id/test— Отправить тестовое сообщение в этот конфиг
POST/api/v1/alert-channel-configs/:id/activate— Включить (если был auto-disabled после серии ошибок)
POST/api/v1/alert-channel-configs/:id/deactivate— Временно выключить без удаления
GET/api/v1/alert-channel-configs/channels/:channel— Активный конфиг для канала (telegram, discord, slack, …)

Дашборд

Агрегированная статистика.

GET/api/v1/dashboard/stats— Aggregated dashboard statistics
GET/api/v1/dashboard/uptime-summary— Сводка uptime по всем мониторам
GET/api/v1/dashboard/alerts-summary— Alerts summary
GET/api/v1/dashboard/incidents— Сводка по инцидентам
GET/api/v1/dashboard/combined— All dashboard data in one call

Вебхуки (исходящие)

Доставка событий через вебхуки (12 эндпоинтов, сгруппированы по назначению).

CRUD вебхуков

GET/api/v1/webhooks— Список вебхуков
POST/api/v1/webhooks— Создать вебхук
GET/api/v1/webhooks/:id— Детали вебхука
PATCH/api/v1/webhooks/:id— Обновить вебхук
DELETE/api/v1/webhooks/:id— Удалить вебхук

Действия

POST/api/v1/webhooks/:id/test— Отправить тестовый payload
POST/api/v1/webhooks/:id/secret— Перегенерировать HMAC-секрет подписи (старая подпись перестанет приниматься у вас на стороне)

Доставки и DLQ

GET/api/v1/webhooks/:id/deliveries— История доставок
GET/api/v1/webhooks/:id/stats— Сводная статистика по доставкам (успехи/ошибки/p50/p95)
GET/api/v1/webhooks/:id/dlq— Очередь несоставшихся доставок (Dead Letter Queue)
POST/api/v1/webhooks/:id/dlq/:dlq_id/retry— Повторить попытку доставки из DLQ
POST/api/v1/webhooks/:id/dlq/:dlq_id/resolve— Пометить запись DLQ как разрешённую (без retry)

Справочник

GET/api/v1/webhooks/events— Доступные типы событий (используются при создании вебхука)

Вебхук-чеки (входящие)

Приём входящих вебхуков от внешних сервисов (10 эндпоинтов + 1 публичный приёмник, сгруппированы по назначению).

CRUD проверок

GET/api/v1/webhook-checks— Список входящих webhook-проверок
POST/api/v1/webhook-checks— Создать входящую проверку
GET/api/v1/webhook-checks/:id— Детали проверки
PUT/api/v1/webhook-checks/:id— Обновить проверку
DELETE/api/v1/webhook-checks/:id— Удалить проверку

Управление проверками

POST/api/v1/webhook-checks/:id/pause— Поставить проверку на паузу
POST/api/v1/webhook-checks/:id/resume— Снять проверку с паузы
POST/api/v1/webhook-checks/:id/regenerate-secret— Перегенерировать секрет (старая HMAC-подпись от source перестанет приниматься)

События и статистика

GET/api/v1/webhook-checks/:id/events— События входящих webhook-проверок
GET/api/v1/webhook-checks/:id/stats— Сводная статистика по incoming-проверке

Публичный приёмник (без auth)

POST/api/v1/webhook-check/:slug— Записать факт доставки (этот URL дают внешнему сервису)

Обратная связь

Отзывы и запросы на фичи.

POST/api/v1/feedback— Submit feedback
GET/api/v1/feedback— List feedback
GET/api/v1/feedback/:id— Get feedback details
PUT/api/v1/feedback/:id/status— Update feedback status (admin)
DELETE/api/v1/feedback/:id— Delete feedback (admin)

Web Push

Push-уведомления в браузере.

GET/api/v1/web-push/vapid-public-key— Get VAPID public key
POST/api/v1/web-push/subscribe— Subscribe to push notifications
POST/api/v1/web-push/unsubscribe— Unsubscribe from push notifications

Проба

Идентификация и IP-адреса пробы.

GET/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/123

Update 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-backup

Heartbeat 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\"}}"
fi

Heartbeat на 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
Free100/hour10/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 секунд.