Enviar contacto
curl --request POST \
--url https://api.omni.z-api.io/v1/channels/{channelId}/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"recipient": {
"identifier": "5511999999999"
},
"content": {
"type": "CONTACT",
"attachments": [
{
"name": "Gutemberg Fernandes",
"phones": [
"5511888888888"
]
}
]
}
}
'import requests
url = "https://api.omni.z-api.io/v1/channels/{channelId}/messages"
payload = {
"recipient": { "identifier": "5511999999999" },
"content": {
"type": "CONTACT",
"attachments": [
{
"name": "Gutemberg Fernandes",
"phones": ["5511888888888"]
}
]
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
recipient: {identifier: '5511999999999'},
content: {
type: 'CONTACT',
attachments: [{name: 'Gutemberg Fernandes', phones: ['5511888888888']}]
}
})
};
fetch('https://api.omni.z-api.io/v1/channels/{channelId}/messages', 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.omni.z-api.io/v1/channels/{channelId}/messages",
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([
'recipient' => [
'identifier' => '5511999999999'
],
'content' => [
'type' => 'CONTACT',
'attachments' => [
[
'name' => 'Gutemberg Fernandes',
'phones' => [
'5511888888888'
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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.omni.z-api.io/v1/channels/{channelId}/messages"
payload := strings.NewReader("{\n \"recipient\": {\n \"identifier\": \"5511999999999\"\n },\n \"content\": {\n \"type\": \"CONTACT\",\n \"attachments\": [\n {\n \"name\": \"Gutemberg Fernandes\",\n \"phones\": [\n \"5511888888888\"\n ]\n }\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.omni.z-api.io/v1/channels/{channelId}/messages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"recipient\": {\n \"identifier\": \"5511999999999\"\n },\n \"content\": {\n \"type\": \"CONTACT\",\n \"attachments\": [\n {\n \"name\": \"Gutemberg Fernandes\",\n \"phones\": [\n \"5511888888888\"\n ]\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.omni.z-api.io/v1/channels/{channelId}/messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"recipient\": {\n \"identifier\": \"5511999999999\"\n },\n \"content\": {\n \"type\": \"CONTACT\",\n \"attachments\": [\n {\n \"name\": \"Gutemberg Fernandes\",\n \"phones\": [\n \"5511888888888\"\n ]\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"messageId": "01A0C92D0C957FE98B73C8BA0CACF741"
}{
"error": 401,
"message": "Unauthorized"
}{
"timestamp": "2026-10-22T14:00:00.123Z",
"code": "BUSINESS_RULE_VIOLATION",
"subCode": "CHANNEL_DISCONNECTED",
"message": "Channel is disconnected"
}Mensajes
Enviar contacto
Envía contactos por WhatsApp
POST
/
v1
/
channels
/
{channelId}
/
messages
Enviar contacto
curl --request POST \
--url https://api.omni.z-api.io/v1/channels/{channelId}/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"recipient": {
"identifier": "5511999999999"
},
"content": {
"type": "CONTACT",
"attachments": [
{
"name": "Gutemberg Fernandes",
"phones": [
"5511888888888"
]
}
]
}
}
'import requests
url = "https://api.omni.z-api.io/v1/channels/{channelId}/messages"
payload = {
"recipient": { "identifier": "5511999999999" },
"content": {
"type": "CONTACT",
"attachments": [
{
"name": "Gutemberg Fernandes",
"phones": ["5511888888888"]
}
]
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
recipient: {identifier: '5511999999999'},
content: {
type: 'CONTACT',
attachments: [{name: 'Gutemberg Fernandes', phones: ['5511888888888']}]
}
})
};
fetch('https://api.omni.z-api.io/v1/channels/{channelId}/messages', 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.omni.z-api.io/v1/channels/{channelId}/messages",
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([
'recipient' => [
'identifier' => '5511999999999'
],
'content' => [
'type' => 'CONTACT',
'attachments' => [
[
'name' => 'Gutemberg Fernandes',
'phones' => [
'5511888888888'
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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.omni.z-api.io/v1/channels/{channelId}/messages"
payload := strings.NewReader("{\n \"recipient\": {\n \"identifier\": \"5511999999999\"\n },\n \"content\": {\n \"type\": \"CONTACT\",\n \"attachments\": [\n {\n \"name\": \"Gutemberg Fernandes\",\n \"phones\": [\n \"5511888888888\"\n ]\n }\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.omni.z-api.io/v1/channels/{channelId}/messages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"recipient\": {\n \"identifier\": \"5511999999999\"\n },\n \"content\": {\n \"type\": \"CONTACT\",\n \"attachments\": [\n {\n \"name\": \"Gutemberg Fernandes\",\n \"phones\": [\n \"5511888888888\"\n ]\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.omni.z-api.io/v1/channels/{channelId}/messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"recipient\": {\n \"identifier\": \"5511999999999\"\n },\n \"content\": {\n \"type\": \"CONTACT\",\n \"attachments\": [\n {\n \"name\": \"Gutemberg Fernandes\",\n \"phones\": [\n \"5511888888888\"\n ]\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"messageId": "01A0C92D0C957FE98B73C8BA0CACF741"
}{
"error": 401,
"message": "Unauthorized"
}{
"timestamp": "2026-10-22T14:00:00.123Z",
"code": "BUSINESS_RULE_VIOLATION",
"subCode": "CHANNEL_DISCONNECTED",
"message": "Channel is disconnected"
}En implementación. Hoy solo funciona un contacto por mensaje:
attachments acepta una lista, pero del segundo ítem en adelante no se envía nada.Además solo llevamos name y phones. Meta acepta hasta 257 contactos en un mismo envío, y en cada uno también correo, dirección, organización, cumpleaños y sitio web.Estamos ampliando el endpoint. Hasta entonces, manda un contacto por petición.Conceptos
Envía un contacto a un destinatario. El campocontent.type debe ser CONTACT. Puedes enviar varios teléfonos en el array phones.
Detalles de la regla de Meta Cloud API en ventana de conversación. Consulta qué acepta cada canal para todos los canales.
Con el canal desconectado, la API rechaza el envío con
422 y subCode CHANNEL_DISCONNECTED, y el mensaje no se envía. Consulta Errores al enviar.Autorizaciones
Secret Key generada en el panel de Seguridad de Omni Z-API
Parámetros de ruta
ID del canal
Ejemplo:
"SU_CHANNEL_ID"
Cuerpo
application/json
Respuesta
Mensaje enviado correctamente
ID del mensaje enviado — hexadecimal de 32 caracteres en mayúsculas