logo

Sending Inline Menus with Messages (Message-bound Menu)

This section explains how to send an inline menu that is directly bound to a specific message. The menu appears beneath the message bubble and provides users with contextual buttons or actions related to that message.
To use this feature, include one of the following in your message payload:
  • inline_menu: A full menu object to be rendered inline
  • menu_ref: The ID of a pre-defined menu (same as menu_id) to be used as an inline menu
βœ… If both inline_menu and menu_ref are provided, the inline_menu takes precedence.
This form of menu is message-specific and will not persist globally like chat keypads.

SDK Mapping β€” sendInlineMenu

SDK
Request Method
Response Callback
Java
TextOutMessage outmsg = new TextOutMessage(); outmsg.setChatId(chatId); outmsg.setReference(reference); outmsg.setEcho(1); outmsg.setText(text); JSONParser parser = new JSONParser(-1); String menuJsonString= "MENU JSON"; outmsg.setMenuRef(menuRef); JSONArray menuJson=(JSONArray) parser,parse(menuJsonString); outmsg.setInlineMenu(menuJson); outmsg.setApp_id(appId); api.send(outmsg);
onMessagAckCallback(MessageAck msgAck)
JavaScript
let outmsg = new TextOutMessage(); outmsg.setChatId(chatId); outmsg.setReference(reference); outmsg.setEcho(1); outmsg.setText(text); let menuJsonString = "MENU JSON"; let inlineMenu = JSON.parse(menuJsonString); outmsg.inline_menu = inlineMenu; outmsg.appId = appId; api.send(outmsg);
onMessagAckCallback(msgAck)
Python
out_msg = TextOutMessage() out_msg.chat_id=chat_id out_msg.reference=reference out_msg.echo=1 out_msg.text=text menu_json_string = "MENU JSON" decoder = json.JSONDecoder() inline_menu, _ = decoder.raw_decode(menu_json_string) out_msg.inline_menus= inline_menus out_msg.app_id=app_id napi.send(out_msg)
on_message_ack_callback(self, msg_ack)

Examples: Sending a Text Message with a Referenced Inline Menu

json
{ "method": "sendMessage", "chat_id": "90090684438172188", "reference": 987654321, "app_id": "90090684293000559", "text": "Hello world!", "menu_ref": "PBw7HmDu5FAWjFm", "inline_menu": [ { "menu_id": "PBw7HmDu5FAWjFm", "cat": "menu", "menu_name": "First Menu", "menu_group": "TgKB8yDHKv4ZBOc", "menu_version": "04oTrLih73KeqCke", "menu_order": 0, "rows": [ { "row_id": "r_bMCvsAZ5ZVkMx2C", "row_order": 0, "menu_id": "PBw7HmDu5FAWjFm", "cells": [ { "cell_id": "b_BKwMwhIVbBFw634", "form": "button", "style": "filled", "cell_order": 1, "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_version": "FoLSTFJYg48eXrDp" }, { "row_id": "r_DAetbJyRzpFUwSI", "row_order": 1, "menu_id": "PBw7HmDu5FAWjFm", "cells": [ { "cell_id": "b_oScCagIGQmaHjNQ", "form": "button", "style": "outlined", "cell_order": 0, "version": "dl609ppkJkkfRdUL", "callback": "b_oScCagIGQmaHjNQ", "label": "Cancel" } ], "row_version": "QU6FfL9gyHSAiw8m" } ], "api_id": "90091783822039252" } ] }
java
{ TextOutMessage outmsg = new TextOutMessage(); outmsg.setChatId(chatId); outmsg.setReference(reference); outmsg.setEcho(1); String menuRef = MAIN_MENU_001; Button oneBtn = createButton("", "oneBtnCBInWebView", 1, "RED", "White", null, null); Row firstRow = new Row(); firstRow.setRowOrder(1); firstRow.setButtons(new Button[] { oneBtn }); Menu inlineMenu = new Menu(); inlineMenu.setMenuRef(menuRef); inlineMenu.setRows(new Row[] { firstRow }); outmsg.setMenuRef(menuRef); outmsg.setInlineMenu(new Menu[] { inlineMenu }); outmsg.setApp_id(appId); api.send(outmsg); }
javascript
{ let outmsg = new TextOutMessage(); outmsg.chat_id = chatId; outmsg.reference = reference; outmsg.echo = 1; let menuRef = MAIN_MENU_001; let oneBtn = createButton("", "oneBtnCBInWebView", 1, "RED", "White", null, null); oneBtn.button_icon = "ic_ball_ic_24dp"; oneBtn.button_icon_bgcolor = "#FFFF44"; let buttons = []; buttons.push(oneBtn); let rowOrder = 1; let firstRow = new Row(buttons, rowOrder); let rows = []; rows.push(firstRow); let inlineMenu = []; let firstInlineMenu = new Menu(rows, menuRef); inlineMenu.push(firstInlineMenu); outmsg.menu_ref = menuRef; outmsg.inline_menu = inlineMenu; outmsg.appId = appId; api.send(JSON.stringify(outmsg)); }
python
{ outMsg = TextOutMessage() outMsg.chat_id = chatId outMsg.reference = reference outMsg.echo = 1 oneBtn = create_button(label="Visit a Milestone", callback="oneBtnCBInWebView", order=1,bg_color="RED", txt_color="White") oneBtn.button_icon = "ic_ball_ic_24dp" oneBtn.button_icon_bgcolor = "#FFFF44" firstRow = Row() firstRow.row_order = 1 firstRow.buttons = [oneBtn] menuRef = "MAIN_MENU_001" inlineMenu = Menu() inlineMenu.menu_ref = menuRef inlineMenu.rows = [firstRow] outMsg.menu_ref = menuRef outMsg.inline_menus = [inlineMenu] outMsg.app_id=app_id napi.send(outMsg) }

Response

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