BoaVoz
Documentação · Integrações

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

TipoQuando a IA chamaPrazo
consultaNa hora, quando a pergunta combina com a descrição da ação. Só lê: nada muda no seu sistema.8 s
executaSó 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).

CampoRegras
Nomesnake_case, até 48 caracteres, começando por letra. Os nomes das ferramentas do BoaVoz e o prefixo boavoz_ são reservados.
DescriçãoDe 20 a 500 caracteres. É o que a IA lê para decidir quando chamar: diga o que a ação faz e quando usar.
URLHTTPS, num endereço público (rede interna e localhost são recusados). Sem redirecionamento: cadastre a URL final.
ParâmetrosJSON 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.
Tipoconsulta ou executa.
Nível mínimo do contatoanônimo, canal ou usuário (veja Nível do contato).
Contextonão exige, ou exige contexto assinado (a ação só aparece para a IA em conversas com ele).
Cabeçalhos personalizadosOpcional, 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éviaSó para executa: marque se o endpoint, ao receber "mode": "preview", não cria nada e devolve o resumo (veja o Confirmar).
Só no roteiroMarcada, 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.
As definições das ações ativas vão junto em cada resposta da IA. Descrições curtas e poucos parâmetros deixam o assistente mais rápido e mais barato; o painel mostra quanto as ações do chatbot pesam.

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.

json · corpo
{
  "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
}
CampoO que é
call_idId da chamada. Repete quando a mesma chamada é feita de novo (veja Repetição): use para não fazer a mesma operação duas vezes.
actionO nome da ação.
paramsOs 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).
confirmedtrue 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.
testtrue quando a chamada vem do botão Testar do painel (sem conversa nem contato).
botO chatbot (bot_…).
conversationId (conv_…) e canal: whatsapp, instagram ou widget (o chat do site).
contactQuem está falando (veja Nível do contato).
contextO 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.

javascript · node
// 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 minutos

Troca 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_id sai 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, o call_id é o do Confirmar e se repete em todo “Tentar de novo”. O BoaVoz nunca refaz uma executa sozinho.
Seja idempotente nas executa
Mesmo 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

HTTPPara o BoaVoz
2xx com JSONDeu certo: lê os campos abaixo.
404Nã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.
409Numa executa: ainda está processando. A chamada fica incerta.
2xx sem corpoNuma executa confirmada: sucesso. Numa consulta: falha (resposta vazia).
OutroFalha: 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).
json · resposta
{
  "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" }]
}
CampoO que acontece
dataOs 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.
replyTexto 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.
internalObjeto 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?”.
componentsBotõ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.
attachmentsAté 5 arquivos {url, filename?}, em HTTPS (veja Arquivos).
confirmationSó na prévia do Confirmar (veja abaixo).
outcomeNum passo de ação de um roteiro: o resultado que escolhe o próximo passo ("sem_debito"), entre os declarados no cadastro (veja Roteiros).
identityNum 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

  1. A IA chama a ação com todos os parâmetros obrigatórios. O seu endpoint ainda não é chamado.
  2. 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.
  3. No Confirmar, o BoaVoz chama o seu endpoint com "confirmed": true. A IA conta o resultado a partir do data (citando o número do pedido ou o protocolo que você devolver), ou vai o seu reply.

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).

json · resposta da prévia
{
  "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ívelQuem éNo contact
anônimoQualquer contato, inclusive o visitante do site.verified_by null; phone null.
canalO 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árioA 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 reply nunca é editado: com item 18+ sem confirmação, ele espera o “Sim”; com item proibido, é descartado e a IA responde com o data já 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).