Справочник 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 и CSV-экспорт/импорт). Все остальные эндпоинты — /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, /export/csv, /import/csv/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/export/csv— Экспорт конфигураций мониторов в CSV (все пространства или ?workspace_id=; секреты не выгружаются)/api/v1/monitors/import/csv— Массовое создание мониторов из CSV-файла (multipart; ?dry_run=true — предпросмотр, ?on_duplicate=skip|create; максимум 500 строк / 1 МБ)Семантика CSV-импорта: обязательна только колонка url (заголовки экспорта StatusCake, bulk-upload шаблона UptimeRobot и HetrixTools принимаются как есть, разделители , и ; определяются автоматически). Дубликаты определяются по URL+протоколу в целевом пространстве. Без ?workspace_id= строки маршрутизируются по колонке workspace (по имени; строки без неё идут в пространство по умолчанию). Имена мониторов уникальны в рамках аккаунта — при импорте копии собственного пространства в другое строки нужно переименовать; конфликты имён попадают в skipped с указанием причины. Импорт доступен в собственные пространства и в общие пространства с ролью editor или owner (viewer получает 403 / построчные ошибки). Понимаются числовые коды типов UptimeRobot (1/2/3/4) и DoNotFind StatusCake; Excel-файлы отклоняются с подсказкой пересохранить как CSV UTF-8. Ответ описывает каждую строку: created / skipped / failed; одна плохая строка никогда не прерывает весь батч.
Статистика и история
/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— Вся история доставки оповещений (по пространству)/api/v1/alerts/channels/availability— Доступные каналы доставки (Telegram, Discord, Email, Slack, …)/api/v1/alerts/test-send— Отправить тестовое сообщение в произвольный канал (без сохранения оповещения)Инциденты
Управление инцидентами.
/api/v1/incidents— List incidents/api/v1/incidents/stats— Сводная статистика инцидентов (всего/активные/решённые/MTTR)/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-пингов перестанут работать)/api/v1/workspaces/:id/members— Список участников рабочего пространства (общий доступ)/api/v1/workspaces/:id/members— Пригласить участника по email (только владелец)/api/v1/workspaces/:id/members/:id— Сменить роль участника: editor или viewer (только владелец)/api/v1/workspaces/:id/members/:id— Удалить участника (только владелец)/api/v1/workspaces/:id/invites— Создать одноразовую ссылку-приглашение, действует 14 дней (только владелец; работает для пользователей без email)/api/v1/workspaces/invites/accept— Принять приглашение по ссылке и присоединиться к рабочему пространству/api/v1/workspaces/:id/leave— Покинуть рабочее пространство (только участники; владелец выйти не может)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/subscriptions— Список push-подписок текущего пользователя/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 |