Integration API v1

Integration API

API для интеграции ваших проектов с Alerto через токен бота (alt_...). Отправляйте уведомления в каналы, группы и личные чаты; получайте callback на webhook при нажатии кнопок.

Base URL: https://api.alerto.cc/v1
Создание ботов, каналов и групп — в dashboard. Client API (мобильное приложение) — docs/mobile-api.md и OpenAPI docs/mobile-api.openapi.yaml.
OpenAPI: docs/integration-api.openapi.yaml — машиночитаемая спецификация для генерации клиента.

Быстрый старт

  1. Зарегистрируйтесь и создайте бота в dashboard
  2. Скопируйте bot-токен (alt_...) в настройках бота
  3. Добавьте бота в канал или группу в dashboard и выдайте право «Отправка»
  4. Отправьте POST /messages с токеном бота
  5. Настройте webhook URL через PATCH /webhook с токеном бота для callback при нажатии кнопок

Аутентификация

Все запросы авторизуются токеном бота в заголовке Authorization. User JWT и другие типы токенов для Integration API не используются.

Authorization: Bearer alt_your_bot_token

Токен выдаётся при создании бота в dashboard. Сохраните его в переменных окружения — повторно он показывается только по запросу в кабинете.

Никогда не публикуйте токен в открытом репозитории. Используйте переменные окружения.

Бот

Бот — единственная точка входа в Integration API: один бот = один токен alt_... = один webhook URL для callback. Slug бота (например deploy-bot) используется в логах и webhook payload.

Создание бота и добавление в каналы/группы выполняются в dashboard. Webhook URL настраивается только через Integration API (PATCH /webhook).

Сообщения

Отправка, чтение, редактирование и удаление сообщений от имени бота. Получатель — существующий канал, группа или пользователь (настроены в dashboard). Укажите одно из полей: channel, group, user_id или chat_id.

Сообщение должно содержать непустой text или хотя бы одно вложение в attachments.

POST /messages

Отправить сообщение

Параметры

ПолеТипОписание
channelstringSlug канала (например, production)
groupstringID группы из dashboard
user_idstringID пользователя для личного сообщения
chat_idstringАльтернатива: channel:slug, group:id, user:id
textstringТекст сообщения (markdown-lite, HTML не поддерживается). Переносы строк — символ \n в JSON
reply_tostringID сообщения (msg_...) для ответа
attachmentsarrayВложения в JSON (см. ниже): [{ "url", "type", "filename"?, "mime"?, "size"? }]
attachments[]fileФайлы при multipart/form-data (до 10 шт.)
dataobjectПроизвольный JSON, отображается в деталях
buttonsarrayМассив кнопок (см. Кнопки)

Вложения

JSON — массив attachments с внешними URL (файл на сервер Alerto не загружается).
multipart — поле attachments[]; файлы сохраняются на сервере и отдаются по публичному URL.

В одном сообщении можно комбинировать текст и несколько вложений (фото и документы).

ОграничениеЗначение
Максимум на сообщение10 вложений
Изображения (type: image)jpeg, jpg, png, gif, webp — до 5 MB
Файлы (type: file)pdf, txt, zip — до 10 MB
Хранение (multipart)storage/app/public/attachments/{userId}/{uuid}.ext → URL /storage/attachments/...
EnvATTACHMENTS_DISK, ATTACHMENTS_MAX_PER_MESSAGE, ATTACHMENTS_IMAGE_MAX_KB, ATTACHMENTS_FILE_MAX_KB

Пустое сообщение, превышение лимитов или недопустимый файл — ответ 422. Внешние URL в JSON доступны только ботам (Integration API); Client API принимает только загрузку файлов.

Объект вложения в ответе API:

{
  "id": "att_abc123",
  "type": "image",
  "url": "https://alerto.cc/storage/attachments/1/uuid.jpg",
  "filename": "deploy.png",
  "mime": "image/png",
  "size": 245760
}

Пример запроса (JSON, внешние URL)

{
  "channel": "production",
  "text": "Деплой api-v2.4.1 завершён успешно",
  "attachments": [
    { "url": "https://cdn.example.com/deploy.png", "type": "image" },
    { "url": "https://cdn.example.com/report.pdf", "type": "file", "filename": "report.pdf" }
  ],
  "buttons": [
    {"id": "rollback", "label": "Откатить", "style": "danger"},
    {"id": "show_logs", "label": "Логи"},
    {"id": "details", "label": "Детали"}
  ]
}

