Ошибка PEER_ID_INVALID в Telegram означает ровно одно: бот пытается написать собеседнику, о котором Telegram ничего не знает. Сервер не нашёл чат по тому идентификатору, который вы передали, и отказал ещё до доставки. Это почти никогда не поломка платформы и не проблема токена — это расхождение между тем, что лежит у вас в базе, и тем, что реально существует на стороне мессенджера.
Разбираем, что стоит за этой ошибкой, пять ситуаций, в которых она появляется чаще всего, что делать в каждой из них и почему главное правило Telegram обойти нельзя никакими настройками.
Что означает PEER_ID_INVALID простыми словами
Peer — это «собеседник»: человек, группа или канал. Каждому собеседнику Telegram выдаёт числовой идентификатор, и отправка сообщения ботом всегда идёт по нему, а не по имени и не по телефону.
Когда вы видите PEER_ID_INVALID, Telegram отвечает вам фразой: «я не знаю такого собеседника». Причин у этого ровно две, и обе стоит держать в голове.
Идентификатора не существует. Число неверное: в него закралась опечатка, потерялся знак минуса, взят номер сообщения вместо номера чата, скопирован id из чужой системы. Такого чата в Telegram просто нет.
Идентификатор есть, но бот не имеет права в него писать. Чат существует, однако между ботом и этим чатом нет связи: диалог не начинался, бота выгнали из группы, человек его заблокировал. Формально бот обращается в пустоту, и сервер отвечает так же, как на несуществующий номер.
Вторая причина встречается на порядок чаще первой, и именно она приводит людей в замешательство: «id я скопировал правильно, а бот всё равно не пишет». Правильный id — это только половина условия. Вторая половина — разрешение, и его выдаёт не сервис рассылки, а сам человек.
Родственная ошибка «chat not found». Это тот же самый отказ, сформулированный другими словами: Telegram не нашёл чат по переданному идентификатору. Разница на практике одна: «chat not found» чаще прилетает, когда идентификатор в принципе не опознан (не тот формат, не тот знак, чужое число), а PEER_ID_INVALID — когда число похоже на настоящее, но связи с ботом нет. Лечатся они одинаково, поэтому дальше разбираем обе как одну.
Пять ситуаций, в которых возникает ошибка
Почти все случаи из практики сводятся к пяти сценариям. Проверяйте по порядку — первый закрывает больше половины обращений.
Ситуация 1. Человек никогда не начинал диалог с ботом. Вы взяли контакты из формы на сайте, из CRM, из выгрузки участников группы — и пробуете написать. Бот не может: он не имеет права первым обращаться к тому, кто с ним не связывался. Даже если вы каким-то образом узнали числовой id человека, отправка вернёт отказ.
Что делать: получить контакт заново, через сам Telegram. Человек должен нажать «Начать» в боте или написать ему сообщение — только после этого чат появляется и в него можно писать. Списки из других источников для рассылки в Telegram не годятся в принципе, и это не ограничение сервиса, а правило платформы.
Ситуация 2. Человек заблокировал бота или удалил чат. Диалог когда-то был, поэтому id в базе выглядит настоящим, а отправка не проходит. При блокировке Telegram обычно отвечает отдельной ошибкой о том, что бот заблокирован пользователем, но в интерфейсе сервиса и в отчётах по рассылке это выглядит одинаково: сообщение не доставлено.
Что делать: ничего, и это важный момент. Блокировка — законный выбор человека, обойти её нельзя. Единственное разумное действие — помечать такие контакты как неактивные и переставать в них стучаться, иначе каждая рассылка будет тащить за собой хвост отказов и портить вам статистику. Если отписок стало заметно больше обычного, причина обычно в частоте и содержании сообщений, а не в технике.
Ситуация 3. Перепутаны идентификатор пользователя и идентификатор чата. В личной переписке эти два числа совпадают, поэтому подмена долго остаётся незаметной. Вылезает она на группах: в базу попал номер человека, а отправка идёт в группу, или наоборот — из группового сообщения взяли id участника и записали как id чата.
Что делать: держать в базе именно идентификатор чата, в который вы собираетесь писать, и хранить его отдельно от идентификатора автора сообщения. Заодно проверьте, не попало ли в поле что-то третье: номер сообщения, номер темы в форуме, внутренний номер клиента из вашей учётной системы. Такое случается чаще, чем кажется, — числа похожи, поле одно.
Ситуация 4. Потерян префикс -100 у супергруппы. Идентификаторы обычных пользователей положительные, у групп и каналов — отрицательные, а у супергрупп и каналов к ним добавляется префикс -100. Если число скопировали без минуса или без этого префикса, Telegram не опознает чат.
Что делать: посмотреть на знак и на начало числа. Положительное число — это человек. Отрицательное, начинающееся на -100, — супергруппа или канал. Частая беда — перенос идентификаторов через таблицу: редактор превращает длинное число в экспоненциальную запись или отбрасывает минус, и наружу это вылезает уже в виде ошибки при отправке. Проверять такие поля стоит глазами, а не по факту неудачной рассылки.
Ситуация 5. Бота убрали из группы или группа стала супергруппой. Второе коварнее: при преобразовании обычной группы в супергруппу идентификатор чата меняется, старый перестаёт работать. Telegram в ответе на неудачную отправку обычно сообщает новый идентификатор, но если ваш сервис его не подхватил, в базе останется мёртвое число.
Что делать: заново добавить бота в группу и обновить сохранённый идентификатор. Проще всего — отправить в группу любое сообщение и взять идентификатор из свежего входящего события, а не из старой записи. И отдельно проверьте права: в группах с ограничениями бот может быть внутри, но без возможности писать — симптом похожий, причина другая.
Почему нельзя написать по номеру телефона или @username
Это шестая по частоте попытка и первая по бесполезности: подставить в отправку телефон человека или его @username и ждать, что бот напишет. Так Bot API не работает.
По номеру телефона бот не пишет никому и никогда. Телефон в Telegram вообще не является адресом для ботов: связать номер с чатом можно только если человек сам поделился контактом внутри диалога, но и тогда писать ему бот сможет лишь потому, что диалог уже есть.
@username работает только для публичных каналов и супергрупп. У них есть публичное имя, и его действительно можно указывать вместо числа. У обычных пользователей это не работает: даже правильный @username человека не даёт боту права ему написать.
Из этого следует простой вывод: если вы придумываете, как «дотянуться» до человека в обход его первого сообщения, вы упираетесь не в баг, а в устройство платформы. Дотянуться не получится.
Главное правило: бот пишет только тем, кто написал ему первым
Это не настройка, не тариф и не особенность конкретного сервиса. Telegram устроен так: диалог с ботом открывает человек, и только после этого бот получает право отправлять в него сообщения. Никакая «починка» PEER_ID_INVALID не обходит это правило — она лишь чинит те случаи, где право есть, а идентификатор испорчен.
Отсюда практический вывод: база для рассылки собирается не выгрузкой, а входящими. Каждый контакт в ней должен появиться в момент, когда человек сам нажал «Начать» или написал боту. Способов сделать это ровно столько, сколько у вас точек контакта.
- Ссылка на бота. Прямая ссылка вида
t.me/имя_ботав шапке профиля, в описании канала, в подписи к посту, в письме, на сайте. Самый честный источник: человек пришёл сам. - Кнопка. Кнопка «Написать в Telegram» на сайте или в форме — вместо привычной формы обратной связи. Заявка приходит вам, а контакт остаётся в мессенджере, где ему можно ответить.
- Кодовое слово. Человек пишет слово в комментарии под постом или в личные сообщения, бот отвечает и отдаёт обещанное — файл, промокод, инструкцию. Механика родом из Instagram*, но идея та же в любом канале: обмен «слово в ответ на материал» даёт вам диалог, а человеку — повод его начать.
- QR-код и офлайн. Наклейка на кассе, код в чеке, табличка на столе. Отсканировал — попал в бот — вы можете писать.
- Полезный повод внутри бота. Проверка статуса заказа, запись, напоминание. Человек возвращается сам, диалог живёт, база не протухает.
Ссылку с меткой стоит делать разной для разных мест: так вы увидите, откуда люди приходят, и не будете гадать. Как раскладывать такую базу по группам и не писать всем одно и то же, разобрано в статье «Сегментация базы в боте», а правила самих рассылок — в «Массовой рассылке в Telegram».
Если бота ещё нет или он собран наспех, начните с основ: как создать чат-бота в Telegram и что написать в первом сообщении. Первое сообщение решает, останется человек в диалоге или заблокирует бота через минуту — а блокировка, как мы выяснили, и есть одна из причин будущих ошибок отправки.
Частые вопросы
Что значит peer id invalid в телеграмме?
Что Telegram не нашёл собеседника, которому вы пытаетесь отправить сообщение. Либо идентификатор чата неверный, либо чат есть, но бот не имеет права в него писать: диалог не начинался, бота удалили из группы, пользователь его заблокировал.
Ошибка возвращается сервером Telegram в ответ на отправку, поэтому она видна в логе или в отчёте о рассылке, а не в самом мессенджере.
Чем отличается chat not found от PEER_ID_INVALID?
Практически ничем: обе означают, что чат по переданному идентификатору не найден. «Chat not found» чаще приходит на заведомо непригодный идентификатор, PEER_ID_INVALID — на похожий на настоящий, но недоступный боту. Проверять в обоих случаях нужно одно и то же: правильность числа и наличие диалога.
Можно ли как-то починить ошибку и всё-таки написать человеку?
Если причина в испорченном идентификаторе — да, идентификатор исправляется и отправка проходит. Если человек не начинал диалог или заблокировал бота — нет. Это правило платформы, и его не обходят ни сервисы, ни настройки, ни платные тарифы. Любое обещание «писать в Telegram всем подряд» стоит воспринимать как сигнал держаться от такого решения подальше.
Почему ошибка появляется только по части контактов?
Потому что с этими контактами что-то изменилось после того, как вы их сохранили: человек заблокировал бота, удалил чат, группа стала супергруппой, бота из неё убрали. Остальные записи в базе остались валидными. Нормальная реакция — не пытаться пробить отказ повторными попытками, а помечать такие контакты неактивными.
Как проверить, что дело не в самом боте?
Напишите боту с другого аккаунта и посмотрите, отвечает ли он на входящее. Если отвечает — значит, подключение и токен в порядке, а проблема именно в конкретном получателе. Если не отвечает никому, проверьте подключение канала: в ЭТОЧАТБОТЕ Telegram подключается токеном, и статус связи виден в панели. Заодно посмотрите типичные ошибки при сборке ботов — часть из них выглядит как «бот не пишет», хотя причина в сценарии.
Коротко
PEER_ID_INVALID — это ответ Telegram «я не знаю такого собеседника». В половине случаев виновата база: не тот номер, потерянный минус, отсутствующий префикс -100 у супергруппы, старый идентификатор группы, которая стала супергруппой. Это чинится проверкой и обновлением идентификаторов.
Во второй половине случаев чинить нечего. Бот пишет только тем, кто написал ему первым, и ни один сервис это не обходит. Если человек не начинал диалог или заблокировал бота, отправки не будет — и правильный ход здесь не искать обходной путь, а перестроить сбор контактов: ссылка на бота, кнопка на сайте, кодовое слово, QR-код в офлайне.
Начните с малого: выгрузите список контактов, по которым падает ошибка, и разделите его на два — «сломанный идентификатор» и «нет диалога». Первый исправляется за вечер, второй показывает, сколько на самом деле стоит ваша база и откуда её пора собирать заново. Подключить Telegram и собрать первую точку входа можно на бесплатном тарифе — без карты.