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

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

Notifly предоставляет REST API для управления каналами, клиентами, сообщениями, мониторингом, метриками и пользователями. Все примеры используют базовый URL https://notifly.ru (можно подставить через переменную $NOTIFLY_URL). Админка (веб-интерфейс) живёт на https://app.notifly.ru/.

Notifly использует три типа токенов:

ТипПрефиксНазначение
App-токенAТолько отправка сообщений (POST /message, POST /ask)
Client-токенCУправление ресурсами и получение сообщений
MCP-кодMМашинный доступ (read или read+write), см. MCP

Токен можно передать тремя способами:

Окно терминала
# 1. Заголовок X-Notifly-Key
curl -H "X-Notifly-Key: CaQw5lL_L.yiRbN" https://notifly.ru/application
# 2. Query-параметр
curl "https://notifly.ru/application?token=CaQw5lL_L.yiRbN"
# 3. Bearer-токен
curl -H "Authorization: Bearer CaQw5lL_L.yiRbN" https://notifly.ru/application

Также поддерживается Basic Auth (логин/пароль) везде, где принимается client-токен.


Эндпоинты доступны без аутентификации.

Окно терминала
curl https://host/health
{"health": "green", "database": "green"}
Окно терминала
curl https://host/version
{"version": "ya-1.0.0", "commit": "...", "buildDate": "..."}
Окно терминала
curl https://host/serverinfo
{"version": "ya-1.0.0", "register": false, "oidc": false}

Создаёт клиентскую сессию. Возвращает client-токен и устанавливает cookie.

Окно терминала
curl -u admin:admin https://host/auth/local/login \
-X POST -d "name=my-cli-client"
{
"id": 1,
"name": "my-cli-client",
"token": "CaQw5lL_L.yiRbN",
"user_id": 1,
"platform": "web"
}
Окно терминала
curl -H "X-Notifly-Key: CaQw5lL_L.yiRbN" \
https://host/auth/logout -X POST

Публичный эндпоинт (без авторизации). Отправляет на указанный email письмо со ссылкой для сброса пароля. Ответ всегда 200, даже если пользователя нет, — чтобы не раскрывать, какие адреса зарегистрированы.

Окно терминала
curl https://host/user/reset-password \
-H "Content-Type: application/json" \
-d '{"email": "user@example.com"}'

POST /user/reset-password/confirm — подтвердить сброс пароля

Заголовок раздела «POST /user/reset-password/confirm — подтвердить сброс пароля»

Публичный эндпоинт. Принимает token из письма и новый пароль pass.

Окно терминала
curl https://host/user/reset-password/confirm \
-H "Content-Type: application/json" \
-d '{"token": "<из письма>", "pass": "новый-пароль"}'

Публичный эндпоинт. Открывается по ссылке из письма-подтверждения (/user/verify?token=...) и активирует адрес пользователя.

Окно терминала
curl "https://host/user/verify?token=<из письма>"

Канал (application в URL API — для совместимости с протоколом Gotify) — это источник сообщений. У каждого канала есть свой app-токен для отправки.

Окно терминала
curl -u admin:admin https://host/application
[
{
"id": 1,
"token": "AGdjfk_L.dKe8q",
"name": "Мониторинг",
"description": "Оповещения от системы мониторинга",
"internal": false,
"image": "image/appicon/1.png",
"defaultPriority": 5,
"lastUsed": "2025-01-15T12:00:00Z"
}
]
Окно терминала
curl -u admin:admin https://host/application \
-H "Content-Type: application/json" \
-d '{"name": "CI/CD", "description": "Уведомления о сборках", "defaultPriority": 5}'

Поля запроса:

ПолеТипОбязательноеОписание
namestringНазвание канала
descriptionstringОписание
defaultPriorityintegerПриоритет по умолчанию
Окно терминала
curl -u admin:admin https://host/application/1 \
-X PUT -H "Content-Type: application/json" \
-d '{"name": "CI/CD v2", "description": "Обновлённое описание"}'
Окно терминала
curl -u admin:admin https://host/application/1 -X DELETE

