IA

API de WhatsApp para agentes de IA: conectando Claude, n8n e LangChain

Um agente de IA que só conversa com você numa janela de chat serve pela metade. A outra metade é alcançar quem já vive no WhatsApp: clientes, leads, o seu próprio time. Este guia mostra três formas de ligar um número de WhatsApp a um agente (servidor MCP, n8n e ferramentas em Python) e as travas que você precisa ter antes de deixar o agente enviar qualquer coisa. Transparência: a ZapZap API é uma API não oficial. Você conecta um número comum por QR code, sem verificação de negócio da Meta e sem templates. Esse é também o principal risco, por isso uma seção inteira fala dele.

Publicado em · 6 min de leitura

Este artigo também está disponível em: English · Español

Escolha o caminho pelo lugar onde o agente roda

Onde o agente rodaCaminhoPrecisa de código?
---------
Assistente de desktop (Claude Desktop, Claude Code, Cursor)Servidor MCPNão, uma entrada de configuração
Automações disparadas por evento (cliente escreve, agente responde)Fluxo no n8nPouco
Seu produto ou backendFerramentas em Python ou Node (LangChain, CrewAI, loop próprio)Sim

Os três usam a mesma API REST: https://api.zapzapapi.com/api/v1/{instanceId}/..., autenticada por dois cabeçalhos, x-api-key e x-api-secret (autenticação). Se o seu framework lê OpenAPI, a especificação é pública em OpenAPI do ZapZap. A página agentes de IA junta as três opções num lugar só.

Caminho 1: servidor MCP para Claude e Cursor

MCP (Model Context Protocol) deixa um cliente de IA descobrir ferramentas de um servidor e chamá-las durante a conversa. O zapzap-mcp expõe 25 ferramentas curadas (enviar texto e mídia, enquetes, botões, checar números, buscar mensagens, grupos, webhooks) em vez de mais de 150 endpoints crus, para o modelo errar menos na escolha.

O código é aberto, está em github.com/zapzapapi/zapzap-mcp e ainda não está publicado no npm. Por isso a instalação é a partir do repositório: clone, instale e compile (Node 18 ou mais novo). Depois aponte o cliente para o arquivo compilado.

Dois comportamentos importantes. As ferramentas de envio são marcadas como não idempotentes e destrutivas, então o cliente MCP pede confirmação a cada envio. E ZAPZAP_READ_ONLY=true remove todas as ferramentas de escrita, que é o padrão certo na primeira semana (já vem ligado nos exemplos abaixo).

Peça algo como: confira se minha instância está conectada e diga quais destes três números têm WhatsApp. Aprove cada chamada manualmente até confiar. Se preferir escrever o seu próprio servidor, o passo a passo do servidor MCP tem o código em TypeScript.

Instalar a partir do GitHub

git clone https://github.com/zapzapapi/zapzap-mcp
cd zapzap-mcp
npm install
npm run build
# Claude Code:
claude mcp add zapzap -e ZAPZAP_API_KEY=your-api-key -e ZAPZAP_API_SECRET=your-api-secret -e ZAPZAP_READ_ONLY=true -- node "$(pwd)/dist/src/index.js"

Claude Desktop ou Cursor (JSON)

{
  "mcpServers": {
    "zapzap": {
      "command": "node",
      "args": ["/path/to/zapzap-mcp/dist/src/index.js"],
      "env": {
        "ZAPZAP_API_KEY": "your-api-key",
        "ZAPZAP_API_SECRET": "your-api-secret",
        "ZAPZAP_READ_ONLY": "true"
      }
    }
  }
}

Caminho 2: fluxo no n8n com o nó AI Agent

O fluxo tem cinco nós. 1) Webhook recebe o evento messages da instância (registre a URL de produção no endpoint de webhook). 2) Code extrai número, texto e id da mensagem e descarta eventos com fromMe verdadeiro; sem isso o agente responde às próprias respostas em loop. 3) AI Agent com memória em janela, usando o número do contato como chave de sessão, para cada cliente ter a própria conversa; coloque a regra de passagem para humano no prompt de sistema, por exemplo responder com uma frase fixa quando o cliente pedir uma pessoa. 4) IF detecta essa frase fixa e marca o contato como com humano. 5) HTTP Request chama POST /api/v1/{instanceId}/send/text com number e text.

Existe também um nó da comunidade, o n8n-nodes-zapzap (versão 0.1.3 no npm). Nós de comunidade não verificados só rodam em n8n self-hosted; no n8n Cloud use o HTTP Request com os mesmos cabeçalhos. O passo a passo completo está em agente de IA no WhatsApp com n8n, e há fluxos prontos nos templates de n8n.

Caminho 3: ferramentas para LangChain (Python)

Uma ferramenta é uma função com nome, descrição e argumentos tipados. O modelo decide quando chamar; a função decide o que é permitido. As travas ficam na função, nunca no prompt. O exemplo abaixo tem duas ferramentas: checar números e enviar texto só para uma lista permitida, com envio desligado até você definir ZAPZAP_ENABLE_SEND=true.

Ligue as ferramentas a um agente com LangChain 1.x (create_agent) ou com o decorator tool do CrewAI, e confira a documentação da sua versão, porque os dois projetos mudam rápido. Aprovação humana antes do envio real vem dos recursos de interrupção ou human-input do seu framework. A versão completa está no guia de LangChain e CrewAI.

Python: ferramentas

