Validar número de WhatsApp via API: como saber se o número tem WhatsApp
Para saber se um número tem WhatsApp via API, chame o endpoint de verificação da instância com a lista de números: para cada um, ele devolve se está registrado no WhatsApp e o identificador (JID). Isso é diferente de validar o formato, que só confere DDI, DDD e quantidade de dígitos. As duas etapas juntas evitam enviar para número que não existe, que gera erro, desperdiça tempo e piora o seu histórico de envio.
Publicado em · 3 min de leitura
Duas validações diferentes: formato e existência
Formato: o número tem DDI, DDD válido e o total de dígitos certo? É uma regra de texto, que roda no seu navegador ou servidor sem consultar ninguém. A ferramenta grátis de validar número de WhatsApp e o formatador em lote fazem isso, inclusive o nono dígito do celular brasileiro.
Existência: aquele número, mesmo bem formado, está registrado no WhatsApp agora? Só uma consulta ao WhatsApp responde. Por isso a ferramenta de formato avisa que não confirma se a conta existe, e a verificação vem pela API.
O endpoint de verificação
Na ZapZap API, o endpoint é POST /api/v1/{instanceId}/chat/check, com o campo numbers como lista. A resposta traz, para cada número consultado, o campo query (o que você enviou), isInWhatsapp (verdadeiro ou falso) e jid (o identificador da conversa). A descrição completa está na referência do endpoint.
Mande o número no mesmo formato do envio: DDI e só dígitos. Confira o formato da resposta com dois números seus antes de ligar isso no seu fluxo.
curl: verificar números
# Does this number have WhatsApp?
curl -X POST "https://api.zapzapapi.com/api/v1/$ZAPZAP_INSTANCE/chat/check" \
-H "Content-Type: application/json" \
-H "x-api-key: $ZAPZAP_API_KEY" -H "x-api-secret: $ZAPZAP_API_SECRET" \
-d '{"numbers":["5511999999999","5521888888888"]}'
# Each item of the answer carries: query, isInWhatsapp (true/false) and jidUm filtro em Node para listas
O exemplo normaliza o formato (apenas dígitos, DDI 55 quando faltar, descarte do que não pode ser número brasileiro), remove duplicados, consulta em lotes pequenos com pausa e devolve só quem tem WhatsApp. O resultado alimenta o envio seguinte e reduz erros.
A regra de normalização é simples de propósito. Para casos de borda, como o nono dígito em números antigos, use o formatador do site como referência.
Node.js: filtrar lista
// Validate a small batch before sending, keep only numbers that exist
const API = "https://api.zapzapapi.com/api/v1/" + process.env.ZAPZAP_INSTANCE;
const headers = {
"Content-Type": "application/json",
"x-api-key": process.env.ZAPZAP_API_KEY,
"x-api-secret": process.env.ZAPZAP_API_SECRET,
};
export function normalizeBr(raw) {
// 1) digits only, 2) add country code 55 when missing, 3) reject what cannot be a Brazilian number
let d = String(raw).replace(/\D/g, "");
if (d.length === 10 || d.length === 11) d = "55" + d;
return /^55\d{10,11}$/.test(d) ? d : null;
}
export async function filterWhatsApp(rawNumbers) {
const numbers = [...new Set(rawNumbers.map(normalizeBr).filter(Boolean))];
const ok = [];
for (let i = 0; i < numbers.length; i += 20) { // small batches
const batch = numbers.slice(i, i + 20);
const r = await fetch(API + "/chat/check", { method: "POST", headers, body: JSON.stringify({ numbers: batch }) });
if (!r.ok) throw new Error("check failed: HTTP " + r.status);
const items = await r.json();
for (const it of items) if (it.isInWhatsapp) ok.push({ number: it.query, jid: it.jid });
await new Promise((res) => setTimeout(res, 3000 + Math.random() * 4000)); // pause between batches
}
return ok;
}Cuidados: trate a consulta como se fosse um envio
Consultar milhares de números de uma vez, em rajada, é um padrão de comportamento incomum. Não temos limite publicado para esse endpoint, então o conselho prudente é o mesmo do envio: lotes pequenos, pausa entre eles e nada em paralelo. Se a sua lista é grande, valide o formato primeiro (grátis, local) e só consulte a existência de quem passou.
Guarde o resultado com a data da consulta. Número que tinha WhatsApp hoje pode não ter amanhã, e número sem WhatsApp pode ser criado depois. E lembre que ter WhatsApp não significa ter consentido em receber a sua mensagem: veja LGPD no WhatsApp.
Onde encaixar no seu fluxo
O ponto mais útil é o cadastro: valide quando o lead digita o telefone, e avise na hora se o número não tem WhatsApp, em vez de descobrir no disparo. O segundo é a limpeza de uma base antiga, antes de reativá-la. Em ambos, combine com o aquecimento e com um volume gradual.
Se você usa n8n, o endpoint cabe num nó de HTTP Request antes do nó de envio. O guia de WhatsApp no n8n mostra o desenho do fluxo.
Resumo rápido
- Formato válido não prova que o número tem WhatsApp: são duas validações.
- POST /chat/check com a lista numbers devolve isInWhatsapp e jid para cada número.
- Valide o formato localmente primeiro e consulte a existência em lotes pequenos, com pausa.
- Ter WhatsApp não é consentimento: respeite LGPD e opt-in.
Continue lendo
Perguntas frequentes
Como verificar se um número tem WhatsApp via API?
Faça POST em /api/v1/{instanceId}/chat/check com o campo numbers (lista). Cada item da resposta traz query, isInWhatsapp e jid.
Qual a diferença entre validar o formato e verificar o número?
Validar o formato confere DDI, DDD e dígitos e roda localmente. Verificar o número consulta o WhatsApp para saber se há uma conta registrada. O formato correto não garante que a conta exista.
A ferramenta grátis do site confirma que o número tem WhatsApp?
Não. Ela valida e formata o número (E.164, nono dígito, link wa.me), no navegador, e avisa que não confirma se a conta existe. Para isso, use a API de verificação.
Posso verificar uma base inteira de uma vez?
Não recomendamos. Consulta em rajada é um comportamento incomum e não há limite publicado para o endpoint. Use lotes pequenos, pausa entre eles e valide o formato antes.
Verificar o número consome mensagem ou custa por consulta?
O preço do ZapZap é por número ativo ao mês, sem cobrança por mensagem, e a página de preços não lista tarifa por consulta. Confira o preço vigente antes de montar um volume grande.
Valide antes de enviar
Use a ferramenta grátis para o formato e a API para a existência. R$15 por número ativo ao mês, sem cobrança por mensagem.