Возвращает агрегированный статус канала (heartbeat-сводка, последняя активность).

Окно терминала
curl -u admin:admin https://host/application/1/status

POST /application/{id}/delivery/test — тест доставки во внешние интеграции

Заголовок раздела «POST /application/{id}/delivery/test — тест доставки во внешние интеграции»

Немедленно (в обход эскалации) отправляет тестовое уведомление через включённые исходящие адаптеры канала (Slack, Telegram, webhook) и возвращает результат по каждому. Опциональное тело {"adapter": "slack"} ограничивает проверку одним адаптером.

Окно терминала
curl -u admin:admin https://host/application/1/delivery/test \
-H "Content-Type: application/json" -d '{"adapter": "telegram"}'
{"results": {"telegram": {"ok": true}, "slack": {"ok": false, "error": "..."}}}

Окно терминала
curl "https://host/message?token=AGdjfk_L.dKe8q" \
-H "Content-Type: application/json" \
-d '{"message": "Сборка #42 завершена", "title": "CI/CD", "priority": 5}'

Или через form-data:

Окно терминала
curl "https://host/message?token=AGdjfk_L.dKe8q" \
-F "title=CI/CD" -F "message=Сборка #42 завершена" -F "priority=5"

Поля запроса:

ПолеТипОбязательноеОписание
messagestringТекст сообщения
titlestringЗаголовок
priorityintegerПриоритет (0–10)
extrasobjectДополнительные поля для клиентов (см. msgextras)

Пример с extras (markdown-контент):

Окно терминала
curl "https://host/message?token=AGdjfk_L.dKe8q" \
-H "Content-Type: application/json" \
-d '{
"message": "**Готово!** Подробности: [ссылка](https://example.com)",
"title": "Сборка",
"priority": 5,
"extras": {
"client::display": {"contentType": "text/markdown"}
}
}'

Ответ:

{
"id": 123,
"appid": 1,
"message": "Сборка #42 завершена",
"title": "CI/CD",
"priority": 5,
"extras": {},
"date": "2025-06-01T10:30:00Z"
}
Окно терминала
curl -u admin:admin "https://host/message?limit=20"

Параметры:

ПараметрТипПо умолчаниюОписание
limitinteger100Количество сообщений (1–200)
sinceintegerКурсор пагинации: вернуть сообщения старше (с ID меньше) указанного. Берётся из paging.next предыдущей страницы

Ответ:

{
"paging": {
"size": 20,
"limit": 20,
"since": 0,
"next": "https://host/message?limit=20&since=20"
},
"messages": [
{
"id": 1,
"appid": 1,
"message": "Текст сообщения",
"title": "Заголовок",
"priority": 5,
"extras": {},
"date": "2025-06-01T10:30:00Z"
}
]
}
Окно терминала
curl -u admin:admin "https://host/application/1/message?limit=50"

Ищет по сообщениям пользователя. Параметр q обязателен (минимум 2 символа). Опциональный appId ограничивает поиск одним каналом. Поддерживает пагинацию (limit, since).

Окно терминала
curl -u admin:admin "https://host/message/search?q=ошибка&limit=20"
curl -u admin:admin "https://host/message/search?q=deploy&appId=1"

POST /message/read — отметить сообщения прочитанными

Заголовок раздела «POST /message/read — отметить сообщения прочитанными»

Тело: {"ids": [1, 2, 3]} — список ID сообщений.

Окно терминала
curl -u admin:admin https://host/message/read \
-H "Content-Type: application/json" -d '{"ids": [1, 2, 3]}'

POST /application/{id}/message/read — отметить весь канал прочитанным

Заголовок раздела «POST /application/{id}/message/read — отметить весь канал прочитанным»
Окно терминала
curl -u admin:admin https://host/application/1/message/read -X POST
Окно терминала
curl -u admin:admin https://host/message -X DELETE
Окно терминала
curl -u admin:admin https://host/message/123 -X DELETE