Пример запроса (multipart, загрузка файлов)

curl -X POST https://api.alerto.cc/v1/messages \
  -H "Authorization: Bearer alt_..." \
  -F "channel=production" \
  -F "text=Готово" \
  -F "reply_to=msg_parent_id" \
  -F "attachments[]=@deploy-a.png" \
  -F "attachments[]=@logs.pdf"

Многострочный текст

Чтобы получить сообщение на нескольких строках, в JSON используйте \n между строками:

{
  "channel": "production",
  "text": "Привет\nКак дела?"
}

В интерфейсе это отобразится так:

Привет
Как дела?

Ответ 201

{
  "id": "msg_8f3a2b1c",
  "bot": "deploy-bot",
  "channel": "production",
  "text": "Деплой api-v2.4.1 завершён успешно",
  "attachments": [
    {
      "id": "att_abc123",
      "type": "image",
      "url": "https://alerto.cc/storage/attachments/1/uuid.png",
      "filename": "deploy.png",
      "mime": "image/png",
      "size": 245760
    }
  ],
  "buttons": [
    {"id": "rollback", "label": "Откатить", "style": "danger"}
  ],
  "created_at": "2026-03-15T14:32:00Z"
}

Поля attachments, buttons и др. опускаются, если пусты. Сообщения в списках (GET /messages) возвращают тот же формат вложений.

GET /messages

Список сообщений бота. Query: channel, group, user_id или chat_id; пагинация — limit, before. Каждое сообщение может содержать массив attachments.

GET /messages/{message_id}

Получить сообщение по ID (включая attachments)

PATCH /messages/{message_id}

Редактировать текст своего сообщения бота и/или кнопки. Передайте "buttons": [], чтобы убрать кнопки без клика.

DELETE /messages/{message_id}

Удалить своё сообщение бота

Кнопки

Кнопки отображаются под сообщением. При нажатии Alerto отправляет webhook на URL бота.

Формат кнопки

ПолеТипОписание
idstringУникальный ID (передаётся в webhook)
labelstringТекст на кнопке
stylestringdefault, danger, success (опционально)
urlstringЕсли указан — кнопка-ссылка, webhook не отправляется
"buttons": [
  {"id": "approve", "label": "Подтвердить", "style": "success"},
  {"id": "reject", "label": "Отклонить", "style": "danger"},
  {"id": "docs", "label": "Документация", "url": "https://docs.example.com"}
]

Webhooks

При нажатии кнопки (без url) Alerto отправляет POST на webhook_url бота.

PATCH /webhook

Установить или сбросить webhook URL бота

Тело запроса

{
  "webhook_url": "https://api.example.com/webhooks/alerto"
}

Передайте null или пустую строку, чтобы сбросить URL.

Payload callback

{
  "event": "button.click",
  "timestamp": "2026-03-15T14:33:12Z",
  "bot": "deploy-bot",
  "message_id": "msg_8f3a2b1c",
  "channel": "production",
  "button": {
    "id": "show_logs",
    "label": "Логи"
  },
  "user": {
    "id": "usr_42",
    "email": "alex@@alerto.cc",
    "name": "Александр"
  },
  "data": {}
}

Подпись запроса

Каждый webhook содержит заголовок X-Alerto-Signature — HMAC-SHA256 тела запроса с секретом бота.

X-Alerto-Signature: sha256=abc123...

Ожидаемый ответ

Ваш сервер должен ответить 200 OK в течение 10 секунд. При ошибке Alerto повторит доставку до 3 раз с экспоненциальной задержкой.

Логи доставки webhook смотрите в dashboard.

Ошибки

API возвращает JSON с полем error при ошибках.

{
  "error": {
    "code": "invalid_token",
    "message": "Invalid or expired bot token"
  }
}
КодHTTPОписание
invalid_token401Неверный или истёкший токен
forbidden403Нет доступа к каналу/группе
not_found404Ресурс не найден
validation_error422Ошибка валидации полей
rate_limited429Превышен лимит запросов

Лимиты

ПараметрFreePro
Сообщений / месяц1 00050 000
Ботов110
Кнопок в сообщении510
Размер текста4 096 символов16 384
Rate limit60 req/min300 req/min