Miércoles, 22 de julio de 2026  ·  LATAM / Español
ÚLTIMA HORA
Anthropic lanza mejoras en la API de Claude para América Latina  ·  MCP 2026-07-28 ya en release candidate  ·  Claude Sonnet 5 supera benchmarks de coding agéntico  ·  Claude Code alcanza $1B de run-rate en 6 meses  ·  NSA publica guía de seguridad para el protocolo MCP
Hace 45 min →
Intermedio 45 min en total 6 pasos

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.

Imagen de portada editorial · Cómo conectar Claude con WhatsApp paso a paso · Educación · Claude Builders
Requisitos
  • 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
Lo que vas a aprender
  • 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
PASO 1 · ~8 min

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.

bash
# 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"
ConsejoEl sandbox caduca la vinculación cada 72 horas de inactividad; si el bot deja de recibir mensajes, reenvía el 'join xxxx-yyyy'.
Error comúnNo uses la API de Meta Cloud directamente para prototipos: requiere verificar el negocio y una plantilla aprobada, lo que puede tardar días.
PASO 2 · ~5 min

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.

bash
python -m venv venv
source venv/bin/activate  # En Windows: venv\Scripts\activate
pip install flask anthropic twilio
ConsejoFija las versiones en un requirements.txt (pip freeze > requirements.txt) para que el despliegue sea reproducible.
PASO 3 · ~8 min

Crear 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.

python
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)
ConsejoDevuelve siempre Content-Type application/xml o Twilio ignorará tu respuesta silenciosamente.
Error comúnNo respondas con JSON: Twilio solo entiende TwiML. Si devuelves JSON, el usuario nunca recibirá el mensaje.
PASO 4 · ~8 min

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.

python
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 texto
ConsejoRecorta el historial a los últimos turnos para controlar coste y latencia; 10 mensajes suele ser suficiente contexto.
Error comúnUn max_tokens alto puede superar los 15s de timeout de Twilio y dejar al usuario sin respuesta. 400 tokens es un buen equilibrio.
PASO 5 · ~5 min

Exponer 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.

bash
# 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/webhook
ConsejoLa URL gratuita de ngrok cambia en cada reinicio; actualízala en Twilio cada vez o usa un dominio reservado de ngrok.
Error comúnSi Twilio marca error 11200, casi siempre es porque tu servidor tardó más de 15s o devolvió un código distinto de 200.
PASO 6 · ~6 min

Validar 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.

python
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 3
ConsejoSi usas ngrok con HTTPS pero tu app ve la URL como HTTP tras un proxy, fuerza request.url a https o la validación fallará.
Error comúnNo desactives la validación 'temporalmente' en producción: es la puerta de entrada a abuso de tu API key.
Resultado

Has 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.

PRÓXIMOS PASOS