Telegram Bot API
🌐 Русский

Как узнать chat id в Telegram: пользователь, группа, канал и тема форума

· 8 мин чтения

Чтобы узнать chat id в Telegram, напишите что-нибудь своему боту и вызовите метод getUpdates: идентификатор чата лежит в поле message.chat.id. С группой то же самое, только бота сначала нужно добавить в чат, а в канале — сделать администратором. Ниже — пошагово для личного чата, группы, супергруппы, канала и темы форума, а также что делать, если getUpdates возвращает пустой result или 409 Conflict.

Что такое chat id и как он выглядит

chat_id — уникальный идентификатор чата, обязательный параметр sendMessage и почти всех методов отправки. По знаку и префиксу сразу видно тип чата:

Чатchat.typeПример id
Личный чат с пользователемprivate123456789 — положительный, совпадает с id пользователя
Обычная группаgroup-987654321 — отрицательный
Супергруппа, в том числе форумsupergroup-1001234567890
Каналchannel-1009876543210

Как узнать chat id телеграм-бота в личном чате

  1. Откройте своего бота и нажмите «Запустить» или отправьте любое сообщение.
  2. Вызовите getUpdates — через curl или в Bot API Tester на методе getUpdates.
  3. Найдите в ответе message.chat.id.
export BOT_TOKEN="123456789:AAEexampleTokenReplaceWithYours"

curl -s "https://api.telegram.org/bot$BOT_TOKEN/getUpdates"
{
  "ok": true,
  "result": [
    {
      "update_id": 851234567,
      "message": {
        "message_id": 15,
        "from": {"id": 123456789, "is_bot": false, "first_name": "Иван", "username": "ivan_dev"},
        "chat": {"id": 123456789, "first_name": "Иван", "username": "ivan_dev", "type": "private"},
        "date": 1793275200,
        "text": "привет"
      }
    }
  ]
}

В личном чате chat.id совпадает с from.id. Если апдейтов много, удобнее сразу вывести список чатов. С утилитой jq это одна строка:

curl -s "https://api.telegram.org/bot$BOT_TOKEN/getUpdates" \
  | jq '.result[] | (.message // .channel_post // .my_chat_member // empty) | .chat | {id, type, title, username}'

То же на Python:

import os
import requests

token = os.environ["BOT_TOKEN"]
updates = requests.get(f"https://api.telegram.org/bot{token}/getUpdates", timeout=10).json()["result"]

for update in updates:
    item = update.get("message") or update.get("channel_post") or update.get("my_chat_member") or {}
    chat = item.get("chat")
    if chat:
        print(chat["id"], chat["type"], chat.get("title") or chat.get("first_name"))

Как узнать chat id группы

  1. Добавьте бота в группу как обычного участника. Если бот не находится или не добавляется, проверьте /setjoingroups в @BotFather.
  2. Отправьте в группе команду с username бота: /start@your_bot.
  3. Вызовите getUpdates и возьмите message.chat.id — отрицательное число, а chat.title подскажет, та ли это группа.

Почему именно команда с @username: по умолчанию у ботов включён privacy mode. В группе бот получает только команды, адресованные ему (/command@your_bot), ответы на свои сообщения, сообщения, отправленные через него, и служебные сообщения. Обычное «привет» в группе до бота не дойдёт. Служебные сообщения приходят всегда, поэтому id часто виден сразу после добавления бота: в апдейте my_chat_member и в сообщении с new_chat_members.

Включён ли privacy mode, видно в ответе getMe: "can_read_all_group_messages": false означает, что включён. Чтобы бот видел все сообщения, сделайте его администратором группы или отключите режим командой /setprivacy — после этого бота нужно удалить из группы и добавить заново.

Группа стала супергруппой. Telegram превращает обычную группу в супергруппу при некоторых изменениях настроек, например при включении тем. Id при этом меняется: бот получит служебное сообщение с migrate_to_chat_id, а отправка по старому id вернёт ошибку с новым id в parameters:

{
  "ok": false,
  "error_code": 400,
  "description": "Bad Request: group chat was upgraded to a supergroup chat",
  "parameters": {"migrate_to_chat_id": -1001234567890}
}

Chat id канала: публичного и приватного

Публичный канал. Числовой id можно вообще не искать: в chat_id подходит @channelusername. Публиковать сообщения бот всё равно сможет, только если он администратор канала с правом публикации. Если для интеграции нужно именно число, вызовите getChat:

curl -s "https://api.telegram.org/bot$BOT_TOKEN/getChat?chat_id=@my_channel"
# в ответе: "result": {"id": -1001234567890, "title": "...", "type": "channel", ...}

Приватный канал.

  1. Добавьте бота в администраторы канала.
  2. Опубликуйте в канале любой пост.
  3. Вызовите getUpdates — придёт апдейт channel_post, id канала в channel_post.chat.id.
{
  "update_id": 851234570,
  "channel_post": {
    "message_id": 7,
    "sender_chat": {"id": -1009876543210, "title": "Закрытый канал", "type": "channel"},
    "chat": {"id": -1009876543210, "title": "Закрытый канал", "type": "channel"},
    "date": 1793275500,
    "text": "Тестовый пост"
  }
}

