Enviar mensaje

Los desarrolladores pueden enviar mensajes a una conversation_id específica mediante la API.

Método de solicitud

POST

URL de solicitud

https://livedesk-api.engagelab.com/api/v2/accounts/conversations/:conversation_id/messages

Autenticación

Para obtener más información, consulta las instrucciones de autenticación en Descripción general de la API.

Solicitud de texto sin formato

Ejemplo de solicitud

curl -X POST 'https://livedesk-api.engagelab.com/api/v2/accounts/conversations/:conversation_id/messages' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic base64(api_key:api_secret)' \ -d '{ "content": "Customer service is sending a message. Is this normal?", "private": false, "content_attributes": { "in_reply_to": 29 } }'
              
              curl -X POST 'https://livedesk-api.engagelab.com/api/v2/accounts/conversations/:conversation_id/messages' \
-H 'Content-Type: application/json' \
-H 'Authorization: Basic base64(api_key:api_secret)' \
-d '{
    "content": "Customer service is sending a message. Is this normal?",
    "private": false,
    "content_attributes": {
        "in_reply_to": 29
    }
}'

            
Este bloque de código se muestra en una ventana flotante

Encabezados de la solicitud

Campo Tipo Descripción
Authorization string Autentica mediante Authorization: Basic base64(API Key:API Secret). Accede a la página API Keys para obtener la API Key y la API Secret, únelas con dos puntos y codifícalas en Base64.
Content-Type application/json Tipo de contenido. Usa application/json para mensajes de texto sin formato.

Parámetros de ruta

Campo Tipo Obligatorio Descripción
conversation_id string ID de la conversación.

Parámetros del cuerpo de la solicitud

Campo Tipo Obligatorio Descripción
content String Contenido del mensaje.
private Boolean No Indica si el mensaje es privado. El valor predeterminado es false.
content_attributes Object No Atributos del contenido. Por ejemplo, al responder a un mensaje, utiliza el campo in_reply_to para especificar el ID del mensaje.

Ejemplo de respuesta de texto sin formato

Ejemplo de respuesta

{ "id": 3030, "content": "Customer service is sending a message. Is this normal?", "inbox_id": 79, "conversation_id": 141, "message_type": 1, "content_type": "text", "status": "sent", "content_attributes": {}, "created_at": 1762331029, "private": false, "source_id": null, "sorting_id": 4, "sender": { "id": 3, "name": "TEST", "available_name": "TEST", "avatar_url": "", "type": "user", "availability_status": "offline", "thumbnail": "" } }
              
              {
    "id": 3030,
    "content": "Customer service is sending a message. Is this normal?",
    "inbox_id": 79,
    "conversation_id": 141,
    "message_type": 1,
    "content_type": "text",
    "status": "sent",
    "content_attributes": {},
    "created_at": 1762331029,
    "private": false,
    "source_id": null,
    "sorting_id": 4,
    "sender": {
        "id": 3,
        "name": "TEST",
        "available_name": "TEST",
        "avatar_url": "",
        "type": "user",
        "availability_status": "offline",
        "thumbnail": ""
    }
}

            
Este bloque de código se muestra en una ventana flotante

Parámetros de respuesta

Campo Tipo Descripción
id Int ID del mensaje.
content String Contenido del mensaje.
inbox_id Int ID de la bandeja de entrada.
conversation_id Int ID de la conversación.
message_type Int Tipo de mensaje.
content_type String Tipo de contenido.
status String Estado del mensaje, como sent o delivered.
content_attributes Object Atributos del contenido.
created_at Int Marca de tiempo de creación del mensaje.
private Boolean Indica si el mensaje es privado.
source_id Int ID de origen.
sorting_id Int ID de ordenación.
sender Object Información del remitente.
sender.id Int ID del remitente.
sender.name String Nombre del remitente.
sender.available_name String Nombre mostrado del remitente.
sender.avatar_url String URL del avatar del remitente.
sender.type String Tipo de remitente, como user.
sender.availability_status String Estado de conexión del remitente, como offline.
sender.thumbnail String Miniatura del remitente.

Solicitudes de imágenes, audio y otros archivos

Ejemplo de solicitud

