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

# API Send Message

> Este documento traz as especificações técnicas para chamada da API SendMessage que faz disparos de mensagens via Invenio, independente do canal.

A API SendMessage é o recurso que permite disparar mensagens pela plataforma Invenio de forma unificada,
independentemente do canal utilizado. Com ela, sua empresa pode enviar mensagens por WhatsApp, SMS e E-mail, incluindo o uso de templates HSM, textos livres e arquivos.
Esse endpoint foi desenvolvido para facilitar a automação da comunicação, tornando possível integrar outros sistemas ao Invenio e centralizar a gestão de envios.

***

## Autenticação

Antes de realizar o envio de mensagens pela API, é necessário obter um token de acesso (access\_token). Esse token é solicitado na rota de
login e deve ser utilizado na chamada da API SendMessage como um Bearer Token, funcionando como a autorização para que o disparo seja concluído
com sucesso.

> ⚠️ **Importante**:<br />
> Caso o token não seja informado, ou esteja expirado, a API retornará o erro **401 Unauthorized** impedindo o envio da mensagem.

O  usuário utilizado na requisição de login precisa ser do tipo **API**, garantindo a segurança e o correto funcionamento da integração.

[Acesse a documentação sobre Usuários](https://docs.robbu.global/docs/center/usuarios)

## Endpoint de Login

Para realizar a autenticação preencha a requisição conforme o exemplo abaixo:

**Método:**  `POST`

**URL:** `https://api.robbu.global/v1/login`

**Company** ➜ `Nome da empresa no Invenio Center`

**Username** ➜ `Nome do usuário API`

**Password** ➜ `Senha do usuário API`

**Body:**

```
    {
  "Company": "#####",
  "Username": "#####",
  "Password": "#####"
    }

```

**Exemplo de response:**

```
{
  "access_token": "eyJhbGciOiJIUzI1NiIsInR5...",
  "expires_in": 287971200,
  "refresh_token": "",
  "token_type": "bearer"
}

```

Não é necessário gerar um novo token a cada envio. O campo **expires\_in** define sua validade em segundos e, por padrão, pode ser considerado válido por até 3333 dias. É importante lembrar que, caso a rota de login seja
executada novamente, o token anterior será invalidado. Por isso, a recomendação é armazená-lo e solicitar um novo apenas quando a requisição de envio retornar **401 Unauthorized**.

***

## Endpoint de Envio de Mensagens

Com o token em mãos, basta utilizar a rota de envio para realizar o disparo das mensagens.

**Método:** `POST`

**URL:** `https://api.robbu.global/v1/sendmessage`

O envio deve incluir no cabeçalho a autenticação no formato: `Authorization: Bearer {access_token}`

**Exemplo de request (completo)**

```json title="POST https://api.robbu.global/v1/sendmessage" showLineNumbers theme={null}
{
  "invenioPrivateToken": "xxxxxx-xxxxxxx-xxxxxxxx-xxxxxxxx",
  "text": "olá usuário",
  "emailSubject": "",
  "channel": 3,
  "templateName": "template1",
  "attendantUserName": "Usuário 1",
  "templateParameters": [
    {
      "parameterName": "PrimeiroNome",
      "parameterValue": "Nome alternativo"
    },
    {
      "parameterName": "Coringa1",
      "parameterValue": "01/01/1993"
    }
  ],
  "source": {
    "countryCode": 55,
    "phoneNumber": 11999999999,
    "prospect": false
  },
  "destination": {
    "countryCode": 55,
    "phoneNumber": 1199999999,
    "email": ""
  },
  "discardSettings": {
    "recentContactLastHours": 0,
    "InAttendance": true
  },
  "contact": {
    "name": "Ana da Silva",
    "customCode": "5150",
    "id": "78905678908",
    "tag": "nometag",
    "jokers": [
      "coringa1",
      "coringa2",
      "coringa3",
      "coringa4",
      "coringa5"
    ],
    "walletClientCode": "CodDefault",
    "updateIfExists": true
  },
  "voiceSettings": {
    "callId": "123123"
  },
  "files": [
    {
      "address": "https://robbublob.blob/download/boletoteste.pdf",
      "base64": "...u5y3i4y5iu345yu345yu345y5y4...",
      "name": "seuboleto.pdf"
    }
  ]
}
```

## Detalhamento dos Campos

### Parâmetros da Requisição SendMessage

| **Campo**               | **Descrição**                                                                                                                                                                                                                    |
| ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **InvenioPrivateToken** | Obtido no ambiente administrativo do Invenio Center em `Configurações > Conta`. **Obrigatório** para que a chamada seja aceita.                                                                                                  |
| **Text**                | Conteúdo da mensagem em texto livre. Ignorado quando o envio utiliza **template HSM**. Só pode ser usado em contatos com janela de 24h aberta ([saiba mais](https://docs.robbu.global/docs/live/sessao-de-24horas-no-whatsapp)). |
| **EmailSubject**        | Usado apenas em mensagens enviadas por **e-mail**, deve ser preenchido com o título do e-mail.                                                                                                                                   |
| **Channel**             | Define o canal de envio: `1 = E-mail`, `2 = SMS`, `3 = WhatsApp`.                                                                                                                                                                |
| **attendantUserName**   | Se preenchido, irá definir qual usuário estará fidelizado ao contato.                                                                                                                                                            |
| **TemplateName**        | Quando o envio é feito via **HSM**, deve ser preenchido com o nome do template.                                                                                                                                                  |
| **TemplateParameters**  | Personalização dos templates com variáveis dinâmicas. Veja abaixo.                                                                                                                                                               |
| **Source**              | Informações da **origem** da mensagem (linha de disparo). Veja abaixo.                                                                                                                                                           |
| **Destination**         | Informações do **destinatário** da mensagem. Veja abaixo.                                                                                                                                                                        |
| **DiscardSettings**     | Evita disparos desnecessários quando já houve contato recente ou atendimento ativo. Veja abaixo.                                                                                                                                 |
| **Contact**             | Dados adicionais do contato que podem ser atualizados no disparo. Veja abaixo.                                                                                                                                                   |
| **WalletClientCode**    | Código cliente do segmento definido no Invenio, garantindo vínculo com a carteira escolhida.                                                                                                                                     |
| **UpdateIfExists**      | Define se as informações do contato devem ser atualizadas (`true` ou `false`).                                                                                                                                                   |
| **VoiceSettings**       | Deve ser preenchido com o **Call ID de voz** nos fluxos do canal de voz.                                                                                                                                                         |
| **Files**               | Permite o envio de arquivos anexados. Veja abaixo.                                                                                                                                                                               |

> ⚠️ **Importante**:<br />
>
> O parâmetro `text` é responsável pelo envio de mensagens livres aos contatos. Mesmo em cenários em que ele não é utilizado, como no disparo de templates por exemplo, esse campo é obrigatório e não deve ser removido do body da requisição.<br />
> Para esses cenários ele deve permanecer presente, ainda que vazio. Caso o parâmetro seja excluído, a API retornará o erro:<br />
> **"message": "Object reference not set to an instance of an object."**

***

### TemplateParameters (Parâmetros de template)

| **Campo**          | **Descrição**                                   |
| ------------------ | ----------------------------------------------- |
| **ParameterName**  | Nome da variável conforme definido no template. |
| **ParameterValue** | Valor que substituirá a variável no envio.      |

***

### Source (Origem da Mensagem)

| **Campo**       | **Descrição**                                                                                                                                                                                                                                                                                                         |
| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **CountryCode** | Código do país da linha de origem.                                                                                                                                                                                                                                                                                    |
| **PhoneNumber** | Número de telefone (com DDD) da linha que realizará o disparo.                                                                                                                                                                                                                                                        |
| **Prospect**    | Define a aleatorização das linhas prospect. <br />- `false`: a mensagem sairá exatamente da linha configurada. <br />- `true`: pode ser enviada por outra linha prospect elegível. <br /> [Saiba mais sobre aleatorização](https://docs.robbu.global/docs/center/canal-whatsapp#aleatoriza%C3%A7%C3%A3o-inteligente). |

***

### Destination (Destino da Mensagem)

| **Campo**       | **Descrição**                                                   |
| --------------- | --------------------------------------------------------------- |
| **CountryCode** | Código do país do contato que receberá a mensagem.              |
| **PhoneNumber** | Número de telefone (com DDD) do contato destinatário.           |
| **Email**       | Endereço de e-mail do destinatário (quando o canal for e-mail). |

***

### DiscardSettings (Descartes)

| **Campo**                  | **Descrição**                                                                                              |
| -------------------------- | ---------------------------------------------------------------------------------------------------------- |
| **RecentContactLastHours** | Quantidade de horas a considerar para descartar o envio.                                                   |
| **InAttendance**           | `true`: descarta contatos em atendimento. <br /> `false`: envia mesmo que o contato esteja em atendimento. |

> ⚠️ **Importante**:<br />
>
> Os parâmetros `DiscardSettings` e `attendantUserName` possuem uma relação direta e devem ser configurados de forma alinhada para evitar bloqueios no envio de mensagens. A condição de descarte definida em `DiscardSettings`, especificamente o parâmetro `InAttendance`, atua como uma barreira de envio sempre que o sistema identifica que aquele contato está fidelizado a um operador em um determinado período de tempo.<br />
>
> Por sua vez, o parâmetro `attendantUserName` é justamente o responsável por realizar essa fidelização do contato a um operador específico. Ou seja, ao definir um nome de operador em `attendantUserName`, o contato passa a ser reconhecido como estando em operação/atendimento.<br />
>
> Dessa forma, sempre que `attendantUserName` for utilizado, é necessário garantir que, na configuração de `DiscardSettings`, o parâmetro `InAttendance` seja marcada como **false**. Caso essa condição permaneça como **true**, o envio será bloqueado e a API retornará o erro:<br />
>
> **message not sent: contact in attendance**

***

### Contact (Contato)

| **Campo**      | **Descrição**                                                                                                                |
| -------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| **Name**       | Atualiza o nome do contato no Invenio.                                                                                       |
| **CustomCode** | Código personalizado usado pela empresa para categorizar contatos.                                                           |
| **Id**         | Atualiza o CPF/CNPJ do contato.                                                                                              |
| **Tag**        | Categoriza contatos para facilitar a busca ([saiba mais](https://docs.robbu.global/docs/live/edicao-de-tags)).               |
| **Jokers**     | Coringas dinâmicos utilizados no disparo. <br />- `Joker 1 a 4`: até 300 caracteres. <br />- `Joker 5`: até 3000 caracteres. |

***

### Files (Anexos)

| **Campo**   | **Descrição**                                     |
| ----------- | ------------------------------------------------- |
| **Address** | URL da mídia a ser enviada.                       |
| **Base64**  | Código em base64 da mídia.                        |
| **Name**    | Nome do arquivo com extensão (ex.: `boleto.pdf`). |

> ℹ️ **Observação**: <br />
>
> * Em **templates (HSM)** só é permitido **1 arquivo por disparo**.
> * Em **mensagens livres**, é possível enviar múltiplos arquivos (ex.: ZIP).
> * Apesar de permitido, o envio em ZIP pode não ser compatível com todos os modelos de celulares.

***

## Responses API Send Message

Ao realizar uma chamada à API, diferentes códigos de status podem ser retornados, indicando o resultado do disparo. A seguir, listamos os principais responses que podem ser encontrados, juntamente com seu significado, para auxiliar no monitoramento e tratamento de respostas:

| **Código**                    | **Descrição**                                        |
| ----------------------------- | ---------------------------------------------------- |
| **200 OK**                    | Mensagem enviada corretamente.                       |
| **400 Bad Request**           | Preenchimento incorreto ou incompleto de parâmetros. |
| **401 Unauthorized**          | Token inválido ou expirado.                          |
| **404 Not Found**             | URL incorreta.                                       |
| **500 Internal Server Error** | Erro interno da API.                                 |

> ℹ️ **Observação**:<br /> É importante observar que a API não retorna mensagens de erro detalhadas em casos de falha de envio nos canais externos (como erros da Meta). Nesses casos, a validação deve ser feita diretamente no **Invenio Center**, onde estão disponíveis os logs e relatórios de entrega.

## Exemplos de Requisições

<Accordion title="Preenchimento com parâmetros de templates">
  ```json title="POST https://api.robbu.global/v1/sendmessage" showLineNumbers theme={null}
  {
    "invenioPrivateToken": "xxxxxx-xxxxxxx-xxxxxxxx-xxxxxxxx",
    "text": "",
    "emailSubject": "",
    "channel": 3,
    "templateName": "comercial_av",
    "attendantUserName": "",
    "templateParameters": [
        {
            "parameterName": "Cliente",
            "parameterValue": "Roberto"
        },
        {
            "parameterName": "Site",
            "parameterValue": "https://docs.robbu.global/"
        }
    ],
    "source": {
        "countryCode": 55,
        "phoneNumber": 11999999999,
        "prospect": false
    },
    "destination": {
        "countryCode": 55,
        "phoneNumber": 11999999999,
        "email": ""
    },
    "discardSettings": {
        "recentContactLastHours": 0,
        "InAttendance": false
    },
    "contact": {
        "name": "",
        "customCode": "",
        "id": "",
        "tag": "",
        "jokers": [
            "",
            "",
            "",
            "",
            ""
        ],
        "walletClientCode": "comercial",
        "updateIfExists": true
    }
  }
  ```

  **Template configurado no Invenio Center**

  <img src="https://robbublob.blob.core.windows.net/docs/sendmessage/templatesendmessage.png" />

  <img src="https://robbublob.blob.core.windows.net/docs/sendmessage/sendmessagetemplateedit.png" />
</Accordion>

<Accordion title="Envio de texto livre com dois arquivos">
  ```json title="POST https://api.robbu.global/v1/sendmessage" showLineNumbers theme={null}

    {
    "invenioPrivateToken": "xxxxxx-xxxxxxx-xxxxxxxx-xxxxxxxx",
    "text": "Segue os arquivos do ultimo evento",
    "emailSubject": "",
    "channel": 3,
    "templateName": "",
    "attendantUserName": "Operador",
    "templateParameters": [
        {
            "parameterName": "",
            "parameterValue": ""
        },
        {
            "parameterName": "",
            "parameterValue": ""
        }
    ],
    "source": {
        "countryCode": 55,
        "phoneNumber": 11999999999,
        "prospect": false
    },
    "destination": {
        "countryCode": 55,
        "phoneNumber": 11999999999,
        "email": ""
    },
    "discardSettings": {
        "recentContactLastHours": 0,
        "InAttendance": false
    },
    "contact": {
        "name": "Cliente",
        "customCode": "",
        "id": "2133125456725",
        "tag": "",
        "jokers": [
            "",
            "",
            "",
            "",
            ""
        ],
        "walletClientCode": "financeiro",
        "updateIfExists": true
    },
    "files": [
    {
      "address": "",
      "base64": "JVBERi0xLjMKJcTl8uXrp....",
      "name": "seuboleto.pdf"

    },
    
    {
      "address": "",
      "base64": "aoijdpisjapsijjsjjsker03nfdikds.....",
      "name": "seuboleto2.pdf"
    }

  ]

  }
  ```

  **Arquivos recebidos em uma conversa**

  <img src="https://robbublob.blob.core.windows.net/docs/sendmessage/exemplo2arquivoswpp.png" />
</Accordion>

<Accordion title="Envio com preenchimento de coringas">
  ```json title="POST https://api.robbu.global/v1/sendmessage" showLineNumbers theme={null}

    {
  "invenioPrivateToken": "xxxxxx-xxxxxxx-xxxxxxxx-xxxxxxxx",
  "text": "",
  "emailSubject": "",
  "channel": 3,
  "templateName": "comercial_av",
  "attendantUserName": "",
  "templateParameters": [
  ],
  "source": {
      "countryCode": 55,
      "phoneNumber": 11999999999,
      "prospect": false
  },
  "destination": {
      "countryCode": 55,
      "phoneNumber": 11999999999,
      "email": ""
  },
  "discardSettings": {
      "recentContactLastHours": 0,
      "InAttendance": false
  },
  "contact": {
      "name": "",
      "customCode": "",
      "id": "",
      "tag": "",
      "jokers": [
          "Roberto",
          "https://docs.robbu.global/",
          "",
          "",
          ""
      ],
      "walletClientCode": "comercial",
      "updateIfExists": false
  }
  } 

  ```

  **Prenchimento em disparo no Invenio Center**

  <img src="https://robbublob.blob.core.windows.net/docs/API/sendMessageRequisicaoCoringas.png" />
</Accordion>

<Accordion title="Envio para e-mail">
  ```json title="POST https://api.robbu.global/v1/sendmessage" showLineNumbers theme={null}

    {
  "invenioPrivateToken": "xxxxxx-xxxxxxx-xxxxxxxx-xxxxxxxx",
  "text": "Caro @primeironome, hoje é dia de oferta especial. Acesse https://docs.robbu.global/ e saiba mais.",
  "emailSubject": "Oferta Especial!!",
  "channel": 1,
  "templateName": "",
  "attendantUserName": "",
  "templateParameters": [
  ],
  "source": {
      "countryCode": 55,
      "phoneNumber": 11999999999,
      "prospect": false
  },
  "destination": {
      "email": "help@robbu.global"
  },
  "discardSettings": {
      "recentContactLastHours": 0,
      "InAttendance": false
  },
  "contact": {
      "name": "",
      "customCode": "",
      "id": "",
      "tag": "",
      "jokers": [
          "",
          "",
          "",
          "",
          ""
      ],
      "walletClientCode": "Teste",
      "updateIfExists": false
  }
  }

  ```

  > ⚠️**Observação**:<br />
  > O envio será realizado pelo e-mail já configurado em `Canais` no Invenio Center. <br />
  > Acesse e saiba mais: [Contas de E-mail - Invenio Center](https://docs.robbu.global/docs/center/cadastrar-conta-de-email)
</Accordion>

<Accordion title="Envio de Carrossel">
  ```json title="POST https://api.robbu.global/v1/sendmessage" showLineNumbers theme={null}

    {
  "invenioPrivateToken": "xxxxxx-xxxxxxx-xxxxxxxx-xxxxxxxx",
  "text": "",
  "emailSubject": "",
  "channel": 3,
  "templateName": "carrosseloferta",
  "attendantUserName": "",
  "templateParameters": [
  {
            "parameterName": "1",
            "parameterValue": "https://storage.robbu.global/v2/file/ECCFA721E503DB489CB5E2E09CC6A2D1.jpeg"
        },
        {
            "parameterName": "2",
            "parameterValue": "https://storage.robbu.global/v2/file/ECCFA721E503DB489CB5E2E09CC6A2D1.jpeg"
        }
  ],
  "source": {
      "countryCode": 55,
      "phoneNumber": 11999999999,
      "prospect": false
  },
  "destination": {
      "countryCode": 55,
      "phoneNumber": 11999999999,
      "email": ""
  },
  "discardSettings": {
      "recentContactLastHours": 0,
      "InAttendance": false
  },
  "contact": {
      "name": "",
      "customCode": "",
      "id": "",
      "tag": "",
      "jokers": [
          "",
          "",
          "",
          "",
          ""
      ],
      "walletClientCode": "comercial",
      "updateIfExists": false
  }
  }

  ```

  > ⚠️**Observação**:<br />
  > No modelo de carrossel, a nomenclatura atribuída aos parâmetros não interfere no comportamento do componente, podendo ser definida livremente. As imagens serão preenchidas conforme a ordem em que forem inseridas. Já os valores dos parâmetros devem ser adicionados por meio da URL correspondente. Na seção de `Mídias` no Invenio Center, é possível copiar essa URL, sendo necessário incluir a extensão do arquivo ao final para garantir o correto processamento do recurso.
  > Acesse e saiba mais: [Biblioteca de Mídias - Invenio Center](https://docs.robbu.global/docs/center/bibliotecas-de-midias)

  <img src="https://robbublob.blob.core.windows.net/docs/API/midiasSend.png" />
</Accordion>

<Accordion title="Envio de Template de Autenticação">
  ```json title="POST https://api.robbu.global/v1/sendmessage" showLineNumbers theme={null}

    {
  "invenioPrivateToken": "xxxxxx-xxxxxxx-xxxxxxxx-xxxxxxxx",
  "text": "",
  "emailSubject": "",
  "channel": 3,
  "templateName": "codigoverificacao",
  "attendantUserName": "",
  "templateParameters": [
  {
            "parameterName": "Code",
            "parameterValue": "xyzp42"
        }
  ],
  "source": {
      "countryCode": 55,
      "phoneNumber": 11999999999,
      "prospect": false
  },
  "destination": {
      "countryCode": 55,
      "phoneNumber": 11999999999,
      "email": ""
  },
  "discardSettings": {
      "recentContactLastHours": 0,
      "InAttendance": false
  },
  "contact": {
      "name": "",
      "customCode": "",
      "id": "",
      "tag": "",
      "jokers": [
          "",
          "",
          "",
          "",
          ""
      ],
      "walletClientCode": "comercial",
      "updateIfExists": false
  }
  }

  ```

  > ⚠️**Observação**:<br />
  > Nesse caso, a única exigência é a utilização da variável `@Code` no botão, seja em um template de autenticação ou em um template tradicional que utilize a função de copiar e colar. No corpo do texto, é possível utilizar outras variáveis — como coringas, por exemplo — conforme sua preferência, sem impacto no funcionamento.

  <img src="https://robbublob.blob.core.windows.net/docs/API/AutenticaSend.png" />
</Accordion>

<Accordion title="Envio de SMS">
  ```json title="POST https://api.robbu.global/v1/sendmessage" showLineNumbers theme={null}

    {
  "invenioPrivateToken": "xxxxxx-xxxxxxx-xxxxxxxx-xxxxxxxx",
  "text": "Caro @primeironome, hoje é dia de oferta especial. Acesse https://docs.robbu.global/ e saiba mais.",
  "emailSubject": "",
  "channel": 2,
  "templateName": "",
  "attendantUserName": "",
  "templateParameters": [
  ],
  "destination": {
      "countryCode": 55,
      "phoneNumber": 11999999999,
      "prospect": false
  },
  "discardSettings": {
      "recentContactLastHours": 0,
      "InAttendance": false
  },
  "contact": {
      "name": "",
      "customCode": "",
      "id": "",
      "tag": "",
      "jokers": [
          "",
          "",
          "",
          "",
          ""
      ],
      "walletClientCode": "Teste",
      "updateIfExists": false
  }
  }

  ```
</Accordion>

## Rate Limit

Para garantir a estabilidade da plataforma e a qualidade de entrega das mensagens, a API **SendMessage** aplica um **limite de requisições** por unidade de tempo. Quando o limite é atingido, novas chamadas são temporariamente recusadas e a API retorna **HTTP `429 Too Many Requests`**, sem encaminhar a mensagem para envio.

<Note>
  Requisições rejeitadas com status `429` **não consomem cota de envio** nem geram registro de mensagem no Invenio Center.
</Note>

### Headers da resposta `429`

| Header                  | Descrição                                                                             |
| ----------------------- | ------------------------------------------------------------------------------------- |
| `X-RateLimit-Limit`     | Quantidade máxima de requisições permitidas dentro da janela de tempo.                |
| `X-RateLimit-Remaining` | Requisições ainda disponíveis na janela atual. Em uma resposta `429` será sempre `0`. |
| `X-RateLimit-Reset`     | Segundos até que novas requisições sejam aceitas.                                     |
| `Retry-After`           | Segundos que o cliente deve aguardar antes de tentar novamente.                       |

### Body da resposta `429`

```json theme={null}
{
  "message": "rate limit exceeded",
  "limit": 60,
  "retryAfterSeconds": 2
}
```

| Campo               | Descrição                                                                       |
| ------------------- | ------------------------------------------------------------------------------- |
| `message`           | Mensagem descritiva do motivo do bloqueio.                                      |
| `limit`             | Quantidade máxima de requisições configurada para a janela de tempo.            |
| `retryAfterSeconds` | Tempo, em segundos, que o cliente deve aguardar antes de reenviar a requisição. |

<Tip>
  Sempre respeite o valor de `Retry-After` retornado e implemente **exponential backoff** em caso de bloqueios consecutivos. Para cenários de alto volume, distribua os disparos ao longo do tempo em vez de concentrá-los em curtos intervalos.
</Tip>

### Atualização da tabela de Responses

Adicione a linha abaixo na tabela existente **Responses API Send Message**:

| Código                  | Descrição                                                                                                                          |
| ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `429 Too Many Requests` | Limite de requisições da API excedido. Consulte os headers `Retry-After` e `X-RateLimit-Reset` para saber quando tentar novamente. |

***

## 🔗 Links e assuntos relacionados

* [Configurações Gerais da Conta](https://docs.robbu.global/docs/center/configuracoes-gerais-da%20conta)
* [Usuários no Invenio Center](https://docs.robbu.global/docs/center/usuarios)
* [Filtros de Busca de Contatos](https://docs.robbu.global/docs/center/filtros-de-busca-de-contatos)
* [Segmentos no Invenio Center](https://docs.robbu.global/docs/center/segmentos)
* [Templates de E-mail](https://docs.robbu.global/docs/center/templates-de-email)
* [Como Criar Templates no WhatsApp](https://docs.robbu.global/docs/center/como-criar-templates-whatsapp)
* [Canais de Atendimento no Invenio Center](https://docs.robbu.global/docs/center/canais-atendimento)
* [Sessão de 24h no WhatsApp](https://docs.robbu.global/docs/live/sessao-de-24horas-no-whatsapp)
* [Filtros e Menus de Busca no Invenio Live](https://docs.robbu.global/docs/live/filtros-e-menus-de-busca)
* [Filtro por Canal no Invenio Live](https://docs.robbu.global/docs/live/filtro-por-canal)

***

## ⁉️ Perguntas Frequentes (FAQ)

<AccordionGroup>
  <Accordion title="A autenticação precisa ser feita em todos os envios?">
    Não. O token obtido na rota de login possui validade definida no campo expires\_in. Ele deve ser reutilizado até expirar, solicitando um novo apenas quando houver retorno **401 Unauthorized**.
  </Accordion>

  <Accordion title="O campo text pode ser usado em qualquer envio?">
    Não. Esse campo é ignorado em envios que utilizam **template HSM** e só pode ser usado para contatos que estejam dentro da **janela de 24 horas aberta no WhatsApp**.
  </Accordion>

  <Accordion title="Quantos arquivos posso enviar em um único disparo?">
    * Em **templates HSM**: apenas **1 arquivo** é permitido.
    * Em **mensagens livres**: múltiplos arquivos podem ser enviados, incluindo ZIP (com ressalva de compatibilidade em alguns dispositivos).
  </Accordion>

  <Accordion title="O que acontece se eu executar novamente a rota de login?">
    O token anterior será automaticamente **invalidado**. Apenas o último token gerado será válido para as requisições.
  </Accordion>

  <Accordion title="Como funciona o parâmetro `discardSettings`?">
    Ele evita envios duplicados ou desnecessários:

    * `recentContactLastHours`: define em quantas horas o envio deve ser descartado se já houver interação anterior.
    * `InAttendance`: quando configurado como `true`, impede disparo para contatos que já estão em atendimento.
  </Accordion>

  <Accordion title="É possível atualizar dados do contato durante o envio?">
    Sim. O objeto **Contact** permite atualizar informações como **nome, documento, tags e coringas**, além de definir se os dados devem ser sobrescritos (`updateIfExists`).
  </Accordion>

  <Accordion title="Onde verificar erros de envio detalhados?">
    A API retorna apenas status gerais (200, 400, 401, etc.).\
    Para detalhes sobre falhas em canais externos (como a Meta/WhatsApp), é necessário consultar os **logs e relatórios de entrega** diretamente no **Invenio Center**.
  </Accordion>
</AccordionGroup>
