# Especificações das mensagens do Chatlayer

Chatlayer.ai suporta diferentes tipos de mensagens de chat, cada uma com sua própria estrutura de objeto. Mensagens de chat podem ser enviadas:

* Na resposta do plugin da API
* Do seu [webhook](https://docs.chatlayer.ai/chatlayer-documentation-pt-br/channels/all-channels/webhook-api) para o Chatlayer.ai

Cada mensagem tem dois campos obrigatórios:

* **type**: o tipo da mensagem (carousel, buttons, list, media, text, …)
* **config**: a configuração da mensagem

## Texto

Uma mensagem de texto inclui uma simples mensagem de texto do bot.

**Formato da requisição**:

```javascript
{
  "senderId": "a7355930-fa92-11e7-8308-2f056e75d1ee",
  "message":  {
    "text": "Hi, I'm a chatbot"
  },
  "messageCounter": 1,
  "verifyToken": "8wMsLZkdDPT64nqh"
}
```

| **Propriedade** | **Valor** | **Descrição**                   |
| --------------- | --------- | ------------------------------- |
| text            | string    | A mensagem de teste do usuário. |

## Modelo de Botão

Um modelo de botão inclui uma simples mensagem de texto do bot e um array de objetos botão.

**Formato da requisição**:

```javascript
{
  "senderId": "a7355930-fa92-11e7-8308-2f056e75d1ee",
  "message":  {
    "attachment": {
      "type": "template",
      "payload": {
        "template_type": "button",
        "text": "Hello, in which language can I help you?",
        "buttons": [
          {
            "type": "postback",
            "title": "Nederlands",
            "payload": "437a034cde170b50de1b6a87d1cba104e39b1f6e"
          },
          {
            "type": "postback",
            "title": "English",
            "payload": "a6a318dd6afe997f282b3c7472e038a2e0f4046a"
          },
        ]
      }
    }
  },
  "messageCounter": 1,
  "verifyToken": "8wMsLZkdDPT64nqh"
}
```

**Objeto de mensagem para modelo de botão**:

| **Propriedade** | **Valor** | **Descrição**        |
| --------------- | --------- | -------------------- |
| attachment      | object    | O objeto attachment. |

**Objeto de attachment**:

| **Propriedade** | **Valor** | **Descrição**                                                                       |
| --------------- | --------- | ----------------------------------------------------------------------------------- |
| type            | string    | O tipo de attachment (template)                                                     |
| payload         | object    | O objeto payload do attachment. A estrutura do objeto depende do tipo de attachment |

**Objeto payload do attachment**:

| **Propriedade** | **Valor**         | **Descrição**                                                    |
| --------------- | ----------------- | ---------------------------------------------------------------- |
| template\_type  | string            | O tipo de template (button)                                      |
| text            | string (opcional) | O texto acima dos botões (apenas para o tipo de template button) |
| buttons         | array             | Um array de objetos botão                                        |

**Objeto botão**:

| **Propriedade** | **Valor**                                                                        | **Descrição**                                                                                                                                                              |
| --------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| type            | string                                                                           | O tipo do botão (web\_url - postback - phone\_number - element\_share)                                                                                                     |
| title           | string                                                                           | A legenda do botão                                                                                                                                                         |
| payload         | string (conterá o número de telefone quando o tipo for phone\_number) - opcional | <p>O payload do botão. Apenas para botões do tipo postback.<br>Isto é um <strong>Identificador opaco</strong> por favor não tente alterar ou extrair significado dele.</p> |
| url             | string - opcional                                                                | A url do botão. Apenas para botões do tipo url                                                                                                                             |

## Respostas rápidas

Uma mensagem de resposta rápida inclui uma simples mensagem de texto do bot e um array de objetos de resposta rápida.

**Formato da requisição**:

```javascript
{
  "senderId": "a7355930-fa92-11e7-8308-2f056e75d1ee",
  "message":  {
    "text": "Hello, in which language can I help you?",
    "quick_replies": [
      {
        "content_type": "text",
        "title": "Nederlands",
        "payload": "c3e30be2f30687fea0ae419acaeb9d77261631a9",
        "image_url": "https://domain/logo.png"
      },
      {
        "content_type": "text",
        "title": "English",
        "payload": "2e29412e82c8eea8c8b0c170661070d28929a900",
        "image_url": "https://domain/logo.png"
      },
    ]
  },
  "messageCounter": 1,
  "verifyToken": "8wMsLZkdDPT64nqh"
}
```

**Objeto de mensagem para respostas rápidas**:

| **Propriedade** | **Valor** | **Descrição**                          |
| --------------- | --------- | -------------------------------------- |
| text            | string    | O texto antes das respostas rápidas.   |
| quick\_replies  | array     | Um array de objetos de resposta rápida |

**Objeto de resposta rápida**:

| **Propriedade** | **Valor** | **Descrição**                                                                                                                                   |
| --------------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| content\_type   | string    | O tipo de conteúdo da resposta rápida (text)                                                                                                    |
| title           | string    | A legenda do botão                                                                                                                              |
| payload         | string    | <p>O payload da resposta rápida.<br>Isto é um <strong>Identificador opaco</strong> por favor não tente alterar ou extrair significado dele.</p> |

## Modelo genérico

Um modelo genérico (carrossel) inclui uma lista de elementos do template genérico. O elemento do template genérico é uma mensagem estruturada simples que inclui um título, subtítulo, imagem e até três botões

**Formato da requisição**:

```javascript
{
  "senderId": "a7355930-fa92-11e7-8308-2f056e75d1ee",
  "message":  {
    "attachment": {
      "type": "template",
      "payload": {
        "template_type": "generic",
        "elements": [
          {
             "title": "Language",
             "subtitle": "Please set your language",
             "image_url": "https://domain/lang.png",
             "item_url": "https://domain/lang",
             "buttons": [
               {
                 "type": "postback",
                 "title": "Nederlands",
                 "payload": "f0512bd2fcddc53963056dc0d63b52b8caa902ff"
               },
               {
                 "type": "postback",
                 "title": "English",
                 "payload": "4562ae76c34a13647fab90425c68a486b8acf356"
               },
            ]
          }
        ]
      }
    }
  },
  "messageCounter": 1,
  "verifyToken": "8wMsLZkdDPT64nqh"
}
```

**Objeto de mensagem para template genérico**:

| **Propriedade** | **Valor** | **Descrição**        |
| --------------- | --------- | -------------------- |
| attachment      | object    | O objeto attachment. |

**Objeto de attachment**:

| **Propriedade** | **Valor** | **Descrição**                                                                       |
| --------------- | --------- | ----------------------------------------------------------------------------------- |
| type            | string    | O tipo de attachment (template)                                                     |
| payload         | object    | O objeto payload do attachment. A estrutura do objeto depende do tipo de attachment |

**Objeto payload do attachment**:

| **Propriedade** | **Valor** | **Descrição**                                                   |
| --------------- | --------- | --------------------------------------------------------------- |
| template\_type  | string    | O tipo de template (generic)                                    |
| elements        | array     | Um array de elementos do template genérico (cards do carrossel) |

**Objeto de elemento do template genérico**:

| **Propriedade** | **Valor** | **Descrição**                                                                                                |
| --------------- | --------- | ------------------------------------------------------------------------------------------------------------ |
| title           | string    | O título do card do carrossel                                                                                |
| subtitle        | string    | O subtítulo do card do carrossel                                                                             |
| image\_url      | string    | A imagem do card do carrossel                                                                                |
| item\_url       | string    | A url do card do carrossel. Quando o usuário clica na imagem a página web abre em uma nova aba do navegador. |
| buttons         | array     | Um array de objetos botão                                                                                    |

**Objeto botão**:

| **Propriedade** | **Valor**                                                                        | **Descrição**                                                                                                                                                              |
| --------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| type            | string                                                                           | O tipo do botão (web\_url - postback - phone\_number - element share)                                                                                                      |
| title           | string                                                                           | A legenda do botão                                                                                                                                                         |
| payload         | string (conterá o número de telefone quando o tipo for phone\_number) - opcional | <p>O payload do botão. Apenas para botões do tipo postback.<br>Isto é um <strong>Identificador opaco</strong> por favor não tente alterar ou extrair significado dele.</p> |
| url             | string - opcional                                                                | A url do botão. Apenas para botões do tipo url                                                                                                                             |

## Modelo de lista

O modelo de lista é uma lista de 2-4 itens estruturados com um botão global opcional exibido na parte inferior. Cada item pode conter uma imagem em miniatura, título, subtítulo e um botão. Você também pode especificar um objeto default\_action que define uma URL que será aberta quando o item for tocado.

**Formato da requisição**:

```javascript
{
  "senderId": "a7355930-fa92-11e7-8308-2f056e75d1ee",
  "message":  {
    "attachment": {
      "type": "template",
      "payload": {
        "template_type": "list",
        "elements": [
          {
             "title": "Language",
             "subtitle": "Select your language",
             "image_url": "https://domain/lang.png",
             "default_action": {
                "type": "web_url",
                "url": "default_url"
              }
             "buttons": [
               {
                 "type": "postback",
                 "title": "Nederlands",
                 "payload": "76601d56d0619ef87552bbfbbfcd714c4fda513b"
               }
            ]
          }
        ],
        "buttons": []
      }
    }
  },
  "messageCounter": 1,
  "verifyToken": "8wMsLZkdDPT64nqh"
}
```

**Objeto de mensagem para template de lista**:

| **Propriedade** | **Valor** | **Descrição**        |
| --------------- | --------- | -------------------- |
| attachment      | object    | O objeto attachment. |

**Objeto de attachment**:

| **Propriedade** | **Valor** | **Descrição**                                                                       |
| --------------- | --------- | ----------------------------------------------------------------------------------- |
| type            | string    | O tipo de attachment (template)                                                     |
| payload         | object    | O objeto payload do attachment. A estrutura do objeto depende do tipo de attachment |

**Objeto payload do attachment**:

| **Propriedade** | **Valor** | **Descrição**                                 |
| --------------- | --------- | --------------------------------------------- |
| template\_type  | string    | O tipo de template (list)                     |
| elements        | array     | Um array de elementos da lista                |
| buttons         | array     | Um array de objetos de botões gerais da lista |

**Objeto de elemento do template de lista**:

| **Propriedade** | **Valor** | **Descrição**                                         |
| --------------- | --------- | ----------------------------------------------------- |
| title           | string    | O título do card do carrossel                         |
| subtitle        | string    | O subtítulo do card do carrossel                      |
| image\_url      | string    | A imagem do card do carrossel                         |
| default\_action | object    | A ação padrão quando o usuário toca no item da lista. |
| buttons         | array     | Um array de objetos de botões do item da lista        |

**Objeto de ação padrão**:

| **Propriedade** | **Valor** | **Descrição**                                                                                                       |
| --------------- | --------- | ------------------------------------------------------------------------------------------------------------------- |
| type            | string    | O tipo de ação (web\_url)                                                                                           |
| url             | string    | A URL da ação. Quando o usuário toca no elemento da lista essa página web será aberta em uma nova aba do navegador. |

**Objeto botão**:

| **Propriedade** | **Valor**                                            | **Descrição**                                                                                                                                                              |
| --------------- | ---------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| type            | string                                               | O tipo do botão (web\_url - postback - phone\_numberl - element share)                                                                                                     |
| title           | string                                               | A legenda do botão                                                                                                                                                         |
| payload         | <p></p><p>string (tipo phone\_number) - opcional</p> | <p>O payload do botão. Apenas para botões do tipo postback.<br>Isto é um <strong>Identificador opaco</strong> por favor não tente alterar ou extrair significado dele.</p> |
| url             | string - opcional                                    | A url do botão. Apenas para botões do tipo url                                                                                                                             |

## Attachment

Um attachment representa um arquivo como imagens e vídeo.

**Formato da requisição**:

```javascript
{
  "senderId": "a7355930-fa92-11e7-8308-2f056e75d1ee",
  "message":  {
    "attachment": {
      "type": "image"
      "payload": {
        "url": "image_url",
      }
    }
  },
  "messageCounter": 1,
  "verifyToken": "8wMsLZkdDPT64nqh"
}
```

**Objeto de mensagem para attachment**:

| **Propriedade** | **Valor** | **Descrição**        |
| --------------- | --------- | -------------------- |
| attachment      | object    | O objeto attachment. |

**Objeto de attachment**:

| **Propriedade** | **Valor** | **Descrição**                                                                       |
| --------------- | --------- | ----------------------------------------------------------------------------------- |
| type            | string    | O tipo de attachment (image-video)                                                  |
| payload         | object    | O objeto payload do attachment. A estrutura do objeto depende do tipo de attachment |

**Objeto payload do attachment**:

| **Propriedade** | **Valor** | **Descrição**       |
| --------------- | --------- | ------------------- |
| url             | string    | A url do attachment |

## Rich text

Rich text é texto ao qual se aplica formatação. A formatação possível é negrito, itálico, sublinhado, hyperlink para URL, hyperlink para bloco, título (1-4), lista com marcadores e lista ordenada.

**Formato da requisição**:

```javascript
{
  senderId: 'a7355930-fa92-11e7-8308-2f056e75d1ee',
  verifyToken: 'e63131e1-459f-45aa-be42-666e1e4ef197',
  message: {
    template: {
      __typename: 'RichTextMessageTemplate',
      order: 1,
      configTranslations: [Object]
    },
    richText: '<p>Paragraph</p>\n' +
      '<p><strong>Bold</strong></p>\n' +
      '<p><em>Italic</em></p>\n' +
      '<p><u>Underlined</u></p>\n' +
      '<p><a href="https://www.sinch.com" target="_blank" rel="noopener noreferrer">Hyperlink</a></p>\n' +
      '<p><a href="f36f9056-2659-4d59-8940-4e9c7d3855a3" target="_blank" rel="noopener noreferrer">Go to bot dialog</a></p>\n' +
      '<h1>Heading 1</h1>\n' +
      '<h2>Heading 2</h2>\n' +
      '<h3>Heading 3</h3>\n' +
      '<h4>Heading 4</h4>\n' +
      '<ul>\n' +
      '<li>Bulleted list</li>\n' +
      '</ul>\n' +
      '<ol>\n' +
      '<li>Ordered list</li>\n' +
      '</ol>',
    type: 'richText'
  },
  messageCounter: 2,
  nlp: { intent: { name: null, score: null } },
  dialogstate: {
    id: 'f444b20b-370a-434d-af00-822cbce056ec',
    name: 'Introduction',
    label: null
  }
}
```

**Objeto de mensagem para attachment**:

| **Propriedade** | **Valor** | **Descrição**        |
| --------------- | --------- | -------------------- |
| richText        | string    | A mensagem rich text |
