Telegram error 403: Forbidden: bot was blocked by the user
Last verified against Telegram Bot API reference
Forbidden: bot was blocked by the userWhat error 403 means
The user you are messaging has blocked your bot. Telegram will not deliver anything to them until they unblock it, and there is no API to query block status ahead of time; the failed send is the signal. This is the most common 403 for any bot that sends notifications, and it is a normal part of operating a bot, not a malfunction.
The chat ID is valid and the token is fine. Retrying will fail identically until the user changes their mind. If a user later unblocks the bot and sends /start again, sends resume; you will see the new update arrive. Distinguish it from its two neighbors: bot can't initiate conversation with a user (they never started your bot) and user is deactivated (the account is gone).
In python-telegram-bot this raises telegram.error.Forbidden (named Unauthorized in the old v13 API, which is why older tutorials catch that instead). aiogram v3 raises aiogram.exceptions.TelegramForbiddenError with this description in message. Telegraf rejects with a TelegramError whose response.error_code is 403, grammY throws a GrammyError with error_code: 403, and node-telegram-bot-api surfaces ETELEGRAM: 403 Forbidden: bot was blocked by the user with the raw body on error.response.body.
Because blocked users stay in your database unless you act on this error, bots that never handle it gradually waste more and more of their send budget on undeliverable messages, and those wasted sends still count toward the broadcast throughput described under Telegram rate limits.
What it looks like
{"ok":false,"error_code":403,"description":"Forbidden: bot was blocked by the user"}Why it happens
- The user blocked the bot from the chat menu (Block bot).
- The user blocked the bot long ago and your recipient list was never pruned.
- The user received a mass broadcast, considered it spam, and blocked the bot in response.
- A re-imported or restored subscriber list re-activated users who had already blocked the bot.
How to fix Telegram error 403
- 1Catch this exact description in your send path, mark the user as blocked in storage, and stop sending to them.
- 2Exclude blocked users from broadcasts until a new update from them arrives.
- 3On a fresh
/startor any inbound message from that user, clear the flag and resume. - 4Track the blocked rate per campaign; a spike is a content or frequency signal, not an infrastructure problem.
- 5Do not retry the failed message; it cannot be delivered and each retry wastes rate-limit budget.
How to stop it recurring
Handle my_chat_member updates: when a user blocks your bot, Telegram sends an update where the bot's new status in that private chat is kicked, so you can flag the user before the next send fails. Give users a clear way to reduce or stop notifications inside the bot, which reduces blocks in the first place; opt-in and opt-out design for Telegram bots is covered on the Telegram chatbot page, and the broader 403 family is cause 4 in Telegram bot not responding.
Official reference: Telegram Bot API reference. See all Telegram error codes or the Telegram limits and quotas.
Related codes
- 403: Forbidden: bot can't initiate conversation with a userForbidden: bot can't initiate conversation with a user
- 403: Forbidden: user is deactivatedForbidden: user is deactivated
- 403: Forbidden: bot was kicked from the group chatForbidden: bot was kicked from the group chat
- 429: Too Many Requests: retry after NToo Many Requests: retry after 34
Error 403 - quick answers
What does Telegram error 403 mean?
The user you are messaging has blocked your bot. Telegram will not deliver anything to them until they unblock it, and there is no API to query block status ahead of time; the failed send is the signal. This is the most common 403 for any bot that sends notifications, and it is a normal part of operating a bot, not a malfunction. The chat ID is valid and the token is fine.
How do I fix Telegram error 403?
1. Catch this exact description in your send path, mark the user as blocked in storage, and stop sending to them. 2. Exclude blocked users from broadcasts until a new update from them arrives. 3. On a fresh /start or any inbound message from that user, clear the flag and resume. 4. Track the blocked rate per campaign; a spike is a content or frequency signal, not an infrastructure problem. 5. Do not retry the failed message; it cannot be delivered and each retry wastes…
Should I retry after error 403?
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.