Integración
Integración (API REST)
Cómo enviar mensajes de WhatsApp desde tus sistemas con la API REST: ejemplos con curl y Node.js, Idempotency-Key, queueIfOffline, estados y errores comunes.
Descripción
La pantalla Integración del panel es una guía rápida para tu equipo técnico, con ejemplos que ya incluyen la URL de tu cuenta y el ID de tu instancia. La referencia completa de la API está en «Documentación completa (Swagger)».
Guía de implementación
- Ten una instancia «Conectada» y anota su ID
- Crea una API key con messages.send (y messages.read para consultar)
- Prueba el envío con el ejemplo de curl de la pantalla Integración
- Configura un webhook con message.status para recibir los estados
Depende de
Lo usan
Ningún otro módulo depende de este.
Funcionalidades
- Ejemplos listos para copiar con curl y Node.js, con tu instancia
- Envío de texto y de archivos (URL o base64, hasta 16 MB)
- Idempotency-Key para que un reintento no duplique el mensaje
- Encolar mientras la instancia está desconectada (queueIfOffline)
- Consulta de estado por ID o por referencia
- Tabla de errores frecuentes y enlace a la documentación completa (Swagger)
Manual de usuario
Antes de empezar #
Necesitas una instancia conectada y una API key. Todas las respuestas llegan como { "data": ... } y los errores como { "error": { "code", "message", "details", "traceId" } }.
- Paso 1: Revisa que la instancia diga «Conectada» en Instancias
- Paso 2: Crea una API key con el permiso messages.sendY messages.read si vas a consultar estados.
- Paso 3: Envía la llave en el header X-API-KeyTambién se acepta Authorization: Bearer <key>.
- Paso 4: Si tienes varias instancias, elige cuál usar en «Instancia para los ejemplos»
Relacionado: Instancias · API keys
Enviar un mensaje por API #
- Inicio: Tu sistemaPOST /messages
- Paso: 202 queuedEntra a la cola
- Paso: Sale en ordenPausa de ~2–3 s
- Paso: WhatsAppsent → delivered → read
- Fin: Webhookmessage.status
Haz un POST a /instances/<ID>/messages con el número destino (to), el texto y, opcionalmente, una referencia de tu sistema. La respuesta 202 trae el mensaje con estado queued: entró a la cola y saldrá en orden. Ejemplo con curl: curl -X POST "https://chat-digital.com/api/v1/instances/1/messages" -H "X-API-Key: TU_API_KEY" -H "Content-Type: application/json" -H "Idempotency-Key: pedido-1234-confirmacion" -d '{"to":"5215512345678","text":"Tu pedido #1234 fue confirmado.","reference":"pedido-1234"}'
- Paso 1: Copia el ejemplo de «2. Enviar un mensaje» en la pantalla Integración
- Paso 2: Reemplaza TU_API_KEY por tu llave y el número por uno de prueba
- Paso 3: Ejecútalo y guarda el id que regresa en data.id
Evitar duplicados con Idempotency-Key #
Si tu sistema reintenta un envío (por un timeout o un reinicio), el header Idempotency-Key evita que el cliente reciba el mensaje dos veces: con la misma llave, la API devuelve el mensaje original (200) en lugar de enviar otro. Usa un valor derivado del evento de negocio, por ejemplo pedido-1234-confirmacion, no un valor aleatorio en cada intento.
Instancia desconectada: queueIfOffline #
Por omisión, si la instancia no está conectada la API responde 409 INSTANCE_NOT_READY y el mensaje no se guarda. Si envías "queueIfOffline": true, el mensaje espera en cola hasta 24 horas y sale cuando la instancia se conecte; si no se conecta a tiempo, queda Fallido con «Expiró en cola».
Relacionado: Instancias
Consultar el estado #
Consulta GET /messages/<id> o busca por tu referencia con GET /messages?reference=pedido-1234. Los estados son queued → sending → sent → delivered → read (played en notas de voz) o failed con el motivo en error. Mejor aún: configura un webhook con el evento message.status y recibe cada cambio sin consultar.
Errores comunes #
400 VALIDATION_ERROR: datos inválidos; error.details dice qué campo. 401: API key inválida, revocada o expirada. 403: a la llave le falta el permiso o está limitada a otra instancia (TENANT_SUSPENDED si la cuenta está suspendida). 409 INSTANCE_NOT_READY: la instancia no está conectada; usa queueIfOffline. 429 QUOTA_EXCEEDED: se alcanzó el límite diario del plan (se reinicia a las 00:00 UTC). 429 RATE_LIMITED: más de 300 peticiones por minuto con la misma llave.
Preguntas frecuentes
¿Puedo usar la API para envíos masivos?
No es su propósito. Los mensajes salen en orden y con pausa para reducir el riesgo de que WhatsApp bloquee el número; enviar a contactos que no esperan tu mensaje puede provocar un bloqueo.
¿En qué formato va el número destino?
Con código de país, solo dígitos (se ignoran +, espacios y guiones), por ejemplo 5215512345678. Para grupos usa su chatId, que termina en @g.us.