Bot API

Lummia Bot API

Боты только для отправки уведомлений. Публикуй форматированные сообщения в группу из CI, мониторинга, деплоев и инцидент-инструментов одним HTTP-запросом.

Базовый URL во всех примерах — https://api.lummia.io , замени его на адрес своего сервера Lummia.

01

Обзор

Бот Lummia — интеграция только для отправки. Внешний сервис авторизуется токеном бота и публикует сообщение в группу, в которую бот явно добавлен. Сообщения бота появляются в ленте под его собственным именем и аватаром с небольшим значком BOT .

Боты намеренно минимальны. Бот не может:

  • читать историю группы или любое сообщение
  • получать события, ответы или реакции
  • выполнять команды или слэш-команды
  • отправлять и получать личные сообщения
  • опрашивать API или что-либо запрашивать

Типичные сценарии: статусы сборок и CI, заметки о деплоях и релизах, алерты мониторинга и аптайма, уведомления об инцидентах в нужной группе.

02

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

Четыре шага от нуля до первого сообщения.

  1. 1

    Создай бота

    В десктоп-приложении открой Настройки → Пространство → Боты и создай бота. Имя обязательно (аватар — по желанию). Сообщения бота показываются под этим именем и аватаром со значком BOT и инициалами вместо аватара, если его нет. Управление ботами доступно только администраторам.

  2. 2

    Сохрани токен — он показывается один раз

    При создании ты получишь токен, начинающийся с lmbot_. Он показывается ровно один раз и позже недоступен. Скопируй его сразу и сохрани в менеджере секретов. Потерял? Перегенерируй новый (старый мгновенно перестаёт действовать).

  3. 3

    Добавь бота в группу

    В нужной группе открой управление участниками через кнопку добавления людей в шапке и добавь бота в подборщике «Add people or bots» (боты отмечены тегом BOT в списке). Бот может публиковать только в те группы, в которые явно добавлен, — рассылки на всё пространство нет.

  4. 4

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

    Опубликуй одним POST-запросом. Сначала задай переменные окружения из раздела о безопасном хранении токена.

curl
curl -X POST "$LUMMIA_API_BASE/api/bot/messages" \
  -H "Authorization: Bot $LUMMIA_BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"channel_id":"'"$LUMMIA_CHANNEL_ID"'","text":"Deploy finished ✅"}'

Успешный ответ: 200 и тело {"ok":true,"message_id":"<uuid>"}.

03

Создание бота

Ботов создаёт и настраивает администратор пространства в разделе Настройки → Пространство → Боты. Оттуда администратор может:

  • Создать бота (имя обязательно) и задать необязательный аватар.
  • Переименовать бота или заменить/удалить аватар.
  • Перегенерировать токен (прежний перестаёт работать сразу).
  • Отозвать токен (бот и его прошлые сообщения остаются, но новые отправки блокируются).
  • Удалить бота (его прошлые сообщения сохраняют авторство).

Чтобы увидеть, куда бот может писать, открой его из этого списка (Настройки → Пространство → Боты → выбери бота): на странице бота показан список всех групп, в которые он добавлен. Тот же список доступен по API через GET /api/teams/:team_id/bots/:bot_id/channels.

Токен показывается один раз — при создании и при каждой перегенерации. Во всех остальных местах (включая список ботов) виден только короткий несекретный префикс вида lmbot_Ab3f…. Относись к полному токену как к паролю.

04

Добавление бота в группу

Право бота писать выдаётся отдельно для каждой группы. Чтобы бот мог публиковать в группу, открой управление участниками этой группы через кнопку добавления людей в шапке и в подборщике «Add people or bots» выбери бота из списка (боты отмечены тегом BOT) — он добавится так же, как человек. Убери его из списка участников, чтобы отозвать право на отправку.

Добавление бота не меняет шифрование сообщений людей и не даёт боту возможности читать переписку (см. раздел «Безопасность»).

05