DELETE /application/{id}/message — удалить все сообщения канала

Заголовок раздела «DELETE /application/{id}/message — удалить все сообщения канала»
Окно терминала
curl -u admin:admin https://host/application/1/message -X DELETE

Клиент — это устройство или приложение, которое получает сообщения и управляет ресурсами.

Окно терминала
curl -u admin:admin https://host/client
[
{
"id": 1,
"name": "firefox",
"token": "CaQw5lL_L.yiRbN",
"lastUsed": "2025-06-01T10:00:00Z"
}
]
Окно терминала
curl -u admin:admin https://host/client \
-H "Content-Type: application/json" \
-d '{"name": "my-script"}'
Окно терминала
curl -u admin:admin https://host/client/1 \
-X PUT -H "Content-Type: application/json" \
-d '{"name": "renamed-client"}'
Окно терминала
curl -u admin:admin https://host/client/1 -X DELETE
Метод и путьОписание
GET /client/onlineСписок client-токенов с активным WS-соединением
PUT /client/{id}/statusСменить статус устройства, тело {"status": "active|suspended|revoked"}
GET /client/{id}/activityЖурнал активности устройства (?from=&to=&type=&limit=)
GET /client/{id}/subscriptionsПодписки устройства на каналы
PUT /client/{id}/subscriptionsМассовая замена подписок, тело {"channelIds": [1, 2]}

Самообслуживание устройства (аутентификация по device-токену самого устройства):

Метод и путьОписание
GET /device/me/subscriptionsСвои подписки на каналы
POST /device/me/subscriptionsПодписаться, тело {"channelId": 1}
DELETE /device/me/subscriptions/{channel_id}Отписаться от канала

GET /current/user — информация о текущем пользователе

Заголовок раздела «GET /current/user — информация о текущем пользователе»
Окно терминала
curl -u admin:admin https://host/current/user
{"id": 1, "email": "admin", "admin": true, "verified": true, "plan": "free", "balanceKopecks": 0}
Окно терминала
curl -u admin:admin https://host/current/user/password \
-H "Content-Type: application/json" \
-d '{"pass": "new-secure-password"}'

Подробности о тарифах и лимитах — на странице Квоты и тарифы.

Метод и путьОписание
GET /user/quota-breakdownДетальная разбивка расхода событий за день (?day=YYYY-MM-DD), почасовая и поминутная
POST /current/user/planСменить тариф, тело {"plan": "free|pro|business"}
POST /current/user/topupПополнить баланс, тело {"amountRubles": N}
Окно терминала
curl -u admin:admin "https://host/user/quota-breakdown?day=2026-06-23"
curl -u admin:admin https://host/current/user/plan \
-H "Content-Type: application/json" -d '{"plan": "pro"}'

Управление пользователями (администратор)

Заголовок раздела «Управление пользователями (администратор)»
Окно терминала
curl -u admin:admin https://host/user
[
{"id": 1, "email": "admin", "admin": true, "verified": true, "plan": "free"},
{"id": 2, "email": "user1@example.com", "admin": false, "verified": true, "plan": "free"}
]
Окно терминала
curl -u admin:admin https://host/user \
-H "Content-Type: application/json" \
-d '{"email": "newuser@example.com", "pass": "password123", "admin": false}'
Окно терминала
curl -u admin:admin https://host/user/2 -X DELETE

Dead-man-switch: внешняя задача (cron, скрипт) периодически шлёт «пинг»; если пинг не приходит вовремя, Notifly присылает алерт. Подробнее — Heartbeat.

Публичный пинг (аутентификация по ping-токену H… в URL, без client-токена):

Окно терминала
curl https://host/heartbeat/ping/HxxxxxxxxToken # GET — удобно из cron
curl -X POST https://host/heartbeat/ping/HxxxxxxxxToken \
-H "Content-Type: application/json" -d '{"fail_reason": "backup failed"}'

