# Botões

Texto com botões embaixo. O botão de resposta manda o clique para você; os outros abrem um link, ligam ou copiam um código.

- `text`: o texto. Com mais de uma linha, a primeira é o cabeçalho (em negrito) e o resto é o corpo.
- `footer`: o rodapé, em cinza.
- `url` ou `base64`: mídia no cabeçalho (imagem, vídeo ou documento), opcional.
- `choices[]`: os botões.
  - `title`: o texto do botão.
  - `id`: o que volta no clique (`option_id`). Sem `id`, vale o `title`.
  - `action`: `reply` (padrão, responde), `url` (abre o link em `value`), `call` (liga para o número em `value`) ou `copy` (copia o código em `value`). Só o `reply` gera evento. Na API oficial: até 3 botões de resposta ou 1 de link, sem misturar; copiar e ligar só em modelo (`template`).
- `legacy: true`: o formato antigo de botões, para quem ainda usa (só botões de resposta, sem mídia).

Para responder pela inbox a uma mensagem de botões que chegou, mande `"type": "interactive_reply"` com a mensagem em `reply_to` e o `id` da opção em `option_id`.

## Canais

| Canal | Funciona | Observação |
|---|---|---|
| WhatsApp (Web) | Sim |  |
| WhatsApp (API oficial) | Em parte | Só resposta e link. |
| Instagram | Em parte | Até 13 respostas, ou até 3 com link. |
| Messenger | Em parte | Até 13 respostas, ou até 3 com link. |
| Telegram | Em parte | Só resposta e link, sem mídia no cabeçalho. |

## Pedido

`POST /messages` com `"type": "buttons"`. [Testar](/endpoint/post/messages)

```json
{
  "to": "5511999999999",
  "type": "buttons",
  "text": "Confirma o pedido?",
  "footer": "Loja",
  "choices": [
    {
      "id": "sim",
      "title": "Sim"
    },
    {
      "id": "nao",
      "title": "Não"
    }
  ]
}
```

### Na uazapi

`POST /send/menu`, que continua funcionando. Na uazapi cada opção era um texto `"Título|id"`, e o tipo do botão vinha do formato do id. Na Orkesio cada item de `choices` é um objeto com `action` e `value`. A resposta pela inbox era um texto `>1` respondendo à mensagem; na Orkesio é `type: interactive_reply`.

```lado-a-lado
{
  "uazapi (POST /send/menu)": {
    "number": "5511999999999",
    "type": "button",
    "text": "Confirma o pedido?",
    "footerText": "Loja",
    "choices": [
      "Sim|sim",
      "Não|nao"
    ]
  },
  "Orkesio (POST /messages)": {
    "to": "5511999999999",
    "type": "buttons",
    "text": "Confirma o pedido?",
    "footer": "Loja",
    "choices": [
      {
        "id": "sim",
        "title": "Sim"
      },
      {
        "id": "nao",
        "title": "Não"
      }
    ]
  }
}
```

## Resposta

A própria mensagem (`OrkesioMessage`), no formato do `message.sent` e da busca. No WhatsApp Web volta na hora com `status: queued`: por padrão o envio vai pela fila (com `options.async: false`, espera o envio e volta a mensagem enviada). É o pedido no formato da mensagem: o arquivo, a miniatura e a prévia do link chegam no `message.sent`. Na API oficial volta depois que a Meta aceita, com `status: pending`. O resultado chega em `message.status` (a falha também em `message.failed`).

```json
{
  "id": "3EB05DCE1D4036FCE241C6",
  "chat_id": "5511999999999@s.whatsapp.net",
  "author": {
    "id": "5511888888888@s.whatsapp.net",
    "phone": "5511888888888"
  },
  "direction": "out",
  "sent_at": "2026-10-17T12:00:00.000Z",
  "category": "unsent",
  "type": "buttons",
  "text": "Confirma o pedido?",
  "footer": "Loja",
  "choices": [
    {
      "id": "sim",
      "title": "Sim"
    },
    {
      "id": "nao",
      "title": "Não"
    }
  ],
  "sent_by": "api",
  "status": "queued"
}
```

### Na uazapi

O `content` da uazapi é o proto do WhatsApp; aqui vai resumido (`...`).

