Pular para o conteúdo principal
POST
/
v1
/
hsm
/
file
Send Bulk HSM
curl --request POST \
  --url https://api.jelou.ai/v1/hsm/file \
  --header 'Authorization: Basic <encoded-value>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "campaignName": "<string>",
  "elementName": "<string>",
  "botId": "<string>",
  "params": [
    {
      "param": 123,
      "column": "<string>"
    }
  ],
  "type": "text",
  "mediaUrl": "<string>",
  "fileUrl": "<string>",
  "buttonPayloads": [
    {}
  ],
  "actions": {},
  "scheduledAt": "2023-11-07T05:31:56Z"
}
'
import requests

url = "https://api.jelou.ai/v1/hsm/file"

payload = {
"campaignName": "<string>",
"elementName": "<string>",
"botId": "<string>",
"params": [
{
"param": 123,
"column": "<string>"
}
],
"type": "text",
"mediaUrl": "<string>",
"fileUrl": "<string>",
"buttonPayloads": [{}],
"actions": {},
"scheduledAt": "2023-11-07T05:31:56Z"
}
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({
campaignName: '<string>',
elementName: '<string>',
botId: '<string>',
params: [{param: 123, column: '<string>'}],
type: 'text',
mediaUrl: '<string>',
fileUrl: '<string>',
buttonPayloads: [{}],
actions: {},
scheduledAt: '2023-11-07T05:31:56Z'
})
};

fetch('https://api.jelou.ai/v1/hsm/file', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://api.jelou.ai/v1/hsm/file",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'campaignName' => '<string>',
'elementName' => '<string>',
'botId' => '<string>',
'params' => [
[
'param' => 123,
'column' => '<string>'
]
],
'type' => 'text',
'mediaUrl' => '<string>',
'fileUrl' => '<string>',
'buttonPayloads' => [
[

]
],
'actions' => [

],
'scheduledAt' => '2023-11-07T05:31:56Z'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>",
"Content-Type: application/json"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"strings"
"net/http"
"io"
)

func main() {

url := "https://api.jelou.ai/v1/hsm/file"

payload := strings.NewReader("{\n \"campaignName\": \"<string>\",\n \"elementName\": \"<string>\",\n \"botId\": \"<string>\",\n \"params\": [\n {\n \"param\": 123,\n \"column\": \"<string>\"\n }\n ],\n \"type\": \"text\",\n \"mediaUrl\": \"<string>\",\n \"fileUrl\": \"<string>\",\n \"buttonPayloads\": [\n {}\n ],\n \"actions\": {},\n \"scheduledAt\": \"2023-11-07T05:31:56Z\"\n}")

req, _ := http.NewRequest("POST", url, payload)

req.Header.Add("Authorization", "Basic <encoded-value>")
req.Header.Add("Content-Type", "application/json")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.post("https://api.jelou.ai/v1/hsm/file")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"campaignName\": \"<string>\",\n \"elementName\": \"<string>\",\n \"botId\": \"<string>\",\n \"params\": [\n {\n \"param\": 123,\n \"column\": \"<string>\"\n }\n ],\n \"type\": \"text\",\n \"mediaUrl\": \"<string>\",\n \"fileUrl\": \"<string>\",\n \"buttonPayloads\": [\n {}\n ],\n \"actions\": {},\n \"scheduledAt\": \"2023-11-07T05:31:56Z\"\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.jelou.ai/v1/hsm/file")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Basic <encoded-value>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"campaignName\": \"<string>\",\n \"elementName\": \"<string>\",\n \"botId\": \"<string>\",\n \"params\": [\n {\n \"param\": 123,\n \"column\": \"<string>\"\n }\n ],\n \"type\": \"text\",\n \"mediaUrl\": \"<string>\",\n \"fileUrl\": \"<string>\",\n \"buttonPayloads\": [\n {}\n ],\n \"actions\": {},\n \"scheduledAt\": \"2023-11-07T05:31:56Z\"\n}"

response = http.request(request)
puts response.read_body
{
  "message": [
    "<string>"
  ],
  "status": "<string>"
}
{
"message": "<string>",
"statusMessage": "<string>",
"status": 123,
"error": {
"code": "<string>",
"key": "<string>",
"description": "<string>",
"developerMessages": {},
"clientMessages": {}
},
"validationError": {}
}
{
"message": "<string>",
"statusMessage": "<string>",
"status": 123,
"error": {
"code": "<string>",
"key": "<string>",
"description": "<string>",
"developerMessages": {},
"clientMessages": {}
},
"validationError": {}
}
{
"message": "<string>",
"statusMessage": "<string>",
"status": 123,
"error": {
"code": "<string>",
"key": "<string>",
"description": "<string>",
"developerMessages": {},
"clientMessages": {}
},
"validationError": {}
}
Use esta função para enviar templates em massa para seus clientes. A API cuidará da entrega aos destinatários a partir de um arquivo baseado em colunas. O envio de templates em massa permite que você envie um template predefinido com valores diferentes relacionados a cada cliente, para que você possa selecionar informações dinâmicas de uma fonte como um arquivo, para automatizar e enviar sua campanha facilmente.

Diretrizes do template

O arquivo de origem deve ser criado seguindo estas especificações:

Formato do arquivo

Apenas arquivos com a extensão .CSV são suportados.

Cabeçalho