Как узнать Channel ID

Для каждой отправки нужен channel_id — UUID группы-получателя. В десктоп-приложении открой группу, нажми значок редактирования (карандаш) в шапке канала, чтобы открыть «Edit group», и в строке «Copy Channel ID» скопируй UUID группы в буфер обмена — останется вставить его в настройки интеграции.

channel_id — это адрес назначения, а не секрет и не учётные данные. Он не заменяет токен бота: токен подтверждает, кто публикует, а channel_id — куда. Если бот не добавлен в группу, запрос всё равно вернёт 404.

06

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

Один эндпоинт. Один заголовок. Одно тело JSON.

Эндпоинт POST https://api.lummia.io/api/bot/messages
Заголовок авторизации Authorization: Bot lmbot_…
Тело {"channel_id":"<uuid>","text":"<string>"}
Успех 200 {"ok":true,"message_id":"<uuid>"}

Поле text — обычная строка UTF-8 с форматированием (см. ниже), не более 4096 байт. Боты ограничены 30 сообщениями в минуту.

curl

curl
curl -X POST "$LUMMIA_API_BASE/api/bot/messages" \
  -H "Authorization: Bot $LUMMIA_BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"channel_id":"'"$LUMMIA_CHANNEL_ID"'","text":"Deploy finished ✅"}'

Python (requests)

python
import os
import requests

resp = requests.post(
    f"{os.environ['LUMMIA_API_BASE']}/api/bot/messages",
    headers={"Authorization": f"Bot {os.environ['LUMMIA_BOT_TOKEN']}"},
    json={
        "channel_id": os.environ["LUMMIA_CHANNEL_ID"],
        "text": "Deploy finished ✅",
    },
    timeout=10,
)
resp.raise_for_status()
print(resp.json())  # {"ok": True, "message_id": "..."}

Node.js (fetch)

