Introducción
¿A quién va dirigido?:
- Desarrolladores e ingenieros de software que integran funciones de WhatsApp en sistemas CRM, SaaS o de negocios personalizados;
- Integradores no-code y especialistas en automatización que utilizan Make, Zapier o n8n;
Casos de uso:
- Crear automáticamente grupos dedicados de soporte o de incorporación de clientes;
- Sincronizar las listas de participantes del grupo con los embudos de ventas de CRM;
- Transmitir anuncios y alertas transaccionales en chats grupales;
- Conectar chatbots interactivos a conversaciones grupales;
Requisitos previos:
- Un número de WhatsApp activo estándar (aplicación personal o comercial regular, no WABA oficial);
- Conocimientos básicos de solicitudes HTTP o acceso a una plataforma de automatización no-code;
Qué puedes hacer con Grupos de WhatsApp vía API
- Enviar mensajes a grupos: Envía actualizaciones, anuncios o recordatorios directamente a cualquier grupo.
- Crear nuevos grupos de WhatsApp: Genera grupos automáticamente según eventos como la incorporación de nuevos clientes o inscripciones a cursos.
- Agregar miembros a un grupo: Invita contactos al grupo de forma programática, sin aprobación manual.
- Promover miembros a administradores: Asigna o revoca derechos de administrador a participantes seleccionados.
- Obtener participantes del grupo: Recupera la lista completa de miembros para análisis o sincronización con el CRM.
- Detectar eventos en el grupo: Monitorea mensajes, ingresos y salidas usando webhooks.
- Conectar bots a grupos: Permite que los bots lean y respondan mensajes grupales según la lógica definida.
Por qué la API de grupos oficial de Meta no es viable para la mayoría de las empresas
| Límite de función | API oficial de WhatsApp Business | Pasarela Whapi.Cloud |
|---|---|---|
| Límite de miembros del grupo | Estritamente limitado a 8 participantes | Hasta 1024 miembros (límite estándar de WhatsApp) |
| Barrera de verificación | Requiere verificación comercial de Meta y distintivo azul (OBA) | No se requiere verificación; conecte cualquier número activo |
| Velocidad de incorporación | Días o semanas de revisión de solicitudes | Menos de dos minutos mediante un escaneo rápido de código QR |
| Estructura de costos | Cargos basados en sesiones medidas | Suscripción mensual fija y predecible |
| Multimedia y acciones | Solo mensajería de plantilla básica | Acceso completo a grupos, canales, estados y catálogos |
Cómo vincular tu WhatsApp y empezar a usar la API
- 1) Ve a tu panel y abre el Canal Predeterminado —ya está creado para ti.
- 2) En el Paso 1 verás un código QR con instrucciones.
- 3) En tu teléfono, abre WhatsApp → Configuración → Dispositivos vinculados → Vincular un dispositivo, luego escanea el código QR.
- 4) Una vez conectado, ponle un nombre a tu canal (por ejemplo, "Mi Chatbot") para identificarlo fácilmente.
- 5) Serás redirigido a la pantalla de configuración del canal, puedes omitir este paso y volver más tarde.
Cómo enviar mensajes grupales de WhatsApp vía API (con ejemplos de código)
[email protected]. Como no son visibles en las aplicaciones móviles o web estándar, deben recuperarse mediante el endpoint Get Groups antes de enviar mensajes.- 1) Primero, obtén el ID del grupo. Usa el endpoint
GET /groupspara obtener una lista de tus grupos de WhatsApp con sus identificadores únicos. Para más detalles, consulta la documentación: Get groups. - 2) Una vez que tengas el ID del grupo, puedes enviar un mensaje. Genera grupos automáticamente según eventos como la incorporación de nuevos clientes. Usa el endpoint
POST /messages/text, especificando el ID del grupo en el parámetrotoy el contenido del mensaje enbody. Para más detalles, consulta: Send text message.
Puedes obtener el ID del grupo usando el endpoint Get groups o revisando conversaciones recientes a través del endpoint chats.
- 1) Al crear un grupo, el ID aparecerá en la respuesta de la API. Más abajo mostramos cómo hacerlo;
- 2) Endpoint Get a list of groups;
- 3) Endpoint Get a list of all chats;
curl --request POST \
--url https://gate.whapi.cloud/messages/text \
--header 'accept: application/json' \
--header 'authorization: Bearer YOUR_API_TOKEN' \
--header 'content-type: application/json' \
--data '
{
"to": "[email protected]",
"body": "Hello, this message was sent via API!"
}
'
// composer require guzzlehttp/guzzle
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://gate.whapi.cloud/messages/text', [
'body' => '{"to":"[email protected]","body":"Hello, this message was sent via API!"}',
'headers' => [
'accept' => 'application/json',
'authorization' => 'Bearer YOUR_API_TOKEN',
'content-type' => 'application/json',
],
]);
echo $response->getBody();
# python -m pip install requests
import requests
url = "https://gate.whapi.cloud/messages/text"
payload = {
"to": "[email protected]",
"body": "Hello, this message was sent via API!"
}
headers = {
"accept": "application/json",
"content-type": "application/json",
"authorization": "Bearer YOUR_API_TOKEN"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
// npm install axios --save
import axios from 'axios';
const options = {
method: 'POST',
url: 'https://gate.whapi.cloud/messages/text',
headers: {
accept: 'application/json',
'content-type': 'application/json',
authorization: 'Bearer YOUR_API_TOKEN'
},
data: {to: '[email protected]', body: 'Hello, this message was sent via API!'}
};
axios
.request(options)
.then(res => console.log(res.data))
.catch(err => console.error(err));
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"to\":\"[email protected]\",\"body\":\"Hello, this message was sent via API!\"}");
Request request = new Request.Builder()
.url("https://gate.whapi.cloud/messages/text")
.post(body)
.addHeader("accept", "application/json")
.addHeader("content-type", "application/json")
.addHeader("authorization", "Bearer YOUR_API_TOKEN")
.build();
Response response = client.newCall(request).execute();
//dotnet add package RestSharp
using RestSharp;
var options = new RestClientOptions("https://gate.whapi.cloud/messages/text");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("authorization", "Bearer YOUR_API_TOKEN");
request.AddJsonBody("{\"to\":\"[email protected]\",\"body\":\"Hello, this message was sent via API!\"}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
Envío de archivos multimedia y documentos a grupos
POST /messages/image o POST /messages/document.to, una URL de archivo de acceso público directo en media y una descripción opcional en caption.// Send an image or PDF document to a WhatsApp group
const groupId = "[email protected]";
const res = await fetch('https://gate.whapi.cloud/messages/image', {
method: 'POST',
headers: {
'accept': 'application/json',
'content-type': 'application/json',
'authorization': `Bearer ${process.env.WHAPI_TOKEN}`
},
body: JSON.stringify({
to: groupId,
media: "https://whapi.cloud/assets/img/whapi/logo-text.svg",
caption: "Welcome to your automated support channel!"
})
});
const result = await res.json();
console.log("Media message sent:", result);
Cómo enviar mensajes grupales usando herramientas no-code como Make o n8n
GET https://gate.whapi.cloud/groups
POST https://gate.whapi.cloud/messages/text to: el ID del grupo.body: el contenido del mensaje
Cómo crear un grupo de WhatsApp vía API
- 1) Usa el método
POSTcon el endpointhttps://gate.whapi.cloud/groupspara crear un nuevo grupo. Proporciona el nombre del grupo en el parámetro subject e incluye al menos un número en el parámetro participants —esto es necesario para crear el grupo exitosamente. - 2) Al crearse exitosamente, la API devolverá un ID de grupo. Necesitarás este identificador para enviar mensajes al grupo.
- 3) Para enviar un mensaje al grupo, usa el método estándar de envío de mensajes. Especifica el ID del grupo en el parámetro
toy el contenido enbody.
participants para asegurar la creación exitosa.
curl --request POST \
--url https://gate.whapi.cloud/groups \
--header 'accept: application/json' \
--header 'authorization: Bearer Your_Token' \
--header 'content-type: application/json' \
--data '
{
"participants": [
"498935516106",
"4915155985667"
],
"subject": "SEO Common GmbH"
}
'
// composer require guzzlehttp/guzzle
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://gate.whapi.cloud/groups', [
'body' => '{"participants":["498935516106","4915155985667"],"subject":"SEO Common GmbH"}',
'headers' => [
'accept' => 'application/json',
'authorization' => 'Bearer Your_Token',
'content-type' => 'application/json',
],
]);
echo $response->getBody();
# python -m pip install requests
import requests
url = "https://gate.whapi.cloud/groups"
payload = {
"participants": ["498935516106", "4915155985667"],
"subject": "SEO Common GmbH"
}
headers = {
"accept": "application/json",
"content-type": "application/json",
"authorization": "Bearer Your_Token"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
// npm install axios --save
import axios from 'axios';
const options = {
method: 'POST',
url: 'https://gate.whapi.cloud/groups',
headers: {
accept: 'application/json',
'content-type': 'application/json',
authorization: 'Bearer Your_Token'
},
data: {participants: ['498935516106', '4915155985667'], subject: 'SEO Common GmbH'}
};
axios
.request(options)
.then(res => console.log(res.data))
.catch(err => console.error(err));
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"participants\":[\"498935516106\",\"4915155985667\"],\"subject\":\"SEO Common GmbH\"}");
Request request = new Request.Builder()
.url("https://gate.whapi.cloud/groups")
.post(body)
.addHeader("accept", "application/json")
.addHeader("content-type", "application/json")
.addHeader("authorization", "Bearer Your_Token")
.build();
Response response = client.newCall(request).execute();
//dotnet add package RestSharp
using RestSharp;
var options = new RestClientOptions("https://gate.whapi.cloud/groups");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("authorization", "Bearer Your_Token");
request.AddJsonBody("{\"participants\":[\"498935516106\",\"4915155985667\"],\"subject\":\"SEO Common GmbH\"}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
Cómo crear un grupo de WhatsApp usando una plataforma no-code
POST a https://gate.whapi.cloud/groups con el subject (nombre del grupo) y participants (array de números).{
"participants": [
"498935516106",
"4915155985667"
],
"subject": "SEO Common GmbH"
}
Cómo agregar participantes a un grupo de WhatsApp
- 1) Asegúrate de tener el ID del grupo al que deseas agregar miembros. Es un parámetro obligatorio. Arriba explicamos cómo obtener el ID.
- 2) Envía una petición
POSTahttps://gate.whapi.cloud/groups/{GroupID}/participantspara agregar nuevos miembros. Debes incluir el ID del grupo en la URL y proporcionar un array de números de teléfono para los participantes que deseas agregar.
Adición directa vs Enlaces de invitación
POST /groups/{GroupID}/participants agrega usuarios a los chats grupales de forma instantánea, evitando la tasa de abandono de clientes potenciales que suelen causar los enlaces de invitación.GET /groups/{GroupID}/invite y envíelo en un mensaje personal.
curl --request POST \
--url https://gate.whapi.cloud/groups/120367831625595066%40g.us/participants \
--header 'accept: application/json' \
--header 'authorization: Bearer Your_Token' \
--header 'content-type: application/json' \
--data '
{
"participants": [
"373983445541",
"373983445542",
"373983445543"
]
}
'
// composer require guzzlehttp/guzzle
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://gate.whapi.cloud/groups/120367831625595066%40g.us/participants', [
'body' => '{"participants":["373983445541","373983445542","373983445543"]}',
'headers' => [
'accept' => 'application/json',
'authorization' => 'Bearer Your_Token',
'content-type' => 'application/json',
],
]);
echo $response->getBody();
# python -m pip install requests
import requests
url = "https://gate.whapi.cloud/groups/120367831625595066%40g.us/participants"
payload = { "participants": ["373983445541", "373983445542", "373983445543"] }
headers = {
"accept": "application/json",
"content-type": "application/json",
"authorization": "Bearer Your_Token"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
// npm install axios --save
import axios from 'axios';
const options = {
method: 'POST',
url: 'https://gate.whapi.cloud/groups/120367831625595066%40g.us/participants',
headers: {
accept: 'application/json',
'content-type': 'application/json',
authorization: 'Bearer Your_Token'
},
data: {participants: ['373983445541', '373983445542', '373983445543']}
};
axios
.request(options)
.then(res => console.log(res.data))
.catch(err => console.error(err));
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"participants\":[\"373983445541\",\"373983445542\",\"373983445543\"]}");
Request request = new Request.Builder()
.url("https://gate.whapi.cloud/groups/120367831625595066%40g.us/participants")
.post(body)
.addHeader("accept", "application/json")
.addHeader("content-type", "application/json")
.addHeader("authorization", "Bearer Your_Token")
.build();
Response response = client.newCall(request).execute();
//dotnet add package RestSharp
using RestSharp;
var options = new RestClientOptions("https://gate.whapi.cloud/groups/120367831625595066%40g.us/participants");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("authorization", "Bearer Your_Token");
request.AddJsonBody("{\"participants\":[\"373983445541\",\"373983445542\",\"373983445543\"]}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
Cómo agregar participantes a un grupo usando herramientas no-code
https://gate.whapi.cloud/groups/[email protected]/participants.@ por %40.{
"participants": [
"373983445541",
"373983445542",
"373983445543"
]
}
Automatización no-code en el mundo real: creación automática de grupos de soporte (Make y n8n)
- Crear el grupo: envíe una solicitud
POST /groupscon un asunto como "Soporte al cliente: Nombre de la empresa" e incluya su número de bot principal. - Agregar participantes: llame a
POST /groups/{groupId}/participantspara agregar el número de teléfono del cliente y su gerente de cuenta asignado. - Enviar un mensaje de bienvenida: envíe una solicitud
POST /messages/imageoPOST /messages/textpara entregar un PDF de incorporación o un banner de bienvenida.
| Ruta de automatización | Cuándo elegir | Ventajas clave |
|---|---|---|
| Make / n8n (No-Code) | Prototipado rápido y operaciones de pequeñas y medianas empresas. | Depuración visual, conectores preconstruidos, cero mantenimiento de servidor. |
| Código personalizado (Node.js / Python) | Aplicaciones empresariales de alto volumen y sincronizaciones complejas de bases de datos. | Menor costo de ejecución, manejo completo de errores, escalabilidad ilimitada. |
Cómo obtener los participantes de un grupo de WhatsApp vía API
- 1) Asegúrate de ser miembro del grupo al que deseas acceder. Sin ser parte del grupo, no podrás obtener la lista de participantes.
- 2) Usa el método de la API Get Groups para obtener una lista de todos los grupos asociados a tu cuenta de WhatsApp. Si ya conoces el ID del grupo deseado, consúltalo directamente usando el endpoint Get group.
- 3) La respuesta incluirá un array de objetos grupo, cada uno con información como el ID, nombre y un campo participants con la lista de miembros. Ejemplo de respuesta:
{
"id": "[email protected]",
"name": "A group of researchers",
"participants": [
{ "id": "972558557032", "rank": "member" },
{ "id": "14409416972", "rank": "creator" },
{ "id": "905589461962", "rank": "member" }
]
}
curl --request GET \
--url 'https://gate.whapi.cloud/groups?count=100' \
--header 'accept: application/json' \
--header 'authorization: Bearer Your_Token'
// composer require guzzlehttp/guzzle
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://gate.whapi.cloud/groups?count=100', [
'headers' => [
'accept' => 'application/json',
'authorization' => 'Bearer Your_Token',
],
]);
echo $response->getBody();
# python -m pip install requests
import requests
url = "https://gate.whapi.cloud/groups?count=100"
headers = {
"accept": "application/json",
"authorization": "Bearer Your_Token"
}
response = requests.get(url, headers=headers)
print(response.text)
// npm install axios --save
import axios from 'axios';
const options = {
method: 'GET',
url: 'https://gate.whapi.cloud/groups?count=100',
headers: {accept: 'application/json', authorization: 'Bearer Your_Token'}
};
axios
.request(options)
.then(res => console.log(res.data))
.catch(err => console.error(err));
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://gate.whapi.cloud/groups?count=100")
.get()
.addHeader("accept", "application/json")
.addHeader("authorization", "Bearer Your_Token")
.build();
Response response = client.newCall(request).execute();
//dotnet add package RestSharp
using RestSharp;
var options = new RestClientOptions("https://gate.whapi.cloud/groups?count=100");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("authorization", "Bearer Your_Token");
var response = await client.GetAsync(request);
Console.WriteLine("{0}", response.Content);
Cómo obtener miembros de un grupo de WhatsApp vía no-code
GET a https://gate.whapi.cloud/groups para obtener una lista de todos los grupos de los que eres miembro, junto con detalles de cada grupo, incluyendo los participantes.GET https://gate.whapi.cloud/groups/{GroupID} para obtener los datos de un grupo específico.Cómo conectar un bot a un grupo de WhatsApp
- Crear un bot de WhatsApp en Node.js;
- Crear un bot de WhatsApp en Python;
- Crear un bot de WhatsApp en PHP;
- Crear un bot de WhatsApp en Java;
chat_id, que tendrá el formato [email protected] (a diferencia de un número de teléfono en chats privados). El campo from indicará el número del remitente dentro del grupo.Consejos, limitaciones y mejores prácticas
- No agregues usuarios a grupos sin su consentimiento. Respeta la privacidad y evita invitaciones no solicitadas;
- Evita enviar spam o contenido no deseado, ya que tu cuenta puede ser marcada o bloqueada permanentemente;
- Whapi.Cloud no impone límites estrictos de velocidad de API en los canales de pago, pero WhatsApp puede marcar las cuentas que envían más de ~20 mensajes por minuto sin historial de calentamiento. Utilice un ritmo similar al humano y retrasos aleatorios de 1.5 a 3.5 segundos entre acciones.
PATCH /groups/{GroupID}/admins inmediatamente después de la creación del grupo. Si el bot principal se desconecta, el administrador secundario puede volver a agregar y promover un nuevo bot. Consulte también Promote to Group Admin.// PATCH https://gate.whapi.cloud/groups/{groupId}/admins
const groupId = "[email protected]";
const res = await fetch(`https://gate.whapi.cloud/groups/${groupId}/admins`, {
method: 'PATCH',
headers: {
'accept': 'application/json',
'content-type': 'application/json',
'authorization': `Bearer ${process.env.WHAPI_TOKEN}`
},
body: JSON.stringify({
participants: ["4915155985667"]
})
});
const status = await res.json();
console.log("Admin promotion status:", status);
Solución de problemas
El bot no responde a mensajes entrantes
- Asegúrate de que estás enviando mensajes al número en el que se ejecuta el bot desde otro teléfono. El bot no podrá reaccionar a los mensajes enviados desde el mismo número.
- Si el bot no reacciona a los mensajes de otros números, verifica el funcionamiento de los webhooks. Utiliza servicios para simular webhooks, por ejemplo, Webhook.site, para asegurarte de por dónde llegan las solicitudes de callback. Luego, verifica que el camino coincide con lo que configuraste. Además, asegúrate de que tu servidor responde con 200Ok.
El bot envía mensajes sin parar
Devoluciones de llamada de webhook y problemas comunes de automatización de grupos
message_created o group_updated. Analice el chat_id con formato [email protected] para identificar mensajes grupales.
- Bucle de envío del bot: asegúrese de que su código verifique el indicador
from_meen las cargas útiles entrantes para evitar bucles de respuesta infinitos. - Error de permiso denegado: esto ocurre al intentar agregar un participante mientras la cuenta del bot no es administradora del grupo. Verifique el rango del bot a través de
GET /groups/{GroupID}. - Falta de números en la lista: la sincronización de metadatos del grupo tarda hasta 15 segundos. Si llama a la API inmediatamente después de la creación, los números de teléfono de los participantes pueden tardar unos momentos en resolverse.
¿No puedes agregar un usuario al grupo?
- Debes ser administrador del grupo. Solo los admins pueden agregar nuevos miembros.
- El usuario puede tener restringidas las invitaciones a grupos en su configuración de privacidad. Si es así, no se puede agregar automáticamente vía API.
- El grupo puede haber alcanzado el tamaño máximo de 1024 participantes. En ese caso, elimina miembros inactivos o considera crear un nuevo grupo.
- Las políticas anti-spam de WhatsApp pueden bloquear la adición de ciertos números a los grupos, especialmente si el contacto no está guardado en tu libreta de direcciones o no ha interactuado contigo. Para reducir este riesgo, recomendamos encarecidamente agregar primero el contacto a tu lista mediante nuestra API de adición de contactos.
¿Mensaje no entregado?
- Verifica el ID del grupo —IDs incorrectos o expirados causarán fallos de entrega.
- Si el mensaje se envía pero no aparece en el grupo, revisa el formato. Por ejemplo, los grupos de WhatsApp pueden no mostrar ciertos tipos de contenido, como imágenes webp o botones interactivos.
¿Permiso denegado?
- Tu número no es reconocido como administrador del grupo.
- La API puede no haber sincronizado correctamente tu estado de admin o número. En ese caso, intenta reautorizar tu canal API para refrescar permisos y metadatos.
¿No se muestran los miembros del grupo?
GET /groups o GET /group, los datos del grupo se ponen en cola para sincronización.¿Qué significa @lid en la lista de participantes?
@lid para proteger la privacidad del usuario, resuélvalos a números de teléfono estándar utilizando GET /contacts/lids o GET /contacts/ids/{ContactLID}. Consulte la guía sobre resolución de identificadores @lid anónimos.// GET https://gate.whapi.cloud/contacts/ids/{contactLid}
const contactLid = "1524746986546@lid";
const res = await fetch(`https://gate.whapi.cloud/contacts/ids/${contactLid}`, {
method: 'GET',
headers: {
'accept': 'application/json',
'authorization': `Bearer ${process.env.WHAPI_TOKEN}`
}
});
const { phone } = await res.json();
console.log("Resolved JID phone number:", phone);
Despliegue y uso de servidores
Firebase
- Crea un proyecto en Firebase Console;
- Instala Firebase CLI, siguiendo las instrucciones;
- Inicializa Firebase en el directorio de tu proyecto con el comando firebase init;
- Despliega tu bot usando el comando firebase deploy --only functions.
AWS (Amazon Web Services)
- Regístrate o inicia sesión en AWS Management Console;
- Crea una nueva función Lambda a través de la consola de AWS, eligiendo API Gateway como desencadenante;
- Sube el código de tu bot a la función Lambda;
- Configura API Gateway para que tu bot interactúe con el mundo exterior.
Heroku
- Crea una cuenta en Heroku;
- Instala Heroku CLI e inicia sesión;
- Crea una nueva aplicación en Heroku a través de la consola o usando el comando heroku create;
- Conecta tu repositorio Git con Heroku y realiza el despliegue con los comandos git push heroku master;
- Configura la URL del webhook proporcionada por Heroku.