logo
Edits a message you already sent. The updated message comes back with "status": "updated".
💡 Send only the field matching the message's type — text for a text message, caption for 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
articleurl
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" }
java
api.updateMessage(messageId, text, caption, toUserId, chatId, appId);
javascript
api.updateMessage(messageId, text, caption, toUserId, chatId, appId);
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)

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" } } }