¡Guau! Crea tu integración de WhatsApp. Empieza gratis. Regístrate ahora
WhatsApp API

Los números que no están en WhatsApp no se usan

Un lead que no está en WhatsApp queda fuera del envío y de la importación al CRM. Cuando una lista de teléfonos va a usarse, Make o n8n pueden comprobar ese número y detener el paso siguiente a través de Whapi.Cloud. Este caso muestra a los integradores cómo implementar ese flujo con la WhatsApp API.

La rama de envío puede mandar el texto La rama de importación no envía
Un escritorio con una lista de teléfonos en un portátil, un chat de WhatsApp que no se abrió para un número dejado fuera de la lista y una fila de CRM vacía para ese número.
Burbuja decorativa
Caso de uso

Cuándo usar este flujo

La lista va a enviarse o a importarse

Usa este flujo cuando la lista va a enviarse o a importarse desde un CRM, un ERP u otro servicio.

El siguiente módulo es Make o n8n

Usa este flujo cuando Make o n8n, si no, enviaría o importaría un número que no está en WhatsApp.

La lista necesita una comprobación primero

Usa este flujo cuando hace falta comprobar el número antes de usar la lista, para no enviar ni importar un número que no está en WhatsApp.

Un teléfono con la lista de chats de WhatsApp sin un hilo nuevo para un número dejado fuera del envío, junto a una lista de contactos del CRM que no incluye ese número.
Experiencia del cliente

El lead no se contacta en vano

Antes de la automatización, el envío sigue yendo a números que no están en WhatsApp y la importación al CRM los conserva, así que el lead no se alcanza y la lista importada queda sucia.

Cuando el flujo termina, una persona que no está en WhatsApp no recibe el envío y ese número no entra en la importación al CRM. Los integradores construyen este resultado con la WhatsApp API.

Flujo

Comprueba la lista y luego envía o para

1

La lista está a punto de usarse

Una lista de teléfonos de un CRM, un ERP u otro servicio está a punto de enviarse o importarse en Make o n8n.

2

Comprueba qué números están en WhatsApp

POST /contacts

checkPhones comprueba los teléfonos de la lista. Pasa esos teléfonos en contacts. HTTP 200 devuelve contacts. Cada elemento tiene input and status. valid también incluye wa_id. invalid significa que el número no tiene WhatsApp. No envíes ese número, no lo importes y no llames a sendMessageText para él.
{"contacts":[{"input":"15052462002","status":"valid","wa_id":"[email protected]"},{"input":"15058662314","status":"invalid"}]}

3

Envía el texto en la rama de mailing

POST /messages/text

sendMessageText solo corre cuando la lista es un envío y checkPhones devolvió status valid para ese número. Pon ese número en to. Un contacto con status invalid no llega a este paso. La importación al CRM se detiene después de la comprobación y no debe llamar a este envío.

¿Hace falta el seguimiento de entrega? La respuesta del envío no significa que la persona ya tenga el texto. Los cambios de estado llegan después de ese envío. La importación al CRM no tiene un envío que seguir. Ver el estado de entrega →

Requisitos

Antes de ejecutar el flujo

Conecta el número de WhatsApp que comprueba la lista y envía el texto. Cada solicitud usa el token de API de ese número. Make o n8n siguen en tu escenario. Whapi.Cloud hace la comprobación y, en la rama de envío, el texto.

Opcional — profundiza en este flujo

Implementación de la API

Dos llamadas para esta puerta

Comprueba primero los teléfonos de la lista. Envía un texto solo cuando la lista es un mailing y el número está en WhatsApp. La importación al CRM se detiene después de la comprobación.

Obtén tu token de API gratis después de registrarte en whapi.cloud y úsalo en el código en lugar de Your_Token de los ejemplos.

Comprueba qué números están en WhatsApp

Lee el status de cada número. Conserva solo valid para el paso siguiente. invalid significa que el número no tiene WhatsApp, así que no lo envíes ni lo importes.

curl --request POST \
     --url https://gate.whapi.cloud/contacts \
     --header 'accept: application/json' \
     --header 'authorization: Bearer Your_Token' \
     --header 'content-type: application/json' \
     --data '
{
  "contacts": ["15052462002", "15058662314"]
}
'
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gate.whapi.cloud/contacts",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{  \"contacts\": [\"15052462002\", \"15058662314\"]}",
  CURLOPT_HTTPHEADER => [
    "accept: application/json",
    "authorization: Bearer Your_Token",
    "content-type: application/json"
  ],
]);

