> ## Documentation Index
> Fetch the complete documentation index at: https://developers.datafyapi.com.br/llms.txt
> Use this file to discover all available pages before exploring further.

# Enviar botões

> Envie uma mensagem com até três botões de resposta rápida.

Envia uma mensagem com **até três botões** para o cliente responder com um toque, como **Confirmar**, **Remarcar** e **Cancelar**. É a forma mais simples de coletar uma escolha sem depender de o cliente digitar. A [janela de 24 horas](https://developers.datafyapi.com.br/api-reference/whatsapp/mensagens/introducao.md#janela-de-24-horas) precisa estar aberta.

> [!NOTE]
>
> O destinatário pode ser informado pelo **número de telefone** (`to`) ou pelo **ID do usuário** (`recipient`). Se os dois forem enviados, vale o `to`; para enviar pelo ID do usuário, deixe o `to` em branco. Veja a diferença em [Destinatário](https://developers.datafyapi.com.br/api-reference/whatsapp/mensagens/introducao.md#destinatário).

## Estrutura da mensagem

A mensagem é do tipo `interactive`, com `interactive.type` igual a `button`. Ela tem quatro partes:

| Parte | Campo | Obrigatório | Limite |
| - | - | - | - |
| Cabeçalho | `interactive.header` | Não | Texto com até 60 caracteres, ou imagem, vídeo ou documento. |
| Texto | `interactive.body.text` | **Sim** | 1.024 caracteres. |
| Rodapé | `interactive.footer.text` | Não | 60 caracteres. |
| Botões | `interactive.action.buttons` | **Sim** | De 1 a 3 botões. |

## Botões

Cada botão tem `type` igual a `reply` e um objeto `reply` com dois campos:

| Campo | Limite | Para que serve |
| - | - | - |
| `reply.id` | 256 caracteres | Identificador que **volta no webhook** quando o cliente toca no botão. Use um valor que o seu sistema reconheça, como `confirmar` ou `pedido-7539-cancelar`. |
| `reply.title` | 20 caracteres | Texto exibido no botão. **Não pode se repetir** entre os botões da mesma mensagem. |

```json theme={null}
"action": {
  "buttons": [
    { "type": "reply", "reply": { "id": "confirmar", "title": "Confirmar" } },
    { "type": "reply", "reply": { "id": "remarcar", "title": "Remarcar" } },
    { "type": "reply", "reply": { "id": "cancelar", "title": "Cancelar" } }
  ]
}
```

## Cabeçalho

O cabeçalho é opcional e aceita um texto ou uma mídia:

| `header.type` | Conteúdo |
| - | - |
| `text` | `header.text`, com até 60 caracteres. |
| `image` | `header.image`, com `link` ou `id`. |
| `video` | `header.video`, com `link` ou `id`. |
| `document` | `header.document`, com `link` ou `id`. |

A mídia do cabeçalho segue as mesmas regras e formatos de [Enviar imagem](https://developers.datafyapi.com.br/api-reference/whatsapp/mensagens/enviar-imagem.md), [Enviar vídeo](https://developers.datafyapi.com.br/api-reference/whatsapp/mensagens/enviar-video.md) e [Enviar documento](https://developers.datafyapi.com.br/api-reference/whatsapp/mensagens/enviar-documento.md): informe `link` **ou** `id`, nunca os dois.

```json theme={null}
"header": {
  "type": "image",
  "image": { "link": "https://exemplo.com/agenda.jpg" }
}
```

No **Testar**, a mensagem já vem preenchida com um cabeçalho de texto, o texto, o rodapé e três botões. Para testar um cabeçalho com mídia, troque o `type` do cabeçalho e preencha o `link` da mídia.

## Resposta do cliente

Quando o cliente toca em um botão, chega pelo [webhook](https://developers.datafyapi.com.br/api-reference/whatsapp/webhooks/eventos/mensagens.md) uma mensagem do tipo `interactive`, com `interactive.type` igual a `button_reply`. O `button_reply.id` é o `reply.id` do botão tocado, e o `context.id` aponta para a mensagem com os botões:

```json theme={null}
{
  "object": "whatsapp_business_account",
  "entry": [
    {
      "id": "234567890123456",
      "changes": [
        {
          "value": {
            "messaging_product": "whatsapp",
            "metadata": {
              "display_phone_number": "5541999999999",
              "phone_number_id": "123456789012345"
            },
            "contacts": [
              {
                "profile": {
                  "name": "Camila Souza"
                },
                "wa_id": "5511999999999",
                "user_id": "BR.13491208655302741918"
              }
            ],
            "messages": [
              {
                "context": {
                  "from": "5541999999999",
                  "id": "wamid.HBgNNTUxMTk5OTk5OTk5ORUCABIYFjNFQjA="
                },
                "from": "5511999999999",
                "from_user_id": "BR.13491208655302741918",
                "id": "wamid.HBgNNTUxMTk5OTk5OTk5ORUCABIYFjVBQjI=",
                "timestamp": "1757956200",
                "type": "interactive",
                "interactive": {
                  "type": "button_reply",
                  "button_reply": {
                    "id": "confirmar",
                    "title": "Confirmar"
                  }
                }
              }
            ]
          },
          "field": "messages"
        }
      ]
    }
  ]
}
```

> [!TIP]
>
> Use o `button_reply.id` para decidir o que fazer com a resposta. O `title` pode mudar se você ajustar o texto do botão; o `id` continua o mesmo.

A resposta do cliente é uma mensagem nova, então **renova a janela de 24 horas**.

Veja mais detalhes na [documentação de botões de resposta da Meta](https://developers.facebook.com/documentation/business-messaging/whatsapp/messages/interactive-reply-buttons-messages).


## OpenAPI

````yaml api-reference/whatsapp/specs/botoes.json POST /v1/{phone_number_id}/messages
openapi: 3.1.0
info:
  title: Datafy API — Enviar botões
  version: 1.0.0
servers:
  - url: https://cloud.datafyapi.com.br
    description: Produção
security:
  - bearerAuth: []
paths:
  /v1/{phone_number_id}/messages:
    post:
      summary: Enviar botões
      operationId: enviarBotoes
      parameters:
        - name: phone_number_id
          in: path
          required: true
          schema:
            type: string
          description: ID do número que envia a mensagem. Descubra com `GET /me`.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MensagemBotoes'
            example:
              messaging_product: whatsapp
              recipient_type: individual
              to: '5511999999999'
              type: interactive
              interactive:
                type: button
                header:
                  type: text
                  text: Confirmação de agendamento
                body:
                  text: >-
                    Olá, Camila! Seu atendimento está marcado para
                    segunda-feira, às 9h. Deseja confirmar?
                footer:
                  text: Clínica Exemplo
                action:
                  buttons:
                    - type: reply
                      reply:
                        id: confirmar
                        title: Confirmar
                    - type: reply
                      reply:
                        id: remarcar
                        title: Remarcar
                    - type: reply
                      reply:
                        id: cancelar
                        title: Cancelar
      responses:
        '200':
          description: Envio aceito pela Meta. Não confirma a entrega.
          content:
            application/json:
              example:
                messaging_product: whatsapp
                contacts:
                  - input: '5511999999999'
                    wa_id: '5511999999999'
                messages:
                  - id: wamid.HBgNNTUxMTk5OTk5OTk5ORUCABIYFjNFQjA=
        '400':
          description: Erro retornado pela Meta.
          content:
            application/json:
              example:
                error:
                  message: (#100) Invalid parameter
                  type: OAuthException
                  code: 100
                  fbtrace_id: AbCdEfGhIjK
        '401':
          description: Token ausente ou inválido.
          content:
            application/json:
              example:
                statusCode: 401
                message: Token inválido ou não encontrado.
components:
  schemas:
    MensagemBotoes:
      type: object
      required:
        - messaging_product
        - to
        - type
        - interactive
      properties:
        messaging_product:
          type: string
          enum:
            - whatsapp
          default: whatsapp
          example: whatsapp
          description: Sempre `whatsapp`.
        recipient_type:
          type: string
          enum:
            - individual
          default: individual
          example: individual
          description: Sempre `individual`.
        to:
          type: string
          example: '5511999999999'
          description: >-
            Número do destinatário com código do país e DDD, como
            `5511999999999`. Tem prioridade sobre `recipient`: para enviar pelo
            ID do usuário, deixe em branco.
        recipient:
          type: string
          description: >-
            ID do usuário no WhatsApp (BSUID), recebido nos webhooks em
            `from_user_id` e `contacts[].user_id`, como
            `BR.13491208655302741918`. Usado quando `to` não é informado.
        type:
          type: string
          enum:
            - interactive
          default: interactive
          example: interactive
          description: Sempre `interactive`.
        interactive:
          type: object
          required:
            - type
            - body
            - action
          description: Mensagem com até três botões de resposta rápida.
          properties:
            type:
              type: string
              enum:
                - button
              default: button
              example: button
              description: Sempre `button`.
            header:
              $ref: '#/components/schemas/Cabecalho'
            body:
              type: object
              required:
                - text
              description: Texto principal da mensagem.
              properties:
                text:
                  type: string
                  maxLength: 1024
                  example: >-
                    Olá, Camila! Seu atendimento está marcado para
                    segunda-feira, às 9h. Deseja confirmar?
                  description: >-
                    Texto da mensagem, com até 1.024 caracteres. URLs viram
                    links clicáveis.
            footer:
              type: object
              description: Rodapé opcional, exibido abaixo do texto em cinza.
              properties:
                text:
                  type: string
                  maxLength: 60
                  example: Clínica Exemplo
                  description: Texto do rodapé, com até 60 caracteres.
            action:
              type: object
              required:
                - buttons
              properties:
                buttons:
                  type: array
                  minItems: 1
                  maxItems: 3
                  description: De 1 a 3 botões de resposta.
                  items:
                    $ref: '#/components/schemas/BotaoResposta'
        context:
          type: object
          description: Responde citando uma mensagem anterior da conversa.
          properties:
            message_id:
              type: string
              description: ID (`wamid`) da mensagem que será citada.
    Cabecalho:
      type: object
      required:
        - type
      description: >-
        Cabeçalho opcional. Use um texto ou uma mídia: imagem, vídeo ou
        documento.
      properties:
        type:
          type: string
          enum:
            - text
            - image
            - video
            - document
          example: text
          description: Tipo do cabeçalho.
        text:
          type: string
          maxLength: 60
          example: Confirmação de agendamento
          description: >-
            Texto do cabeçalho, com até 60 caracteres. Usado quando `type` é
            `text`.
        image:
          $ref: '#/components/schemas/MidiaCabecalho'
        video:
          $ref: '#/components/schemas/MidiaCabecalho'
        document:
          $ref: '#/components/schemas/MidiaCabecalho'
    BotaoResposta:
      type: object
      required:
        - type
        - reply
      properties:
        type:
          type: string
          enum:
            - reply
          default: reply
          example: reply
          description: Sempre `reply`.
        reply:
          type: object
          required:
            - id
            - title
          properties:
            id:
              type: string
              maxLength: 256
              example: confirmar
              description: >-
                Identificador do botão, com até 256 caracteres. Volta no webhook
                quando o cliente toca no botão.
            title:
              type: string
              maxLength: 20
              example: Confirmar
              description: >-
                Texto do botão, com até 20 caracteres. Não pode se repetir entre
                os botões.
    MidiaCabecalho:
      type: object
      description: >-
        Mídia do cabeçalho, usada quando `type` é `image`, `video` ou
        `document`. Informe `link` ou `id`, nunca os dois.
      properties:
        link:
          type: string
          description: >-
            URL pública da mídia. Você pode gerar um link na aba **Mídias** do
            número, no painel da Datafy.
        id:
          type: string
          description: ID da mídia retornado pelo endpoint **Upload de mídia**.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Token gerado no painel da Datafy ao criar o canal. Formato:
        `sk_live_xxx`.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.