> ## Documentation Index
> Fetch the complete documentation index at: https://docs.jelou.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Envio em Massa

> Envie templates em massa para múltiplos destinatários e verifique o status das suas campanhas

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\_number    | param\_1 | param\_2 | param\_3   |
| ---------------- | -------- | -------- | ---------- |
| PHONE\_NUMBER    | A12345   | \$250.00 | December 1 |
| PHONE\_NUMBER\_2 | B67890   | \$100.50 | December 2 |
| PHONE\_NUMBER\_3 | C22345   | \$50.00  | December 3 |

<Note>
  O arquivo CSV deve ser codificado em UTF-8.
</Note>

***

## 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

| Propriedade        | Tipo   | Descrição                                                                                                                               | Obrigatório |
| ------------------ | ------ | --------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
| **campaignName**   | string | Nome atribuído à campanha sendo enviada.                                                                                                | Sim         |
| **elementName**    | string | Nome do template. Deve ter status **aprovado** pelo WhatsApp.                                                                           | Sim         |
| **botId**          | string | Identificador único do bot que envia o template.                                                                                        | Sim         |
| **params**         | array  | Array 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         |
| **type**           | string | Tipo de template: `text`, `image`, `document`, `video`. Padrão é `text`.                                                                | Não         |
| **mediaUrl**       | string | URL pública do arquivo de mídia. Obrigatório para templates de imagem, vídeo ou documento.                                              | Condicional |
| **fileUrl**        | string | URL pública do arquivo CSV. Obrigatório se o arquivo não for enviado diretamente.                                                       | Condicional |
| **file**           | file   | Arquivo CSV anexado. Obrigatório se `fileUrl` não for usado.                                                                            | Condicional |
| **buttonPayloads** | array  | Array de objetos para botões de resposta rápida com workflows.                                                                          | Não         |
| **actions**        | object | Ações relacionadas ao template.                                                                                                         | Não         |
| **scheduledAt**    | date   | Data e hora em UTC quando a campanha será enviada.                                                                                      | Não         |

***

## Exemplos de requisição

<AccordionGroup>
  <Accordion title="Enviar a partir de URL pública (JSON)">
    ```bash theme={null}
    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"}
        ]
      }'
    ```
  </Accordion>

  <Accordion title="Enviar com arquivo anexado (multipart/form-data)">
    ```bash theme={null}
    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=[]'
    ```
  </Accordion>
</AccordionGroup>

***

## Respostas do envio

<AccordionGroup>
  <Accordion title="200 - Resposta bem-sucedida">
    ```json theme={null}
    {
      "message": ["Campaign has been created."],
      "status": "success"
    }
    ```
  </Accordion>

  <Accordion title="400 - Requisição Inválida">
    ```json theme={null}
    {
      "message": ["Invalid CSV format"],
      "status": "failed"
    }
    ```
  </Accordion>

  <Accordion title="401 - Não Autorizado">
    ```json theme={null}
    {
      "message": "Authentication failed"
    }
    ```
  </Accordion>

  <Accordion title="422 - Entidade não processável">
    ```json theme={null}
    {
      "message": ["Template not found or not approved"],
      "status": "failed"
    }
    ```
  </Accordion>
</AccordionGroup>

***

## Estrutura de params

Cada elemento no array `params` é um objeto que contém:

```json theme={null}
[
  {"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:

```json theme={null}
[
  {"type": "edge", "action": "Yes", "skillId": "1"},
  {"type": "edge", "action": "Reschedule", "skillId": "2"},
  {"type": "edge", "action": "Cancel", "skillId": "3"}
]
```


## OpenAPI

````yaml POST /v1/hsm/file
openapi: 3.1.0
info:
  title: Jelou API
  description: >-
    API for the Jelou platform. Send messages, manage campaigns, handle
    conversations, users, databases, and widgets.
  version: 1.0.0
servers:
  - url: https://api.jelou.ai
    description: Production server
security:
  - basicAuth: []
tags:
  - name: Messages
    description: Send messages to users
  - name: Campaigns
    description: HSM campaigns and templates
  - name: Conversations
    description: Chat history and metrics
  - name: Users
    description: User state and cache management
  - name: Resources
    description: Media resource management
  - name: Datum
    description: Database CRUD operations
  - name: Widget
    description: Widget and room management
  - name: PMA Custom
    description: External support panel integration
paths:
  /v1/hsm/file:
    post:
      tags:
        - Campaigns
      summary: Send Bulk HSM
      description: Send HSM templates in bulk to multiple recipients using a CSV file.
      operationId: sendBulkHSM
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkHSMJsonRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/BulkHSMFormRequest'
      responses:
        '200':
          description: Campaign created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BulkHSMResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
components:
  schemas:
    BulkHSMJsonRequest:
      type: object
      required:
        - campaignName
        - elementName
        - botId
        - params
      properties:
        campaignName:
          type: string
        elementName:
          type: string
        botId:
          type: string
        params:
          type: array
          items:
            $ref: '#/components/schemas/CSVParam'
        type:
          type: string
          enum:
            - text
            - image
            - document
            - video
          default: text
        mediaUrl:
          type: string
          format: uri
        fileUrl:
          type: string
          format: uri
        buttonPayloads:
          type: array
          items:
            type: object
        actions:
          type: object
        scheduledAt:
          type: string
          format: date-time
    BulkHSMFormRequest:
      type: object
      required:
        - campaignName
        - elementName
        - botId
        - params
        - file
      properties:
        campaignName:
          type: string
        elementName:
          type: string
        botId:
          type: string
        params:
          type: string
          description: JSON string of params array
        file:
          type: string
          format: binary
        buttonPayloads:
          type: string
          description: JSON string
    BulkHSMResponse:
      type: object
      properties:
        message:
          type: array
          items:
            type: string
        status:
          type: string
    CSVParam:
      type: object
      properties:
        param:
          type: integer
        column:
          type: string
    Error:
      type: object
      properties:
        message:
          oneOf:
            - type: string
            - type: array
              items:
                type: string
        statusMessage:
          type: string
        status:
          type: integer
        error:
          type: object
          properties:
            code:
              type: string
            key:
              type: string
            description:
              type: string
            developerMessages:
              type: object
            clientMessages:
              type: object
        validationError:
          type: object
  responses:
    BadRequest:
      description: Bad request - Invalid format or missing required fields
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: Unauthorized - Invalid authentication credentials
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    UnprocessableEntity:
      description: Unprocessable entity - Validation error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    basicAuth:
      type: http
      scheme: basic
      description: Basic authentication using Base64 encoded clientId:clientSecret

````