Ligações
Confere se a loja atende ligações no WhatsApp e consulta o histórico de ligações com transcrição e gravação.
Além de mensagens, o WhatsApp Business recebe ligações de voz feitas pelo cliente dentro do aplicativo. Quando a loja ativa o atendimento por voz, um assistente virtual atende a ligação, conversa com o cliente e, se for o caso, registra um pedido. Estas quatro rotas mostram se isso está funcionando (diagnostico) e guardam o histórico (calls).
Diagnosticar o atendimento
/api/v1/vendor/whatsapp/diagnosticoSellerConfere por que o telefone da loja atende (ou não) ligações
Responde à pergunta "por que o telefone toca e ninguém atende?". Faz duas conferências: se o assistente de voz está configurado no servidor e se a loja tem um número conectado com credencial que abre. Não chama a Meta.
Exemplo de requisição
curl "$BASE_URL/api/v1/vendor/whatsapp/diagnostico" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"can_answer": false,
"summary": "A ligação nativa do WhatsApp ainda não atende. Veja o que falta abaixo.",
"checks": [
{
"id": "vi",
"label": "Atendente virtual",
"status": "erro",
"detail": "A VI de voz não está ligada neste servidor.",
"fix": "Peça à plataforma para configurar a chave da voz. Sem isso o WhatsApp toca e ninguém atende."
},
{
"id": "conta",
"label": "Número do WhatsApp",
"status": "ok",
"detail": "Número conectado e com credencial válida."
}
],
"phone_number_id": "104857392011234"
}Campos da resposta
can_answerbooleantrue quando as duas conferências passaram.summarystringchecksarraychecks[].idstringvicontavi: assistente de voz configurado no servidor. conta: número conectado e credencial válida.checks[].labelstringchecks[].statusstringokerroavisook ou erro.checks[].detailstringchecks[].fixstringstatus é ok.phone_number_idstringErros
| Status | Quando | Corpo |
|---|---|---|
| 401 | Sem token | {"error":"authentication required"} |
| 403 | Token que não é de seller | {"error":"insufficient permissions"} |
| 403 | Módulo desligado | {"error":"module_disabled","module":"whatsapp-commerce"} |
Uma falha na conferência não vira erro HTTP: ela aparece em checks com status: "erro".
Listar as ligações
/api/v1/vendor/whatsapp/callsSellerLista as ligações recebidas, da mais recente para a mais antiga
Devolve o resumo de cada ligação. A transcrição não vem na lista: ela só existe em has_transcript. Para ler o texto, abra a ligação.
Parâmetros de consulta
limitintegerpadrão: 50phonestring9999-0000 vira 99990000).Exemplo de requisição
curl "$BASE_URL/api/v1/vendor/whatsapp/calls?limit=20" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"calls": [
{
"call_id": "wacall.ABGGFjFVU2AfAgo6V",
"phone": "5511999990000",
"started_at": "2026-10-11T12:30:05Z",
"duration_seconds": 142,
"tools_used": 3,
"order_number": "PEDIDO-20261011-0012",
"outcome": "pedido",
"rating": 5,
"has_audio": true,
"has_transcript": true
}
]
}Campos da resposta
callsarraycalls[].call_idstringcalls[].phonestringcalls[].started_atstringcalls[].duration_secondsinteger0 enquanto a ligação não terminou ou quando não foi medida.calls[].tools_usedintegercalls[].order_numberstringcalls[].outcomestringpedidoconversousem_interacaopedido gerou um pedido, conversou houve conversa sem pedido, sem_interacao o cliente não interagiu. Vazio enquanto a ligação não foi encerrada.calls[].ratingintegercalls[].has_audiobooleantrue quando há gravação do cliente.calls[].has_transcriptbooleantrue quando há transcrição.Erros
| Status | Quando | Corpo |
|---|---|---|
| 401 / 403 | Autenticação, módulo ou tipo de token | veja a tabela do diagnóstico |
| 500 | Banco de dados indisponível | {"error":"db_unavailable"} |
Abrir uma ligação
/api/v1/vendor/whatsapp/calls/{callID}SellerLê uma ligação com a transcrição
Parâmetros de caminho
callIDstringobrigatóriocalls[].call_id).Exemplo de requisição
curl "$BASE_URL/api/v1/vendor/whatsapp/calls/$CALL_ID" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"call_id": "wacall.ABGGFjFVU2AfAgo6V",
"phone": "5511999990000",
"started_at": "2026-10-11T12:30:05Z",
"duration_seconds": 142,
"tools_used": 3,
"order_number": "PEDIDO-20261011-0012",
"outcome": "pedido",
"rating": 5,
"has_audio": true,
"has_transcript": true,
"transcript": "Cliente: Oi, queria um tênis preto tamanho 42.\nAtendente: Claro! Tenho o Tênis Urbano Preto por R$ 189,00..."
}Os campos são os de um item da lista, mais transcript: o texto da conversa, com falas separadas por quebra de linha. Fica ausente quando não há transcrição.
Erros
| Status | Quando | Corpo |
|---|---|---|
| 401 / 403 | Autenticação, módulo ou tipo de token | veja a tabela do diagnóstico |
| 404 | Ligação inexistente | {"error":"call_not_found"} |
| 500 | Falha ao ler | {"error":"read_failed"} ou {"error":"db_unavailable"} |
Baixar a gravação
/api/v1/vendor/whatsapp/calls/{callID}/audioSellerBaixa o áudio gravado da ligação
Devolve o arquivo de áudio em audio/ogg. A gravação não fica em endereço público: só sai por esta rota autenticada.
Parâmetros de caminho
callIDstringobrigatórioParâmetros de consulta
sidestringpadrão: viclientevicliente é a voz do cliente; qualquer outro valor (ou nenhum) baixa a voz do assistente.Exemplo de requisição
curl "$BASE_URL/api/v1/vendor/whatsapp/calls/$CALL_ID/audio?side=cliente" \
-H "Authorization: Bearer $TOKEN" -o ligacao-cliente.oggResposta
HTTP/1.1 200 OK
Content-Type: audio/ogg
Cache-Control: private, max-age=300
(bytes do arquivo)O arquivo aceita requisições com Range, então um player pode pular para o meio da gravação.
Erros
| Status | Quando | Corpo |
|---|---|---|
| 401 / 403 | Autenticação, módulo ou tipo de token | veja a tabela do diagnóstico |
| 403 | O caminho da gravação não pertence a esta loja | texto simples caminho inválido |
| 404 | Sem gravação desse lado | texto simples sem gravação |
| 404 | O arquivo não está mais disponível | texto simples arquivo indisponível |
| 500 | Banco indisponível | texto simples db unavailable |