API de WhatsApp SENDO
Envía mensajes de WhatsApp a tus clientes.
Enviar mensaje con plantilla
Este endpoint se utiliza para enviar mensajes de WhatsApp a un destino específico usando una plantilla.
Atributos requeridos
| Campo | Tipo | Descripción | Valor por Defecto | Opcional | Ejemplo |
|---|---|---|---|---|---|
| templateName | string | El nombre del template a utilizar para el mensaje. | ninguno | No | template-name |
| senderNumber | string | Número de teléfono del remitente. | ninguno | No | +1234567890 |
| recipientNumber | string | Número de teléfono del destinatario. | ninguno | No | +1234567890 |
| variables | object | Un objeto que contiene variables a ser insertadas en el cuerpo del mensaje. | ninguno | No | { "name": "John Doe", "age": 30, "city": "New York" } |
Cuerpo de la petición.
curl --location 'https:/api.sendo.cloud/api/whatsapp/send-message'
--header 'apikey: API-KEY'
--header 'Content-Type: application/json'
--data-raw '{"templateName": "url_button_test","senderNumber": "593967793436","recipientNumber": "+50584533001","variables": {"nombre":"Jasson"}}'
| Código | Descripción |
|---|---|
| 200 | Exitoso |
{
"status": {
"messageId": "68c9802d-1910-4dba-9048-4a6c98787a0e",
"message": "Mensaje recibido",
}
}
Respuestas del servidor.
Enviar mensaje sin plantilla
Este endpoint se utiliza para enviar mensajes de WhatsApp a un destino específico sin una plantilla.
NOTA: Solo puedes llamar a este endpoint una vez que el usuario haya interactuado con tu negocio, ya sea enviando un mensaje a tu número o respondiendo a un mensaje que fue entregado a través de una plantilla.
| Campo | Tipo | Descripción | Valor por Defecto | Opcional | Comentarios | Ejemplo |
|---|---|---|---|---|---|---|
| senderNumber | string | El número de teléfono del remitente. | ninguno | No | 1234567890 | |
| recipientNumber | string | El número de teléfono del destinatario. | ninguno | No | +1234567890 | |
| type | string | Tipo de mensajes como texto, video, imagen o documento | ninguno | No | text |
NOTA: Consulta la tabla a continuación para conocer más sobre los tipos de mensajes.
Tipos de Interacción
| Campo | Tipo | Descripción | Valor por Defecto | Opcional | Comentarios | Ejemplo |
|---|---|---|---|---|---|---|
| body | string | El texto del mensaje. | ninguno | No | Hola mundo | |
| preview_url | boolean | Muestra una prevista de la url en el cuerpo del mensaje | ninguno | Sí | true |
curl --location 'https:/api.sendo.cloud/api/whatsapp/send-message' \
--header 'apikey: API-KEY' \
--header 'Content-Type: application/json' \
--data-raw '{"senderNumber": "593967793436","recipientNumber": "+50584533001","type": "text","text": {"body":"Este es un mensaje de ejemplo"}}'
| Código | Descripción |
|---|---|
| 200 | Exitoso |
{
"status": {
"messageId": "68c9802d-1910-4dba-9048-4a6c98787a0e",
"message": "Mensaje recibido"
}
}
Respuestas del servidor.
| Campo | Tipo | Descripción | Valor por Defecto | Opcional | Comentarios | Ejemplo |
|---|---|---|---|---|---|---|
| link | string | Enlace de la imagen. | ninguno | No | https://www.sendo.cloud/images/logo.png | |
| caption | string | Título de la imagen. | ninguno | Sí | Esta es una imagen de ejemplo |
NOTA: Consulta esta tabla para ver las imágenes soportadas por META.
curl --location 'https:/api.sendo.cloud/api/whatsapp/send-message' \
--header 'apikey: API-KEY' \
--header 'Content-Type: application/json' \
--data-raw '{"senderNumber": "593967793436","recipientNumber": "+50584533001","type": "image","image": {"link":"https://www.sendo.cloud/images/logo.png","caption":"Esta es una imagen de ejemplo"}}'
| Código | Descripción |
|---|---|
| 200 | Exitoso |
{
"status": {
"messageId": "68c9802d-1910-4dba-9048-4a6c98787a0e",
"message": "Mensaje recibido"
}
}
| Campo | Tipo | Descripción | Valor por Defecto | Opcional | Comentarios | Ejemplo |
|---|---|---|---|---|---|---|
| link | string | Enlace del video. | ninguno | No | https://www.sendo.cloud/images/test.mp4 | |
| caption | string | Título del video. | ninguno | Sí | Este es un video de ejemplo |
NOTA: Consulta esta tabla para ver las imágenes soportadas por META.
curl --location 'https:/api.sendo.cloud/api/whatsapp/send-message' \
--header 'apikey: API-KEY' \
--header 'Content-Type: application/json' \
--data-raw '{"senderNumber": "593967793436","recipientNumber": "+50584533001","type": "video","video": {"link":"https://www.sendo.cloud/images/test.mp4","caption":"Este es un video de ejemplo"}}'
| Código | Descripción |
|---|---|
| 200 | Exitoso |
{
"status": {
"messageId": "68c9802d-1910-4dba-9048-4a6c98787a0e",
"message": "Mensaje recibido"
}
}
| Campo | Tipo | Descripción | Valor por Defecto | Opcional | Comentarios | Ejemplo |
|---|---|---|---|---|---|---|
| link | string | Enlace del documento. | ninguno | No | https://www.sendo.cloud/images/test_document.pdf | |
| filename | string | Nombre del archivo del documento. | ninguno | No | test_document.pdf | |
| caption | string | Título del documento. | ninguno | Sí | Este es un documento de ejemplo |
NOTA: Consulta esta tabla para ver las imágenes soportadas por META.
curl --location 'https:/api.sendo.cloud/api/whatsapp/send-message' \
--header 'apikey: API-KEY' \
--header 'Content-Type: application/json' \
--data-raw '{"senderNumber": "593967793436","recipientNumber": "+50584533001","type": "document","document": {"link":"https://www.sendo.cloud/images/test_document.pdf","filename":"test_document.pdf","caption":"Este es un documento de ejemplo"}}'
| Código | Descripción |
|---|---|
| 200 | Exitoso |
{
"status": {
"messageId": "68c9802d-1910-4dba-9048-4a6c98787a0e",
"message": "Mensaje recibido"
}
}
| Campo | Tipo | Descripción | Valor por Defecto | Opcional | Comentarios | Ejemplo |
|---|---|---|---|---|---|---|
| link | string | Enlace del audio. | ninguno | No | https://www.sendo.cloud/images/test_audio.mp4 |
NOTA: Consulta esta tabla para ver las imágenes soportadas por META.
curl --location 'https:/api.sendo.cloud/api/whatsapp/send-message' \
--header 'apikey: API-KEY' \
--header 'Content-Type: application/json' \
--data-raw '{"senderNumber": "593967793436","recipientNumber": "+50584533001","type": "audio","audio": {"link":"https://www.sendo.cloud/images/test_audio.mp4"}}'
| Código | Descripción |
|---|---|
| 200 | Exitoso |
{
"status": {
"messageId": "68c9802d-1910-4dba-9048-4a6c98787a0e",
"message": "Mensaje recibido"
}
}
Descargar Archivo de Media de WhatsApp
Este endpoint se utiliza para descargar un archivo enviado por el usuario.
NOTA: Este endpoint entrega el archivo vía streaming, por lo que la respuesta es un flujo de bytes.
| Campo | Tipo | Descripción | Valor por Defecto | Opcional | Comentarios | Ejemplo |
|---|---|---|---|---|---|---|
| FILE_ID | string | El id del archivo proporcionado por META WhatsApp | ninguno | No | 1234567890 |
| Código | Descripción |
|---|---|
| 200 | Exitoso |
El archivo se envía vía streaming
Respuestas del servidor.
Webhook
Callback
Los webhooks le permiten recibir notificaciones HTTP en tiempo real sobre eventos en la Plataforma Sendo, como notificaciones de eventos o mensajes de clientes.
Campos Requeridos
| Campo | Tipo | Descripción | Ejemplo |
|---|---|---|---|
| message_id | string | Identificador interno del mensaje en la plataforma Sendo | 8fe793e2-3a5e-452e-a92a-363666248098 |
| waba_id | string | Identificador de la cuenta de whatsapp generado por Meta | 432857389903424 |
| value | object | Detalles de atributos del evento procesado, Ver Definición del campo Value | |
| field | string | Indica el tipo de Evento que se ha solicitado. | messages |
Cuerpo de la Petición
Ejemplo de Respuesta : Actualización del estado del evento
{
"message_id": "8fe793e2-3a5e-452e-a92a-363666248098",
"waba_id": "432857389903424",
"value": {
"messaging_product": "whatsapp",
"metadata": {
"display_phone_number": "593967793436",
"phone_number_id": "401156743081691"
},
"statuses": [
{
"id": "wamid.HBgLNTA1ODY3MjA3NzUVAgARGBIzM0U2M0VFNEM2Njc5ODU1ODEA",
"status": "sent",
"timestamp": "1737575163",
"recipient_id": "50586720775",
"conversation": {
"id": "634fb63c5b96fa266692ca32f5494304",
"expiration_timestamp": "1737661620",
"origin": {
"type": "marketing"
}
}
}
]
},
"field": "messages"
}
Ejemplo 2 de Respuesta : Texto enviado por un cliente como respuesta
{
"message_id": "8fe793e2-3a5e-452e-a92a-363666248098",
"waba_id": "432857389903424",
"value": {
"messaging_product": "whatsapp",
"metadata": {
"display_phone_number": "593967793436",
"phone_number_id": "401156743081691"
},
"contacts": [
{
"profile": {
"name": "Jorge Argeñal"
},
"wa_id": "50586720775"
}
],
"messages": [
{
"from": "50586720775",
"id": "wamid.HBgLNTA1ODY3MjA3NzUVAgASGBQzQTREQTFCRTU1MkFBOTIxMjlCMQA=",
"timestamp": "1737575679",
"text": {
"body": "Si acepto"
},
"type": "text"
}
]
},
"field": "messages"
}
Ejemplo 3 de Respuesta : Video enviado por un cliente como respuesta
{
"message_id": "8fe793e2-3a5e-452e-a92a-363666248098",
"waba_id": "432857389903424",
"value": {
"messaging_product": "whatsapp",
"metadata": {
"display_phone_number": "593967793436",
"phone_number_id": "401156743081691"
},
"contacts": [
{
"profile": {
"name": "Jorge Argeñal"
},
"wa_id": "50586720775"
}
],
"messages": [
{
"from": "50586720775",
"id": "wamid.HBgLNTA1ODY3MjA3NzUVAgASGBQzQTYxMDgxMTk1MUJBNkQ3MTkxQQA=",
"timestamp": "1738183832",
"type": "video",
"video": {
"caption":"Hola",
"mime_type": "video/mp4",
"sha256": "8D96O65u2ZpA+OQBdw1PvKQOH0dSDNtXENfnue8z8DM=",
"id": "1804954366989548"
}
}
]
},
"field": "messages"
}
Ejemplo 4 de Respuesta : Imagen enviada por un cliente como respuesta
{
"message_id": "8fe793e2-3a5e-452e-a92a-363666248098",
"waba_id": "432857389903424",
"value": {
"messaging_product": "whatsapp",
"metadata": {
"display_phone_number": "593967793436",
"phone_number_id": "401156743081691"
},
"contacts": [
{
"profile": {
"name": "Jorge Argeñal"
},
"wa_id": "50586720775"
}
],
"messages": [
{
"from": "50586720775",
"id": "wamid.HBgLNTA1ODY3MjA3NzUVAgASGBQzQUQyQURFMDI1OUEzRDlCQzQ3RAA=",
"timestamp": "1738183940",
"type": "image",
"image": {
"caption":"Hola",
"mime_type": "image/jpeg",
"sha256": "jVIbmT753LbDCN5/msrHSOE2DKEPbwfvltygDNRTdpo=",
"id": "957620909803014"
}
}
]
},
"field": "messages"
}
Ejemplo 5 de Respuesta : Documento enviado por un cliente como respuesta
{
"message_id": "8fe793e2-3a5e-452e-a92a-363666248098",
"waba_id": "432857389903424",
"value": {
"messaging_product": "whatsapp",
"metadata": {
"display_phone_number": "593967793436",
"phone_number_id": "401156743081691"
},
"contacts": [
{
"profile": {
"name": "Jorge Argeñal"
},
"wa_id": "50586720775"
}
],
"messages": [
{
"from": "50586720775",
"id": "wamid.HBgLNTA1ODY3MjA3NzUVAgASGBQzQTk0ODlBNzQ4M0U4NzdBMDE5RgA=",
"timestamp": "1738184020",
"type": "document",
"document": {
"caption":"Hola",
"filename": "01_BTS_Sendo_v1.0-2.docx",
"mime_type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"sha256": "pX/nG5rjWwc+FY7vZSCmJGbkyXpVTW+/IPNL+1jZRMk=",
"id": "2143224972803342"
}
}
]
},
"field": "messages"
}
Respuesta del Callback
El webhook espera una respuesta HTTP que puede ser:
| Código | Descripción |
|---|---|
| 200 | Exitoso con retorno de datos |
| 201 | Exitoso sin retorno de datos |
| 204 | Exitoso sin retorno de datos |
Definiciones de Atributos
Value
| Campo | Tipo | Descripción | Ejemplo |
|---|---|---|---|
| messaging_product | string | Tipo de producto o servicio en Meta | |
| metadata | object | Objeto que contiene detalles del remitente. | |
| contacts | object | Objeto que contiene detalles de destino | |
| statuses | object | Objeto que contiene detalles del evento del mensaje, incluidos los estados enviado, entregado, leído y otros. Ver Definición del campo Statuses | |
| messages | object | Objeto que contiene atributos del mensaje. Ver Definición del campo Messages |
Statuses
| Campo | Tipo | Descripción |
|---|---|---|
| id | string | ID del mensaje de WhatsApp proporcionado por Meta |
| status | string | Evento de estado |
| timestamp | string | Fecha y hora cuando ocurrió el evento. |
| recipient_id | string | Número de teléfono del cliente |
| conversation | object | Objeto que contiene detalles de la conversación |
Messages
| Campo | Tipo | Descripción |
|---|---|---|
| id | string | Identificación del mensaje de WhatsApp proporcionada por Meta |
| timestamp | string | Fecha y hora en que ocurrió el evento. |
| from | string | Número de teléfono del cliente |
| text | object | Objeto que contiene detalles del texto. |
| video | object | Objeto que contiene detalles del video. |
| image | object | Objeto que contiene detalles de la imagen |
| document | object | Objeto que contiene detalles del documento. |
| type | string | Tipo de mensajes como texto, video, imagen o documento |
Tipos de Medios Soportados por META
Imagen
| Tipo de Imagen | Extensión | Tipo MIME | Tamaño Máximo |
|---|---|---|---|
| JPEG | .jpg | image/jpeg | 5MB |
| PNG | .png | image/png | 5MB |
Video
NOTA: Solo se admiten códec de video H.264 y códec de audio AAC. Solo flujo de audio único o sin flujo de audio.
| Tipo de Video | Extensión | Tipo MIME | Tamaño Máximo |
|---|---|---|---|
| 3GPP | .3gp | video/3gpp | 16MB |
| Video MP4 | .mp4 | video/mp4 | 16MB |
Documento
| Tipo de Documento | Extensión | Tipo MIME | Tamaño Máximo |
|---|---|---|---|
| Texto | .txt | text/plain | 100 MB |
| Microsoft Excel | .xls | application/vnd.ms-excel | 100 MB |
| Microsoft Excel | .xlsx | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | 100 MB |
| Microsoft Word | .doc | application/msword | 100 MB |
| Microsoft Word | .docx | application/vnd.openxmlformats-officedocument.wordprocessingml.document | 100 MB |
| Microsoft PowerPoint | .ppt | application/vnd.ms-powerpoint | 100 MB |
| Microsoft PowerPoint | .pptx | application/vnd.openxmlformats-officedocument.presentationml.presentation | 100 MB |
| application/pdf | 100 MB |
Audio
| Audio Type | Extension | MIME Type | Max Size |
|---|---|---|---|
| AAC | .aac | audio/aac | 16 MB |
| AMR | .amr | audio/amr | 16 MB |
| MP3 | .mp3 | audio/mpeg | 16 MB |
| MP4 Audio | .m4a | audio/mp4 | 16 MB |
| OGG Audio | .ogg | audio/ogg (OPUS codecs only; base audio/ogg not supported; mono input only) | 16 MB |