Telegram Bot API 10.0–10.3: Rich Messages, Ephemeral Messages, Guest Mode and More
Telegram Bot API 10.3, released on August 24, 2026, is the current version of the Bot API with 185 methods. The 10.x series, which began with Bot API 10.0 on May 8, 2026, brought guest mode, live photos, rich messages with streamed drafts, ephemeral messages, communities and join request queries. Below is what's new in each release, with short JSON examples and the changes that can break an existing bot.
Telegram Bot API 10 at a glance
| Version | Date | Highlights |
|---|---|---|
| 10.0 | May 8, 2026 | Guest mode, live photos, media in polls, reaction removal |
| 10.1 | June 11, 2026 | Rich messages and rich drafts, join request queries |
| 10.2 | July 14, 2026 | Ephemeral messages, communities, subscription update, Mini App origin protection |
| 10.3 | August 24, 2026 | EphemeralMessageParameters, stoppable drafts, DisabledButton, buttons in rich messages |
Bot API 10.0: guest mode, live photos and polls
Guest mode. After you enable Guest Mode in the @BotFather Mini App, users can mention your bot in chats it is not a member of. The bot receives a guest_message update and can send one reply with answerGuestQuery, passing guest_query_id from the message and an InlineQueryResult:
{
"guest_query_id": "<message.guest_query_id>",
"result": {
"type": "article",
"id": "1",
"title": "Translation",
"input_message_content": {"message_text": "Bonjour tout le monde"}
}
}
A guest bot gets no access to the chat history or member list and won't see later messages unless it is mentioned or replied to again.
- Reactions and admins:
deleteMessageReactionremoves a reaction in a group;deleteAllMessageReactionsremoves up to 10000 recent reactions of a given user or chat.getChatAdministratorsgainedreturn_bots. - Polls: media in polls, options and quiz explanations (
media,explanation_media), plusmembers_onlyandcountry_codes. The minimum number of options dropped from 2 to 1. - Live photos:
sendLivePhotosends a photo with a short video; live photos also work insendMediaGroup,editMessageMediaand paid media. - Other:
getManagedBotAccessSettingsandsetManagedBotAccessSettings,getUserPersonalChatMessages, bot-to-bot messages by username when both bots allow it, and an emptytextinsendMessageDraftto show a "Thinking..." placeholder.
Bot API 10.1: Telegram rich messages and join request queries
Rich messages are for structured output such as reports, documentation and AI answers. sendRichMessage takes a rich_message object with the content in html or markdown (10.2 added explicit blocks and a media list). Supported: headings, lists and task lists, tables, quotes, collapsible details, footnotes, LaTeX formulas, maps, collages, slideshows and media blocks. Limits: 32768 UTF-8 characters, 500 blocks, 16 nesting levels, 50 media and 20 table columns.
curl -X POST "https://api.telegram.org/bot123456789:AAEexampleTokenReplaceWithYours/sendRichMessage" \
-H "Content-Type: application/json" \
-d '{
"chat_id": 123456789,
"rich_message": {
"markdown": "# Weekly report\n\n| Metric | Value |\n|:-------|------:|\n| Users | **1204** |\n| Errors | 3 |\n\n- [x] Deploy v2.1\n- [ ] Update docs\n\n$$E = mc^2$$"
}
}'
sendRichMessageDraft streams a partial rich message into a private chat while it is being generated. The draft is a temporary 30-second preview, so finish with sendRichMessage. editMessageText now accepts rich_message as well.
Join request queries. When your bot is set up as the guard bot of a chat, the chat_join_request update carries a query_id. Decide right away with answerChatJoinRequestQuery (approve, decline, or queue to leave the decision to other admins), or first show a Mini App with sendChatJoinRequestWebApp; the Mini App receives chat_join_request_query_id in its init data.
{"chat_join_request_query_id": "<chat_join_request.query_id>", "result": "approve"}
Polls also gained link media in 10.1.
Bot API 10.2: Telegram ephemeral messages, communities and Mini App security
Ephemeral messages are group messages visible only to one user and the bot, which keeps hints, welcome texts and personal results out of the shared timeline. Users can also send ephemeral commands (BotCommand.is_ephemeral) that nobody else sees. The delivery rules:
- Any bot may answer ephemerally within 15 seconds of an eligible action: a callback query (by its id) or an incoming ephemeral message (via
reply_parameters.ephemeral_message_id). - A bot that is a chat administrator can send an ephemeral message to any non-bot member at any time.
- Delivery is not guaranteed, especially if the user is offline.
Ephemeral messages have their own methods: editEphemeralMessageText, editEphemeralMessageMedia, editEphemeralMessageCaption, editEphemeralMessageReplyMarkup and deleteEphemeralMessage:
{"chat_id": -1001234567890, "receiver_user_id": 123456789, "ephemeral_message_id": 15}
- Communities: supergroups, channels and bots linked around a shared topic, with the
Communitytype,community_chat_addedandcommunity_chat_removedservice messages andChatFullInfo.community. - Subscriptions: the new
subscriptionupdate reports changes to a user's payment subscription. - Mini App origin protection: Mini App methods are blocked when called from an origin different from the Mini App domain. It was enabled for all Mini Apps on July 20, 2026, with an opt-out in @BotFather. See how to test a Telegram Mini App for what this means in practice.
Bot API 10.3: EphemeralMessageParameters, stoppable drafts and DisabledButton
Breaking change for ephemeral messages. The 10.2 parameters receiver_user_id and callback_query_id were replaced in 13 send methods (sendMessage, sendPhoto, sendVideo, sendAnimation, sendAudio, sendDocument, sendLivePhoto, sendSticker, sendVideoNote, sendVoice, sendContact, sendLocation, sendVenue) by one object, ephemeral_message_parameters. sendRichMessage accepts it too, and the new replace_callback_query_message shows the ephemeral message in place of the message with the pressed button:
{
"chat_id": -1001234567890,
"text": "Only you can see this.",
"ephemeral_message_parameters": {
"receiver_user_id": 123456789,
"callback_query_id": "<callback_query.id>",
"replace_callback_query_message": true
}
}
Stoppable drafts. Pass can_stop to sendMessageDraft or sendRichMessageDraft to show a Stop button. When the user presses it, your bot receives a stopped_message_generation update with chat and draft_id, so you can cancel the model. keep_on_stop leaves the partial draft visible for a while; send it as a regular message if it should stay.
import time
import requests
API = "https://api.telegram.org/bot123456789:AAEexampleTokenReplaceWithYours"
text, last = "", 0.0
for chunk in generate_reply(): # your LLM token stream
text += chunk
if time.monotonic() - last > 0.5: # don't send a draft per token
requests.post(f"{API}/sendMessageDraft", json={"chat_id": 123456789,
"draft_id": 1, "text": text, "can_stop": True}, timeout=10)
last = time.monotonic()
requests.post(f"{API}/sendMessage", json={"chat_id": 123456789, "text": text}, timeout=10)
- Disabled buttons: the new
disabledfield ofInlineKeyboardButtontakes aDisabledButtonobject, for example{"text": "Sold out", "disabled": {}}; the button does nothing.InlineKeyboardMarkupandReplyKeyboardMarkupalso gainedforce_reply. - Rich messages: buttons inside the message (
<tg-button>,<tg-button-row>), compact tables, expandable block quotations and document blocks. - Admins: the
can_send_welcome_messagesright inChatAdministratorRightsandpromoteChatMember. - Ephemeral edits: new file uploads in
editEphemeralMessageMedia,show_caption_above_mediaineditEphemeralMessageCaptionandrich_messageineditEphemeralMessageText.
How to upgrade a bot to Bot API 10.3
- Update your library (python-telegram-bot, aiogram, grammY, Telegraf and others) to a release that lists Bot API 10.3 support in its changelog.
- Move 10.2-style
receiver_user_idandcallback_query_idintoephemeral_message_parameters. - If you pass an explicit
allowed_updateslist, add the new types you handle:guest_message,subscription,stopped_message_generation. - Relax poll validation: a single option is now allowed.
- For Mini Apps, make sure every
Telegram.WebAppcall runs on the registered domain. - Try the new methods with your token in the Bot API Tester: sendRichMessage, deleteEphemeralMessage and answerChatJoinRequestQuery.
Ephemeral and regular messages share the same basics, so sending messages with the Bot API is a good refresher, and Telegram Bot API limits lists rich message limits next to the classic ones. The full history is in the official Bot API changelog.
Frequently asked questions
What is the latest Telegram Bot API version?
Bot API 10.3, released on August 24, 2026, with 185 methods. It is the fourth release of the 10.x series, which started with Bot API 10.0 on May 8, 2026.
What are rich messages in Telegram?
Rich messages (Bot API 10.1) are structured messages sent with sendRichMessage: headings, lists, tables, LaTeX formulas, media blocks, maps and, since 10.3, buttons. You pass the content as HTML, Markdown or blocks in rich_message, up to 32768 UTF-8 characters.
What are ephemeral messages in Telegram bots?
Ephemeral messages (Bot API 10.2) are messages in a group or supergroup that only one user and the bot can see. Since 10.3 you send them with ephemeral_message_parameters in sendMessage and other send methods. Delivery is not guaranteed, especially if the user is offline.
How do I stream AI replies in a Telegram bot?
In a private chat, call sendMessageDraft or sendRichMessageDraft repeatedly with the same draft_id, then send the final text with sendMessage or sendRichMessage, because a draft is only a temporary 30-second preview. With can_stop the user gets a Stop button and your bot receives stopped_message_generation.
What changed for ephemeral messages in Bot API 10.3?
The 10.2 parameters receiver_user_id and callback_query_id were moved from the send methods into the EphemeralMessageParameters object passed as ephemeral_message_parameters, which also adds replace_callback_query_message. Code written for 10.2 must be updated.
What is guest mode in Telegram Bot API 10.0?
Guest mode lets a bot reply when it is mentioned in a chat it is not a member of. The bot receives a guest_message update and answers once with answerGuestQuery, without access to the chat history. You enable it in the @BotFather Mini App.
Related guides
How to Create a Telegram Bot: Step by Step with BotFather and Python
How to create a Telegram bot step by step: register it with @BotFather, get the token, test it with getMe and send a first message with curl or Python.
Telegram Bot API Limits: Rate Limits, 429 Errors, File Sizes and Message Length
Telegram Bot API rate limits explained: 30 msg/s, 1 msg/s per chat, 20/min in groups, handling 429 retry_after, plus file size and message length limits.
How to Send a Message with the Telegram Bot API (sendMessage)
Telegram Bot API send message guide: sendMessage with curl, Python and JavaScript, HTML and MarkdownV2 formatting, inline buttons and error fixes.
Telegram Bot Token: How to Get It, Find It Again, Check It and Keep It Safe
Telegram bot token guide: get one from @BotFather, find the token of an existing bot, check it with getMe, revoke a leaked token and store it safely.
How to Set Up a Telegram Bot Webhook: setWebhook, Secret Token and Troubleshooting
Set up a Telegram bot webhook: setWebhook URL requirements, secret_token header check, getWebhookInfo debugging, deleteWebhook and fixes for n8n.
How to Get a Telegram Chat ID for a User, Group, Channel or Topic
How to get a Telegram chat ID for a user, group, supergroup, channel or forum topic with getUpdates, plus fixes for an empty result and 409 Conflict.
How to Test a Telegram Mini App: From Browser Mock to Real Telegram
Test a Telegram Mini App step by step: browser mock mode, localhost via HTTPS tunnel, test environment, DevTools per platform, initData validation.