curl -X POST "https://livedesk.engagelab.com/api/v2/accounts/conversations/:conversation_id/messages" \ -H "Authorization: Basic base64(api_key:api_secret)" \ -F "attachments[]=@/path/to/your/file.jpg" \ -F "content=Detailed image below"
              
              curl -X POST "https://livedesk.engagelab.com/api/v2/accounts/conversations/:conversation_id/messages" \
  -H "Authorization: Basic base64(api_key:api_secret)" \
  -F "attachments[]=@/path/to/your/file.jpg" \
  -F "content=Detailed image below"

            
Este bloque de código se muestra en una ventana flotante

Parámetros de ruta

Campo Tipo Obligatorio Descripción
conversation_id string ID de la conversación.

Ejemplo de respuesta de imágenes, audio y otros archivos

Ejemplo de respuesta

{ "id": 3031, "content": "Detailed image below", "inbox_id": 79, "conversation_id": 141, "message_type": 1, "content_type": "text", "status": "sent", "content_attributes": {}, "created_at": 1762331762, "private": false, "source_id": null, "sorting_id": 5, "sender": { "id": 3, "name": "Wenjie Yu", "available_name": "Wenjie Yu", "avatar_url": "", "type": "user", "availability_status": "offline", "thumbnail": "" }, "attachments": [ { "id": 199, "message_id": 3031, "file_type": "image", "account_id": 14, "extension": null, "data_url": "https://livedesk.engagelab.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBamNUIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--727ba7469d64f90790d242c743f254b5c9013fe1/android-icon-48x48.png", "thumb_url": "https://livedesk.engagelab.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBamNUIiwiZXhwIjpudWxsLCJwdXIiOiJ2YXJpYXRpb24ifX0tLTYzYzg5MGNiZjE3M2ViM2RjOTJhODc4NmZjYzNlMTIwYzMyOTg1MmQvYW5kcm9pZC1pY29uLTQ4eDQ4LnBuZw==", "file_size": 589136, "width": null, "height": null } ] }
              
              {
    "id": 3031,
    "content": "Detailed image below",
    "inbox_id": 79,
    "conversation_id": 141,
    "message_type": 1,
    "content_type": "text",
    "status": "sent",
    "content_attributes": {},
    "created_at": 1762331762,
    "private": false,
    "source_id": null,
    "sorting_id": 5,
    "sender": {
        "id": 3,
        "name": "Wenjie Yu",
        "available_name": "Wenjie Yu",
        "avatar_url": "",
        "type": "user",
        "availability_status": "offline",
        "thumbnail": ""
    },
    "attachments": [
        {
            "id": 199,
            "message_id": 3031,
            "file_type": "image",
            "account_id": 14,
            "extension": null,
            "data_url": "https://livedesk.engagelab.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBamNUIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--727ba7469d64f90790d242c743f254b5c9013fe1/android-icon-48x48.png",
            "thumb_url": "https://livedesk.engagelab.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBamNUIiwiZXhwIjpudWxsLCJwdXIiOiJ2YXJpYXRpb24ifX0tLTYzYzg5MGNiZjE3M2ViM2RjOTJhODc4NmZjYzNlMTIwYzMyOTg1MmQvYW5kcm9pZC1pY29uLTQ4eDQ4LnBuZw==",
            "file_size": 589136,
            "width": null,
            "height": null
        }
    ]
}

            
Este bloque de código se muestra en una ventana flotante

Parámetros de respuesta

Campo Tipo Descripción
id Int ID del mensaje.
content String Contenido del mensaje.
inbox_id Int ID de la bandeja de entrada.
conversation_id Int ID de la conversación.
message_type Int Tipo de mensaje.
content_type String Tipo de contenido.
status String Estado del mensaje, como sent o delivered.
content_attributes Object Atributos del contenido.
created_at Int Marca de tiempo de creación del mensaje.
private Boolean Indica si el mensaje es privado.
source_id Int ID de origen.
sorting_id Int ID de ordenación.
sender Object Información del remitente.
sender.id Int ID del remitente.
sender.name String Nombre del remitente.
sender.available_name String Nombre mostrado del remitente.
sender.avatar_url String URL del avatar del remitente.
sender.type String Tipo de remitente, como user.
sender.availability_status String Estado de conexión del remitente, como offline.
sender.thumbnail String Miniatura del remitente.
attachments Array Lista de información de los archivos adjuntos.
attachments.id Int ID del archivo adjunto.
attachments.message_id Int ID del mensaje asociado.
attachments.file_type String Tipo de archivo, como image.
attachments.account_id Int ID de la cuenta.
attachments.extension String Extensión del archivo.
attachments.data_url String URL del archivo.
attachments.thumb_url String URL de la miniatura (solo para tipos de imagen).
attachments.file_size Int Tamaño del archivo en bytes.
attachments.width Int Anchura del archivo (solo para tipos de imagen).
attachments.height Int Altura del archivo (solo para tipos de imagen).

