Skip to main content
POST
/
v1
/
bots
/
{botId}
/
templates
Crear Plantilla
curl --request POST \
  --url https://api.jelou.ai/v1/bots/{botId}/templates \
  --header 'Authorization: Basic <encoded-value>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "category": "UTILITY",
  "language": "<string>",
  "elementName": "<string>",
  "template": "<string>",
  "isVisible": true,
  "params": [
    {
      "param": "<string>",
      "label": "<string>",
      "example": "<string>"
    }
  ],
  "paramsNumber": 123,
  "displayName": "<string>",
  "type": "HSM",
  "mediaUrl": "<string>",
  "interactiveAction": "NONE",
  "buttons": [
    {
      "text": "<string>",
      "type": "QUICK_REPLY",
      "url": "<string>",
      "phone_number": "<string>",
      "example": "<string>"
    }
  ],
  "header": "<string>",
  "exampleHeader": "<string>",
  "headerParams": [
    {}
  ],
  "example": "<string>",
  "extraSettings": {
    "addSecurityRecommendation": true,
    "codeExpirationMinutes": 45,
    "allowChangeCategory": true
  }
}
'
{
  "message": [
    "<string>"
  ],
  "status": "<string>",
  "data": {}
}
Create custom HSM templates with positional parameters, interactive buttons, and media. Optionally, submit the template directly to WhatsApp for approval.
POST /v1/bots/{botId}/templates
Templates must be approved by the WhatsApp team before they can be used. Follow Meta’s guidelines to avoid rejections.

Path Parameters

PropertyTypeDescription
botIdstringUnique bot ID. Example: 123456789

Query Parameters

PropertyTypeDescription
sendToAprovebooleanDefines whether the template should be submitted to WhatsApp for approval.

Request Body

PropertyTypeDescription
categorystringHSM template category. Values: UTILITY, MARKETING, AUTHENTICATION
languagestringTemplate language.
isVisiblebooleanDefines whether the template should be shown to operators.
paramsarrayParameter structure. For the authentication category, Meta has restricted to one parameter.
paramsNumbernumberNumber of parameters. For the authentication category, Meta has restricted to one parameter.
elementNamestringUnique identifier for the template. Can only contain lowercase letters, underscores (_), and numbers.
displayNamestringDisplay name of the template.
templatestringTemplate body. For the authentication category, Meta has restricted the content.
typestringHSM type. Values: HSM, IMAGE, VIDEO, DOCUMENT
mediaUrlstringMedia URL. Required when the HSM type is IMAGE, VIDEO, DOCUMENT. Not applicable for the authentication category.
interactiveActionstringHSM interactive action. Values: NONE, CALL_TO_ACTION, QUICK_REPLY, OTP
buttonsarrayButton structure. Required when the HSM interactive action is CALL_TO_ACTION, QUICK_REPLY, or OTP.
headerstringTemplate header. Applicable only for text-type templates. Not applicable for the authentication category and has a 60-character limit.
exampleHeaderstringHeader example. Required only if the template will have a header.
headerParamsarrayParameter structure. The header supports a maximum of one parameter.
examplestringTemplate example. If the template has a parameter, it must be replaced with an example.
extraSettingsobjectOptional settings for the template.

Request Examples

curl --request POST \
  --url 'https://api.jelou.ai/v1/bots/BOT_ID/templates?sendToAprove=true' \
  --header 'Authorization: Basic {{Base64EncodedUsername:Password}}' \
  --header 'Content-Type: application/json' \
  --data '{
    "displayName": "text_template_utility",
    "template": "Thank you for your order, {{1}}! Your confirmation number is {{2}}. If you have any questions, contact support.",
    "example": "Thank you for your order, Maria! Your confirmation number is 71936. If you have any questions, contact support.",
    "elementName": "text_template_utility",
    "params": [
      {"param": "1", "label": "customer", "example": "Maria"},
      {"param": "2", "label": "order", "example": "71936"}
    ],
    "paramsNumber": 2,
    "type": "HSM",
    "language": "en",
    "category": "UTILITY",
    "interactiveAction": "NONE"
  }'