Альтернатива — перешлите любой пост из канала боту в личный чат: в апдейте будет message.forward_origin с типом channel, а id канала — в forward_origin.chat.id.

Темы форума: message_thread_id

В супергруппе с темами ("is_forum": true) chat id один на весь форум, а конкретную тему задаёт message_thread_id. Чтобы его узнать, отправьте в нужной теме команду /start@your_bot и вызовите getUpdates: у сообщения будут поля message_thread_id и "is_topic_message": true. Если тему создаёт сам бот методом createForumTopic, id придёт в ответе в поле message_thread_id.

curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
  -H "Content-Type: application/json" \
  -d '{"chat_id": -1001234567890, "message_thread_id": 42, "text": "Сообщение в нужную тему"}'

Темы бывают и в личных чатах с ботом, если для него включён этот режим, — message_thread_id работает там так же.

Пустой result и 409 Conflict: что делать

Ответ {"ok": true, "result": []} — запрос прошёл, но новых апдейтов нет. Причины:

Ошибка 409 Conflict: can't use getUpdates method while webhook is active; use deleteWebhook to delete the webhook first — у бота установлен вебхук, например его поставил n8n или фреймворк. Пока вебхук активен, getUpdates не работает. Удалите вебхук — без drop_pending_updates накопленные апдейты сохранятся:

curl -s "https://api.telegram.org/bot$BOT_TOKEN/deleteWebhook"

Если бот в продакшене работает на вебхуке, после этого установите его заново. В Bot API Tester кнопка «Старт» в панели обновлений сама вызывает deleteWebhook перед запуском long polling, а новые апдейты сразу появляются в истории.

Ошибка 409 Conflict: terminated by other getUpdates request — тот же токен одновременно опрашивают два процесса. Оставьте один.

Где пригодится chat id

curl -s "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
  -d chat_id=123456789 \
  --data-urlencode "text=Деплой завершён успешно"

Токен для таких интеграций — в гайде как получить токен бота, а форматирование, кнопки и разбор ошибок отправки — в гайде как отправить сообщение через бота. Если бот ещё не создан, начните с инструкции как создать бота в Телеграм.

Частые вопросы

Почему chat id группы отрицательный?

Так Bot API отличает чаты от пользователей: у пользователей id положительный, у обычных групп — отрицательный, а у супергрупп и каналов начинается с -100. Минус и -100 — часть id, передавайте число целиком.

Можно ли узнать chat id пользователя по username?

Нет. В chat_id можно передать @username только канала, супергруппы или бота. Числовой id пользователя бот узнаёт, когда тот сам ему пишет: он приходит в message.from.id и message.chat.id.

Почему getUpdates возвращает пустой result?

Новых апдейтов нет: боту ничего не писали, апдейты старше 24 часов удалены или их уже забрал другой процесс с тем же токеном. Если установлен вебхук, вместо пустого списка придёт 409 Conflict — сначала вызовите deleteWebhook.

Как узнать chat id приватного канала?

Добавьте бота в канал администратором, опубликуйте пост и вызовите getUpdates: id будет в channel_post.chat.id и начнётся с -100. Второй способ — переслать пост из канала боту и взять forward_origin.chat.id.

Может ли chat id группы измениться?

Да, когда обычную группу преобразуют в супергруппу. Новый id вида -100… приходит в поле migrate_to_chat_id, а старый перестаёт работать.

В каком типе данных хранить chat id?

В 64-битном целом (BIGINT, int64). Id может занимать больше 32 бит, но не больше 52 значащих, поэтому int32 не подходит, а int64 и double — подходят.

Как создать бота в Телеграм: от @BotFather до первого сообщения

Как создать бота в Телеграм: регистрация в @BotFather, токен, проверка через getMe, первое сообщение на curl и Python, команды и описание бота.

Что нового в Telegram Bot API 10.0–10.3: rich-сообщения, эфемерные сообщения и гостевой режим

Что нового в Telegram Bot API 10.0–10.3: rich-сообщения, эфемерные сообщения, гостевой режим, заявки на вступление — с примерами и чек-листом миграции.

Лимиты Telegram Bot API: сообщения в секунду, ошибка 429 и размеры файлов

Все лимиты Telegram Bot API в одном месте: сообщения в секунду, ошибка 429 и retry_after, платные рассылки, размеры файлов, длина текста и подписи.

Как отправить сообщение через бота Telegram: sendMessage, разметка и кнопки

Как отправить сообщение через бота Telegram: sendMessage на curl, Python и JavaScript, parse_mode HTML и MarkdownV2, кнопки и ошибки 400, 403, 429.

Токен бота Telegram: как получить, где найти, как проверить и отозвать

Как получить токен бота Телеграм в @BotFather, где взять токен уже созданного бота, как проверить его через getMe и что делать, если токен утёк.

Вебхук для Telegram-бота: настройка setWebhook, проверка и удаление

Как настроить вебхук Телеграм-бота: требования к HTTPS и портам, setWebhook с secret_token, проверка через getWebhookInfo, удаление и частые ошибки.

Тестирование Telegram Mini App: от браузера до отладки на телефоне

Тестирование Telegram Mini App по шагам: mock-режим в браузере, HTTPS-туннель для localhost, тестовая среда, DevTools на телефоне и проверка initData.