logo

Sending Inline Menus with Messages -Message-bound Menu

Attaches a menu to one specific message. It renders beneath the message bubble and belongs to that message alone.
πŸ’‘ If you send both inline_menu and menu_ref, inline_menu wins.

How to attach one

Add one of these to any outgoing message:
Field
Type
What it does
inline_menu
Array of Menu
Defines the menu right there in the message. Not reusable.
menu_ref
String
References an existing menu by its menu_id, provisioned earlier with setChatMenu.
Unlike a keypad menu, a message-bound menu does not persist across the chat.

Response

messageAck

The normal message acknowledgement. Presses on the menu arrive later as menuCallback with "source": "inline".

SDKs

All three SDKs take the menu as raw JSON, so build it as a JSON array rather than with DTO classes.
SDK
Field
Callback
Java
outmsg.setInlineMenu(JSONArray) / outmsg.setMenuRef(String)
onMessagAckCallback(MessageAck msgAck)
JavaScript
outmsg.inline_menu / outmsg.menu_ref
onMessagAckCallback(msgAck)
Python
out_msg.inline_menus / out_msg.menu_ref β€” note the plural property; it serialises to inline_menu
on_message_ack_callback(self, msg_ack)

Example

Request

json
{ "method": "sendMessage", "chat_id": "90090684438172188", "app_id": "90090684293000559", "reference": 987654321, "text": "Hello world!", "inline_menu": [ { "menu_id": "PBw7HmDu5FAWjFm", "cat": "menu", "menu_name": "First Menu", "menu_group": "TgKB8yDHKv4ZBOc", "menu_version": "04oTrLih73KeqCke", "menu_order": 0, "api_id": "90091783822039252", "rows": [ { "row_id": "r_bMCvsAZ5ZVkMx2C", "row_order": 0, "menu_id": "PBw7HmDu5FAWjFm", "row_version": "FoLSTFJYg48eXrDp", "cells": [ { "cell_id": "b_BKwMwhIVbBFw634", "form": "button", "style": "filled", "cell_order": 0, "version": "7fOkiEWlDadvyOIE", "callback": "b_BKwMwhIVbBFw634", "label": "Save" }, { "cell_id": "b_b2ZRG1YmHStEPo5", "form": "button", "style": "tonal", "cell_order": 1, "version": "Gk4E9kpy4KG1yDij", "callback": "b_b2ZRG1YmHStEPo5", "label": "Delete" } ] }, { "row_id": "r_DAetbJyRzpFUwSI", "row_order": 1, "menu_id": "PBw7HmDu5FAWjFm", "row_version": "QU6FfL9gyHSAiw8m", "cells": [ { "cell_id": "b_oScCagIGQmaHjNQ", "form": "button", "style": "outlined", "cell_order": 0, "version": "dl609ppkJkkfRdUL", "callback": "b_oScCagIGQmaHjNQ", "label": "Cancel" } ] } ] } ] }
java
String menuJson = "[ ... the inline_menu array shown above ... ]"; JSONArray inlineMenu = (JSONArray) new JSONParser(-1).parse(menuJson); TextOutMessage outmsg = new TextOutMessage(); outmsg.setChatId("90090684438172188"); outmsg.setApp_id("90090684293000559"); outmsg.setReference("987654321"); outmsg.setText("Hello world!"); outmsg.setEcho(1); outmsg.setInlineMenu(inlineMenu); api.send(outmsg);
javascript
const inlineMenu = JSON.parse("[ ... the inline_menu array shown above ... ]"); let outmsg = new TextOutMessage(); outmsg.chat_id = "90090684438172188"; outmsg.appId = "90090684293000559"; outmsg.reference = "987654321"; outmsg.text = "Hello world!"; outmsg.echo = 1; outmsg.inline_menu = inlineMenu; api.send(JSON.stringify(outmsg.toJsonObject()));
python
import json inline_menu = json.loads("[ ... the inline_menu array shown above ... ]") out_msg = TextOutMessage() out_msg.chat_id = "90090684438172188" out_msg.app_id = "90090684293000559" out_msg.reference = "987654321" out_msg.text = "Hello world!" out_msg.echo = 1 out_msg.inline_menus = inline_menu obj, _ = out_msg.to_json_obj() napi.send(obj)
To reference a menu you already provisioned, drop inline_menu and send "menu_ref": "PBw7HmDu5FAWjFm" instead.

Response

json
{ "method": "messageAck", "ack": { "reference": 987654321, "message_id": "d1_jzsailTx126848", "date": 1744200040098, "gmid": 52 } }