Cómo conectar Claude con WhatsApp paso a paso
Monta un bot de WhatsApp con Claude usando Twilio y un webhook en Python que responde en tiempo real.

- Cuenta de Anthropic con API key activa
- Cuenta gratuita de Twilio (con sandbox de WhatsApp)
- Python 3.10+ instalado
- Conocimientos básicos de Flask y APIs REST
- ngrok o un servidor con URL pública para el webhook
- Configurar el sandbox de WhatsApp de Twilio en minutos
- Crear un webhook en Flask que reciba mensajes entrantes
- Llamar a la API de Claude (claude-opus-4-8) y devolver la respuesta
- Mantener contexto de conversación por número de teléfono
- Evitar los errores más comunes de timeouts y firmas de Twilio
Activar el sandbox de WhatsApp en Twilio
WhatsApp no permite conectar la API oficial de Meta sin verificación de negocio, así que para prototipar usaremos el sandbox de Twilio, que funciona idéntico y está disponible en España y LATAM sin coste inicial. Entra en console.twilio.com, ve a Messaging > Try it out > Send a WhatsApp message. Verás un número de sandbox (normalmente +1 415 523 8886) y un código tipo 'join xxxx-yyyy'. Envía ese mensaje desde tu WhatsApp personal al número del sandbox para vincular tu teléfono. A partir de ahí, cualquier mensaje que envíes a ese número llegará a tu webhook. Anota tu Account SID y Auth Token desde el dashboard: los necesitarás para firmar respuestas y validar peticiones más adelante.
# Verifica tus credenciales de Twilio desde terminal
export TWILIO_ACCOUNT_SID="ACxxxxxxxxxxxxxxxx"
export TWILIO_AUTH_TOKEN="tu_auth_token"
export ANTHROPIC_API_KEY="sk-ant-xxxxxxxx"Instalar dependencias del proyecto
Crea un entorno virtual e instala las librerías necesarias. Usaremos Flask para el servidor web que recibirá los webhooks de Twilio, el SDK oficial de Anthropic para hablar con Claude y el SDK de Twilio para construir respuestas TwiML válidas. Trabajar dentro de un entorno virtual evita conflictos de versiones y facilita el despliegue posterior. Mantén las claves siempre en variables de entorno, nunca hardcodeadas en el código: es el error de seguridad más frecuente cuando se sube el repositorio a GitHub.
python -m venv venv
source venv/bin/activate # En Windows: venv\Scripts\activate
pip install flask anthropic twilioCrear el webhook en Flask
Twilio envía cada mensaje entrante como una petición POST con parámetros codificados en formato form. Los campos clave son 'Body' (el texto del usuario) y 'From' (el número en formato whatsapp:+34...). Nuestro endpoint debe responder con TwiML: un XML sencillo que Twilio interpreta como el mensaje a devolver. Aquí montamos el esqueleto que extrae el mensaje y prepara la respuesta. Importante: Twilio espera una respuesta HTTP en menos de 15 segundos, así que el paso de llamar a Claude debe ser rápido; más adelante veremos cómo controlar la longitud de la salida para no pasarnos.
from flask import Flask, request
from twilio.twiml.messaging_response import MessagingResponse
app = Flask(__name__)
@app.route("/webhook", methods=["POST"])
def webhook():
mensaje_usuario = request.form.get("Body", "")
numero = request.form.get("From", "")
print(f"Mensaje de {numero}: {mensaje_usuario}")
respuesta_texto = generar_respuesta(numero, mensaje_usuario)
twiml = MessagingResponse()
twiml.message(respuesta_texto)
return str(twiml), 200, {"Content-Type": "application/xml"}
if __name__ == "__main__":
app.run(port=5000)Integrar la API de Claude con memoria por usuario
Ahora conectamos Claude. Usamos el modelo claude-opus-4-8 y guardamos el historial de cada número en un diccionario en memoria para mantener contexto conversacional. En producción esto debería ir a Redis o una base de datos, pero para el prototipo un dict basta. Limitamos max_tokens para que la respuesta llegue rápido y quepa en un mensaje de WhatsApp (que corta textos muy largos). El system prompt define la personalidad del bot: aquí lo configuramos como asistente conciso en español, ideal para el mercado hispanohablante. Cada respuesta se añade al historial para que Claude recuerde el hilo.
import anthropic
client = anthropic.Anthropic()
historiales = {}
def generar_respuesta(numero, mensaje):
historial = historiales.get(numero, [])
historial.append({"role": "user", "content": mensaje})
resp = client.messages.create(
model="claude-opus-4-8",
max_tokens=400,
system="Eres un asistente por WhatsApp. Responde en español, breve y claro (máx 3 frases).",
messages=historial,
)
texto = resp.content[0].text
historial.append({"role": "assistant", "content": texto})
historiales[numero] = historial[-10:] # conserva últimos 10 turnos
return textoExponer el servidor con ngrok y configurar el webhook
Twilio necesita una URL pública para enviarte los mensajes. En local, ngrok crea un túnel HTTPS hacia tu puerto 5000. Arranca primero Flask y luego ngrok en otra terminal. Copia la URL https que te da ngrok y pégala en el sandbox de Twilio, en el campo 'When a message comes in', añadiendo la ruta /webhook y método POST. Guarda los cambios y envía un mensaje de WhatsApp al número del sandbox: deberías ver la petición en la consola de Flask y recibir la respuesta de Claude en tu móvil en pocos segundos.
# Terminal 1
python app.py
# Terminal 2
ngrok http 5000
# Copia la URL https://xxxx.ngrok-free.app y configúrala en Twilio como:
# https://xxxx.ngrok-free.app/webhookValidar la firma de Twilio para seguridad
Cualquiera que descubra tu URL de ngrok podría enviar peticiones falsas y consumir tu cuota de Claude. Twilio firma cada petición con una cabecera X-Twilio-Signature que puedes validar con tu Auth Token. Añade esta comprobación al inicio del webhook para rechazar peticiones no autenticadas. Esto es imprescindible antes de pasar a producción, especialmente si vas a manejar datos de clientes bajo el RGPD europeo.
from twilio.request_validator import RequestValidator
import os
validator = RequestValidator(os.environ["TWILIO_AUTH_TOKEN"])
@app.route("/webhook", methods=["POST"])
def webhook():
firma = request.headers.get("X-Twilio-Signature", "")
url = request.url
if not validator.validate(url, request.form, firma):
return "Firma inválida", 403
# ...resto del código del paso 3Has construido un bot de WhatsApp funcional que recibe mensajes reales, mantiene contexto por usuario y responde con Claude claude-opus-4-8 en español, todo con validación de seguridad de Twilio. Esta base te permite pasar a la API oficial de Meta cuando verifiques tu negocio. Si quieres profundizar en construir sobre la API de Claude con arquitecturas más robustas, colas de mensajes y persistencia real, este proyecto es el punto de partida ideal.