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

# Enviando Mensagens

> Configure endpoints e templates para enviar mensagens através da Conexão Universal

A aba **Envio** é onde você configura como o Datacrazy envia mensagens para a API externa. Aqui você define a URL base, os endpoints para cada tipo de mensagem, e como interpretar a resposta.

## URL Base

No campo **URL Base**, insira o endereço base da API externa (ex: `https://api.exemplo.com`). A URL final de cada requisição é composta pela URL Base + o caminho do endpoint:

```
https://api.exemplo.com + /messages/send = https://api.exemplo.com/messages/send
```

***

## Endpoint de Envio de Texto

Este é o endpoint principal e **obrigatório**. Configure os seguintes campos:

| Campo                   | Descrição                                                             |
| ----------------------- | --------------------------------------------------------------------- |
| **Método**              | Método HTTP da requisição (`GET`, `POST`, `PUT`, `PATCH` ou `DELETE`) |
| **Caminho**             | Caminho relativo à URL Base (suporta variáveis). Ex: `/v1/messages`   |
| **Template do Body**    | Template JSON do corpo da requisição com variáveis dinâmicas          |
| **Headers**             | Headers customizados adicionais (pares chave-valor)                   |
| **Parâmetros de Query** | Parâmetros de query string (pares chave-valor)                        |
| **Content-Type**        | Tipo do conteúdo da requisição (padrão: `application/json`)           |
| **Timeout (ms)**        | Tempo limite em milissegundos (padrão: `30000`)                       |

### Exemplo de preenchimento

* **Método:** `POST`
* **Caminho:** `/v1/messages`
* **Template do Body:**

```json theme={null}
{
  "to": "${contact.contactId}",
  "text": "${message.body}"
}
```

> ⚠️ **Importante:** Se uma mensagem com anexo não encontrar um endpoint específico (ex: endpoint de mídia não configurado), o endpoint de texto será usado como fallback.

***

## Variáveis de interpolação

Os templates suportam variáveis dinâmicas com a sintaxe `${variavel}`. Elas podem ser usadas nos campos **Caminho**, **Template do Body**, **Headers** e **Parâmetros de Query**.

### Variáveis de mensagem

| Variável          | Descrição              | Exemplo                    |
| ----------------- | ---------------------- | -------------------------- |
| `${message.body}` | Conteúdo da mensagem   | `Olá, tudo bem?`           |
| `${message.id}`   | ID interno da mensagem | `507f1f77bcf86cd799439011` |

### Variáveis de contato

| Variável               | Descrição                           | Exemplo      |
| ---------------------- | ----------------------------------- | ------------ |
| `${contact.contactId}` | ID do contato na plataforma externa | `123456789`  |
| `${contact.name}`      | Nome do contato                     | `João Silva` |

### Variáveis de anexo

Disponíveis apenas nos endpoints de mídia, documento e áudio.

| Variável                 | Descrição            | Exemplo                            |
| ------------------------ | -------------------- | ---------------------------------- |
| `${attachment.url}`      | URL pública do anexo | `https://cdn.exemplo.com/foto.jpg` |
| `${attachment.mimeType}` | Tipo MIME do anexo   | `image/jpeg`                       |
| `${attachment.filename}` | Nome do arquivo      | `foto.jpg`                         |

### Variáveis de credenciais

| Variável             | Descrição                                                              |
| -------------------- | ---------------------------------------------------------------------- |
| `${credentials.xxx}` | Valor da credencial com chave `xxx` (configurada na seção Credenciais) |

> ⚠️ **Nota:** Valores de `${message.body}` e `${contact.name}` são automaticamente escapados para JSON (aspas, quebras de linha, tabulações). Isso garante que o template continue sendo um JSON válido mesmo com caracteres especiais.

***

## Mapeamento de Resposta

A seção **Mapeamento de Resposta** define como extrair informações da resposta da API externa. Preencha os campos usando **dot notation** (notação de ponto) para acessar campos aninhados no JSON de resposta.

| Campo                           | Obrigatório | Descrição                                                      |
| ------------------------------- | ----------- | -------------------------------------------------------------- |
| **Caminho do ID da Mensagem**   | Sim         | Caminho no JSON de resposta para o ID da mensagem enviada      |
| **Caminho do Sucesso**          | Sim         | Caminho para o campo que indica se a operação foi bem-sucedida |
| **Caminho da Mensagem de Erro** | Não         | Caminho para a mensagem de erro (quando a operação falha)      |

### Exemplo

Se a API externa retorna:

```json theme={null}
{
  "ok": true,
  "result": {
    "message_id": 456
  },
  "description": "mensagem de erro aqui"
}
```

Preencha:

* **Caminho do ID da Mensagem:** `result.message_id`
* **Caminho do Sucesso:** `ok`
* **Caminho da Mensagem de Erro:** `description`

### Notação de ponto e arrays

| Caminho                 | Descrição                     |
| ----------------------- | ----------------------------- |
| `id`                    | Campo direto na raiz          |
| `result.data.messageId` | Campo aninhado                |
| `items[0].id`           | Primeiro elemento de um array |
| `items[-1].id`          | Último elemento de um array   |

### Avaliação de sucesso

O campo indicado em **Caminho do Sucesso** é avaliado da seguinte forma:

| Valor retornado                               | Resultado |
| --------------------------------------------- | --------- |
| `true` (boolean)                              | Sucesso   |
| Número > 0                                    | Sucesso   |
| `"true"` ou `"ok"` (string, case-insensitive) | Sucesso   |
| `false`, `0`, `null`, `undefined`             | Falha     |

***

## Endpoints Adicionais

Para APIs que possuem endpoints específicos para diferentes tipos de anexo, use a seção **Endpoints Adicionais**. Clique em **Adicionar Endpoint** para criar um novo.

Cada endpoint adicional possui os mesmos campos do endpoint de texto, mais:

| Campo                | Descrição                              |
| -------------------- | -------------------------------------- |
| **Nome do Endpoint** | Nome identificador (ex: `Enviar Foto`) |
| **Tipos de Anexo**   | Tipos de anexo que esse endpoint trata |

### Tipos de Anexo disponíveis

| Tipo    | Descrição                    |
| ------- | ---------------------------- |
| `IMAGE` | Imagens (MIME: `image/*`)    |
| `VIDEO` | Vídeos (MIME: `video/*`)     |
| `AUDIO` | Áudios (MIME: `audio/*`)     |
| `FILE`  | Documentos e outros arquivos |
| `Todos` | Qualquer tipo de anexo       |

> ⚠️ **Nota:** Endpoints adicionais têm prioridade sobre os endpoints padrão. Se um endpoint adicional com tipo **Todos** estiver configurado, ele será usado para todos os anexos.

***

## Testar Conexão

Após configurar os endpoints, clique no botão **Testar Conexão** na parte inferior da tela. O teste envia uma mensagem de prova para o endpoint de texto com dados fictícios.

O resultado exibe:

| Campo        | Descrição                          |
| ------------ | ---------------------------------- |
| **Status**   | Código HTTP da resposta            |
| **Duração**  | Tempo de resposta em milissegundos |
| **Resposta** | Corpo da resposta da API           |
| **Erro**     | Mensagem de erro (se houver)       |
