Atendimento humano (trava do bot)
Toda operação chega nesse momento: um atendente humano precisa assumir a conversa. Sem uma trava, o robô continua respondendo por cima da pessoa — dois “atendentes” na mesma conversa, falando coisas diferentes.
A plataforma resolve isso com uma regra simples:
O bot para de responder, mas a plataforma continua ouvindo tudo.
Assim, quando o bot voltar, ele já sabe o que o atendente combinou com o cliente.
Dois níveis de trava
| Trava | Alcance | Quando usar |
|---|---|---|
| Por conversa | Só aquele cliente, naquele canal | O caso normal: um atendente assumiu um atendimento |
| Por agent | Todas as conversas daquele agent | Manutenção, horário sem robô, ou quando o time inteiro vai atender na mão |
Hoje as travas são acionadas pela API — não existe botão “assumir conversa” no painel. A ideia é que o sistema do cliente (o SaaS de atendimento) chame a plataforma quando o atendente clica em “assumir” na tela dele.
O que acontece durante a pausa
Com a conversa pausada, quando o cliente manda mensagem:
- ✅ a mensagem é gravada no histórico;
- ✅ o evento
conversation.inboundé enviado para os seus webhooks; - ❌ não há resposta do robô;
- ❌ não aparece o “digitando…”;
- ❌ nada é enviado ao cliente.
A pausa também cancela qualquer resposta que estivesse em fila de repetição. Se uma conversa estava travada tentando responder e o atendente assumiu, a resposta atrasada não vai estourar no meio do atendimento humano. Isso vale inclusive se a pausa acontecer enquanto o agent está pensando: a resposta é descartada.
Quando o próprio agent entrega
Além da pausa pela API, o agent pode entregar a conversa a uma pessoa por conta própria — para as situações que você escreveu no perfil dele (“o cliente pede um humano”, “pedido de cancelamento”, “reclamação”). Isso só acontece com a capacidade Entregar a um humano ligada na tela do agent; ela nasce desligada.
Quando ele entrega, tudo isto acontece no mesmo instante:
- O cliente recebe uma última mensagem escrita pelo agent, e nada mais depois dela.
- No número não oficial (uazapi), a conversa recebe a etiqueta correspondente à situação — pelo nome exato que você escreveu no perfil.
- Você e a equipe recebem um aviso pelo canal do dono, com o telefone do cliente, a etiqueta e o motivo.
- O bot fica pausado nessa conversa — o mesmo estado da pausa pela API.
A plataforma nunca cria uma etiqueta. Se o nome que o agent usou não existir na conta do WhatsApp, o aviso avisa: Etiqueta “X” não existe no WhatsApp — aplique na mão. A entrega acontece do mesmo jeito. No número oficial (Datafy) e no Telegram etiqueta não existe: o aviso sai sem essa linha, e a conversa é entregue igual.
A retomada continua sendo pela API
Entregar é automático; retomar não é. Depois da entrega, a conversa só volta ao robô com
POST .../conversations/resume — o mesmo endereço da tabela abaixo.
Receita pronta (número não oficial). Se você usa n8n ou parecido, dá para religar o bot tirando a etiqueta no aplicativo:
- No uazapi, assine o webhook de
chat_labelsapontando para o seu n8n. - No n8n, filtre o evento em que a etiqueta de atendimento foi removida do chat.
- Chame
POST /orgs/{orgId}/agents/{agentId}/conversations/resumecom oconversationIddaquele chat.
Para espelhar a entrega no seu CRM ou numa planilha, assine o evento conversation.handoff
— veja Webhooks de saída.
Como o bot retoma com contexto
Ao retomar:
- O que ficou acumulado durante a pausa não gera resposta retroativa — o robô não vomita cinco respostas atrasadas de uma vez.
- O robô responde apenas a próxima mensagem nova.
- Tudo que aconteceu durante a pausa continua no histórico e vai junto no próximo pedido ao agent.
A fala do atendente também entra no histórico
Nos dois canais, o que o atendente digita no aparelho/aplicativo do número é capturado
e gravado com o papel de operador. No histórico enviado ao agent, esse trecho aparece
prefixado por [atendente humano]: , para que ele entenda que aquilo não foi dito pelo
robô.
- No canal não oficial (uazapi), a captura vem do próprio evento de mensagem.
- No canal oficial (Datafy), a captura depende da assinatura
smb_message_echoesno painel Meta/Datafy — veja Conectar WhatsApp oficial. Sem ela, a fala do atendente não chega à plataforma.
As respostas enviadas pelo próprio robô nunca são confundidas com fala de atendente — elas saem pela API e são descartadas em duas camadas diferentes. Isso vale nos dois canais: a API não ecoa as mensagens que ela mesma envia, então não há risco de o robô “conversar com ele mesmo”.
Os endereços da API
Todos usam a mesma autenticação das demais chamadas da organização.
| Ação | Chamada |
|---|---|
| Pausar uma conversa | POST /orgs/{orgId}/agents/{agentId}/conversations/pause |
| Retomar uma conversa | POST /orgs/{orgId}/agents/{agentId}/conversations/resume |
| Consultar o estado | GET /orgs/{orgId}/agents/{agentId}/conversations/state?conversationId=…&provider=… |
| Desligar o bot inteiro | POST /orgs/{orgId}/agents/{agentId}/bot/pause |
| Religar o bot inteiro | POST /orgs/{orgId}/agents/{agentId}/bot/resume |
| Consultar o bot | GET /orgs/{orgId}/agents/{agentId}/bot |
Exemplos
Os exemplos abaixo usam apenas espaços reservados. Troque tudo entre <> pelos
valores reais e nunca cole uma chave verdadeira em documento, ticket ou conversa.
Pausar uma conversa (o atendente assumiu):
curl -X POST "$GATEWAY_URL/orgs/<ID_DA_ORG>/agents/<ID_DO_AGENT>/conversations/pause" \
-H "Authorization: Bearer <SUA_CHAVE_DO_GATEWAY>" \
-H "Content-Type: application/json" \
-d '{
"conversationId": "<ID_DA_CONVERSA>",
"provider": "uazapi"
}'Retomar:
curl -X POST "$GATEWAY_URL/orgs/<ID_DA_ORG>/agents/<ID_DO_AGENT>/conversations/resume" \
-H "Authorization: Bearer <SUA_CHAVE_DO_GATEWAY>" \
-H "Content-Type: application/json" \
-d '{
"conversationId": "<ID_DA_CONVERSA>",
"provider": "uazapi"
}'Consultar se está pausada:
curl "$GATEWAY_URL/orgs/<ID_DA_ORG>/agents/<ID_DO_AGENT>/conversations/state?conversationId=<ID_DA_CONVERSA>&provider=uazapi" \
-H "Authorization: Bearer <SUA_CHAVE_DO_GATEWAY>"Desligar o robô do agent inteiro:
curl -X POST "$GATEWAY_URL/orgs/<ID_DA_ORG>/agents/<ID_DO_AGENT>/bot/pause" \
-H "Authorization: Bearer <SUA_CHAVE_DO_GATEWAY>"Os dois campos que confundem
conversationIdé a mesma chave que a plataforma usa internamente para a conversa — o identificador do cliente no canal (o telefone/chatid). É o mesmo valor que chega noconversation_iddos seus webhooks.provideré obrigatório e valedatafyouuazapi. O mesmo telefone pode falar pelos dois canais, e cada um é uma conversa diferente. Errar o provider pausa a conversa errada.
Detalhes que valem saber
- A pausa não expira sozinha. Quem pausou precisa retomar.
- Não existe pausa automática por adivinhação (“detectei um humano, pauso sozinho”) — a trava é sempre explícita, decidida pelo seu sistema.
- As chamadas autenticadas de envio de mensagem não são afetadas pela trava: se o seu sistema mandar uma mensagem de propósito, ela sai. A trava vale para o robô reagindo sozinho.
Problemas comuns
| Sintoma | Causa provável | O que fazer |
|---|---|---|
| Pausei e o bot continuou respondendo | provider errado — você pausou a conversa do outro canal | Repita a pausa com o provider correto |
| Pausei, mas quero conferir | — | Use o GET .../conversations/state |
| Retomei e o robô não respondeu nada | Correto: ele só responde a partir da próxima mensagem nova | Peça ao cliente uma nova mensagem, ou responda pelo atendente |
| O robô ficou mudo em todas as conversas | O bot do agent inteiro foi desligado | Consulte GET .../bot e religue com .../bot/resume |
| O agent não sabe o que o atendente combinou | No canal oficial (Datafy), falta a assinatura smb_message_echoes no painel | Assine smb_message_echoes — veja Conectar WhatsApp oficial |