Управление (client-токен):

Метод и путьОписание
GET /heartbeatСписок heartbeat-ов
POST /heartbeatСоздать
PUT /heartbeat/{id}Обновить
DELETE /heartbeat/{id}Удалить
POST /heartbeat/{id}/pause · /resumeПриостановить / возобновить
POST /heartbeat/{id}/test-alert · /test-recoveryТестовое алерт- / recovery-уведомление

Активные проверки доступности и контента. Каждый тип имеет свою страницу с деталями.

Метод и путьОписание
GET /monitor · POST /monitorСписок / создать
POST /monitor/testПроверить настройки без сохранения
PUT /monitor/{id} · DELETE /monitor/{id}Обновить / удалить
POST /monitor/{id}/pause · /resumeПриостановить / возобновить
Метод и путьОписание
GET /http-monitor · POST /http-monitorСписок / создать
POST /http-monitor/testПроверить запрос
PUT /http-monitor/{id} · DELETE /http-monitor/{id}Обновить / удалить
POST /http-monitor/{id}/pause · /resumeПриостановить / возобновить
Метод и путьОписание
GET /content-monitor · POST /content-monitorСписок / создать
POST /content-monitor/suggest-selectorИИ-подбор CSS-селектора
POST /content-monitor/test-ruleПроверить правило
PUT /content-monitor/{id} · DELETE /content-monitor/{id}Обновить / удалить
POST /content-monitor/{id}/pause · /resumeПриостановить / возобновить
Метод и путьОписание
GET /port-monitor · POST /port-monitorСписок / создать
POST /port-monitor/testПроверить порт
PUT /port-monitor/{id} · DELETE /port-monitor/{id}Обновить / удалить
POST /port-monitor/{id}/pause · /resumeПриостановить / возобновить
Метод и путьОписание
GET /port-scan · GET /port-scan/{id}Список / один скан
POST /port-scanЗапустить скан
PATCH /port-scan/{id} · DELETE /port-scan/{id}Обновить / удалить
POST /port-scan/{id}/cancel · /restartОтменить / перезапустить
POST /port-scan/{id}/to-monitorПревратить найденный порт в монитор
Метод и путьОписание
GET /workflow-monitor · POST /workflow-monitorСписок / создать
POST /workflow-monitor/build-stepИИ-сборка шага
POST /workflow-monitor/testПрогнать сценарий
PUT /workflow-monitor/{id} · DELETE /workflow-monitor/{id}Обновить / удалить
POST /workflow-monitor/{id}/pause · /resumeПриостановить / возобновить
Метод и путьОписание
GET /browser-workflow · POST /browser-workflowСписок / создать
POST /browser-workflow/build-stepИИ-подбор действия
POST /browser-workflow/loginЗахват cookie авторизации
POST /browser-workflow/test-stepПроверить шаг
PUT /browser-workflow/{id} · DELETE /browser-workflow/{id}Обновить / удалить
POST /browser-workflow/{id}/pause · /resumeПриостановить / возобновить

Подтверждение владения хостом перед сканированием/мониторингом.

Метод и путьОписание
GET /verified-hostСписок
POST /verified-host/start · /checkНачать / проверить подтверждение
DELETE /verified-host/{id}Удалить

{kind} — тип монитора (monitor, http-monitor, content-monitor, port-monitor и т. д.).

Метод и путьОписание
GET /monitor-history/{kind}/{id}Uptime %, время отклика, агрегаты
GET /monitor-history/{kind}/{id}/logПодробный лог отдельных проверок

Входящее письмо на адрес ящика превращается в уведомление. Подробнее — Email Inbox.