Ejemplo de solicitud de mensaje de plantilla de WhatsApp

Ejemplo de solicitud

curl -X POST 'https://livedesk.engagelab.com/api/v2/accounts/conversations/:conversation_id/messages' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic base64(api_key:api_secret)' \ -d '{ "content": "Display text for chat UI", "message_type": "outgoing", "template_params": { "name": "order_update", "namespace": "optional_namespace", "language": "en_US", "category": "MARKETING", "processed_params": { "1": "John", "2": "shipped" }, "header_params": { "type": "text", "text_variables": { "1": "Order #456" } }, "footer_params": { "text_variables": { "1": "Acme Corp" } }, "button_params": [ { "index": 0, "sub_type": "url", "text": "track/12345" } ] } }'
              
              curl -X POST 'https://livedesk.engagelab.com/api/v2/accounts/conversations/:conversation_id/messages' \
-H 'Content-Type: application/json' \
-H 'Authorization: Basic base64(api_key:api_secret)' \
-d '{
    "content": "Display text for chat UI",
    "message_type": "outgoing",
    "template_params": {
      "name": "order_update",
      "namespace": "optional_namespace",
      "language": "en_US",
      "category": "MARKETING",
      "processed_params": {
        "1": "John",
        "2": "shipped"
      },
      "header_params": {
        "type": "text",
        "text_variables": {
         "1": "Order #456" }
      },
      "footer_params": {
        "text_variables": { "1": "Acme Corp" }
      },
      "button_params": [
        {
          "index": 0,
          "sub_type": "url",
          "text": "track/12345"
        }
      ]
    }
  }'

            
Este bloque de código se muestra en una ventana flotante

Parámetros de ruta

Campo Tipo Obligatorio Descripción
conversation_id string ID de la conversación.

Parámetros del cuerpo de la solicitud

Campo Tipo Obligatorio Descripción
content String Contenido del mensaje mostrado en la interfaz de chat.
message_type String Tipo de mensaje. Al enviar un mensaje de plantilla, establécelo en outgoing.
template_params Object Objeto de parámetros del mensaje de plantilla.
template_params.name String Nombre de la plantilla.
template_params.namespace String No Espacio de nombres de la plantilla (utilizado por WhatsApp Cloud o 360Dialog).
template_params.language String Código de idioma de la plantilla, como en_US.
template_params.category String No Categoría de la plantilla, como MARKETING.
template_params.processed_params Object No Valores de las variables del cuerpo de la plantilla. La clave es la posición de la variable ("1", "2") o su nombre.
template_params.header_params Object No Parámetros del componente de encabezado de la plantilla. Consulta las instrucciones siguientes.
template_params.footer_params Object No Parámetros del componente de pie de página de la plantilla. Consulta las instrucciones siguientes.
template_params.button_params Array No Parámetros del componente de botón de la plantilla. Consulta las instrucciones siguientes.

Descripción del parámetro header_params

La estructura de header_params varía en función del tipo de encabezado:

Tipo de texto:

{ "type": "text", "text_variables": { "1": "Order #456" } }
              
              {
  "type": "text",
  "text_variables": { "1": "Order #456" }
}

            
Este bloque de código se muestra en una ventana flotante

Tipo de imagen:

{ "type": "image", "media_url": "https://example.com/image.jpg" }
              
              {
  "type": "image",
  "media_url": "https://example.com/image.jpg"
}

            
Este bloque de código se muestra en una ventana flotante

Tipo de vídeo:

{ "type": "video", "media_url": "https://example.com/video.mp4" }
              
              {
  "type": "video",
  "media_url": "https://example.com/video.mp4"
}

            
Este bloque de código se muestra en una ventana flotante

Tipo de archivo:

{ "type": "document", "media_url": "https://example.com/invoice.pdf", "filename": "invoice.pdf" }
              
              {
  "type": "document",
  "media_url": "https://example.com/invoice.pdf",
  "filename": "invoice.pdf"
}

            
Este bloque de código se muestra en una ventana flotante

