Ir al contenido

Enviar mensajes ​

Todo se envía con un solo endpoint: POST /api/v1/messages. Necesitas una clave con el scope messages:send y una instancia conectada.

Enviar un texto ​

bash
curl -X POST "https://zappio.cloud/api/v1/messages" \
  -H "Authorization: Bearer $ZAPPIO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: pedido-1042" \
  -d '{
    "instance": "ins_...",
    "to": "5215500000000",
    "type": "text",
    "text": "Tu pedido 1042 va en camino"
  }'
CampoQué es
instanceEl id de la instancia desde la que se envía (ins_...).
toEl destinatario: un número en formato internacional o un id de grupo (grp_...).
typetext, image, document, audio o video.
textEl mensaje, de hasta 4096 caracteres (para type: text).

to como número: con código de país primero. Los espacios, guiones, paréntesis y un + inicial se ignoran; deben quedar entre 8 y 15 dígitos. Si es un grupo, usa su id (ver Grupos).

Qué responde la API ​

El envío es asíncrono. La API responde 202 Accepted en cuanto el mensaje queda en cola, sin esperar a WhatsApp:

json
{
  "data": {
    "id": "msg_01EXAMPLE00000000000000001",
    "instance_id": "ins_01EXAMPLE00000000000000001",
    "direction": "outbound",
    "type": "text",
    "status": "queued",
    "to": "5215500000000",
    "from": null,
    "group_id": null,
    "text": "Tu pedido 1042 va en camino",
    "created_at": "2026-01-31T14:05:09+00:00",
    "queued_at": "2026-01-31T14:05:09+00:00",
    "sent_at": null,
    "delivered_at": null,
    "read_at": null
  }
}

Guarda el id del mensaje: sirve para consultarlo y para relacionarlo con los eventos que llegan por webhook.

Ciclo de vida de un mensaje ​

queued → processing → sent → delivered → read, o failed.

EstadoSignifica
queuedEn cola.
processingZAPPIO lo está enviando.
sentWhatsApp lo aceptó.
deliveredLlegó al teléfono del destinatario.
readEl destinatario lo leyó.
failedNo se pudo enviar. error.code explica el motivo.

Los estados sent, delivered y read dependen de WhatsApp: pueden llegar tarde o saltarse alguno. Los mensajes que recibes de tus clientes tienen direction: "inbound" y status: "received".

Un mensaje failed trae error.code: MESSAGE_SEND_EXPIRED, INSTANCE_NOT_CONNECTED, INVALID_RECIPIENT, RECIPIENT_NOT_ON_WHATSAPP, MEDIA_UNAVAILABLE, UNSUPPORTED_MESSAGE_TYPE, GATEWAY_UNAVAILABLE o MESSAGE_SEND_FAILED.

Seguir un mensaje ​

Por webhook (recomendado): recibes message.sent, message.delivered, message.read y message.failed sin consultar. Ver Webhooks.

Por consulta: GET /api/v1/messages/{message} (scope messages:read) devuelve el mensaje con su estado actual.

bash
curl "https://zappio.cloud/api/v1/messages/msg_..." -H "Authorization: Bearer $ZAPPIO_API_KEY"

GET /api/v1/messages lista tus mensajes (enviados y recibidos), los más recientes primero, con paginación por cursor (ver Convenciones). Acepta filtros por instance, direction, type y status.

Errores frecuentes al enviar ​

RespuestaCódigoQué hacer
409INSTANCE_NOT_CONNECTEDConecta la instancia (Instancias).
422INVALID_RECIPIENTto no es un número válido ni un id de grupo.
422UNSUPPORTED_MESSAGE_TYPEEl tipo no existe o la instancia no puede enviarlo.
404INSTANCE_NOT_FOUNDEl id de instancia no existe en tu espacio de trabajo.
402TRIAL_LIMIT_REACHEDSe usaron los mensajes de la prueba (planes).
429SEND_BACKLOGLa instancia tiene demasiados mensajes en espera; reintenta tras Retry-After.

La lista completa está en Errores. Para reintentar un envío sin riesgo de duplicarlo, usa Idempotencia.