Volver al blog
Desarrolladores

Estados de mensajes en la API de Waspy: queued, sent, delivered, read y failed

El POST deja el mensaje en queued. Meta lo pasa a sent, delivered, read o failed. Lo leés en GET /messages/:id y en el webhook message.status_changed. clientRef vuelve igual.

· 11 min
Estados de mensajes en la API de Waspy: queued, sent, delivered, read y failed

Respuesta corta: POST /api/v2/messages responde 201 con status: "queued". Después el mensaje pasa a sent, delivered, read, o a failed. Lo consultás con GET /api/v2/messages/:id (scope messages:read) o con el webhook message.status_changed. Si mandaste clientRef, vuelve igual en los dos.

El ciclo está en estados de mensajes. El sobre del webhook está en eventos. El campo en el POST está en messages. Cómo dar de alta la suscripción está en gestionar webhooks.

Los cinco estados

EstadoQué pasó
queuedWaspy aceptó el pedido y lo encoló. waMessageId es null
sentMeta aceptó el mensaje. Ahí aparece el waMessageId (wamid...)
deliveredLlegó al teléfono
readLa persona lo leyó. Solo si tiene las confirmaciones de lectura activadas
failedNo salió o no se entregó. Mirá errorCode y errorMessage
curl -sS "https://api.waspytech.com/api/v2/messages/MSG_UUID" \
  -H "Authorization: Bearer $WASPY_API_KEY"

Si el UUID no es de tu cuenta, es 404 MESSAGE_NOT_FOUND. El clientRef va en data.clientRef. La página de conceptos no lo muestra en el ejemplo corto; el serializer del GET sí lo incluye.

No hagas un loop cerrado contra ese GET. Cada lectura cuenta para las 120 por minuto de la cuenta. El webhook es el camino. El límite está en rate limits.

El webhook

message.status_changed llega en un mensaje saliente. El data trae el mensaje y, además, previousStatus y newStatus. clientRef es el string que pusiste en el POST o en cada ítem de POST /messages/batch. Si no mandaste uno, es null.

El recorrido para reconciliar un pedido sin guardar una tabla de ids está en clientRef.

Los eventos pueden llegar desordenados. El procesador se queda con el estado más avanzado:

LlegaSi ahora estáQué hace
deliveredsentAvanza
readdeliveredAvanza
sentdelivered o readLo ignora
failedcualquiera de esosPasa a failed
sentfailedLo ignora. No borra el errorCode
read no implica que la persona haya respondido. La ventana de 24 horas la abre el mensaje de ella, no el tilde azul.

Códigos que vas a ver en failed

errorCode es texto con el número de Meta. La página de conceptos hoy dice que 131047 es “el número no tiene WhatsApp” y que 131056 es “el negocio no puede enviar”. El catálogo que usa el envío dice otra cosa. Para decidir un reintento, manda el catálogo. La lista oficial de Meta está en error codes.

CódigoQué es en el catálogo del producto¿Se reintenta solo?
131047Pasaron más de 24 horas desde el último mensaje de la persona. Hace falta una plantillaNo. Queda failed
131026No se pudo entregar. El número puede no tener WhatsApp o ser inválidoNo
132000La cantidad de parámetros no coincide con la plantillaNo
131056Demasiados mensajes entre este número y ese contactoSí. Sigue en queued y la cola reintenta
132001 (la plantilla no existe o no está aprobada) tampoco es reintentable. Cómo armar el POST para no caer en 132000 está en enviar una plantilla.

Un failed no se cobra: Meta cobra el mensaje entregado. En Argentina, desde el 1 de octubre de 2026, una utilidad entregada sale alrededor de ARS 37,68 (~US$0,026). La rate card es la fuente.

clientRef e Idempotency-Key

Header o campoPara quéTope
Idempotency-KeyQue un reintento del POST no mande dos veces. Dura 24 horas256 caracteres
clientRefQue el webhook y el GET te devuelvan tu id (pedido, ticket)256 caracteres
El primero evita el duplicado. El segundo te deja matchear sent y failed contra tu base cuando el 201 ya volvió. No son intercambiables: una clave de idempotencia repetida no reescribe el estado, devuelve el 201 guardado.

La API pública está en Scale y Enterprise. Diez días sin tarjeta, en el registro. La referencia está en la página de la API y en Planes.

Tu equipo atendiendo por WhatsApp en minutos

CRM facil pero potente. En 10 minutos tenes a tu equipo trabajando — no necesitas hablar con nadie.