Метод и путьОписание
GET /email-inbox · POST /email-inboxСписок / создать ящик
PUT /email-inbox/{id} · DELETE /email-inbox/{id}Обновить / удалить
GET /email-inbox/{id}/rules · POST /email-inbox/{id}/rulesПравила обработки писем
PUT /email-inbox/{id}/rules/{rid} · DELETE /email-inbox/{id}/rules/{rid}Обновить / удалить правило
GET /email-inbox/eventИстория входящих писем
GET /email-inbox/event/{eid} · DELETE /email-inbox/event/{eid}Письмо / удалить
POST /email-inbox/rule/from-event/{eid}ИИ-подсказка правила по письму

JS-сниппеты для сайта: трекинг ошибок (console_errors), события и т. п. Подробнее — Web-скрипт.

Публичный ingest (аутентификация по токену в URL, отправка из браузера):

Окно терминала
curl -X POST https://host/script/<token> \
-H "Content-Type: application/json" -d '{ ... }'

Управление (client-токен):

Метод и путьОписание
GET /web-script · POST /web-scriptСписок / создать
PUT /web-script/{id} · DELETE /web-script/{id}Обновить / удалить
GET /web-script/{id}/sourcemaps · POST /web-script/{id}/sourcemapsSource maps
DELETE /web-script/{id}/sourcemaps/{smid}Удалить source map
GET /web-script/{id}/issuesСгруппированные ошибки (issues)
POST /web-script/{id}/issues/{iid}/resolveПометить issue решённым
DELETE /web-script/{id}/issues/{iid}Удалить issue

Принимает входящие вебхуки и маршрутизирует их по правилам в каналы. Это singleton на пользователя с path-based маршрутизацией. Подробнее — Webhook-роутер.

Публичный приём (аутентификация по токену в URL, любой путь после токена):

Окно терминала
curl -X POST https://host/router/<token>/любой/путь \
-H "Content-Type: application/json" -d '{ ... }'

Управление (client-токен):

Метод и путьОписание
GET /webhook-router · PUT /webhook-routerПолучить / обновить роутер
POST /webhook-router/rotate-tokenСменить публичный токен
GET /webhook-router/rule · POST /webhook-router/ruleПравила маршрутизации
PUT /webhook-router/rule/{rid} · DELETE /webhook-router/rule/{rid}Обновить / удалить правило
GET /webhook-router/event · GET /webhook-router/event/{eid}История событий
DELETE /webhook-router/event/{eid}Удалить событие
GET /webhook-router/message · DELETE /webhook-router/message/{mid}Маршрутизированные сообщения
POST /webhook-router/rule/from-event/{eid}ИИ-подсказка правила по событию

Числовые временные ряды с алертами. Подробнее — Метрики.

Публичный приём метрики (аутентификация по токену M… в URL):

Окно терминала
curl -X POST https://host/metric/<token> \
-H "Content-Type: application/json" -d '{ ... }'

Управление (client-токен):

Метод и путьОписание
GET /metric-source · POST /metric-sourceИсточники метрик
PUT /metric-source/{id} · DELETE /metric-source/{id}Обновить / удалить источник
GET /metric-source/{id}/metricsМетрики источника
PATCH /metric-source/{id}/metrics/{mid} · DELETE /metric-source/{id}/metrics/{mid}Тип / удалить метрику
GET /metric-source/{id}/metrics/{mid}/seriesВременной ряд значений
GET /metric-source/{id}/alerts · POST /metric-source/{id}/alertsАлерты по метрике
PUT /metric-source/{id}/alerts/{aid} · DELETE /metric-source/{id}/alerts/{aid}Обновить / удалить алерт

Предоставление другим пользователям доступа к каналу по email. Подробнее — Доступ к каналам.

Метод и путьОписание
GET /application/{id}/share · POST /application/{id}/shareСписок / создать шару на канал
PUT /share/{id} · DELETE /share/{id}Обновить / отозвать шару
GET /share/incomingШары, предоставленные мне
GET /share/recipientsАдреса, с кем я уже делился (подсказки)
POST /share/{id}/accept · /declineПринять / отклонить шару
POST /share/joinПрисоединиться по токену

Токены машинного доступа (M…) для интеграции через MCP. Генерируются из админки.

