IA

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

Un agente de IA que solo conversa contigo en una ventana de chat sirve a medias. La otra mitad es llegar a quienes ya viven en WhatsApp: clientes, leads, tu propio equipo. Esta guía muestra tres formas de conectar un número de WhatsApp a un agente (servidor MCP, n8n y herramientas en Python) y los seguros que debes tener antes de dejar que el agente envíe cualquier cosa. Transparencia: ZapZap API es una API no oficial. Conectas un número común por código QR, sin verificación de negocio de Meta y sin plantillas. Ese es también su principal riesgo, por eso una sección entera habla de él.

Publicado el · 6 min de lectura

Este artículo también está disponible en: Português · English

Elige el camino según dónde corre el agente

Dónde corre el agenteCamino¿Necesita código?
---------
Asistente de escritorio (Claude Desktop, Claude Code, Cursor)Servidor MCPNo, una entrada de configuración
Automatizaciones disparadas por evento (el cliente escribe, el agente responde)Flujo en n8nPoco
Tu producto o backendHerramientas en Python o Node (LangChain, CrewAI, bucle propio)Sí

Los tres usan la misma API REST: https://api.zapzapapi.com/api/v1/{instanceId}/..., autenticada con dos encabezados, x-api-key y x-api-secret (autenticación). Si tu framework lee OpenAPI, la especificación es pública: OpenAPI de ZapZap. La página de agentes de IA reúne las tres opciones en un solo lugar.

Camino 1: servidor MCP para Claude y Cursor

MCP (Model Context Protocol) permite que un cliente de IA descubra herramientas de un servidor y las llame durante la conversación. zapzap-mcp expone 25 herramientas curadas (enviar texto y multimedia, encuestas, botones, comprobar números, buscar mensajes, grupos, webhooks) en lugar de más de 150 endpoints crudos, para que el modelo se equivoque menos al elegir.

El código es abierto, está en github.com/zapzapapi/zapzap-mcp y todavía no está publicado en npm. Por eso la instalación es desde el repositorio: clona, instala y compila (Node 18 o más nuevo). Luego apunta el cliente al archivo compilado.

Dos comportamientos importantes. Las herramientas de envío están marcadas como no idempotentes y destructivas, así que el cliente MCP pide confirmación en cada envío. Y ZAPZAP_READ_ONLY=true quita todas las herramientas de escritura, que es el valor correcto durante la primera semana (ya viene activado en los ejemplos).

Pide algo como: comprueba si mi instancia está conectada y dime cuáles de estos tres números tienen WhatsApp. Aprueba cada llamada a mano hasta que confíes. Si prefieres escribir tu propio servidor, el paso a paso del servidor MCP tiene el código en 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"
      }
    }
  }
}

Camino 2: flujo en n8n con el nodo AI Agent

El flujo tiene cinco nodos. 1) Webhook recibe el evento messages de la instancia (registra la URL de producción en el endpoint de webhook). 2) Code extrae número, texto e id del mensaje y descarta los eventos con fromMe verdadero; sin eso el agente responde a sus propias respuestas en bucle. 3) AI Agent con memoria de ventana, usando el número del contacto como clave de sesión, para que cada cliente tenga su propia conversación; pon la regla de traspaso a una persona en el prompt de sistema, por ejemplo responder con una frase fija cuando el cliente pida a alguien. 4) IF detecta esa frase fija y marca el contacto como con humano. 5) HTTP Request llama a POST /api/v1/{instanceId}/send/text con number y text.

También existe un nodo de la comunidad, n8n-nodes-zapzap (versión 0.1.3 en npm). Los nodos de comunidad no verificados solo corren en n8n self-hosted; en n8n Cloud usa HTTP Request con los mismos encabezados. El paso a paso completo está en agente de IA en WhatsApp con n8n, y hay flujos listos en las plantillas de n8n.

Camino 3: herramientas para LangChain (Python)

