SMeetBot API

SMeet Bot API

Изменения API

Здесь записывается каждое изменение контракта Bot API, новые версии сверху. Сам контракт опубликован как openapi.json.

Как записываются изменения#

  • Версия в пути, /bot-api/v1, меняется только тогда, когда работающая программа может сломаться. Внутри v1 SMeet добавляет новое: поля, типы событий, значения reason и status, коды ошибок. Программы пропускают то, чего не знают (Версии и совместимость).
  • В каждой записи указаны дата и версия, а также что нового, что исправлено, что устарело и что нужно изменить в программе.
  • Устаревшая возможность продолжает работать в v1; в её записи сказано, чем её заменить.
  • Машиночитаемый контракт текущей версии: openapi.json.

1.2.0#

Версии и условные изменения, а также мини-приложения. Выходит вместе с мини-приложениями SMeet; дата добавляется при выпуске. Всё новое необязательно: программа, которая не передаёт новых параметров, работает как с 1.1.1, кроме перечисленного в разделе «Изменено».

Новое#

  • getMe.capabilities перечисляет, что сервер обещает сверх 1.1.0: chat_context, access_revisions, message_revisions, initiator_conditions, strict_conditions, mini_apps (Возможности сервера).
  • Версии: access_revision в каждом Chat, installation_generation в групповых и канальных чатах, message_revision в message, edited_message и в результатах отправки и правки (Версии в событиях).
  • Условные параметры изменяющих методов: expected_access_revision, expected_installation_generation, expected_message_revision и объект initiator, которые проверяются вместе с действием (Условные запросы, initiator).
  • getChatContext: один чат в его нынешнем состоянии, с версиями и необязательной проверкой одного человека (Контекст чата).
  • Строгий режим условий, setMyConditionsMode и getMe.conditions_mode (Строгий режим).
  • Четыре кода ошибок: 409 ACCESS_REVISION_CONFLICT, 409 INSTALLATION_GENERATION_CONFLICT, 409 MESSAGE_REVISION_CONFLICT, 403 INITIATOR_NOT_AUTHORIZED.
  • Мини-приложения: кнопка mini_app, событие mini_app_submission с формой человека, getMe.mini_app и reason: mini_app_not_configured у INVALID_REQUEST о reply_markup (Мини-приложения).

Изменено#

  • Повтор условного запроса с тем же ключом и телом возвращает первый результат без повторной проверки чата и условий. Безусловные повторы работают как раньше.
  • Повтор, который пришёл, пока первый вызов ещё выполняется, ждёт его не дольше 2 секунд, затем получает 503 TEMPORARILY_UNAVAILABLE с retry_after 1. Изменяющий вызов ждёт одновременного отзыва те же 2 секунды, не дольше.
  • Незнакомое поле, имя которого начинается с expected_, незнакомое поле внутри initiator и условие, которого метод не принимает, получают 400 INVALID_REQUEST.
  • Ограничение частоты отправки проверяется до блокировок, поэтому 429 может прийти раньше ошибки, которую видно только под ними.
  • Stop, блокировка и выход из пространства бота навсегда отзывают файлы, которые бот получил в этом личном чате, и отменяют FAILED-события чата, как это уже делали групповые отзывы.
  • Человек, который добавляет аккаунт бота в общий список блокировок, даёт боту chat_access_changed со статусом blocked.
  • Превращение группы в канал или обратно даёт боту my_chat_member с новым chat.type.
  • У кнопки ровно одно из полей callback_data, url и mini_app.

Исправлено#

  • file_status_changed.chat для вложения из группы является групповым чатом с type, group_id, title и topic_id; раньше всегда приходил private.
  • Две одновременные правки одного сообщения больше не теряют одну из них: вторая видит текст первой.
  • Удаление бота из удалённой группы больше не завершается ошибкой.

Устарело#

Ничего.

Переход#

Программе, которая не передаёт условий, менять ничего не нужно. Чтобы пользоваться ими: читайте capabilities при запуске и не реже раза в 5 минут, передавайте условие, только когда его значение есть в списке, проверяйте, что каждый успешный ответ содержит result.chat.access_revision, берите каждую версию из события, по которому принято решение, и никогда её не обновляйте, а свежее событие без access_revision считайте откатом сервера (правила). Незнакомые типы событий пропускайте: mini_app_submission приходит только ботам с мини-приложением.