Метод и путьОписание
GET /mcp/token · POST /mcp/tokenСписок / создать токен
PUT /mcp/token/{id} · DELETE /mcp/token/{id}Обновить / удалить токен

Интерактивные вопросы: канал спрашивает — пользователь отвечает из интерфейса. Подробнее — Ask.

Отправка вопроса использует app-токен:

Метод и путьАутентификацияОписание
POST /askapp-токенЗадать вопрос от имени канала
GET /ask/pending-answersapp-токенЗабрать готовые ответы
POST /ask/ackapp-токенПодтвердить получение ответов
GET /ask-question/{id}app-токенУзнать ответ на конкретный вопрос
POST /ask-question/{id}/answerclient-токенОтветить на вопрос из UI
DELETE /ask-question/{id}client-токенОтменить вопрос
POST /message/{id}/answerclient-токенОтветить на вопрос из сообщения

Чат-копайлот для онбординга и помощи. Подробнее — Ассистент.

Метод и путьОписание
GET /assistant/threadsСписок бесед
GET /assistant/threads/{id}/messagesИстория сообщений беседы
DELETE /assistant/threads/{id}Удалить беседу
POST /assistant/chatОтправить сообщение ассистенту

Есть два независимых канала live-обновлений. Подробнее — на странице WebSocket.

Основной канал доставки push-сообщений в реальном времени. Подключение — по client-токену в query-параметре token:

Окно терминала
# С помощью wscat
wscat -c "wss://host/ws?token=CaQw5lL_L.yiRbN"
const ws = new WebSocket("wss://host/ws?token=CaQw5lL_L.yiRbN");
ws.onmessage = (event) => {
const msg = JSON.parse(event.data);
console.log(`[${msg.title}] ${msg.message} (приоритет: ${msg.priority})`);
};

Каждое входящее событие — JSON-объект Message:

{
"id": 124,
"appid": 1,
"message": "Новое сообщение",
"title": "Заголовок",
"priority": 5,
"extras": {},
"date": "2025-06-01T10:31:00Z"
}

Отдельный эндпоинт Server-Sent Events (GET /stream, Content-Type: text/event-stream) для live-обновления интерфейсов. Это обычный HTTP-GET-стрим — используйте EventSource в браузере (аутентификация через cookie-сессию или client-токен). Сервер шлёт именованные события (например connected, channel:status_changed) и периодические keepalive-комментарии.

const es = new EventSource("https://host/stream", { withCredentials: true });
es.addEventListener("connected", () => console.log("подключено"));
es.onmessage = (event) => console.log(event.data);

import requests
# Отправить сообщение
requests.post("https://host/message?token=AGdjfk_L.dKe8q", json={
"title": "Бэкап",
"message": "Резервное копирование завершено",
"priority": 2,
})
# Получить все сообщения
resp = requests.get("https://host/message", auth=("admin", "admin"))
for msg in resp.json()["messages"]:
print(f"[{msg['title']}] {msg['message']}")
package main
import (
"net/http"
"net/url"
)
func main() {
http.PostForm("https://host/message?token=AGdjfk_L.dKe8q",
url.Values{
"title": {"Deploy"},
"message": {"Версия 2.0 развёрнута"},
})
}
// Отправить сообщение
const resp = await fetch("https://host/message?token=AGdjfk_L.dKe8q", {
method: "POST",
headers: {"Content-Type": "application/json"},
body: JSON.stringify({
title: "CI",
message: "Тесты пройдены",
priority: 3,
}),
});
console.log(await resp.json());
Окно терминала
# Отправить сообщение
Invoke-RestMethod -Uri "https://host/message?token=AGdjfk_L.dKe8q" `
-Method POST -Body @{
title = "Отчёт"
message = "Ежедневный отчёт сгенерирован"
priority = 1
}

КодЗначение
200Успешно
400Некорректный запрос (неверные параметры)
401Не авторизован (отсутствует или невалидный токен)
403Запрещено (недостаточно прав)
404Ресурс не найден