$response = curl_exec($curl);
curl_close($curl);
echo $response;
import requests

url = "https://gate.whapi.cloud/contacts"
payload = {"contacts": ["15052462002", "15058662314"]}
headers = {
    "accept": "application/json",
    "authorization": "Bearer Your_Token",
    "content-type": "application/json"
}

response = requests.request("POST", url, json=payload, headers=headers)
print(response.text)
const response = await fetch("https://gate.whapi.cloud/contacts", {
  method: "POST",
  headers: {
    accept: "application/json",
    authorization: "Bearer Your_Token",
    "content-type": "application/json"
  },
  body: JSON.stringify({ contacts: ["15052462002", "15058662314"] })
});

console.log(await response.text());
OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{  \"contacts\": [\"15052462002\", \"15058662314\"]}");
Request request = new Request.Builder()
  .url("https://gate.whapi.cloud/contacts")
  .method("POST", body)
  .addHeader("accept", "application/json")
  .addHeader("authorization", "Bearer Your_Token")
  .addHeader("content-type", "application/json")
  .build();

Response response = client.newCall(request).execute();
using RestSharp;

var options = new RestClientOptions("https://gate.whapi.cloud/contacts");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("authorization", "Bearer Your_Token");
request.AddHeader("content-type", "application/json");
request.AddJsonBody(new { contacts = new[] { "15052462002", "15058662314" } });
var response = await client.ExecuteAsync(request);

Console.WriteLine("{0}", response.Content);
package main

import (
	"bytes"
	"fmt"
	"io"
	"net/http"
)

func main() {
	body := []byte(`{
  "contacts": ["15052462002", "15058662314"]
}`)
	req, _ := http.NewRequest("POST", "https://gate.whapi.cloud/contacts", bytes.NewReader(body))
	req.Header.Set("accept", "application/json")
	req.Header.Set("authorization", "Bearer Your_Token")
	req.Header.Set("content-type", "application/json")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	out, _ := io.ReadAll(res.Body)
	fmt.Println(string(out))
}

Envía el texto en la rama de mailing

Envía el texto solo a un número que la comprobación conservó y omite esta llamada en una importación al CRM.

curl --request POST \
     --url https://gate.whapi.cloud/messages/text \
     --header 'accept: application/json' \
     --header 'authorization: Bearer Your_Token' \
     --header 'content-type: application/json' \
     --data '
{
  "to": "15052462002",
  "body": "Hello"
}
'
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gate.whapi.cloud/messages/text",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{  \"to\": \"15052462002\",  \"body\": \"Hello\"}",
  CURLOPT_HTTPHEADER => [
    "accept: application/json",
    "authorization: Bearer Your_Token",
    "content-type: application/json"
  ],
]);

$response = curl_exec($curl);
curl_close($curl);
echo $response;
import requests

url = "https://gate.whapi.cloud/messages/text"
payload = {"to": "15052462002", "body": "Hello"}
headers = {
    "accept": "application/json",
    "authorization": "Bearer Your_Token",
    "content-type": "application/json"
}

response = requests.request("POST", url, json=payload, headers=headers)
print(response.text)
const response = await fetch("https://gate.whapi.cloud/messages/text", {
  method: "POST",
  headers: {
    accept: "application/json",
    authorization: "Bearer Your_Token",
    "content-type": "application/json"
  },
  body: JSON.stringify({ to: "15052462002", body: "Hello" })
});

console.log(await response.text());
OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{  \"to\": \"15052462002\",  \"body\": \"Hello\"}");
Request request = new Request.Builder()
  .url("https://gate.whapi.cloud/messages/text")
  .method("POST", body)
  .addHeader("accept", "application/json")
  .addHeader("authorization", "Bearer Your_Token")
  .addHeader("content-type", "application/json")
  .build();

Response response = client.newCall(request).execute();
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_Token");
request.AddHeader("content-type", "application/json");
request.AddJsonBody(new { to = "15052462002", body = "Hello" });
var response = await client.ExecuteAsync(request);

Console.WriteLine("{0}", response.Content);
package main

import (
	"bytes"
	"fmt"
	"io"
	"net/http"
)

func main() {
	body := []byte(`{
  "to": "15052462002",
  "body": "Hello"
}`)
	req, _ := http.NewRequest("POST", "https://gate.whapi.cloud/messages/text", bytes.NewReader(body))
	req.Header.Set("accept", "application/json")
	req.Header.Set("authorization", "Bearer Your_Token")
	req.Header.Set("content-type", "application/json")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	out, _ := io.ReadAll(res.Body)
	fmt.Println(string(out))
}
Entrega