```lado-a-lado
{
  "uazapi": {
    "id": "5511888888888:3EB05DCE1D4036FCE241C6",
    "messageid": "3EB05DCE1D4036FCE241C6",
    "chatid": "5511999999999@s.whatsapp.net",
    "chatlid": "123456789012345@lid",
    "fromMe": true,
    "isGroup": false,
    "groupName": "",
    "sender": "987654321098765@lid",
    "sender_pn": "5511888888888@s.whatsapp.net",
    "sender_lid": "987654321098765@lid",
    "senderName": "",
    "messageType": "InteractiveMessage",
    "mediaType": "",
    "messageTimestamp": 1792238400000,
    "source": "web",
    "status": "",
    "text": "Confirma o pedido?",
    "content": {
      "body": {
        "text": "Confirma o pedido?"
      },
      "footer": {
        "text": "Loja"
      },
      "nativeFlowMessage": {
        "buttons": [
          "..."
        ]
      }
    },
    "quoted": "",
    "edited": "",
    "reaction": "",
    "vote": "",
    "buttonOrListid": "",
    "convertOptions": "",
    "pinned": false,
    "owner": "5511888888888",
    "wasSentByApi": true,
    "track_source": "",
    "track_id": "",
    "response": {
      "status": "success",
      "message": "Message sent successfully"
    }
  },
  "Orkesio": {
    "id": "3EB05DCE1D4036FCE241C6",
    "chat_id": "5511999999999@s.whatsapp.net",
    "author": {
      "id": "5511888888888@s.whatsapp.net",
      "phone": "5511888888888"
    },
    "direction": "out",
    "sent_at": "2026-10-17T12:00:00.000Z",
    "category": "unsent",
    "type": "buttons",
    "text": "Confirma o pedido?",
    "footer": "Loja",
    "choices": [
      {
        "id": "sim",
        "title": "Sim"
      },
      {
        "id": "nao",
        "title": "Não"
      }
    ],
    "sent_by": "api",
    "status": "queued"
  }
}
```

## No webhook

O que chega no seu webhook (ou em `GET /events`) depois do envio.

### message.sent

Quando a mensagem sai. [O evento `message.sent`](/webhook/message.sent)

```json
{
  "id": "evt_01JAB3K9ZQ7V0M4T8R2X6WYD5H",
  "type": "message.sent",
  "created_at": "2026-10-17T12:00:00.000Z",
  "inbox": {
    "id": "r0269625d29bfbd",
    "name": "loja",
    "phone": "5511888888888",
    "channel": "whatsapp_web"
  },
  "data": {
    "message": {
      "id": "3EB05DCE1D4036FCE241C6",
      "chat_id": "5511999999999@s.whatsapp.net",
      "author": {
        "id": "5511888888888@s.whatsapp.net",
        "phone": "5511888888888"
      },
      "direction": "out",
      "sent_at": "2026-10-17T12:00:00.000Z",
      "category": "conversation",
      "type": "buttons",
      "text": "Confirma o pedido?",
      "footer": "Loja",
      "choices": [
        {
          "id": "sim",
          "title": "Sim"
        },
        {
          "id": "nao",
          "title": "Não"
        }
      ],
      "sent_by": "api"
    },
    "chat": {
      "id": "5511999999999@s.whatsapp.net",
      "lid": "123456789012345@lid",
      "type": "direct"
    }
  }
}
```

### message.status

`sent`, `delivered`, `read` e `played` (áudio e voz), um evento por mudança; `failed` se o envio falhar. [O evento `message.status`](/webhook/message.status)

```json
{
  "id": "evt_01JAB3K9ZQ7V0M4T8R2X6WYD6J",
  "type": "message.status",
  "created_at": "2026-10-17T12:00:05.000Z",
  "inbox": {
    "id": "r0269625d29bfbd",
    "name": "loja",
    "phone": "5511888888888",
    "channel": "whatsapp_web"
  },
  "data": {
    "chat": {
      "id": "5511999999999@s.whatsapp.net",
      "lid": "123456789012345@lid",
      "type": "direct"
    },
    "status": "delivered",
    "at": "2026-10-17T12:00:05.000Z",
    "messages": [
      {
        "id": "3EB05DCE1D4036FCE241C6"
      }
    ]
  }
}
```

## Quando o contato responde

### message.received

O contato tocou em **Sim**. `option_id` é o `id` do botão e `reply_to` é a mensagem dos botões. `kind` é `template_button` (é assim que o WhatsApp manda o clique nesses botões; com `legacy: true`, vem `button`). [O evento `message.received`](/webhook/message.received)

```json
{
  "id": "evt_01JAB3M2K8P4R6T8V0X2Z4B6D8",
  "type": "message.received",
  "created_at": "2026-10-17T12:03:00.000Z",
  "inbox": {
    "id": "r0269625d29bfbd",
    "name": "loja",
    "phone": "5511888888888",
    "channel": "whatsapp_web"
  },
  "data": {
    "message": {
      "id": "AC1FACA14F3FA7A19DB5FB19D7035506",
      "chat_id": "5511999999999@s.whatsapp.net",
      "author": {
        "id": "5511999999999@s.whatsapp.net",
        "phone": "5511999999999",
        "lid": "123456789012345@lid",
        "name": "Maria Souza"
      },
      "direction": "in",
      "sent_at": "2026-10-17T12:03:00.000Z",
      "category": "conversation",
      "type": "interactive_reply",
      "kind": "template_button",
      "option_id": "sim",
      "text": "Sim",
      "reply_to": "3EB05DCE1D4036FCE241C6",
      "quoted": {
        "id": "3EB05DCE1D4036FCE241C6",
        "direction": "out",
        "type": "buttons",
        "preview": "Confirma o pedido?"
      }
    },
    "chat": {
      "id": "5511999999999@s.whatsapp.net",
      "lid": "123456789012345@lid",
      "type": "direct"
    }
  }
}
```

