Ações
Uma ação é um endpoint seu que a IA chama durante a conversa. Ela consulta (status do pedido, agenda, saldo) ou faz algo de verdade (criar pedido, agendar, cancelar), sempre com o Confirmar do contato antes.
Consulta e executa
| Tipo | Quando a IA chama | Prazo |
|---|---|---|
| consulta | Na hora, quando a pergunta combina com a descrição da ação. Só lê: nada muda no seu sistema. | 8 s |
| executa | Só depois que o contato toca em Confirmar num resumo que o BoaVoz monta. Cria, altera ou cancela. | 20 s |
O BoaVoz também classifica as ações: a que cria pedido, reserva ou cobrança sempre pede o Confirmar, mesmo cadastrada como consulta. A IA nunca decide sozinha uma operação dessas: quem decide é o toque do contato.
Cadastro
No painel: chatbot → aba Ações (dono ou administrador da agência, com a verificação em duas etapas). O segredo de ações do chatbot precisa existir antes (botão Gerar segredo).
| Campo | Regras |
|---|---|
| Nome | snake_case, até 48 caracteres, começando por letra. Os nomes das ferramentas do BoaVoz e o prefixo boavoz_ são reservados. |
| Descrição | De 20 a 500 caracteres. É o que a IA lê para decidir quando chamar: diga o que a ação faz e quando usar. |
| URL | HTTPS, num endereço público (rede interna e localhost são recusados). Sem redirecionamento: cadastre a URL final. |
| Parâmetros | JSON Schema com "type": "object": até 10 parâmetros em snake_case, dos tipos string, number, integer, boolean ou array de um desses; enum, description (até 200) e required. |
| Tipo | consulta ou executa. |
| Nível mínimo do contato | anônimo, canal ou usuário (veja Nível do contato). |
| Contexto | não exige, ou exige contexto assinado (a ação só aparece para a IA em conversas com ele). |
| Cabeçalhos personalizados | Opcional, até 10, um por linha (Nome: valor), por exemplo a chave que o seu gateway pede. Vão em toda chamada, guardados cifrados, e não aparecem de novo nem nos logs. Os de assinatura (webhook-*), de transporte e o Content-Type são reservados. |
| Aceita prévia | Só para executa: marque se o endpoint, ao receber "mode": "preview", não cria nada e devolve o resumo (veja o Confirmar). |
| Só no roteiro | Marcada, a IA só usa a ação no passo de um roteiro ligado (desligar o roteiro tira a ação junto). Desmarcada, a IA usa a ação sempre que a conversa precisar. |
A chamada
O BoaVoz faz um POST com JSON. Cabeçalhos: content-type: application/json, user-agent: BoaVoz-Acoes/1, os três da assinatura e os seus personalizados.
{
"call_id": "call_3f1c9a0b…",
"action": "consultar_pedido",
"params": { "pedido": "1234" },
"confirmed": false,
"bot": { "id": "bot_8c1e…" },
"conversation": { "id": "conv_14a2…", "channel": "whatsapp" },
"contact": {
"id": "ctc_77d0…",
"level": "canal",
"verified_by": "meta",
"phone": "5511999990000",
"whatsapp_user_id": null,
"age_confirmed": true,
"age_confirmed_source": "chat"
},
"context": null
}| Campo | O que é |
|---|---|
call_id | Id da chamada. Repete quando a mesma chamada é feita de novo (veja Repetição): use para não fazer a mesma operação duas vezes. |
action | O nome da ação. |
params | Os parâmetros que a IA preencheu, já conferidos contra o seu schema (obrigatório vazio, tipo errado ou fora do enum: o BoaVoz nem chama, e a IA pede o dado à pessoa). |
confirmed | true quando o contato tocou em Confirmar (ou num botão com ação que vale como confirmação). |
mode | "preview" na prévia do Confirmar. Ausente nas chamadas normais. |
test | true quando a chamada vem do botão Testar do painel (sem conversa nem contato). |
bot | O chatbot (bot_…). |
conversation | Id (conv_…) e canal: whatsapp, instagram ou widget (o chat do site). |
contact | Quem está falando (veja Nível do contato). |
context | O contexto da conversa (por exemplo, a loja, o workspace ou a conta), {source, data}, ou null. source: token (o site), pairing (o pareamento), routine (a conta que a identificação pelo roteiro escolheu) ou bot (só o contexto fixo do chatbot, da aba Ações). O contexto fixo vai sempre em data, por cima dos outros: a loja do chatbot não muda pelo token. Vai só para as ações: a IA não vê. |
Assinatura
Toda chamada vai assinada no padrão Standard Webhooks com o segredo de ações do chatbot: cabeçalhos webhook-id (o call_id), webhook-timestamp e webhook-signature. Confira com a biblioteca oficial (há para Node, Python, Go, PHP, Ruby, Java e outras) e recuse o que falhar ou tiver mais de 5 minutos.
// Node: npm i standardwebhooks
import { Webhook } from "standardwebhooks";
const wh = new Webhook(process.env.BOAVOZ_ACTION_SECRET); // whsec_...
// corpo cru (string ou Buffer) e os cabeçalhos da requisição
const chamada = wh.verify(corpoCru, cabecalhos); // lança erro se a assinatura não bate ou passou de 5 minutosTroca do segredo: ao gerar um novo, o anterior continua valendo por 24 horas, e as chamadas vão com as duas assinaturas nesse período. Se o segredo vazou, marque invalidar o anterior agora.
Prazos, tamanho e repetição
- Consulta: 8 segundos. Executa: 20 segundos. Passou disso, a consulta conta como falha e a executa fica incerta (veja o Confirmar).
- Resposta de até 32 KB. Acima de 8 KB no
data, o painel avisa: tudo isso vai para a IA em cada resposta. - Redirecionamento (3xx) não é seguido: dá erro com o endereço para você cadastrar.
- Repetição: numa consulta, o
call_idsai da mensagem do contato, da ação e dos parâmetros; se o BoaVoz processar a mesma mensagem de novo, a chamada vai com o mesmo id e, se a anterior deu certo, a resposta gravada é reaproveitada sem chamar você. Numa executa, ocall_idé o do Confirmar e se repete em todo “Tentar de novo”. O BoaVoz nunca refaz uma executa sozinho.
call_id = mesma operação. Se receber de novo um id que você já processou, devolva o mesmo resultado sem criar outro pedido.A resposta
| HTTP | Para o BoaVoz |
|---|---|
| 2xx com JSON | Deu certo: lê os campos abaixo. |
| 404 | Não encontrado. Mande {"error": "motivo"}: a IA diz que não achou, sem inventar. Use também para o que a pessoa não pode ver. |
| 409 | Numa executa: ainda está processando. A chamada fica incerta. |
| 2xx sem corpo | Numa executa confirmada: sucesso. Numa consulta: falha (resposta vazia). |
| Outro | Falha: a IA diz que não conseguiu agora, sem inventar o resultado (numa executa, oferece tentar de novo daqui a pouco ou falar com a equipe). |
{
"data": { "pedido": "1234", "status": "saiu para entrega", "previsao": "20h" },
"internal": { "cliente_inadimplente": false },
"components": {
"type": "buttons",
"buttons": [{ "title": "Falar com a loja", "id": "falar_loja" }]
},
"attachments": [{ "url": "https://seu-sistema.com/notas/1234.pdf", "filename": "nota-1234.pdf" }]
}| Campo | O que acontece |
|---|---|
data | Os dados para a IA responder com as palavras dela. Qualquer JSON. Link, e-mail, chave Pix, linha de boleto ou conta que a IA escrever só sai se for o valor inteiro de um campo ("pix": "12345678900"): no meio de um texto livre (uma observação de pedido escrita por outra pessoa), vira [link removido]. Para mandar um texto com link do jeito certo, use reply. |
reply | Texto exato para o contato (até 4.000 caracteres). Com reply, a IA não escreve nada naquela vez: vai o seu texto, com os botões e os arquivos da mesma resposta. |
internal | Objeto que a IA usa para decidir o que dizer, mas que nunca aparece: frase da resposta que contiver um desses valores sai, e se não sobrar nada o contato recebe “Não consigo te passar essa informação por aqui. Posso ajudar com outra coisa?”. |
components | Botões, lista, link ou carrossel (veja Mensagens ricas). Numa consulta sem reply, eles só vão se a resposta da IA oferece essa escolha; com reply e no resultado do Confirmar, vão sempre. |
attachments | Até 5 arquivos {url, filename?}, em HTTPS (veja Arquivos). |
confirmation | Só na prévia do Confirmar (veja abaixo). |
outcome | Num passo de ação de um roteiro: o resultado que escolhe o próximo passo ("sem_debito"), entre os declarados no cadastro (veja Roteiros). |
identity | Num passo de ação de um roteiro: quem é a pessoa ({external_id, name, accounts}). A conversa fica identificada e as próximas ações recebem o nível usuário (veja Identificar a pessoa). |
Arquivos
O BoaVoz baixa cada arquivo (até 25 MB), confere o tipo pelo conteúdo e recusa executável, HTML e SVG. Imagem que o canal aceita vai como imagem; PDF e os documentos aceitos pelo canal vão como documento; o resto vai como link que vale 7 dias. Os arquivos saem logo depois do texto. Se um falhar, o contato recebe “Não consegui anexar o arquivo agora.”.
Ações que criam ou alteram: o Confirmar
- A IA chama a ação com todos os parâmetros obrigatórios. O seu endpoint ainda não é chamado.
- O BoaVoz manda ao contato um resumo fixo, sem texto da IA: “Confere antes de eu concluir:”, as linhas do pedido e “Nada é feito antes do Confirmar.”, com os botões Confirmar e Cancelar.
- No Confirmar, o BoaVoz chama o seu endpoint com
"confirmed": true. A IA conta o resultado a partir dodata(citando o número do pedido ou o protocolo que você devolver), ou vai o seureply.
O resumo e a prévia
Sem prévia, o resumo lista os parâmetros (com os nomes dos itens que uma consulta anterior trouxe, em vez dos ids). Com aceita prévia, antes do resumo o BoaVoz chama o seu endpoint com "mode": "preview": não crie nada e devolva o resumo calculado pelo seu sistema (preço atual, taxa, total).
{
"confirmation": {
"summary": "Pedido para entrega na Rua das Flores, 10",
"items": [{ "name": "Pizza Calabresa", "quantity": 2 }, "Coca-Cola 2L"],
"total_cents": 11180
}
}Regras
- Os botões valem por 24 horas e uma vez só. Tocar de novo responde “Esse pedido já foi confirmado.”.
- Um resumo novo da mesma ação na mesma conversa substitui o anterior.
- “sim”, “confirmo” ou “1”, escritos sozinhos logo depois do resumo, valem como Confirmar; “não”, “cancelar” ou “2”, como Cancelar.
- Incerta (passou de 20 s ou 409): o contato recebe “Não consegui confirmar se deu certo” com Tentar de novo (mesmo
call_id, sem duplicar) e Falar com alguém. - Um botão com ação (em Mensagens ricas) também vale como confirmação: o toque chama a ação direto, com os parâmetros guardados no BoaVoz.
Nível do contato
A ação só aparece para a IA quando o contato alcança o nível mínimo dela.
| Nível | Quem é | No contact |
|---|---|---|
| anônimo | Qualquer contato, inclusive o visitante do site. | verified_by null; phone null. |
| canal | O canal garante quem é: o número no WhatsApp, a conta no Instagram. | verified_by meta; no WhatsApp, phone só com dígitos e o código do país (no Instagram, null). |
| usuário | A empresa identificou a pessoa (token assinado no site, pareamento no WhatsApp ou no Instagram, ou a sua ação num roteiro). | verified_by signed_token, pairing ou routine; external_id (o id dela no seu sistema) e display. |
age_confirmed diz se a pessoa confirmou ter 18 anos (age_confirmed_source: chat ou company). Para dados pessoais, autorize sempre pelo contato verificado, nunca só pelo que a pessoa digitou: pedido de outra pessoa responde 404, como se não existisse.
WhatsApp e Instagram: o portão
Nesses canais, o BoaVoz confere o que a ação devolve pelas regras da Meta antes de qualquer coisa chegar ao contato:
- No
data, itens proibidos saem, e bebida alcoólica e remédio ficam de fora até a pessoa confirmar 18 anos. Depois do “Sim”, a mesma consulta é chamada de novo. - O
replynunca é editado: com item 18+ sem confirmação, ele espera o “Sim”; com item proibido, é descartado e a IA responde com odatajá filtrado. - Botões, cards e arquivos são conferidos um a um.
- A venda de bebida alcoólica e de remédio nunca fecha no chat: o pedido desses itens vai para o site, o app ou o telefone que o chatbot tiver.
Limites
- 15 chamadas de ação por minuto em cada conversa e 600 por minuto em cada chatbot.
- No mês, até 10 vezes a cota do chatbot (no mínimo 1.000 chamadas). Passou disso, a IA oferece a equipe até o dia 1º. No teto por minuto ou no do mês, o dono recebe e-mail e o aviso aparece na aba Ações do chatbot.
- 5 respostas “não encontrado” da mesma ação na mesma conversa em 1 hora: a ação fica indisponível nessa conversa por um tempo (ninguém varre números de pedido).