Telegram error 400: Bad Request: message to be replied not found
Last verified against Telegram Bot API reference
Bad Request: message to be replied not foundWhat error 400 means
You sent a message with reply_parameters.message_id (or the legacy reply_to_message_id) pointing at a message that does not exist in that chat. Current Bot API versions return message to be replied not found; older servers and many library test fixtures show the earlier wording Bad Request: reply message not found. Both mean the same thing, and either may still be seen depending on the server and the exact method.
The reply target was deleted, never existed in this chat, or belongs to another chat. Unless you pass allow_sending_without_reply=true in reply_parameters, Telegram refuses to send at all rather than sending without the quote.
The bot, token and chat are fine. This is purely about the referenced message.
What it looks like
{"ok":false,"error_code":400,"description":"Bad Request: message to be replied not found"}Why it happens
- The user deleted their message between sending it and your bot replying (common with slow handlers or queued replies).
- A stale message_id from a previous conversation or a different chat was reused.
- The message was in a different forum topic and the thread context did not match.
- In a channel, replying to a post the bot never received.
How to fix Telegram error 400
- 1Set
reply_parameters.allow_sending_without_reply: trueso the message still goes out when the target is gone. - 2Reply promptly; if processing is slow, send an acknowledgment first and the full answer later without a reply reference.
- 3Verify the message_id came from the same chat_id in the same update.
- 4On this error, retry once without reply parameters rather than failing the whole send.
How to stop it recurring
Use allow_sending_without_reply by default in customer-facing bots; a missing quote is cosmetic, a missing reply is a dropped conversation. Never persist reply targets across sessions. Keep reply handling inside the update that produced the target message.
All major libraries expose this as a generic 400; python-telegram-bot and aiogram code typically matches the description and retries once without reply_parameters. The quote variant has its own constraint: reply_parameters.quote must be an exact substring of the original message (0-1,024 characters, see text limits) or the send fails similarly. Related identifier failures: message not found and chat not found.
Official reference: Telegram Bot API reference. See all Telegram error codes or the Telegram limits and quotas.
Related codes
Error 400 - quick answers
What does Telegram error 400 mean?
You sent a message with reply_parameters.message_id (or the legacy reply_to_message_id ) pointing at a message that does not exist in that chat. Current Bot API versions return message to be replied not found ; older servers and many library test fixtures show the earlier wording Bad Request: reply message not found .
How do I fix Telegram error 400?
1. Set reply_parameters.allow_sending_without_reply: true so the message still goes out when the target is gone. 2. Reply promptly; if processing is slow, send an acknowledgment first and the full answer later without a reply reference. 3. Verify the message_id came from the same chat_id in the same update. 4. On this error, retry once without reply parameters rather than failing the whole send.
Should I retry after error 400?
No. Retrying the same request produces the same error; the condition has to be fixed first. Treat it as a permanent failure for that message and surface it, rather than looping.
Stop debugging Telegram by hand
Connect the channel through Conferbot: tokens, webhooks and retries are handled, failures show as readable status.