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

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

Notifly предоставляет REST API для управления каналами, клиентами, сообщениями и пользователями. Все примеры используют базовый URL https://your-notifly-domain.com.

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

ТипПрефиксНазначение
App-токенAТолько отправка сообщений (POST /message)
Client-токенCУправление ресурсами, получение сообщений

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

Окно терминала
# 1. Заголовок X-Notifly-Key
curl -H "X-Notifly-Key: CaQw5lL_L.yiRbN" https://host/application
# 2. Query-параметр
curl "https://host/application?token=CaQw5lL_L.yiRbN"
# 3. Bearer-токен
curl -H "Authorization: Bearer CaQw5lL_L.yiRbN" https://host/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/notiflyinfo
{"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",
"lastUsed": null
}
Окно терминала
curl -H "X-Notifly-Key: CaQw5lL_L.yiRbN" \
https://host/auth/logout -X POST

Канал (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
Окно терминала
curl -u admin:admin https://host/application/1/image \
-F "file=@icon.png"
Окно терминала
curl -u admin:admin https://host/application/1/image -X DELETE

Окно терминала
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": {
"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"
Окно терминала
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 /current/user — информация о текущем пользователе

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

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

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

Для получения сообщений в реальном времени подключитесь по WebSocket:

Окно терминала
# С помощью wscat
wscat -c "wss://host/stream?token=CaQw5lL_L.yiRbN"
// JavaScript
const ws = new WebSocket("wss://host/stream?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"
}

Окно терминала
curl -u admin:admin https://host/plugin
Окно терминала
curl -u admin:admin https://host/plugin/1/config
Окно терминала
curl -u admin:admin https://host/plugin/1/config \
-H "Content-Type: text/x-yaml" \
-d 'key: value'
Окно терминала
curl -u admin:admin https://host/plugin/1/display
Окно терминала
curl -u admin:admin https://host/plugin/1/enable -X POST
Окно терминала
curl -u admin:admin https://host/plugin/1/disable -X POST

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Ресурс не найден