Wow! Redução de 65% no preço para clientes brasileiros! Registre-se agora
WhatsApp API

Números que não estão no WhatsApp não são usados

Um lead que não está no WhatsApp fica fora do envio e da importação no CRM. Quando uma lista de telefones vai ser usada, o Make ou o n8n podem verificar esse número e parar o passo seguinte pelo Whapi.Cloud. Este caso mostra aos integradores como implementar esse fluxo com a WhatsApp API.

A trilha de envio pode mandar o texto A trilha de importação não envia
Uma mesa com uma lista de telefones no notebook, um chat do WhatsApp que não foi aberto para um número deixado de fora da lista e uma linha de CRM em branco para esse número.
Balão decorativo
Caso de uso

Quando usar este fluxo

A lista vai ser enviada ou importada

Use este fluxo quando a lista vai ser enviada ou importada a partir de um CRM, ERP ou outro serviço.

O próximo módulo é Make ou n8n

Use este fluxo quando o Make ou o n8n, sem isso, enviaria ou importaria um número que não está no WhatsApp.

A lista precisa de uma verificação antes

Use este fluxo quando é preciso verificar o número antes de usar a lista, para não enviar nem importar um número que não está no WhatsApp.

Um telefone com a lista de chats do WhatsApp sem uma conversa nova para um número deixado fora do envio, ao lado de uma lista de contatos do CRM que não inclui esse número.
Experiência do cliente

O lead não é contactado em vão

Antes da automação, o envio ainda vai para números que não estão no WhatsApp e a importação no CRM guarda esses números, então o lead não é alcançado e a lista importada fica suja.

Depois que o fluxo corre, uma pessoa que não está no WhatsApp não recebe o envio e esse número não entra na importação do CRM. Os integradores constroem esse resultado com a WhatsApp API.

Fluxo

Verifique a lista e depois envie ou pare

1

A lista está prestes a ser usada

Uma lista de telefones de um CRM, ERP ou outro serviço está prestes a ser enviada ou importada no Make ou n8n.

2

Verifique quais números estão no WhatsApp

POST /contacts

checkPhones checkPhones verifica os telefones da lista. Passe esses telefones em contacts. HTTP 200 devolve contacts. Cada item tem input e status. valid também inclui wa_id. invalid significa que o número não tem WhatsApp. Não envie esse número, não o importe e não chame sendMessageText para ele.
{"contacts":[{"input":"15052462002","status":"valid","wa_id":"[email protected]"},{"input":"15058662314","status":"invalid"}]}

3

Envie o texto na trilha de envio

POST /messages/text

sendMessageText só corre quando a lista é um envio e checkPhones devolveu status valid para esse número. Coloque esse número em to. Um contato com status invalid não chega a este passo. A importação no CRM para depois da verificação e não deve chamar este envio.

Precisa acompanhar a entrega? A resposta do envio não significa que a pessoa já tem o texto. As mudanças de status chegam depois desse envio. A importação no CRM não tem envio para acompanhar. Ver o status de entrega →

Pré-requisitos

Antes de executar o fluxo

Conecte o número de WhatsApp que verifica a lista e envia o texto. Cada pedido usa o token de API desse número. Make ou n8n ficam no seu cenário. O Whapi.Cloud faz a verificação e, na trilha de envio, o texto.

Opcional — aprofunde este fluxo

Implementação da API

Duas chamadas para esta porta

Verifique primeiro os telefones da lista. Envie um texto só quando a lista é um envio e o número está no WhatsApp. A importação no CRM para depois da verificação.

Obtenha o token de API grátis depois de se cadastrar em whapi.cloud e use esse token no código no lugar de Your_Token dos exemplos.

Verifique quais números estão no WhatsApp

Leia o status de cada número. Guarde só valid para o passo seguinte. invalid significa que o número não tem WhatsApp, então não envie e não importe.

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))
}

Envie o texto na trilha de envio

Envie o texto só para um número que a verificação manteve e pule esta chamada numa importação de 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

Status depois do envio

Este acompanhamento é só para o texto do envio. Uma importação no CRM não envia. Uma resposta de envio bem-sucedida não significa que o destinatário já tem o texto. O primeiro status visível antes de um webhook é pending. As mudanças seguintes chegam só em statuses.post e statuses.put. Se o status fica em pending e não passa para sent, delivered ou um ack posterior, a mensagem não foi entregue. Verifique o payload e a permissão da conta para enviar esse tipo.

  • Uma resposta bem-sucedida de sendMessageText inclui sent. Isso não significa que a pessoa já tem o texto.

  • As mudanças de ack seguintes chegam em statuses.post e statuses.put.

O que ler sobre entrega e webhooks

Fale com o suporte se algo deu errado
Quando algo quebra

Trate as falhas em cada passo

A verificação pode mostrar que um número não está no WhatsApp enquanto o passo seguinte do Make ou n8n ainda envia a mensagem ou importa esse número. Pare esse uso nesse passo.

A verificação disse não, mas o passo seguinte rodou?

Pare esse passo do Make ou n8n. Não envie a mensagem e não importe o número. Os clientes costumam dizer que nosso suporte responde. Não hesite em pedir ajuda.

Fale com o suporte se algo deu errado

Investigue por passo da API

Status O que significa O que fazer
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
Status O que significa O que fazer
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

Perguntas de operadores

Não. A importação no CRM para depois de checkPhones e não deve chamar sendMessageText. O texto sai só quando a lista é um envio e a verificação diz que o número está no WhatsApp.
Pare esse passo do Make ou n8n. Não envie a mensagem e não importe o número.
Não. A verificação só diz se o número está no WhatsApp. Ela não registra o consentimento para receber o envio.
De um CRM, ERP ou outro serviço, para o Make ou n8n. O Whapi.Cloud não lê esse sistema. Ele verifica os telefones que você passa e envia um texto só na trilha de mailing.
Para que um número que não está no WhatsApp não seja enviado nem importado. A verificação é a porta da lista, não um passo separado de consentimento.
Recursos compatíveis do WhatsApp

Tudo o que você precisa para criar automações no WhatsApp

O Whapi.Cloud oferece acesso a um conjunto completo de recursos do WhatsApp — mensagens, mídia, grupos, canais, webhooks e muito mais. Crie bots, automações e integrações sem limitações de funcionalidades.

Escolhido por desenvolvedores

Confiado por mais de 3.300 desenvolvedores e equipes SaaS

Desenvolvedores no mundo inteiro utilizam o Whapi.Cloud para criar automações, bots, integrações com CRM, ferramentas de envio em massa e fluxos avançados de WhatsApp. Nossa infraestrutura processa milhões de requisições API com alta estabilidade — e esse número cresce a cada mês.

Ícone de recurso

5,5K+

canais de API ativos

Ícone de recurso

21M+

requisições API por mês

“Tudo é simples, intuitivo e fácil de navegar. A documentação é clara e todas as informações estão bem à mão. Trabalho excelente.”

Roberto K. / Desenvolvedor Web

“Conectamos o WhatsApp aos nossos fluxos usando o n8n em apenas alguns minutos. Sem código, sem complicações — funcionou de primeira.”

Martin P. / Desenvolvedor

“O Whapi.Cloud se tornou uma parte essencial da nossa comunicação com clientes. Automatizamos atualizações de produtos, notificações de pedidos e mensagens de suporte — tudo sem templates nem aprovações da Meta.”

Oscar T. / CTO

Balão decorativo