javascript
const res = await fetch(`${process.env.LUMMIA_API_BASE}/api/bot/messages`, {
  method: "POST",
  headers: {
    "Authorization": `Bot ${process.env.LUMMIA_BOT_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    channel_id: process.env.LUMMIA_CHANNEL_ID,
    text: "Deploy finished ✅",
  }),
});

if (!res.ok) throw new Error(`Bot API ${res.status}`);
console.log(await res.json()); // { ok: true, message_id: "..." }

Переменные окружения и безопасное хранение токена

shell
export LUMMIA_API_BASE="https://api.lummia.io"
export LUMMIA_BOT_TOKEN="lmbot_paste-the-token-shown-once-on-create"
export LUMMIA_CHANNEL_ID="00000000-0000-0000-0000-000000000000"
  • Никогда не коммить токен в репозиторий — читай его из переменной окружения или менеджера секретов.
  • Храни его в секретах CI/CD, а не в файле пайплайна.
  • Если токен утёк, сразу перегенерируй его — старый мгновенно перестаёт работать.
07

Форматирование текста

Текст бота использует ровно то же форматирование, что и обычное сообщение в чате. Ниже — всё, что клиент действительно отображает, и ничего больше. Настоящие символы \n в строке JSON становятся переносами строк.

Синтаксис
Результат
**bold**
Жирный
__italic__
Курсив
~~strikethrough~~
Зачёркнутый
||spoiler||
Спойлер (скрыт до нажатия)
`inline code`
код в строке
[label](https://lummia.io)
ссылка
https://lummia.io
https://lummia.io (обычные ссылки распознаются автоматически)
> quoted line
строка цитаты
@mention
@mention

Блоки кода

Оберни несколько строк в тройные обратные кавычки, при желании указав язык на открывающей строке:

text
```bash
kubectl rollout status deploy/web
```

Примечания

  • Курсив — это двойное подчёркивание __вот так__. Одиночные *звёздочки* и одиночные _подчёркивания_ курсивом не считаются.
  • Эмодзи — это обычный Unicode, вставляй их прямо в текст.
  • Экранируй символ форматирования обратным слэшем, например \*не жирный\*.
  • Заголовков, списков, таблиц и картинок нет — эти конструкции Markdown не обрабатываются.
08

Примеры

Полные тела запросов с корректно экранированным JSON, каждое с превью.

Инцидент на проде

json
{
  "channel_id": "00000000-0000-0000-0000-000000000000",
  "text": "🚨 **Production incident** — API latency\n\n> p99 latency is 4.2s (SLO: 300ms)\n\nAffected: __checkout__, __search__\nRunbook: [open](https://example.com/runbooks/latency)\nOn call: @oncall"
}

Превью

S
Statuspage BOT
🚨 Production incident — API latency

p99 latency is 4.2s (SLO: 300ms)

Affected: checkout, search
Runbook: open
On call: @oncall

Отчёт CI

json
{
  "channel_id": "00000000-0000-0000-0000-000000000000",
  "text": "✅ **CI passed** — `main` @ `a1b2c3d`\n\n~~flaky~~ tests all green: **412 passed**, 0 failed\nDuration: 3m 41s\n\n```\nsuite: unit + integration\ncoverage: 91.2%\n```"
}

Превью

C
CI BOT
CI passedmain @ a1b2c3d

flaky tests all green: 412 passed, 0 failed
Duration: 3m 41s

suite: unit + integration
coverage: 91.2%

Неудачный деплой

json
{
  "channel_id": "00000000-0000-0000-0000-000000000000",
  "text": "❌ **Deploy failed** — web @ v1.8.0\n\n> step \"migrate\" exited 1\n\nRolled back to __v1.7.4__. Logs: [view build](https://example.com/builds/9182)\nSecret token was ||not|| exposed."
}

Превью

D
Deploybot BOT
Deploy failed — web @ v1.8.0

step "migrate" exited 1

Rolled back to v1.7.4. Logs: view build
Secret token was not exposed.
09

Ошибки

Любая ошибка — это тело JSON с полем error.

Статус Тело Описание
400 {"error":"channel_id is required"} В теле нет channel_id.
401 {"error":"unauthorized"} Отсутствует или неверный заголовок, либо неизвестный, отозванный или удалённый токен.
404 {"error":"Not found"} Бот не участник группы, группа в другой команде или архивирована, либо channel_id некорректен. Один общий ответ, без раскрытия существования.
409 {"error":"no_recipient_devices",…} Ни у одного участника группы нет зарегистрированного устройства, для которого можно зашифровать сообщение.
422 {"error":"text must be a non-empty string"} Пустой текст или только пробелы.
422 {"error":"text is larger than the maximum allowed size"} Текст больше 4096 байт.
429 {"error":"rate_limited",…} Более 30 сообщений в минуту от этого бота.

Диагностика

  • 401 — перегенерируй токен и обнови секрет; проверь, что заголовок именно Authorization: Bot <token> (а не Bearer).
  • 404 — перепроверь channel_id и убедись, что бот добавлен в эту группу.
  • 409 no_recipient_devices — сейчас ни у кого в группе нет устройства для приёма; пусть участник зайдёт в десктоп-приложение, затем повтори.
  • 429 — сбавь темп; подожди и повтори после текущей минуты.
10

Безопасность

Твоя интеграция отправляет собственный открытый текст бота в API по HTTPS. На шлюзе Lummia шифрует это сообщение бота для текущих устройств-получателей группы; хранится и рассылается уже шифртекст. У бота нет собственных ключей, и он никогда не получает ключ переписки группы, поэтому он не может прочитать в группе ничего — ни свои доставленные сообщения, ни чужие.

Добавление бота в группу не делает сообщения людей читаемыми для сервера. Бот — это односторонний публикатор: текст на вход, зашифрованное сообщение на выход. Держи токен lmbot_ в секрете: любой, у кого он есть, может писать от имени бота во все группы, где состоит бот.