Una herramienta es una función con nombre, descripción y argumentos tipados. El modelo decide cuándo llamarla; la función decide qué está permitido. Los seguros van en la función, nunca en el prompt. El ejemplo de abajo tiene dos herramientas: comprobar números y enviar texto solo a una lista permitida, con el envío apagado hasta que definas ZAPZAP_ENABLE_SEND=true.

Conecta las herramientas a un agente con LangChain 1.x (create_agent) o con el decorador tool de CrewAI, y revisa la documentación de tu versión, porque ambos proyectos cambian rápido. La aprobación humana antes del envío real viene de las funciones de interrupción o human-input de tu framework. La versión completa está en la guía de LangChain y 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?"}]})

Los seguros, sea cual sea el camino

SeguroPor qué
------
Lista de destinatarios permitidos, dentro de la herramientaEl modelo puede equivocarse o dejarse convencer
Aprobación humana por envíoÚltima barrera antes de un mensaje real
Primero, modo solo lecturaPrueba consultas sin riesgo de envío
Límite por hora y registro de las llamadasContiene a un agente en bucle y deja un rastro de auditoría
Instancia dedicadaMantiene el riesgo lejos de tu número principal
El texto recibido es entrada no confiableUn cliente puede escribir instrucciones dirigidas al modelo (prompt injection)

El riesgo que no debes saltarte

Una API no oficial va contra los términos de WhatsApp y un número puede ser limitado o bloqueado. Un agente no reduce ese riesgo; puede aumentarlo si empieza conversaciones en frío en volumen. Funciones antibloqueo, como el escribiendo automático y el ritmo de envío, reducen el riesgo, no lo eliminan, y nadie honesto promete lo contrario.

Usa agentes para responder a quien escribió primero, apoyar al equipo y tareas internas, y escribe solo a quien aceptó recibir mensajes. Consulta la guía antibloqueo y la política de uso aceptable. Si necesitas un canal oficial, usa la Cloud API de Meta: el comparativo oficial vs no oficial muestra cuándo gana cada una.

Pruébalo

R$15 por número activo al mes, prepago, sin cobro por mensaje (precios). Las cuentas nuevas reciben un crédito de bienvenida al verificar el teléfono, según la campaña vigente. El inicio rápido te lleva de la cuenta al primer mensaje.

Resumen rápido

  • MCP para asistentes de escritorio, n8n para automatización por evento, herramientas en Python para tu backend: los tres usan la misma API REST.
  • zapzap-mcp es de código abierto en GitHub y aún no está en npm: instálalo clonando y compilando el repositorio.
  • Los seguros van dentro de la herramienta: destinatarios permitidos, aprobación humana, modo solo lectura y límite por hora.
  • Un agente de IA no reduce el riesgo de bloqueo del número. Úsalo para responder a quien escribió primero y para tareas internas.

Lee también

Preguntas frecuentes

¿El servidor MCP de ZapZap ya está en npm?

Todavía no. El código es abierto en github.com/zapzapapi/zapzap-mcp: clónalo, ejecuta npm install y npm run build, y apunta tu cliente MCP al archivo compilado. Esta guía se actualizará cuando se publique en npm.

¿Puedo dejar que el agente envíe mensajes solo?

Puedes, pero empieza con aprobación humana por envío, lista de destinatarios permitidos y modo solo lectura. Los seguros deben ir dentro de la herramienta, no solo en el prompt, porque el modelo puede equivocarse o ser inducido por el texto recibido.

¿n8n Cloud acepta el nodo de ZapZap?

Los nodos de comunidad no verificados solo corren en n8n self-hosted. En n8n Cloud usa el nodo HTTP Request con los encabezados x-api-key y x-api-secret.

¿Usar un agente de IA aumenta el riesgo de bloqueo del número?

Puede aumentarlo si el agente empieza conversaciones en frío en volumen. Una API no oficial va contra los términos de WhatsApp y ninguna función elimina el riesgo. Para un canal homologado, usa la API oficial de Meta.

Dale un canal de WhatsApp a tu agente

Conecta un número de prueba, empieza en modo solo lectura y activa el envío cuando los seguros estén en su lugar. R$15 por número activo al mes.