If you are porting from Telegram, read this first. The path shape is familiar but several behaviors differ. Status is authoritative at core.mp.net/bots.
Overview
The MPChat Bot API mirrors Telegram-style methods but is not a full replica. These are the differences that break naive ports.
file_id is not reusable
A previously sent media file_id cannot be reused. sendPhoto, sendVideo, sendDocument, and setChatPhoto accept a public URL or multipart upload. When migrating, switch to URLs or your own storage.
banChatMember mutes, does not kick
banChatMember sets the member to restricted (muted) without removing them. until_date=0 or omitted means permanent until unbanChatMember. Risk L3, DocOnly.
Bots cannot start conversations
A user must establish context first. Sending to a chat_id with no conversation may return 400. Flow: user messages → getUpdates reads chat_id → sendMessage.
sendMessage buttons and MiniApp
sendMessage is an MP difference: reply_markup supports inline url / web_app / callback_data / copy_text and Reply Keyboard. Message callbacks use answerCallbackQuery. MiniApp client return flows (web_app_data / sendData / answerWebAppQuery) are still not available.
Quick reference
Topic | Telegram expectation | MP today |
Media reuse | file_id reusable | Not supported; URL / multipart |
Ban member | Kicks from chat | Mutes, stays in chat |
Proactive DM | Possible in some cases | User must establish context |
Message callback buttons | callback_data + answerCallbackQuery | Supported (300s window; no url/cache_time) |
sendMessage MiniApp open | Full MiniApp return flows | web_app opens MiniApp; also url / copy_text |
MiniApp client return | web_app_data / sendData / answerWebAppQuery | Not supported |
Menu button vs Reply Keyboard | Independent left / right controls | Same; setChatMenuButton never drives Reply Keyboard |
sendPoll / sendLocation / sendChatAction | Available | HTTP 501 |
Why does an existing private chat return HTTP 403?
If the user blocks the bot, sending, forwarding, or copying a message into that private chat returns HTTP 403. Skip retries for this error. The bot can send new messages after the user unblocks it. Blocked messages are not resent automatically.
Why does the MiniApp button work only in private chat?
Ordinary
web_appbuttons are private-chat only. For MiniApp sharing in a group or supergroup the bot has joined, thesendMessageinline keyboard must have exactly one row and one button containing onlytextandweb_app. Check that the URL belongs to an enabled MiniApp owned by this bot.
Why did the keyboard or media caption disappear after an edit?
Composite message edits clear the inline keyboard or media caption when the corresponding field is omitted. To preserve either field, include its current value in the edit. Use the dedicated edit method when updating only the keyboard or only the caption.
Related
Many Telegram methods are simply not exposed by MP. Confirm availability in the method matrix before depending on a method.
