Telegram error 403: Forbidden: bot can't initiate conversation with a user
Last verified against Telegram Bot API reference
Forbidden: bot can't initiate conversation with a userWhat error 403 means
You tried to send a private message to a user who has never started a conversation with your bot. Telegram's rule is absolute: a bot cannot message a user first. The user must send /start, tap a deep link such as https://t.me/YourBot?start=payload, or otherwise message the bot before the bot is allowed to reply. Knowing their user ID from a group, or having their phone number, does not grant permission.
This differs from bot was blocked by the user (they started, then blocked) and from chat not found (the ID is unknown to the bot entirely; you will often see that one instead for brand-new users, depending on whether the bot has encountered the ID in a group). The fix in all cases is the same on your side: obtain opt-in inside Telegram.
To reproduce it deliberately: add your bot to a group with a second account, capture that account's from.id from a group message, then call sendMessage with that ID as chat_id without ever opening a private chat from the second account. The send fails with exactly this description.
python-telegram-bot raises telegram.error.Forbidden for this description; aiogram v3 raises TelegramForbiddenError; Telegraf and grammY surface a 403 TelegramError / GrammyError; node-telegram-bot-api reports ETELEGRAM: 403 Forbidden: bot can't initiate conversation with a user. None of the libraries can work around it, because it is a platform rule rather than a permission you can request.
What it looks like
{"ok":false,"error_code":403,"description":"Forbidden: bot can't initiate conversation with a user"}Why it happens
- A notification flow that imports user IDs from a group, CRM export or another bot and tries to DM them.
- The user appeared in a group the bot is in, so the bot knows their ID, but they never opened a private chat with it.
- The user deleted their chat with the bot; depending on client behavior the bot may lose the right to initiate.
- A migration from another bot: the old bot's users never started the new bot, so their IDs are known but unreachable.
How to fix Telegram error 403
- 1Give users a deep link or a button that opens the bot; the Telegram link generator builds t.me links with a start payload.
- 2Only send private messages to users with a recorded
/start(or any inbound message) for this specific bot. - 3In groups, reply in the group or prompt the user to open the bot privately.
- 4Mark the user as not opted-in when you see this error, and stop retrying; the state only changes when they message the bot.
How to stop it recurring
Design every Telegram notification feature to begin with a deep link that carries your own identifier (the start parameter allows 1-64 characters of A-Z, a-z, 0-9, underscore and hyphen), so the first message from the user both opts them in and maps their Telegram ID to your record. Treat 'has started the bot' as a stored boolean gate on all outbound DMs. Deep-link onboarding patterns for support bots are described on the Telegram chatbot page.
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?
You tried to send a private message to a user who has never started a conversation with your bot. Telegram's rule is absolute: a bot cannot message a user first. The user must send /start , tap a deep link such as https://t.me/YourBot?start=payload , or otherwise message the bot before the bot is allowed to reply. Knowing their user ID from a group, or having their phone number, does not grant permission.
How do I fix Telegram error 403?
1. Give users a deep link or a button that opens the bot; the Telegram link generator builds t.me links with a start payload. 2. Only send private messages to users with a recorded /start (or any inbound message) for this specific bot. 3. In groups, reply in the group or prompt the user to open the bot privately. 4. Mark the user as not opted-in when you see this error, and stop retrying; the state only changes when they message the bot.
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.