Send action buttons
curl --request POST \
--url https://api.z-api.io/instances/{instanceId}/token/{token}/send-button-actions \
--header 'Client-Token: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"phone": "<string>",
"message": "<string>",
"buttonActions": [
{
"id": "<string>",
"type": "<string>",
"label": "<string>",
"phone": "<string>",
"url": "<string>"
}
]
}
'import requests
url = "https://api.z-api.io/instances/{instanceId}/token/{token}/send-button-actions"
payload = {
"phone": "<string>",
"message": "<string>",
"buttonActions": [
{
"id": "<string>",
"type": "<string>",
"label": "<string>",
"phone": "<string>",
"url": "<string>"
}
]
}
headers = {
"Client-Token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Client-Token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
phone: '<string>',
message: '<string>',
buttonActions: [
{
id: '<string>',
type: '<string>',
label: '<string>',
phone: '<string>',
url: '<string>'
}
]
})
};
fetch('https://api.z-api.io/instances/{instanceId}/token/{token}/send-button-actions', 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.z-api.io/instances/{instanceId}/token/{token}/send-button-actions",
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([
'phone' => '<string>',
'message' => '<string>',
'buttonActions' => [
[
'id' => '<string>',
'type' => '<string>',
'label' => '<string>',
'phone' => '<string>',
'url' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Client-Token: <api-key>",
"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.z-api.io/instances/{instanceId}/token/{token}/send-button-actions"
payload := strings.NewReader("{\n \"phone\": \"<string>\",\n \"message\": \"<string>\",\n \"buttonActions\": [\n {\n \"id\": \"<string>\",\n \"type\": \"<string>\",\n \"label\": \"<string>\",\n \"phone\": \"<string>\",\n \"url\": \"<string>\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Client-Token", "<api-key>")
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.z-api.io/instances/{instanceId}/token/{token}/send-button-actions")
.header("Client-Token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"phone\": \"<string>\",\n \"message\": \"<string>\",\n \"buttonActions\": [\n {\n \"id\": \"<string>\",\n \"type\": \"<string>\",\n \"label\": \"<string>\",\n \"phone\": \"<string>\",\n \"url\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.z-api.io/instances/{instanceId}/token/{token}/send-button-actions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Client-Token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"phone\": \"<string>\",\n \"message\": \"<string>\",\n \"buttonActions\": [\n {\n \"id\": \"<string>\",\n \"type\": \"<string>\",\n \"label\": \"<string>\",\n \"phone\": \"<string>\",\n \"url\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_bodyMessages
Send action buttons
Send a message with action buttons (link, call or reply)
POST
/
instances
/
{instanceId}
/
token
/
{token}
/
send-button-actions
Send action buttons
curl --request POST \
--url https://api.z-api.io/instances/{instanceId}/token/{token}/send-button-actions \
--header 'Client-Token: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"phone": "<string>",
"message": "<string>",
"buttonActions": [
{
"id": "<string>",
"type": "<string>",
"label": "<string>",
"phone": "<string>",
"url": "<string>"
}
]
}
'import requests
url = "https://api.z-api.io/instances/{instanceId}/token/{token}/send-button-actions"
payload = {
"phone": "<string>",
"message": "<string>",
"buttonActions": [
{
"id": "<string>",
"type": "<string>",
"label": "<string>",
"phone": "<string>",
"url": "<string>"
}
]
}
headers = {
"Client-Token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Client-Token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
phone: '<string>',
message: '<string>',
buttonActions: [
{
id: '<string>',
type: '<string>',
label: '<string>',
phone: '<string>',
url: '<string>'
}
]
})
};
fetch('https://api.z-api.io/instances/{instanceId}/token/{token}/send-button-actions', 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.z-api.io/instances/{instanceId}/token/{token}/send-button-actions",
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([
'phone' => '<string>',
'message' => '<string>',
'buttonActions' => [
[
'id' => '<string>',
'type' => '<string>',
'label' => '<string>',
'phone' => '<string>',
'url' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Client-Token: <api-key>",
"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.z-api.io/instances/{instanceId}/token/{token}/send-button-actions"
payload := strings.NewReader("{\n \"phone\": \"<string>\",\n \"message\": \"<string>\",\n \"buttonActions\": [\n {\n \"id\": \"<string>\",\n \"type\": \"<string>\",\n \"label\": \"<string>\",\n \"phone\": \"<string>\",\n \"url\": \"<string>\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Client-Token", "<api-key>")
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.z-api.io/instances/{instanceId}/token/{token}/send-button-actions")
.header("Client-Token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"phone\": \"<string>\",\n \"message\": \"<string>\",\n \"buttonActions\": [\n {\n \"id\": \"<string>\",\n \"type\": \"<string>\",\n \"label\": \"<string>\",\n \"phone\": \"<string>\",\n \"url\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.z-api.io/instances/{instanceId}/token/{token}/send-button-actions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Client-Token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"phone\": \"<string>\",\n \"message\": \"<string>\",\n \"buttonActions\": [\n {\n \"id\": \"<string>\",\n \"type\": \"<string>\",\n \"label\": \"<string>\",\n \"phone\": \"<string>\",\n \"url\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_bodyOverview
With this method you can send text messages with action buttons that redirect to links, initiate calls, or provide standard responses.Button sending is currently available, but there are some decisive factors for it to work. Check the button status topic for more information.
ATTENTIONSending all three button types simultaneously causes an error on WhatsApp Web. Combine CALL and URL buttons together, and send REPLY buttons separately.
Example on WhatsApp

Attributes
Header
string
required
Your instance ID. Available in the Z-API panel under Instances.
string
required
Your Z-API instance token.
Required
string
required
Recipient’s phone number (or group ID for group messages) in DDI DDD NUMBER format. E.g.: 551199999999
string
required
Message text
array
required
Array of action buttons
Show Properties
Show Properties
string
Button identifier
string
required
Button type:
CALL, URL or REPLYstring
required
Text displayed on the button
string
Phone number (required for CALL type)
string
Link URL (required for URL type, must start with http:// or https://).Tip: WhatsApp has a specific link for copying text. By passing this link in the
url attribute, your button becomes a copy button: https://www.whatsapp.com/otp/code/?otp_type=COPY_CODE&code=otpyourcodeOptional
string
Message title
string
Message footer
string
Image link or Base64
Request Body
CALL and URL buttons (together):{
"phone": "551199999999",
"message": "a message",
"title": "if you want to add a title",
"footer": "if you want to add a footer",
"image": "https://app.z-api.io/logos/zapi-dark.png",
"buttonActions": [
{
"id": "1",
"type": "CALL",
"phone": "554498398733",
"label": "Contact us"
},
{
"id": "2",
"type": "URL",
"url": "https://z-api.io",
"label": "Visit our website"
}
]
}
{
"phone": "551199999999",
"message": "a message",
"title": "if you want to add a title",
"footer": "if you want to add a footer",
"image": "https://app.z-api.io/logos/zapi-dark.png",
"buttonActions": [
{
"id": "3",
"type": "REPLY",
"label": "Talk to an agent"
}
]
}
Response
200
{
"zaapId": "3999984263738042930CD6ECDE9VDWSA",
"messageId": "D241XXXX732339502B68",
"id": "D241XXXX732339502B68"
}
405
Make sure you are correctly sending the method specification, that is, verify that you sent POST or GET as specified at the beginning of this topic.415
If you receive a 415 error, make sure to add the “Content-Type” header to your request, which in most cases is “application/json”.⌘I