Telegram Chat ID Finder
Paste a bot token and get the chat_id of every user, group, supergroup and channel your bot has heard from, ready to copy into sendMessage. Nothing is marked as read.
Connect your bot
From @BotFather. Stop your own poller first, or both get 409.
Runs in your browser. Your token goes only to api.telegram.org and is never stored.
# No offset, so nothing is marked as read
curl "https://api.telegram.org/bot<TOKEN>/getUpdates?limit=100"What a Telegram chat ID is
Every sendMessage, sendPhoto and banChatMember call needs a chat_id, and Telegram never shows it in the app. Your bot learns it from incoming updates: each message carries a chat object with an id and a type. This page reads those updates for you and lists them, grouped by chat.
The sign tells you the kind of chat. A positive number is a person, and it doubles as their private chat with your bot. A plain negative number is a basic group. A number starting with -100 is a supergroup or a channel. IDs can exceed 32 bits, so store them as 64-bit integers or strings, never as a 32-bit int.
Why getUpdates here does not eat your messages
Telegram keeps a queue of updates for each bot and only forgets one when a getUpdates call passes an offset higher than its update_id. This tool never sends an offset, so it reads the queue without confirming anything: your own polling code still receives every update afterwards. The queue holds updates for 24 hours.
Two things block the read. A registered webhook makes getUpdates answer 409 Conflict, and a bot already polling elsewhere makes the two requests fight. Both are explained above when they happen, with the fix.
Groups, privacy mode and upgraded supergroups
A bot added to a group with privacy mode on, which is the default, only receives commands, replies to its own messages and mentions. Ordinary chatter never reaches it, so the group does not appear until someone sends /start@yourbot. Turn privacy off with /setprivacy in @BotFather if the bot should read everything.
When a basic group is upgraded to a supergroup, its ID changes to a new -100 number and the old one stops working. The finder lists the new ID from the migration message. A chat not found error on a group that used to work is usually this.
Without a bot token
You need a bot to send messages anyway, but if you only want your own numeric user ID, the public helper bots such as @userinfobot reply with it when you message them. Forwarding a channel post to such a bot often reveals the channel ID too, unless the channel restricts forwarding. Treat third-party bots as you would any stranger: they see what you send them. With your own bot and this page nothing leaves your browser except the call to Telegram. Once you have the ID, the link generator builds t.me links for the same chat, and a hosted Telegram chatbot handles the routing without IDs in your code. Rate limits for sending are on the Telegram limits page, and silent bots are covered in why your Telegram bot is not responding.
Frequently asked questions
How do I find the chat ID of a Telegram group?
Add your bot to the group, then send a command such as /start@yourbot so the bot receives it even with privacy mode on. Paste the bot token here and press Find chats: the group appears with its ID. Basic groups have a plain negative ID; supergroups start with -100. If the group was upgraded, use the new -100 ID.
Why does my supergroup or channel ID start with -100?
The Bot API builds one ID space out of users, basic groups and channels so they never collide. Supergroups and channels are channels underneath, and their Bot API ID is -100 followed by the internal channel number. Always send the full value including -100 as chat_id. Dropping the prefix gives a different, usually nonexistent, chat and a chat not found error.
Will this tool steal or mark my bot's messages as read?
No. It calls getUpdates without an offset, and Telegram only treats updates as confirmed when a request passes an offset higher than their update_id. Everything stays queued for your own code. The token goes from your browser straight to api.telegram.org and is never sent to Conferbot. Stop your own poller while you use it, because two pollers at once trigger 409.
Why does getUpdates return an empty result?
Nobody has messaged the bot since the queue was last confirmed, the updates are older than 24 hours, or the bot is in a group with privacy mode on and only sees commands and mentions. Open the bot, send it a message, then press Find chats or turn on Listen. A 409 instead of an empty list means a webhook is set.
Can I get a chat ID while my bot uses a webhook?
Not with getUpdates, which Telegram refuses while a webhook is registered. Either log update.message.chat.id inside your webhook handler, or delete the webhook without dropping pending updates, read the IDs here, and set the webhook again. The webhook checker does both steps from the browser, and keeping the queue means no message is lost.
Is a Telegram user ID the same as their private chat ID?
Yes. In a private chat with your bot, chat.id equals the user's own ID, and it is a positive number. Your bot can only message that user after they have started a conversation with it, so a user ID copied from elsewhere returns chat not found until they press Start. Group IDs are always negative.
Related
Stop hunting for chat IDs
Connect your Telegram bot to Conferbot and every conversation lands in one inbox with the chat already identified. Free plan, no card.