Edits a message you already sent. The updated message comes back with
"status": "updated".💡 Send only the field matching the message's type —textfor a text message,captionfor media. You cannot change a message from one type to another.
Request
method is "updateMessage".Field | Type | Required | Description |
message_id | String | Yes | The message you want to edit. |
chat_id | String | Yes | The chat or user the message is in. |
app_id | String | Yes | The app the message belongs to. |
reference | Long | Yes | Your local id for this request. Echoed back in messageAck. |
text | String | Conditional | New body — for text messages only. |
caption | String | Conditional | New caption — for any media message (photo, video, audio, document…). |
menu_ref | String | Optional | Swap the attached menu. Set to an empty string to remove the inline menu. |
inline_menu | Array of Menu | Optional | Replace the attached menu inline. Wins over menu_ref unless menu_ref is an empty string. |
Replacing media
To swap the media itself, send the field matching the original type. Each takes the same shape it had when the message was sent.
Field | Use when the message type is |
photo · gif · video · audio · voice · document | The matching media type |
text_file | text_file |
sticker | sticker |
location | location |
contact | contact |
article • url | article — must be a nandbox article |
Preconditions
Requirement | Needed for |
"Update Message" permission | Editing any message. |
Chat type | Your API must be |
--- | --- |
User chat | Started by the user, and the original sender of the message |
Group | An admin |
Channel | An admin |
Response
When | Method | What it tells you |
Always | messageAck | The edit was accepted. Carries "status": "updated". |
Always | message | The message as it now stands, also carrying "status": "updated". |
SDKs
SDK | Call | Callback |
Java | api.updateMessage(messageId, text, caption, toUserId, chatId, appId); | onMessagAckCallback(MessageAck msgAck) |
JavaScript | api.updateMessage(messageId, text, caption, toUserId, chatId, appId); | onMessagAckCallback(msgAck) |
Python | napi.update_message(message_id=message_id, text=text, caption=caption, to_user_id=to_user_id, chat_id=chat_id, app_id=app_id) | on_message_ack_callback(self, msg_ack) |
There are shorthands for the common cases:
Goal | Java / JavaScript | Python |
Edit text in a user chat | api.updateTextMsg(messageId, text, toUserId, appId) | napi.update_text_msg(...) |
Edit a caption in a user chat | api.updateMediaCaption(messageId, caption, toUserId, appId) | napi.update_media_caption(...) |
Edit text in a group or channel | api.updateChatMsg(messageId, text, chatId, appId) | napi.update_chat_msg(...) |
Edit a caption in a group or channel | api.updateChatMediaCaption(messageId, caption, chatId, appId) | napi.update_chat_media_caption(...) |
Example
Request
json{ "method": "updateMessage", "message_id": "d1_cdbTJTTV126179", "chat_id": "90090684438172188", "text": "Hello World!", "reference": 111111171, "app_id": "90090684293000559" }
javaapi.updateMessage(messageId, text, caption, toUserId, chatId, appId);
javascriptapi.updateMessage(messageId, text, caption, toUserId, chatId, appId);
pythonnapi.update_message(message_id=message_id, text=text, caption=caption, to_user_id=to_user_id, chat_id=chat_id, app_id=app_id)
Response
json{ "method": "messageAck", "ack": { "message_id": "d1_cdbTJTTV126179", "reference": 111111171, "date": 1742649824308, "gmid": 41, "status": "updated" } }
json{ "method": "message", "app_id": 90090684293000559, "message": { "message_id": "d1_cdbTJTTV126179", "reference": 111111171, "date": 1742649824308, "gmid": "41", "type": "text", "text": "Hello World!", "status": "updated", "from_admin": 1, "chat": { "id": "90090684438172188", "title": "New Chat", "type": "Group" }, "from": { "id": "90091783822039252", "name": "My First API", "type": "Bot", "terminal": "API" } } }