A primeira linha do arquivo deve definir os nomes das colunas (cabeçalho). Siga estas regras para o cabeçalho:
  • Evite espaços em branco nos nomes das colunas.
  • Não use caracteres especiais ou marcas de pontuação (ex.: !, $, %, &, *, etc.).
  • Use apenas letras, números e underscores (_) se necessário.
Correto: phone_number, customer_name, order_amount Incorreto: phone number, customer-name!, order#amount

Primeira coluna

A primeira coluna deve conter os números de telefone dos destinatários. É obrigatório incluir o código internacional sem o símbolo + (por exemplo, para um número no Equador, escreva PHONE_NUMBER).

Colunas restantes

As outras colunas serão usadas para os valores dinâmicos dos parâmetros (personalização do template).

Exemplo

Se o seu template contém o seguinte conteúdo:
Your order {{1}} for a total of {{2}} is confirmed. The expected delivery is {{3}}.
O arquivo CSV seria:
phone_numberparam_1param_2param_3
PHONE_NUMBERA12345$250.00December 1
PHONE_NUMBER_2B67890$100.50December 2
PHONE_NUMBER_3C22345$50.00December 3
O arquivo CSV deve ser codificado em UTF-8.

Enviar HSM a partir de arquivo

POST https://api.jelou.ai/v1/hsm/file

Opções de upload de arquivo

Há duas formas de fornecer o arquivo CSV com informações dos destinatários:
  1. Usando uma URL pública: Você pode fornecer a URL para o arquivo CSV que está disponível publicamente. Neste caso, o corpo da requisição deve estar no formato JSON.
  2. Fazendo upload do arquivo: Alternativamente, você pode anexar o arquivo CSV diretamente à requisição. Neste caso, o corpo da requisição deve estar no formato multipart/form-data.

Parâmetros do corpo

PropriedadeTipoDescriçãoObrigatório
campaignNamestringNome atribuído à campanha sendo enviada.Sim
elementNamestringNome do template. Deve ter status aprovado pelo WhatsApp.Sim
botIdstringIdentificador único do bot que envia o template.Sim
paramsarrayArray de objetos com o número do parâmetro e a coluna CSV correspondente. Se o template não tiver parâmetros, o array deve estar vazio.Sim
typestringTipo de template: text, image, document, video. Padrão é text.Não
mediaUrlstringURL pública do arquivo de mídia. Obrigatório para templates de imagem, vídeo ou documento.Condicional
fileUrlstringURL pública do arquivo CSV. Obrigatório se o arquivo não for enviado diretamente.Condicional
filefileArquivo CSV anexado. Obrigatório se fileUrl não for usado.Condicional
buttonPayloadsarrayArray de objetos para botões de resposta rápida com workflows.Não
actionsobjectAções relacionadas ao template.Não
scheduledAtdateData e hora em UTC quando a campanha será enviada.Não

Exemplos de requisição

curl --request POST \
  --url https://api.jelou.ai/v1/hsm/file \
  --header 'Authorization: Basic {{Base64EncodedUsername:Password}}' \
  --header 'Content-Type: application/json' \
  --data '{
    "campaignName": "campaign_name",
    "botId": "BOT_ID",
    "elementName": "ELEMENT_NAME",
    "params": [
      {"param": 1, "column": "customer_name"}
    ],
    "mediaUrl": "https://cdn.example.com/image.png",
    "type": "image",
    "fileUrl": "https://cdn.example.com/campaign.csv",
    "buttonPayloads": [
      {"type": "edge", "action": "Yes", "skillId": "1"}
    ]
  }'
curl --request POST \
  --url https://api.jelou.ai/v1/hsm/file \
  --header 'Authorization: Basic {{Base64EncodedUsername:Password}}' \
  --form campaignName=campaign_name \
  --form botId=BOT_ID \
  --form elementName=ELEMENT_NAME \
  --form 'buttonPayloads=[{"type":"edge","action":"Yes","skillId":"1"},{"type":"edge","action":"Reschedule","skillId":"2"},{"type":"edge","action":"Cancel","skillId":"3"}]' \
  --form file=@/local/path/campaign.csv \
  --form 'params=[]'

Respostas do envio

{
  "message": ["Campaign has been created."],
  "status": "success"
}
{
  "message": ["Invalid CSV format"],
  "status": "failed"
}
{
  "message": "Authentication failed"
}
{
  "message": ["Template not found or not approved"],
  "status": "failed"
}

Estrutura de params

Cada elemento no array params é um objeto que contém:
[
  {"param": 1, "column": "customer_name"},
  {"param": 2, "column": "order_amount"}
]
  • param: Número do parâmetro no template (1, 2, 3…).
  • column: Nome da coluna no arquivo CSV da qual os valores serão extraídos.

Estrutura de buttonPayloads

Para templates com botões de resposta rápida que ativam workflows:
[
  {"type": "edge", "action": "Yes", "skillId": "1"},
  {"type": "edge", "action": "Reschedule", "skillId": "2"},
  {"type": "edge", "action": "Cancel", "skillId": "3"}
]

Autorizações

Authorization
string
header
obrigatório

Basic authentication using Base64 encoded clientId:clientSecret

Corpo

campaignName
string
obrigatório
elementName
string
obrigatório
botId
string
obrigatório
params
object[]
obrigatório
type
enum<string>
padrão:text
Opções disponíveis:
text,
image,
document,
video
mediaUrl
string<uri>
fileUrl
string<uri>
buttonPayloads
object[]
actions
object
scheduledAt
string<date-time>

Resposta

Campaign created successfully

message
string[]
status
string