Messaging
Send list
Send an interactive list message with multiple sections and rows
POST
/
message
/
sendList
/
:instanceName
Send list
curl --request POST \
--url https://api.example.com/message/sendList/:instanceName \
--header 'Content-Type: application/json' \
--data '
{
"number": "<string>",
"title": "<string>",
"description": "<string>",
"buttonText": "<string>",
"footerText": "<string>",
"sections": [
{
"title": "<string>",
"rows": [
{
"title": "<string>",
"description": "<string>",
"rowId": "<string>"
}
]
}
],
"delay": 123
}
'import requests
url = "https://api.example.com/message/sendList/:instanceName"
payload = {
"number": "<string>",
"title": "<string>",
"description": "<string>",
"buttonText": "<string>",
"footerText": "<string>",
"sections": [
{
"title": "<string>",
"rows": [
{
"title": "<string>",
"description": "<string>",
"rowId": "<string>"
}
]
}
],
"delay": 123
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
number: '<string>',
title: '<string>',
description: '<string>',
buttonText: '<string>',
footerText: '<string>',
sections: [
{
title: '<string>',
rows: [{title: '<string>', description: '<string>', rowId: '<string>'}]
}
],
delay: 123
})
};
fetch('https://api.example.com/message/sendList/:instanceName', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/message/sendList/:instanceName",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'number' => '<string>',
'title' => '<string>',
'description' => '<string>',
'buttonText' => '<string>',
'footerText' => '<string>',
'sections' => [
[
'title' => '<string>',
'rows' => [
[
'title' => '<string>',
'description' => '<string>',
'rowId' => '<string>'
]
]
]
],
'delay' => 123
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/message/sendList/:instanceName"
payload := strings.NewReader("{\n \"number\": \"<string>\",\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"buttonText\": \"<string>\",\n \"footerText\": \"<string>\",\n \"sections\": [\n {\n \"title\": \"<string>\",\n \"rows\": [\n {\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"rowId\": \"<string>\"\n }\n ]\n }\n ],\n \"delay\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/message/sendList/:instanceName")
.header("Content-Type", "application/json")
.body("{\n \"number\": \"<string>\",\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"buttonText\": \"<string>\",\n \"footerText\": \"<string>\",\n \"sections\": [\n {\n \"title\": \"<string>\",\n \"rows\": [\n {\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"rowId\": \"<string>\"\n }\n ]\n }\n ],\n \"delay\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/message/sendList/:instanceName")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"number\": \"<string>\",\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"buttonText\": \"<string>\",\n \"footerText\": \"<string>\",\n \"sections\": [\n {\n \"title\": \"<string>\",\n \"rows\": [\n {\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"rowId\": \"<string>\"\n }\n ]\n }\n ],\n \"delay\": 123\n}"
response = http.request(request)
puts response.read_body{
"key": {},
"message": {}
}Request
Send a message with an interactive list that users can open to see multiple options organized in sections.string
required
Name of the instance
Body parameters
string
required
Recipient’s WhatsApp number with country code (e.g., “5511999999999”)
string
required
Main title text of the message
string
Description text shown in the message body
string
required
Text displayed on the button that opens the list
string
Footer text displayed at the bottom
array
required
number
Delay in milliseconds before sending
Response
object
Message key information
object
List message details
Example request
curl -X POST https://your-api.com/message/sendList/my-instance \
-H "apikey: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"number": "5511999999999",
"title": "Product Catalog",
"description": "Choose a product category",
"buttonText": "View Products",
"footerText": "Evolution API Store",
"sections": [
{
"title": "Electronics",
"rows": [
{
"title": "Smartphone",
"description": "Latest model smartphones",
"rowId": "product-smartphone"
},
{
"title": "Laptop",
"description": "High-performance laptops",
"rowId": "product-laptop"
}
]
},
{
"title": "Accessories",
"rows": [
{
"title": "Headphones",
"description": "Wireless and wired options",
"rowId": "product-headphones"
}
]
}
]
}'
const response = await fetch('https://your-api.com/message/sendList/my-instance', {
method: 'POST',
headers: {
'apikey': 'YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
number: '5511999999999',
title: 'Product Catalog',
description: 'Choose a product category',
buttonText: 'View Products',
footerText: 'Evolution API Store',
sections: [
{
title: 'Electronics',
rows: [
{ title: 'Smartphone', description: 'Latest model smartphones', rowId: 'product-smartphone' },
{ title: 'Laptop', description: 'High-performance laptops', rowId: 'product-laptop' }
]
},
{
title: 'Accessories',
rows: [
{ title: 'Headphones', description: 'Wireless and wired options', rowId: 'product-headphones' }
]
}
]
})
});
const data = await response.json();
console.log(data);
Notes
- List messages can contain multiple sections
- Each section can have multiple rows (up to 10 rows per section recommended)
- Use the
rowIdto identify which option was selected in webhook events - The list appears as a menu when the user taps the button
Lists are ideal for:
- Product catalogs
- Service menus
- FAQ categories
- Navigation menus
List messages are only supported on WhatsApp versions that support interactive messages. Older clients may not render the list properly.
⌘I
Send list
curl --request POST \
--url https://api.example.com/message/sendList/:instanceName \
--header 'Content-Type: application/json' \
--data '
{
"number": "<string>",
"title": "<string>",
"description": "<string>",
"buttonText": "<string>",
"footerText": "<string>",
"sections": [
{
"title": "<string>",
"rows": [
{
"title": "<string>",
"description": "<string>",
"rowId": "<string>"
}
]
}
],
"delay": 123
}
'import requests
url = "https://api.example.com/message/sendList/:instanceName"
payload = {
"number": "<string>",
"title": "<string>",
"description": "<string>",
"buttonText": "<string>",
"footerText": "<string>",
"sections": [
{
"title": "<string>",
"rows": [
{
"title": "<string>",
"description": "<string>",
"rowId": "<string>"
}
]
}
],
"delay": 123
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
number: '<string>',
title: '<string>',
description: '<string>',
buttonText: '<string>',
footerText: '<string>',
sections: [
{
title: '<string>',
rows: [{title: '<string>', description: '<string>', rowId: '<string>'}]
}
],
delay: 123
})
};
fetch('https://api.example.com/message/sendList/:instanceName', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/message/sendList/:instanceName",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'number' => '<string>',
'title' => '<string>',
'description' => '<string>',
'buttonText' => '<string>',
'footerText' => '<string>',
'sections' => [
[
'title' => '<string>',
'rows' => [
[
'title' => '<string>',
'description' => '<string>',
'rowId' => '<string>'
]
]
]
],
'delay' => 123
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/message/sendList/:instanceName"
payload := strings.NewReader("{\n \"number\": \"<string>\",\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"buttonText\": \"<string>\",\n \"footerText\": \"<string>\",\n \"sections\": [\n {\n \"title\": \"<string>\",\n \"rows\": [\n {\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"rowId\": \"<string>\"\n }\n ]\n }\n ],\n \"delay\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/message/sendList/:instanceName")
.header("Content-Type", "application/json")
.body("{\n \"number\": \"<string>\",\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"buttonText\": \"<string>\",\n \"footerText\": \"<string>\",\n \"sections\": [\n {\n \"title\": \"<string>\",\n \"rows\": [\n {\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"rowId\": \"<string>\"\n }\n ]\n }\n ],\n \"delay\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/message/sendList/:instanceName")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"number\": \"<string>\",\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"buttonText\": \"<string>\",\n \"footerText\": \"<string>\",\n \"sections\": [\n {\n \"title\": \"<string>\",\n \"rows\": [\n {\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"rowId\": \"<string>\"\n }\n ]\n }\n ],\n \"delay\": 123\n}"
response = http.request(request)
puts response.read_body{
"key": {},
"message": {}
}