Tipo de ubicación:

{ "type": "location", "location": { "latitude": 37.7749, "longitude": -122.4194, "name": "Acme HQ", "address": "123 Main St, San Francisco" } }
              
              {
  "type": "location",
  "location": {
    "latitude": 37.7749,
    "longitude": -122.4194,
    "name": "Acme HQ",
    "address": "123 Main St, San Francisco"
  }
}

            
Este bloque de código se muestra en una ventana flotante
Campo Tipo Obligatorio Descripción
type String Tipo de encabezado. Valores admitidos: text, image, video, document, location.
text_variables Object No Se utiliza para los tipos de texto. La clave es la posición de la variable y el valor es el contenido de sustitución.
media_url String No Se utiliza para los tipos multimedia. URL del archivo multimedia.
filename String No Se utiliza para los tipos de archivo. Nombre del archivo.
location Object No Se utiliza para los tipos de ubicación.
location.latitude Float Latitud.
location.longitude Float Longitud.
location.name String No Nombre de la ubicación.
location.address String No Dirección de la ubicación.

Descripción del parámetro footer_params

{ "text_variables": { "1": "Acme Corp" } }
              
              {
  "text_variables": { "1": "Acme Corp" }
}

            
Este bloque de código se muestra en una ventana flotante
Campo Tipo Obligatorio Descripción
text_variables Object No La clave es la posición de la variable y el valor es el contenido de sustitución.

Descripción del parámetro button_params

[ { "index": 0, "sub_type": "url", "text": "track/12345" }, { "index": 1, "sub_type": "quick_reply", "payload": "OPT_OUT" } ]
              
              [
  {
    "index": 0,
    "sub_type": "url",
    "text": "track/12345"
  },
  {
    "index": 1,
    "sub_type": "quick_reply",
    "payload": "OPT_OUT"
  }
]

            
Este bloque de código se muestra en una ventana flotante
Campo Tipo Obligatorio Descripción
index Int Índice del botón, empezando por 0.
sub_type String Tipo de botón. Valores admitidos: url, quick_reply.
text String No Se utiliza para botones de tipo URL. Sufijo de la URL o ruta de redirección.
payload String No Se utiliza para botones de tipo quick_reply. Contenido de la carga devuelta.

Ejemplo de respuesta

Respuesta correcta

{ "id": 123, "content": "Display text for chat UI", "message_type": 1, "status": "sent", "additional_attributes": { "template_params": { "name": "order_update", "language": "en_US", "category": "MARKETING" } } }
              
              {
  "id": 123,
  "content": "Display text for chat UI",
  "message_type": 1,
  "status": "sent",
  "additional_attributes": {
    "template_params": {
      "name": "order_update",
      "language": "en_US",
      "category": "MARKETING"
    }
  }
}

            
Este bloque de código se muestra en una ventana flotante

Respuesta fallida

{ "id": 123, "status": "failed", "content_attributes": { "external_error": "131047: Re-engagement message is not allowed" } }
              
              {
  "id": 123,
  "status": "failed",
  "content_attributes": {
    "external_error": "131047: Re-engagement message is not allowed"
  }
}

            
Este bloque de código se muestra en una ventana flotante

Parámetros de respuesta

Campo Tipo Descripción
id Int ID del mensaje.
content String Contenido del mensaje.
message_type Int Tipo de mensaje.
status String Estado del mensaje, como sent, delivered o failed.
additional_attributes Object Atributos adicionales.
additional_attributes.template_params Object Información sobre los parámetros de la plantilla enviada.
content_attributes Object Atributos del contenido. Contiene información sobre el error cuando el envío falla.
content_attributes.external_error String Información del error externo devuelta cuando falla el envío del mensaje.

Reintentar mensajes fallidos

Si el estado del mensaje es failed, utiliza el siguiente endpoint para restablecer el estado del mensaje y volver a enviarlo:

URL de solicitud

POST https://livedesk-api.engagelab.com/api/v2/accounts/conversations/:conversation_id/messages/:message_id/retry

Parámetros de ruta

Campo Tipo Obligatorio Descripción
conversation_id string ID de la conversación.
message_id string ID del mensaje.
Icon Solid Transparent White Qiyu
Contacto