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.urloubase64: 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). Semid, vale otitle.action:reply(padrão, responde),url(abre o link emvalue),call(liga para o número emvalue) oucopy(copia o código emvalue). Só oreplygera 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. |
| 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
{
"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.
{
"number": "5511999999999",
"type": "button",
"text": "Confirma o pedido?",
"footerText": "Loja",
"choices": [
"Sim|sim",
"Não|nao"
]
}{
"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).
{
"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 (...).
{
"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"
}
}{
"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
{
"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
{
"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
{
"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"
}
}
}