2 октября 2026 г.
Conflict: terminated by other getUpdates request — что это и как исправить
Бот то отвечает, то замолкает, а в логах — telegram.error.Conflict: terminated by other getUpdates request (или просто "error_code": 409 в ответе API). Код не менялся, токен тот же, но что-то мешает боту забирать обновления.
Что значит эта ошибка
Telegram Bot API разрешает только одному процессу одновременно держать активный long-polling (getUpdates) на один и тот же токен. Как только появляется второй процесс с тем же токеном, Telegram обрывает более раннее соединение и отдаёт ему 409 Conflict — а не делит обновления между обоими. В логе это обычно видит именно «проигравший» процесс, так что эффект выглядит случайным: то работает, то нет, в зависимости от того, какой из двух процессов успел опросить API последним.
Быстрая диагностика
Сначала убедитесь, что вебхук не включён параллельно с polling — это тоже даёт конфликт того же рода:
curl "https://api.telegram.org/bot<TOKEN>/getWebhookInfo"
Пустой url в ответе значит, что бот работает через polling — тогда ищите второй polling-процесс. Непустой — значит, где-то в коде всё ещё вызывается getUpdates при включённом вебхуке, и конфликтуют они друг с другом.
Дальше — найти, где именно запущен второй процесс с тем же токеном:
ps aux | grep -i <имя_вашего_скрипта>
Причины по убыванию вероятности
- Бот одновременно крутится локально для отладки и на сервере — самый частый случай.
- Старый деплой не остановлен перед запуском нового: два контейнера/процесса с одним токеном какое-то время работают параллельно.
- Включён вебхук, и в коде одновременно где-то остался вызов
getUpdates(или наоборот). - Второй участник команды запустил бота с тем же токеном у себя для теста.
Как исправить руками
- Проверьте
getWebhookInfo(команда выше) — определите, polling у вас или вебхук. - Остановите все процессы бота — локальные, на сервере, тестовые — и запустите только один.
- Если переключаетесь с polling на вебхук, явно снимите старый режим:
curl "https://api.telegram.org/bot<TOKEN>/deleteWebhook"перед тем, как снова включать polling. - При деплое следите, чтобы процесс останавливался до запуска нового, а не после — иначе на несколько секунд всегда будут жить оба.
- Заведите разработчикам отдельные тестовые токены через
@BotFather— тестовый бот не должен делить токен с продовым.
Или без всего этого
В botdepo это решено на уровне деплоя и супервизора: перед запуском нового контейнера старый гарантированно останавливается, а если конфликт всё же возникает (например, вы сами запустили бота локально с тем же токеном), супервизор отличает его от обычного падения, помечает бота статусом «конфликт» и сразу присылает алерт в Телеграм с объяснением — вместо того, чтобы тихо дёргать рестарт, который здесь не поможет. Задеплоить бота.
Частые вопросы
Поможет ли просто перезапустить бота?
Нет, пока жив второй процесс с тем же токеном — конфликт вернётся при следующем опросе API.
Можно ли на один токен держать два процесса специально, для отказоустойчивости?
Нет — Bot API так не работает ни для polling, ни для webhook. Отказоустойчивость нужно строить на уровне супервизора/оркестратора, который держит ровно один активный процесс, а не на дублировании.