Telegram Bot API · error code

Telegram error 403: Forbidden: bot can't send messages to bots

Permanent - do not retryHTTP 403403 Forbidden: blocked, kicked, not started

Last verified against Telegram Bot API reference

What Telegram returns
Forbidden: bot can't send messages to bots

What error 403 means

The target chat ID belongs to another bot, and bots cannot message other bots in private. The FAQ explains the reasoning: bots talking to each other could get stuck in unwelcome loops, so bots never see messages from other bots regardless of mode. The Bot API enforces this on the sending side with this 403.

You usually reach this by accident: a user ID captured from a group turns out to be a bot (the is_bot flag on User is true), or a test was run by sending from one bot to another. Telegram's features page mentions bots can send private messages to other bots via @username in limited 'bot-to-bot' scenarios, but ordinary sends by numeric ID are rejected.

Tokens, rights and rate limits are irrelevant here; the target type is the problem.

What it looks like

{"ok":false,"error_code":403,"description":"Forbidden: bot can't send messages to bots"}

Why it happens

  • A broadcast list includes IDs of bots that were members of a group.
  • A test harness tries to verify one bot by messaging it from another.
  • An integration stored the bot's own ID as a 'user' and later tries to notify it.
  • A support flow that tries to forward a conversation to an 'agent' that is actually another bot account.

How to fix Telegram error 403

  1. 1Filter recipients on from.is_bot === false when collecting user IDs.
  2. 2Mark the target as non-messageable when this error appears.
  3. 3For bot-to-bot testing, use a real test account, or a group both bots are in.

How to stop it recurring

Store is_bot alongside every captured user and exclude bots from any outbound list by default. Treat this description as a permanent per-target failure in the same classifier you use for blocked and deactivated users. If two of your own systems need to exchange data, do it over your backend or a shared group rather than through bot-to-bot private messages.

Both python-telegram-bot and aiogram raise their Forbidden classes here, identical to blocked handling, so the is_bot filter belongs in list collection, not in the error handler. If the target is a human who simply never started the bot, the error is can't initiate conversation instead.

Official reference: Telegram Bot API reference. See all Telegram error codes or the Telegram limits and quotas.

Related codes

Error 403 - quick answers

What does Telegram error 403 mean?

The target chat ID belongs to another bot, and bots cannot message other bots in private. The FAQ explains the reasoning: bots talking to each other could get stuck in unwelcome loops, so bots never see messages from other bots regardless of mode. The Bot API enforces this on the sending side with this 403.

How do I fix Telegram error 403?

1. Filter recipients on from.is_bot === false when collecting user IDs. 2. Mark the target as non-messageable when this error appears. 3. For bot-to-bot testing, use a real test account, or a group both bots are in.

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.