curl --request POST \
--url https://api.jelou.ai/v2/whatsapp/{botId}/hsm \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"elementName": "<string>",
"destinations": [
"<string>"
],
"mediaUrl": "<string>",
"filename": "<string>",
"type": "text",
"language": "en",
"parameters": [
"<string>"
],
"buttonPayloads": [
{}
],
"actions": {},
"headerParameters": [
"<string>"
],
"buttonParameters": [
{
"type": "URL",
"payload": {},
"param": 123
}
],
"ltoParams": {
"expirationTime": 123
},
"cards": [
{
"mediaUrl": "<string>",
"params": [
"<string>"
],
"buttonParameters": [
{
"type": "URL",
"payload": {},
"param": 123
}
]
}
],
"expirationTime": "<string>",
"campaignId": "<string>"
}
'[
{
"id": "<string>",
"destination": "<string>"
}
]Envía mensajes HSM personalizados a destinatarios individuales usando la API de WhatsApp
curl --request POST \
--url https://api.jelou.ai/v2/whatsapp/{botId}/hsm \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"elementName": "<string>",
"destinations": [
"<string>"
],
"mediaUrl": "<string>",
"filename": "<string>",
"type": "text",
"language": "en",
"parameters": [
"<string>"
],
"buttonPayloads": [
{}
],
"actions": {},
"headerParameters": [
"<string>"
],
"buttonParameters": [
{
"type": "URL",
"payload": {},
"param": 123
}
],
"ltoParams": {
"expirationTime": 123
},
"cards": [
{
"mediaUrl": "<string>",
"params": [
"<string>"
],
"buttonParameters": [
{
"type": "URL",
"payload": {},
"param": 123
}
]
}
],
"expirationTime": "<string>",
"campaignId": "<string>"
}
'[
{
"id": "<string>",
"destination": "<string>"
}
]POST https://api.jelou.ai/v2/whatsapp/{botId}/hsm
type): Define el tipo de plantilla que se va a enviar.| Propiedad | Tipo | Descripción | Obligatorio |
|---|---|---|---|
| mediaUrl | string | URL pública del archivo multimedia. Obligatoria si tu plantilla es de tipo video, imagen o documento. | Condicional |
| filename | string | Nombre del archivo para plantillas de tipo documento. | Condicional |
| type | string | Tipo de mensaje: text, hsm, image, document, video, catalog, carousel. Por defecto es text. | No |
| language | string | Idioma de la plantilla: en, es, pt | No |
| elementName | string | Nombre de la plantilla aprobada. | Sí |
| parameters | array | Conjunto de strings que reemplazan valores en la plantilla. | Sí |
| destinations | array | Lista de números de teléfono. Formato numérico con código de país, sin + ni espacios. | Sí |
| buttonPayloads | array | Información para los botones de respuesta rápida. | No |
| actions | object | Configuración y acciones de la plantilla en formato payload. | No |
| headerParameters | array | Parámetro del encabezado, máximo 1 parámetro. | No |
| thumbnailProduct | string | URL de imagen en miniatura. Obligatoria para plantillas de catálogo. | Condicional |
| expirationTime | string | Tiempo de expiración en formato timestamp (milisegundos). | No |
| campaignId | string | Identificador único de la campaña asociada. | No |
| buttonParameters | array | Configuración de todos los tipos de botones. | No |
| ltoParams | object | Parámetros de tiempo limitado (LTO). | No |
| cards | array | Tarjetas de contenido para plantillas de carrusel. | No |
Mensaje de texto
curl --request POST \
--url 'https://api.jelou.ai/v2/whatsapp/BOT_ID/hsm' \
--header 'Authorization: Basic {{Base64EncodedUsername:Password}}' \
--header 'Content-Type: application/json' \
--data '{
"parameters": ["PARAMETER_1", "PARAMETER_2"],
"destinations": ["PHONE_NUMBER"],
"elementName": "ELEMENT_NAME"
}'
Mensaje con imagen
curl --request POST \
--url 'https://api.jelou.ai/v2/whatsapp/BOT_ID/hsm' \
--header 'Authorization: Basic {{Base64EncodedUsername:Password}}' \
--header 'Content-Type: application/json' \
--data '{
"parameters": ["PARAMETER_1", "PARAMETER_2"],
"mediaUrl": "https://cdn.ejemplo.com/imagen.jpeg",
"type": "image",
"destinations": ["PHONE_NUMBER"],
"elementName": "ELEMENT_NAME"
}'
Mensaje con video
curl --request POST \
--url 'https://api.jelou.ai/v2/whatsapp/BOT_ID/hsm' \
--header 'Authorization: Basic {{Base64EncodedUsername:Password}}' \
--header 'Content-Type: application/json' \
--data '{
"parameters": ["PARAMETER_1", "PARAMETER_2"],
"mediaUrl": "https://cdn.ejemplo.com/video.mp4",
"type": "video",
"destinations": ["PHONE_NUMBER"],
"elementName": "ELEMENT_NAME"
}'
Mensaje con documento adjunto
curl --request POST \
--url 'https://api.jelou.ai/v2/whatsapp/BOT_ID/hsm' \
--header 'Authorization: Basic {{Base64EncodedUsername:Password}}' \
--header 'Content-Type: application/json' \
--data '{
"parameters": ["PARAMETER_1"],
"mediaUrl": "https://cdn.ejemplo.com/documento.pdf",
"type": "document",
"destinations": ["PHONE_NUMBER"],
"elementName": "ELEMENT_NAME"
}'
Mensaje de texto con botones de acción de URL estática
curl --request POST \
--url 'https://api.jelou.ai/v2/whatsapp/BOT_ID/hsm' \
--header 'Authorization: Basic {{Base64EncodedUsername:Password}}' \
--header 'Content-Type: application/json' \
--data '{
"parameters": ["PARAMETER_1"],
"destinations": ["PHONE_NUMBER"],
"elementName": "ELEMENT_NAME"
}'
Mensaje de texto con botones de acción de URL dinámica
curl --request POST \
--url 'https://api.jelou.ai/v2/whatsapp/BOT_ID/hsm' \
--header 'Accept-Language: es' \
--header 'Authorization: Basic {{Base64EncodedUsername:Password}}' \
--header 'Content-Type: application/json' \
--data '{
"destinations": ["PHONE_NUMBER"],
"parameters": ["PARAMETER_1"],
"elementName": "ELEMENT_NAME",
"buttonParameters": [
{
"type": "URL",
"payload": {"param": "PARAM_URL"}
}
]
}'
Mensaje de texto con botones de Quick Reply
curl --request POST \
--url 'https://api.jelou.ai/v2/whatsapp/BOT_ID/hsm' \
--header 'Authorization: Basic {{Base64EncodedUsername:Password}}' \
--header 'Content-Type: application/json' \
--data '{
"elementName": "ELEMENT_NAME",
"language": "es",
"type": "text",
"parameters": ["param1", "param2"],
"destinations": ["PHONE_NUMBER"],
"buttonParameters": [
{
"type": "QUICK_REPLY",
"payload": {"type": "edge", "action": "BTN1", "skillId": "1"}
},
{
"type": "QUICK_REPLY",
"payload": {"type": "edge", "action": "BTN2", "skillId": "2"}
},
{
"type": "QUICK_REPLY",
"payload": {"type": "edge", "action": "BTN3", "skillId": "3"}
}
]
}'
Mensaje de texto personalizado con parámetros en el encabezado
curl --request POST \
--url 'https://api.jelou.ai/v2/whatsapp/BOT_ID/hsm' \
--header 'Authorization: Basic {{Base64EncodedUsername:Password}}' \
--header 'Content-Type: application/json' \
--data '{
"elementName": "ELEMENT_NAME",
"destinations": ["PHONE_NUMBER"],
"parameters": ["PARAMETER_1", "PARAMETER_2"],
"headerParameters": ["PARAMETER_VALUE"]
}'
Catálogo completo
curl --request POST \
--url 'https://api.jelou.ai/v2/whatsapp/BOT_ID/hsm' \
--header 'Authorization: Basic {{Base64EncodedUsername:Password}}' \
--header 'Content-Type: application/json' \
--data '{
"elementName": "ELEMENT_NAME",
"destinations": ["PHONE_NUMBER"],
"parameters": ["PARAMETER_1"],
"type": "catalog",
"buttonParameters": [
{
"type": "CATALOG",
"payload": {"thumbnailProduct": "productId"}
}
]
}'
LTO con botón de copiar código
curl --request POST \
--url 'https://api.jelou.ai/v2/whatsapp/BOT_ID/hsm' \
--header 'Authorization: Basic {{Base64EncodedUsername:Password}}' \
--header 'Content-Type: application/json' \
--data '{
"buttonOptions": {},
"elementName": "ELEMENT_NAME",
"destinations": ["PHONE_NUMBER"],
"parameters": ["PARAMETER_1", "PARAMETER_2"],
"type": "image",
"mediaUrl": "https://cdn.ejemplo.com/imagen.jpeg",
"ltoParams": {"expirationTime": 1733260800000},
"buttonParameters": [
{
"type": "COPY_CODE",
"param": 1,
"payload": {"param": "20OFF"}
}
]
}'
Autenticación
curl --request POST \
--url 'https://api.jelou.ai/v2/whatsapp/BOT_ID/hsm' \
--header 'Authorization: Basic {{Base64EncodedUsername:Password}}' \
--header 'Content-Type: application/json' \
--data '{
"buttonOptions": {},
"elementName": "ELEMENT_NAME",
"destinations": ["PHONE_NUMBER"],
"parameters": ["PARAMETER_1"],
"type": "hsm"
}'
Carrusel con 2 tarjetas
curl --request POST \
--url 'https://api.jelou.ai/v2/whatsapp/BOT_ID/hsm' \
--header 'Authorization: Basic {{Base64EncodedUsername:Password}}' \
--header 'Content-Type: application/json' \
--data '{
"elementName": "ELEMENT_NAME",
"destinations": ["PHONE_NUMBER"],
"parameters": [],
"type": "carousel",
"cards": [
{
"mediaUrl": "https://cdn.ejemplo.com/producto1.jpg",
"params": ["VALOR_PARAMETRO"],
"buttonParameters": [
{
"type": "QUICK_REPLY",
"payload": {"action": "Boton 1", "type": "edge", "skillId": "45515", "cardIndex": 0}
}
]
},
{
"mediaUrl": "https://cdn.ejemplo.com/producto2.jpg",
"params": ["VALOR_PARAMETRO_1", "VALOR_PARAMETRO_2"],
"buttonParameters": [
{
"type": "QUICK_REPLY",
"payload": {"action": "Boton 2", "type": "edge", "skillId": "10192", "cardIndex": 1}
}
]
}
]
}'
+, incluir el código de país, solo pueden ingresar caracteres numéricos. Los guiones o espacios no son aceptados.
| ✅ Forma correcta | ❌ Forma incorrecta | ❌ Forma incorrecta |
|---|---|---|
| PHONE_NUMBER | +PHONE_NUMBER | 09XXXXXXXX |
Button Payload
buttonPayloads cuando tu plantilla incluya botones de respuesta rápida usando skills; esto te permitirá activar flujos adicionales dentro de la conversación según la acción seleccionada por el usuario.[
{"type": "edge", "action": "Yes", "skillId": "1"},
{"type": "edge", "action": "Reschedule", "skillId": "2"},
{"type": "edge", "action": "Cancel", "skillId": "3"}
]
type, action y skillId. La clave action define el texto que aparecerá en el botón, mientras que skillId indica el ID del skill que el botón activará.Actions Payload
{
"actions": {
"setSkill": {"id": 2222}
}
}
{
"actions": {
"setMemoryParams": {
"url": "https://apps.jelou.ai"
}
}
}
setMemoryParams con sus respectivos campos clave-valor.
{
"actions": {
"setMemoryParams": {
"url": "https://apps.jelou.ai"
}
}
}
200 - Respuesta exitosa
[
{
"id": "msg-12345-67890-abcde-fghij-klmno",
"destination": "PHONE_NUMBER"
}
]
400 - Bad Request
{
"message": ["Template does not exist"],
"status": "failed",
"_metadata": {
"error": {},
"body": {
"destinations": [{"destination": "PHONE_NUMBER"}],
"parameters": ["John", "example_value"],
"elementName": "sample_template",
"code": "es",
"type": "text",
"botId": "BOT_ID",
"botName": "Your Bot"
}
},
"error": {}
}
401 - Unauthorized
{
"message": "Authentication failed"
}
404 - Not Found
{
"message": ["The Bot could not be found at the moment."],
"statusMessage": "failed",
"status": 0,
"error": {
"code": "E1019",
"key": "BOT_NOT_FOUND",
"description": "Error to be thrown when trying to get a Bot.",
"developerMessages": {
"es": "El botId no se encuentra en la base de datos o ha sido eliminado.",
"en": "The botId is not found in the database or has been deleted."
},
"clientMessages": {
"es": "El Bot no se pudo encontrar por el momento.",
"en": "The Bot could not be found at the moment."
}
}
}
422 - Unprocessable Entity
{
"message": ["Los valores ingresados no son correctos."],
"statusMessage": "failed",
"status": 0,
"error": {
"code": "E0422",
"key": "VALIDATOR_ERROR",
"description": "Error to be thrown when cannot process request because of incoming values",
"developerMessages": {
"es": "Los valores del request no son correctos para ser procesados.",
"en": "The request values are not correct for processing."
},
"clientMessages": {
"es": "Los valores ingresados no son correctos.",
"en": "The values entered are not correct."
}
},
"validationError": {
"parameters": [
{
"en": "The number of parameters is incorrect.",
"es": "El número de parámetros es incorrecto."
}
]
}
}
500 - Internal Server Error
{
"message": ["We are having trouble processing your request. Please try again later."],
"statusMessage": "failed",
"status": 0,
"error": {
"code": "E0000",
"key": "UNKNOWN_ERROR",
"description": "Error to be thrown when it couldn't be determined the reason of failure",
"developerMessages": {
"es": "Error inesperado occurido, revisar logs.",
"en": "Unexpected error occurred, check logs."
},
"clientMessages": {
"es": "Estamos teniendo problemas procesando la solicitud. Por favor intenta mas tarde.",
"en": "We are having trouble processing your request. Please try again later."
}
}
}
¿Cuántos caracteres están permitidos?
.pdf.mp4.jpg, .jpeg, .png¿Cómo se consume la API?
curl --request POST \
--url 'https://api.jelou.ai/v2/whatsapp/BOT_ID/hsm' \
--header 'Accept-Language: es' \
--header 'Authorization: Basic {{Base64EncodedUsername:Password}}' \
--header 'Content-Type: application/json' \
--data '{
"destinations": ["PHONE_NUMBER"],
"parameters": [],
"elementName": "your_template_name"
}'
Basic authentication using Base64 encoded clientId:clientSecret
The unique identifier of the bot
Approved template name
Phone numbers with country code, no + sign
Public URL for media (required for image/video/document templates)
Filename for document templates
text, hsm, image, document, video, catalog, carousel en, es, pt Template parameter values
1Show child attributes
Show child attributes
Show child attributes
Expiration timestamp in milliseconds
Was this page helpful?