O que é a WhatsApp Cloud API
A Cloud API substituiu a antiga "On-Premises API" em 2022. As diferenças:
| Cloud API (atual) | On-Premises (legado) |
|---|
| Hospedada pela Meta | Você hospeda |
|---|---|
| Setup em horas | Setup em semanas |
| Sem servidor para manter | VPS + Docker + manutenção |
| Mesma performance | Mais complexa |
| Recomendada para 99% dos casos | Apenas casos enterprise específicos |
Pré-requisitos
Antes de começar:
Caminho 1: Direto pela Meta (complexo)
Se você quiser ir direto pela Meta, sem BSP:
Esse caminho funciona, mas você ainda precisa:bashcurl -X POST \ "https://graph.facebook.com/v18.0/<PHONE_NUMBER_ID>/messages" \ -H "Authorization: Bearer <ACCESS_TOKEN>" \ -H "Content-Type: application/json" \ -d '{ "messaging_product": "whatsapp", "to": "5511999998888", "type": "template", "template": { "name": "hello_world", "language": { "code": "en_US" } } }'
- Aprovar templates manualmente no Meta Business Suite
- Lidar com renovação de tokens
- Implementar webhooks com verificação de assinatura
- Tratar erros e retries
- Migrar de número se a Meta limitar
Caminho 2: Via BSP oficial (recomendado)
Provedores oficiais resolvem 90% da complexidade. Aqui está como funciona com Zavu:
1. Crie conta gratuita
zavu.dev/pt/signup — sem cartão de crédito.2. Conecte sua conta Meta Business
No dashboard, clique em Add WhatsApp Sender e siga o fluxo de OAuth. Você é redirecionado para o Meta, autoriza Zavu como BSP, e volta. Leva 5 minutos.
3. Instale o SDK
bash# Node.js npm install @zavudev/sdk
bash# Python pip install zavudev
4. Envie a primeira mensagem
Node.js / TypeScript:Python:typescriptimport Zavu from "@zavudev/sdk" const zavu = new Zavu({ apiKey: process.env.ZAVU_API_KEY }) const result = await zavu.messages.send({ to: "+5511999998888", channel: "whatsapp", text: "Olá! Esta é a primeira mensagem via Zavu 🎉" }) console.log(result.message.id) // msg_xxx console.log(result.message.status) // queued
cURL:pythonfrom zavudev import Zavu zavu = Zavu(api_key=os.environ["ZAVU_API_KEY"]) result = zavu.messages.send( to="+5511999998888", channel="whatsapp", text="Olá! Esta é a primeira mensagem via Zavu 🎉" ) print(result.message.id) print(result.message.status)
bashcurl -X POST https://api.zavu.dev/v1/messages \ -H "Authorization: Bearer $ZAVU_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "to": "+5511999998888", "channel": "whatsapp", "text": "Olá!" }'
Mensagens livres vs templates
A janela de 24 horas é central na Cloud API:
- Dentro de 24h depois do cliente te mandar mensagem: você pode enviar qualquer coisa (texto, mídia, botões)
- Fora de 24h: você só pode enviar templates aprovados pela Meta
Enviando template
typescriptawait zavu.messages.send({ to: "+5511999998888", channel: "whatsapp", messageType: "template", content: { templateId: "tpl_pedido_confirmado", templateVariables: { "1": "João", // {{1}} no body "2": "12345", // {{2}} "3": "R$ 89,90" // {{3}} } } })
Templates precisam de aprovação Meta (24-48h). Categorias:
- Utility (transacional) — confirmação, lembrete, status — ~R$ 0,07
- Authentication (OTP) — códigos — ~R$ 0,04
- Marketing (promocional) — ofertas — ~R$ 0,18
Mídia rica
typescript// Imagem await zavu.messages.send({ to: "+5511999998888", channel: "whatsapp", messageType: "image", text: "Confira nosso novo produto!", content: { mediaUrl: "https://example.com/produto.jpg" } }) // Documento (PDF) await zavu.messages.send({ to: "+5511999998888", channel: "whatsapp", messageType: "document", content: { mediaUrl: "https://example.com/nota-fiscal.pdf", filename: "nota-fiscal.pdf" } }) // Botões interativos await zavu.messages.send({ to: "+5511999998888", channel: "whatsapp", messageType: "buttons", text: "Como podemos te ajudar?", content: { buttons: [ { id: "comprar", title: "Quero comprar" }, { id: "duvida", title: "Tirar dúvida" }, { id: "rastreio", title: "Rastrear pedido" } ] } })
Recebendo mensagens (webhooks)
Configure um endpoint HTTPS no Zavu Dashboard. A cada mensagem recebida, Zavu manda um POST:
typescript// app/api/whatsapp-webhook/route.ts (Next.js) export async function POST(req: Request) { const event = await req.json() // Verifique a assinatura para segurança const signature = req.headers.get("x-zavu-signature") if (!verifySignature(signature, event)) { return new Response("Unauthorized", { status: 401 }) } switch (event.type) { case "message.inbound": console.log(Cliente ${event.message.from} disse: ${event.message.text}) // Responder ou processar break case "message.delivered": console.log(Mensagem ${event.message.id} entregue) break case "message.read": console.log(Mensagem ${event.message.id} lida) break } return new Response("ok") }
Erros comuns
1.131056 — Number not registered: o número não está habilitado no WhatsApp Business. Verifique no Meta Business Suite.2. 131005 — Access denied: o token está errado ou expirou. Use System User token (permanente) em produção.3. 132000 — Template not approved: você tentou usar template ainda em revisão. Aguarde aprovação ou use texto livre dentro da janela de 24h.4. Mensagem não chega: o número de destino pode não ter WhatsApp, ou bloqueou seu número. Verifique pelo webhook message.failed.5. Webhook não responde em 2 segundos: a Meta tenta reenviar até 3 vezes. Estruture seu endpoint para responder rápido e processar async.Custos da WhatsApp Cloud API
A Meta cobra por conversa de 24h iniciada, não por mensagem. Preços Brasil 2026:
| Categoria | Custo Meta |
|---|
| Utility (transacional) | ~R$ 0,07 |
|---|---|
| Authentication (OTP) | ~R$ 0,04 |
| Marketing | ~R$ 0,18 |
| Service (cliente inicia) | Gratuito |
Recursos relacionados
- WhatsApp Business: como funciona
- Mensagem automática no WhatsApp Business
- Construa um agente de IA para WhatsApp com FastAPI
- Documentação técnica Zavu
- Zavu vs Twilio para WhatsApp