import os
import re
import requests
from langchain_core.tools import tool

BASE = "https://api.zapzapapi.com/api/v1"
INSTANCE = os.environ["ZAPZAP_INSTANCE_ID"]
HEADERS = {
    "x-api-key": os.environ["ZAPZAP_API_KEY"],
    "x-api-secret": os.environ["ZAPZAP_API_SECRET"],
}
ALLOWED = {n.strip() for n in os.environ.get("ZAPZAP_ALLOWED", "").split(",") if n.strip()}
SEND_ENABLED = os.environ.get("ZAPZAP_ENABLE_SEND") == "true"


def _post(path: str, body: dict) -> dict:
    r = requests.post(f"{BASE}/{INSTANCE}{path}", json=body, headers=HEADERS, timeout=20)
    r.raise_for_status()
    return r.json()


@tool
def check_whatsapp_numbers(numbers: list[str]) -> str:
    """Check which phone numbers are registered on WhatsApp.
    Numbers: country code plus digits only, for example 5511999999999."""
    clean = [n for n in numbers if re.fullmatch(r"\d{10,15}", n)]
    if not clean:
        return "No valid numbers. Use country code and digits only."
    return str(_post("/chat/check", {"numbers": clean}))


@tool
def send_whatsapp_text(number: str, text: str) -> str:
    """Send a WhatsApp text to ONE allowed recipient. Never invent numbers."""
    if not re.fullmatch(r"\d{10,15}", number):
        return "Invalid number format."
    if number not in ALLOWED:
        return "Blocked: this number is not on the allowed list."
    if len(text) > 1000:
        return "Blocked: text too long."
    if not SEND_ENABLED:
        return f"Safe mode, not sent. Would send to {number}: {text[:80]}"
    return str(_post("/send/text", {"number": number, "text": text}))

Python: agente

from langchain.agents import create_agent

agent = create_agent(
    model="provider:model-name",   # fill in the provider you have a key for
    tools=[check_whatsapp_numbers, send_whatsapp_text],
    system_prompt="You help the support team. Only message people on the allowed list.",
)
result = agent.invoke({"messages": [{"role": "user", "content": "Is 5511999999999 on WhatsApp?"}]})

As travas, qualquer que seja o caminho

TravaPor quê
------
Lista de destinatários permitidos, dentro da ferramentaO modelo pode errar ou ser induzido
Aprovação humana por envioÚltima barreira antes de uma mensagem real
Primeiro, modo somente leituraTesta consultas sem risco de envio
Limite por hora e registro das chamadasContém um agente em loop e gera trilha de auditoria
Instância dedicadaMantém o risco longe do número principal
Texto recebido é entrada não confiávelUm cliente pode escrever instruções para o modelo (prompt injection)

O risco que você não deve pular

API não oficial vai contra os termos do WhatsApp e um número pode ser limitado ou banido. Agente não reduz esse risco; pode aumentar se começar conversa fria em volume. Recursos anti-bloqueio, como digitando automático e ritmo de envio, reduzem o risco, não o eliminam, e ninguém honesto promete o contrário.

Use agentes para responder quem escreveu primeiro, apoiar o time e tarefas internas, e só mande mensagem para quem concordou em receber. Veja o guia anti-bloqueio e a política de uso aceitável. Se você precisa de canal oficial, use a Cloud API da Meta: o comparativo oficial x não oficial mostra quando cada uma vence.

Experimente

R$15 por número ativo por mês, pré-pago, sem cobrança por mensagem (preços). Contas novas recebem crédito de boas-vindas ao verificar o telefone, conforme a campanha vigente. O início rápido leva da conta à primeira mensagem.

Resumo rápido

  • MCP para assistentes de desktop, n8n para automação por evento, ferramentas em Python para o seu backend: os três usam a mesma API REST.
  • O zapzap-mcp é de código aberto no GitHub e ainda não está no npm: instale clonando e compilando o repositório.
  • As travas ficam dentro da ferramenta: lista de destinatários, aprovação humana, modo somente leitura e limite por hora.
  • Agente de IA não diminui o risco de bloqueio do número. Use para responder quem escreveu primeiro e para tarefas internas.

Perguntas frequentes

O servidor MCP da ZapZap já está no npm?

Ainda não. O código é aberto em github.com/zapzapapi/zapzap-mcp e você instala clonando, rodando npm install e npm run build, e apontando o cliente MCP para o arquivo compilado. Quando for publicado no npm, o guia será atualizado.

Posso deixar o agente enviar mensagens sozinho?

Pode, mas comece com aprovação humana por envio, lista de destinatários permitidos e modo somente leitura. As travas devem ficar dentro da ferramenta, não só no prompt, porque o modelo pode errar ou ser induzido por texto recebido.

O n8n Cloud aceita o nó da ZapZap?

Nós de comunidade não verificados só rodam em n8n self-hosted. No n8n Cloud use o nó HTTP Request com os cabeçalhos x-api-key e x-api-secret.

Usar um agente de IA aumenta o risco de bloqueio do número?

Pode aumentar, se o agente começar conversas frias em volume. Uma API não oficial vai contra os termos do WhatsApp e nenhum recurso elimina o risco. Para canal homologado, use a API oficial da Meta.

Dê um canal de WhatsApp ao seu agente

Conecte um número de teste, comece em modo somente leitura e libere o envio quando as travas estiverem no lugar. R$15 por número ativo ao mês.