curl --request POST \
  --url 'https://api.jelou.ai/v1/bots/BOT_ID/templates?sendToAprove=true' \
  --header 'Authorization: Basic {{Base64EncodedUsername:Password}}' \
  --header 'Content-Type: application/json' \
  --data '{
    "displayName": "template_quick_reply",
    "template": "Thank you for your order, {{1}}! Your confirmation number is {{2}}. Use the buttons to contact us.",
    "example": "Thank you for your order, Maria! Your confirmation number is 57893. Use the buttons to contact us.",
    "elementName": "template_quick_reply",
    "params": [
      {"param": "1", "label": "customer", "example": "Maria"},
      {"param": "2", "label": "order", "example": "57893"}
    ],
    "paramsNumber": 2,
    "type": "HSM",
    "language": "en",
    "category": "UTILITY",
    "interactiveAction": "QUICK_REPLY",
    "buttons": [
      {"text": "Contact Support", "type": "QUICK_REPLY"},
      {"text": "Contact Sales", "type": "QUICK_REPLY"}
    ]
  }'
curl --request POST \
  --url 'https://api.jelou.ai/v1/bots/BOT_ID/templates?sendToAprove=true' \
  --header 'Authorization: Basic {{Base64EncodedUsername:Password}}' \
  --header 'Content-Type: application/json' \
  --data '{
    "displayName": "template_call_action",
    "template": "Thank you for your order, {{1}}! Your confirmation number is {{2}}. Use the buttons to contact us.",
    "example": "Thank you for your order, Maria! Your confirmation number is 67996. Use the buttons to contact us.",
    "elementName": "template_call_action",
    "params": [
      {"param": "1", "label": "customer", "example": "Maria"},
      {"param": "2", "label": "order", "example": "67996"}
    ],
    "paramsNumber": 2,
    "type": "HSM",
    "language": "en",
    "category": "UTILITY",
    "interactiveAction": "CALL_TO_ACTION",
    "buttons": [
      {"text": "Contact Support", "type": "URL", "url": "https://apps.jelou.ai", "example": "https://apps.jelou.ai"},
      {"text": "Call", "type": "PHONE_NUMBER", "phone_number": "+PHONE_NUMBER"}
    ]
  }'
curl --request POST \
  --url 'https://api.jelou.ai/v1/bots/BOT_ID/templates?sendToAprove=true' \
  --header 'Authorization: Basic {{Base64EncodedUsername:Password}}' \
  --header 'Content-Type: application/json' \
  --data '{
    "displayName": "image_template",
    "template": "Hello {{1}}. We invite you to check out our promotions.",
    "example": "Hello Maria. We invite you to check out our promotions.",
    "elementName": "image_template",
    "params": [
      {"param": "1", "label": "customer", "example": "Maria"}
    ],
    "paramsNumber": 1,
    "type": "IMAGE",
    "language": "en",
    "category": "MARKETING",
    "mediaUrl": "https://cdn.example.com/image.jpeg",
    "interactiveAction": "NONE"
  }'
curl --request POST \
  --url 'https://api.jelou.ai/v1/bots/BOT_ID/templates?sendToAprove=true' \
  --header 'Authorization: Basic {{Base64EncodedUsername:Password}}' \
  --header 'Content-Type: application/json' \
  --data '{
    "displayName": "document_template",
    "template": "Hello {{1}}. Please find your requested document attached.",
    "example": "Hello Maria. Please find your requested document attached.",
    "elementName": "document_template",
    "params": [
      {"param": "1", "label": "customer", "example": "Maria"}
    ],
    "paramsNumber": 1,
    "type": "DOCUMENT",
    "language": "en",
    "category": "MARKETING",
    "mediaUrl": "https://cdn.example.com/document.pdf",
    "interactiveAction": "NONE"
  }'
curl --request POST \
  --url 'https://api.jelou.ai/v1/bots/BOT_ID/templates?sendToAprove=true' \
  --header 'Authorization: Basic {{Base64EncodedUsername:Password}}' \
  --header 'Content-Type: application/json' \
  --data '{
    "displayName": "video_template",
    "template": "Hello {{1}}. Watch our new video.",
    "example": "Hello Maria. Watch our new video.",
    "elementName": "video_template",
    "params": [
      {"param": "1", "label": "customer", "example": "Maria"}
    ],
    "paramsNumber": 1,
    "type": "VIDEO",
    "language": "en",
    "category": "MARKETING",
    "mediaUrl": "https://cdn.example.com/video.mp4",
    "interactiveAction": "NONE"
  }'

Responses