Estado después del envío

Este seguimiento es solo para el texto del envío. Una importación al CRM no envía. Una respuesta de envío correcta no significa que el destinatario ya tenga el texto. El primer estado visible antes de un webhook es pending. Los cambios posteriores llegan solo en statuses.post y statuses.put. Si el estado se queda en pending y no pasa a sent, delivered o un ack posterior, el mensaje no se entregó. Revisa el payload y el permiso de la cuenta para enviar ese tipo.

  • Una respuesta correcta de sendMessageText incluye sent. Eso no significa que la persona ya tenga el texto.

  • Los cambios de ack posteriores llegan en statuses.post y statuses.put.

Qué leer sobre entrega y webhooks

Contacta a soporte si algo salió mal
Cuando algo falla

Gestiona los fallos en cada paso

La comprobación puede decir que un número no está en WhatsApp mientras el paso siguiente de Make o n8n igual envía el mensaje o importa ese número. Detén ese uso en ese paso.

La comprobación dijo que no, pero el paso siguiente igual corrió?

Detén ese paso de Make o n8n. No envíes el mensaje y no importes el número. Los clientes suelen decir que nuestro soporte responde. No dudes en pedir ayuda.

Contacta a soporte si algo salió mal

Revisa por paso de API

Estado Qué significa Qué hacer
200 OK HTTP 200 returns contacts. valid includes wa_id. invalid means the number does not have WhatsApp, so do not mail it, do not import it, and do not call sendMessageText for it. Example: {"contacts":[{"input":"15052462002","status":"valid","wa_id":"[email protected]"},{"input":"15058662314","status":"invalid"}]}.
400 Wrong request parameters
401 Need channel authorization for check phones Authorize the channel before this check.
402 Trial version limit exceeded
429 Too many requests
500 Internal Error
Estado Qué significa Qué hacer
200 Created
400 Wrong request parameters
401 Need channel authorization for send message Authorize the channel before this send.
402 Trial version limit exceeded
403 It is forbidden to send to this group/recipient
413 Request body too large
429 Too many requests
500 Internal Error
FAQ

Preguntas de operadores

No. La importación al CRM se detiene después de checkPhones y no debe llamar a sendMessageText. El texto sale solo cuando la lista es un envío y la comprobación dice que el número está en WhatsApp.
Detén ese paso de Make o n8n. No envíes el mensaje y no importes el número.
No. La comprobación solo dice si el número está en WhatsApp. No registra el consentimiento para recibir el envío.
De un CRM, un ERP u otro servicio, hacia Make o n8n. Whapi.Cloud no lee ese sistema. Comprueba los teléfonos que le pasas y envía un texto solo en la rama de mailing.
Para que un número que no está en WhatsApp no se envíe ni se importe. La comprobación es la puerta de la lista, no un paso aparte de consentimiento.
Funciones compatibles de WhatsApp

Todo lo que necesitas para crear automatizaciones en WhatsApp

Whapi.Cloud te da acceso a un conjunto completo de funciones de WhatsApp — mensajería, multimedia, grupos, canales, webhooks y más. Crea bots, automatizaciones e integraciones sin limitaciones de funciones.

Elegido por desarrolladores

Confiado por más de 3.300 desarrolladores y equipos SaaS

Desarrolladores de todo el mundo confían en Whapi.Cloud para crear automatizaciones, bots, integraciones con CRM, herramientas de mensajería masiva y flujos avanzados de WhatsApp. Nuestra infraestructura procesa millones de solicitudes API con alta estabilidad, y este número crece cada mes.

Icono de característica

5,5K+

canales API activos

Icono de característica

21M+

solicitudes API al mes

“Todo es simple, intuitivo y fácil de usar. La documentación es clara y toda la información está justo donde la necesito. Excelente trabajo.”

Roberto K. / Desarrollador Web

“Conectamos WhatsApp a nuestros flujos en n8n en solo unos minutos. Sin código, sin complicaciones — todo funcionó a la primera.”

Martin P. / Desarrollador

“Whapi.Cloud se convirtió en una parte clave de nuestra comunicación con clientes. Automatizamos actualizaciones de productos, notificaciones de pedidos y mensajes de soporte — sin plantillas ni aprobaciones de Meta.”

Oscar T. / CTO

Burbuja decorativa