Interactive Messages
Send messages with interactive elements such as quick-reply buttons and scrollable list menus. These provide a guided experience for your customers.
Reply Buttons
POST
/api/messages/reply-buttons
Send a message with up to 3 quick-reply buttons. Each button has a unique ID and a title (max 20 characters).
| Field | Type | Required | Description |
|---|---|---|---|
to | string | Yes | Recipient phone number with country code |
bodyText | string | Yes | Main message body (max 1,024 chars) |
buttons | array | Yes | Array of 1-3 button objects |
buttons[].id | string | Yes | Unique button identifier (max 256 chars) |
buttons[].title | string | Yes | Button label shown to user (max 20 chars) |
headerText | string | No | Header text (max 60 chars) |
footerText | string | No | Footer text (max 60 chars) |
phoneNumberId | string | No | Send from a specific number |
Example
{
"to": "15551234567",
"headerText": "Appointment Confirmation",
"bodyText": "Would you like to confirm your appointment for tomorrow at 2:00 PM?",
"footerText": "Please select an option",
"buttons": [
{ "id": "btn_yes", "title": "Yes, confirm" },
{ "id": "btn_no", "title": "No, cancel" },
{ "id": "btn_reschedule", "title": "Reschedule" }
]
}JSON
C# Example
var payload = new
{
to = "15551234567",
headerText = "Appointment Confirmation",
bodyText = "Would you like to confirm your appointment?",
footerText = "Please select an option",
buttons = new[]
{
new { id = "btn_yes", title = "Yes, confirm" },
new { id = "btn_no", title = "No, cancel" },
new { id = "btn_reschedule", title = "Reschedule" }
}
};
var json = JsonSerializer.Serialize(payload);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync(
"https://app.waconnect.me/api/messages/reply-buttons", content);C#
List Messages
POST
/api/messages/list
Send a message with a scrollable list menu containing up to 10 items organized into sections. The user taps a button to open the list.
| Field | Type | Required | Description |
|---|---|---|---|
to | string | Yes | Recipient phone number with country code |
bodyText | string | Yes | Main message body |
buttonText | string | Yes | Text on the button that opens the list (max 20 chars) |
sections | array | Yes | Array of section objects |
sections[].title | string | Yes | Section heading |
sections[].rows | array | Yes | Array of row items in this section |
sections[].rows[].id | string | Yes | Unique row identifier |
sections[].rows[].title | string | Yes | Row title (max 24 chars) |
sections[].rows[].description | string | No | Row description (max 72 chars) |
headerText | string | No | Header text |
footerText | string | No | Footer text |
phoneNumberId | string | No | Send from a specific number |
Example
{
"to": "15551234567",
"headerText": "Service Menu",
"bodyText": "Please select a service from the menu below:",
"buttonText": "View Services",
"sections": [
{
"title": "Consulting",
"rows": [
{ "id": "svc_1", "title": "Strategy", "description": "Business strategy session" },
{ "id": "svc_2", "title": "Technical", "description": "Architecture review" }
]
},
{
"title": "Support",
"rows": [
{ "id": "svc_3", "title": "General Help", "description": "Get help with any issue" },
{ "id": "svc_4", "title": "Billing", "description": "Payment and invoice questions" }
]
}
]
}JSON
ⓘ
When a user selects a button or list item, their response is delivered to your webhook as an interactive message type containing the selected id and title.