{
  "message": ["Template has been created."],
  "status": "success",
  "data": {
    "template": "Hello! We are *Jelou*. \nWelcome _{{1}}_. Soon {{2}} from the team will reach out to you.",
    "displayName": "Welcome",
    "elementName": "test_hsm_api",
    "params": [
      {"label": "Customer name", "param": "1"},
      {"label": "Agent name", "param": "2"}
    ],
    "paramsNumber": 2,
    "isVisible": false,
    "language": "EN",
    "createdAt": "2021-01-28T15:08:38.492Z",
    "updatedAt": "2021-01-28T15:08:38.492Z",
    "botId": "BOT_ID",
    "companyId": 100,
    "status": "APPROVED"
  }
}
{
  "message": ["Template name already exists"],
  "status": "failed"
}
{
  "message": "Authentication failed"
}
{
  "message": ["The Bot could not be found at the moment."],
  "statusMessage": "failed",
  "error": {
    "code": "E1019",
    "key": "BOT_NOT_FOUND"
  }
}
The status field in the response indicates whether your template has been approved by WhatsApp.

Language

The language supported by WhatsApp is detailed on the official page. Please review it carefully at the following link.

Content Restrictions (Authentication Category)

Meta has restricted content for the authentication category. The content will be according to the template language. Meta is restricted to a single parameter.

Language

LanguageCodeContent
Englishen{{1}} is your verification code.
Portuguese (BR)pt_BRSeu código de verificação é {{1}}.
SpanishesTu código de verificación es {{1}}.

Parameter Structure

Use the following structure in the params field when creating a template:
[
  {"label": "Customer name", "param": "1"},
  {"label": "Order number", "param": "2"}
]

Button Structure

Use the following structure in the buttons field when the interactive actions are CALL_TO_ACTION, QUICK_REPLY, or OTP.

QUICK_REPLY

Used to obtain quick replies. It is an array of objects and can have a maximum of 3 buttons.
PropertyDescription
textButton text, this value cannot be updated.
typeButton type. Value: QUICK_REPLY
[
  {"text": "More information", "type": "QUICK_REPLY"},
  {"text": "Talk to an operator", "type": "QUICK_REPLY"},
  {"text": "Sales", "type": "QUICK_REPLY"}
]

CALL_TO_ACTION

Used to offer a call to action. Can have a maximum of 2 buttons and a maximum of 1 button of each type.
PropertyDescription
textButton text, this value cannot be updated.
typeButton type. Values: PHONE_NUMBER, URL
phone_numberButton phone number.
urlButton URL.
exampleURL example. Required when the button type is URL.
[
  {"text": "Sales", "phone_number": "+PHONE_NUMBER", "type": "PHONE_NUMBER"},
  {"type": "URL", "text": "View site", "url": "https://apps.jelou.ai/{{1}}", "example": "https://apps.jelou.ai/offers"}
]

OTP

Used to obtain a “One Time Password”. Can have a maximum of 1 button.
PropertyDescription
textButton text, this value cannot be updated.
typeButton type. Value: OTP
[
  {"text": "COPY CODE", "type": "OTP"}
]

extraSettings Structure

PropertyTypeDescription
addSecurityRecommendationbooleanAdds an additional security message in authentication templates.
codeExpirationMinutesnumberAdds a footer message with the code expiration time. Values between 1 and 90 minutes.
allowChangeCategorybooleanAllows Meta to update the template category if necessary.

Authorizations

Authorization
string
header
required

Basic authentication using Base64 encoded clientId:clientSecret

Path Parameters

botId
string
required

Query Parameters

sendToAprove
boolean

Body

application/json
category
enum<string>
required
Available options:
UTILITY,
MARKETING,
AUTHENTICATION
language
string
required
elementName
string
required
Pattern: ^[a-z0-9_]+$
template
string
required
isVisible
boolean
params
object[]
paramsNumber
integer
displayName
string
type
enum<string>
Available options:
HSM,
IMAGE,
VIDEO,
DOCUMENT
mediaUrl
string<uri>
interactiveAction
enum<string>
Available options:
NONE,
CALL_TO_ACTION,
QUICK_REPLY,
OTP
buttons
object[]
header
string
Maximum string length: 60
exampleHeader
string
headerParams
object[]
example
string
extraSettings
object

Response

Plantilla creada exitosamente

message
string[]
status
string
data
object