SMeet Bot API
Изменения API
Здесь записывается каждое изменение контракта Bot API, новые версии сверху. Сам контракт опубликован как openapi.json.
Как записываются изменения#
- Версия в пути,
/bot-api/v1, меняется только тогда, когда работающая программа может сломаться. Внутриv1SMeet добавляет новое: поля, типы событий, значения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_after1. Изменяющий вызов ждёт одновременного отзыва те же 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.