1.1.1 (2026-10-07)#

Команды в группах адресуются одному боту.

Новое#

  • Кроме /command@bot_username args команду можно адресовать как @bot_username /command args. В обоих случаях бот получает обычный text /command args.

Исправлено#

  • Команда без имени (/command) в группе доходила до всех ботов с read_all_messages, и на один вопрос отвечали два бота. Теперь она не доходит ни до кого.
  • Бот с read_all_messages больше не получает сообщения, явно адресованные другому боту (его упоминание, его команду или ответ ему).

Устарело#

Ничего.

Переход#

Менять ничего не нужно: команда приходит в том же виде, что и в личном чате. Программы, которые сами разбирали /command@bot_username, продолжают работать, потому что суффикс теперь убирается до доставки.

1.1.0 (2026-09-30)#

Поддержка групп, тем и каналов.

Новое#

  • Установка бота с независимыми разрешениями read_all_messages, отправки, редактирования, удаления, закрепления, ограничения участников и публикации в канале. Чтение всех новых сообщений по умолчанию выключено и никогда не открывает историю.
  • Объекты группового чата и канала с group_id, title и необязательным topic_id.
  • События my_chat_member и delivery_gap.
  • Методы deleteMessage, pinChatMessage, unpinChatMessage и restrictChatMember.

Исправлено#

  • Действующий доступ к группе проверяется при polling, webhook и повторе FAILED, поэтому отозванный доступ нельзя вернуть повторной доставкой.

Устарело#

Ничего.

Переход#

Продолжайте игнорировать незнакомые типы событий и поля чата. Для поддержки групп сохраняйте chat.id как адрес ответа и обрабатывайте my_chat_member и delivery_gap; не предполагайте, что каждый чат личный.

1.0.0 (2026-09-26)#

Первая публичная версия SMeet Bot API по адресу https://messenger.scrile.com/bot-api/v1.

Новое#

  • Методы: getMe, getUpdates, rejectUpdate, sendMessage, editMessageText, answerCallbackQuery, getMyCommands, setMyCommands, getDeliveryInfo, getWebhookInfo, uploadFile, sendPhoto, sendDocument, getFile и скачивание файлов по адресу /files/<file_id>/content.
  • Типы событий: message, message_edited, message_deleted, callback_query, chat_access_changed и file_status_changed.
  • Long polling с одним получателем на бота (consumer_id, аренда, epoch), подтверждение через offset, выданный сервером next_offset и диапазоны skipped. Вызов с чужой epoch ничего не подтверждает, а каждый CONSUMER_CONFLICT приходит с retry_after.
  • Доставка через webhook с подписью HMAC-SHA256, бюджетом ошибок на событие и circuit breaker. Ответы, которые может исправить только владелец (секрет не совпадает, адреса больше нет, перенаправление, сертификат), приостанавливают доставку, пока владелец не нажмёт «Возобновить доставку» в «Моих ботах»; за это время ничего не теряется, а SMeet BotFather сообщает владельцу о паузе и о событиях, ушедших в FAILED.
  • Idempotency-Key у каждого метода, который что-то меняет; ключи хранятся 7 дней.
  • Кнопки под сообщениями (callback-кнопки и ссылки https://) и редактирование собственных сообщений бота.
  • Фото и документы в обе стороны с антивирусной проверкой.
  • Список FAILED с повтором владельцем; event_id не меняется при повторах доставки и повторах владельцем.

Исправлено#

Ничего: это первая версия.

Устарело#

Ничего.

Переход#

Переходить не с чего. Программы, написанные по предварительной версии контракта, стоит сверить со справочником API, который собран из опубликованного контракта. Главные отличия: ответы webhook 401, 403, 404 и 410 приостанавливают доставку до возобновления владельцем, а не переводят события в FAILED; id в getMe означает идентификатор аккаунта бота, то же значение, что from.id в его сообщениях; вызов с чужой epoch ничего не подтверждает; у User нет language_code, а у файла нет статуса uploading.