Conversas
Lista e abre as conversas de WhatsApp, marca como lida, liga e desliga o assistente e age em lote.
Uma conversa (thread) junta todas as mensagens trocadas entre um número da loja e um telefone de cliente. É a unidade da caixa de entrada: cada conversa tem um estado (assistente ligado ou atendente humano), um contador de não lidas, etiquetas e, opcionalmente, um atendente responsável. As rotas abaixo listam, abrem e organizam conversas.
Listar conversas
Devolve uma página de conversas. Os filtros se combinam. Se o usuário do token estiver vinculado a um seller, a lista é restrita a esse seller mesmo que você peça outro vendor_id.
/api/v1/admin/whatsapp/threadsAdminLista as conversas, as mais recentes primeiro, com filtros
Parâmetros de consulta
pageintegerpadrão: 1per_pageintegerpadrão: 50statusstringopenpendingresolvedopen: assistente ligado. pending: tem mensagens não lidas. resolved: nenhuma não lida. Quando enviado, substitui bot e unread.botbooleantrue só com assistente ligado; false só com humano.unreadbooleantrue só conversas com não lidas; false só sem.vendor_idstringqstringfromstringYYYY-MM-DD, sobre a data da última mensagem do cliente (inclusivo).tostringYYYY-MM-DD (inclusivo).assigned_tostringme (você), unassigned (sem responsável) ou um UUID de usuário.tagsstringExemplo de requisição (Listar conversas)
curl "$BASE_URL/api/v1/admin/whatsapp/threads?status=open&per_page=20" \
-H "Authorization: Bearer $TOKEN"Resposta (Listar conversas)
{
"threads": [
{
"id": "014ff6d8-8ff0-40da-82ce-e5a349b57be6",
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"vendor_name": "Loja Exemplo",
"customer_phone": "+5511999990428",
"customer_user_id": "f12f30a9-cbec-40ba-98f1-b7fa8f2e8e10",
"bot_enabled": true,
"last_inbound_at": "2026-10-11T14:52:49.987899Z",
"last_outbound_at": "2026-10-11T14:50:10.100000Z",
"unread_count": 1,
"created_at": "2026-10-01T02:52:49.971994Z",
"updated_at": "2026-10-11T14:52:49.987899Z",
"urgency_state": "normal",
"tags": [
"vip"
]
}
],
"total": 17,
"page": 1,
"per_page": 20,
"total_pages": 1
}Campos da resposta
threadsarrayConversas da página.
idstringvendor_idstringvendor_namestringcustomer_phonestring+ e código do país.customer_user_idstringbot_enabledbooleantrue quando o assistente automático responde nesta conversa; false quando um atendente assumiu.human_requested_atstringpending_actionstringlast_inbound_atstringlast_outbound_atstringunread_countintegercreated_atstringupdated_atstringurgency_statestringnormalhuman_requestedwaiting_clientmanual_modenormal, human_requested (humano pedido, contagem regressiva), waiting_client (a loja respondeu por último, aguardando o cliente) ou manual_mode (bot desligado à mão).urgency_seconds_remainingintegerhuman_requested ou waiting_client. Ausente nos demais estados.assigned_to_user_idstringtagsarrayvip, lead...). Sempre um array, vazio quando não há.totalintegerpageintegerper_pageintegertotal_pagesintegerErros (Listar conversas)
| Status | Quando | Corpo |
|---|---|---|
| 400 | from ou to fora do formato YYYY-MM-DD. | {"error":"invalid from date ..."} |
| 401 | Sem token, token inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O módulo WhatsApp Commerce está desligado na loja, o usuário não é administrador ou não tem o privilégio exigido. | {"error":"module_disabled","module":"whatsapp-commerce"} ou {"error":"insufficient privileges","required":"manage_orders"} ou {"error":"admin access required"} |
Abrir uma conversa
Devolve a conversa com as 50 mensagens mais recentes. Atenção: abrir a conversa envia confirmação de leitura à Meta das até 10 últimas mensagens do cliente (o cliente vê o "visto" azul). Não zera o contador de não lidas: use a rota de marcar como lida para isso.
/api/v1/admin/whatsapp/threads/{id}AdminDevolve a conversa e as últimas 50 mensagens
Parâmetros de caminho
idstringobrigatórioExemplo de requisição (Abrir uma conversa)
curl "$BASE_URL/api/v1/admin/whatsapp/threads/014ff6d8-8ff0-40da-82ce-e5a349b57be6" \
-H "Authorization: Bearer $TOKEN"Resposta (Abrir uma conversa)
{
"thread": {
"id": "014ff6d8-8ff0-40da-82ce-e5a349b57be6",
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"vendor_name": "Loja Exemplo",
"customer_phone": "+5511999990428",
"customer_user_id": "f12f30a9-cbec-40ba-98f1-b7fa8f2e8e10",
"bot_enabled": true,
"last_inbound_at": "2026-10-11T14:52:49.987899Z",
"last_outbound_at": "2026-10-11T14:50:10.100000Z",
"unread_count": 1,
"created_at": "2026-10-01T02:52:49.971994Z",
"updated_at": "2026-10-11T14:52:49.987899Z",
"urgency_state": "normal",
"tags": [
"vip"
]
},
"messages": [
{
"id": 2027,
"thread_id": "014ff6d8-8ff0-40da-82ce-e5a349b57be6",
"wa_message_id": "wamid.HBgNNTUxMTk5OTk5MDQyOBUCABIYFA",
"direction": "inbound",
"message_type": "text",
"body": "Oi, tem a camisa M?",
"status": "V",
"sent_manually": false,
"is_rep": false,
"created_at": "2026-10-11T14:52:49.982318Z"
}
]
}Campos da resposta
threadobjectA conversa.
(...)objectmessagesarrayAté 50 mensagens.
idintegermedia/{message_id} espera.thread_idstringwa_message_idstringwamid...).directionstringinboundoutboundinbound (do cliente) ou outbound (da loja).message_typestringtext, image, video, audio, document, button, interactive, location, template...bodystringmedia_urlstringmedia_mime_typestringmedia_filenamestringtemplate_namestringstatusstringPSVRFP pendente, S enviada, V entregue (também usada para mensagem recebida), R lida, F falhou.sent_manuallybooleantrue quando um atendente enviou, false quando foi o assistente ou um automatismo.is_repbooleantrue quando o remetente é um representante de vendas cadastrado (veja Representantes).sent_atstringdelivered_atstringread_atstringcreated_atstringErros (Abrir uma conversa)
| Status | Quando | Corpo |
|---|---|---|
| 401 | Sem token, token inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O módulo WhatsApp Commerce está desligado na loja, o usuário não é administrador ou não tem o privilégio exigido. | {"error":"module_disabled","module":"whatsapp-commerce"} ou {"error":"insufficient privileges","required":"manage_orders"} ou {"error":"admin access required"} |
| 404 | A conversa não existe. | {"error":"thread not found"} |
Marcar como lida
Põe unread_count em 0. Não envia confirmação de leitura ao cliente. Sem corpo.
/api/v1/admin/whatsapp/threads/{id}/mark-readAdminZera o contador de não lidas da conversa
Parâmetros de caminho
idstringobrigatórioExemplo de requisição (Marcar como lida)
curl -X POST "$BASE_URL/api/v1/admin/whatsapp/threads/014ff6d8-8ff0-40da-82ce-e5a349b57be6/mark-read" \
-H "Authorization: Bearer $TOKEN"Resposta (Marcar como lida)
{
"success": "ok"
}Campos da resposta
successstringok.Erros (Marcar como lida)
| Status | Quando | Corpo |
|---|---|---|
| 401 | Sem token, token inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O módulo WhatsApp Commerce está desligado na loja, o usuário não é administrador ou não tem o privilégio exigido. | {"error":"module_disabled","module":"whatsapp-commerce"} ou {"error":"insufficient privileges","required":"manage_orders"} ou {"error":"admin access required"} |
Ligar ou desligar o assistente
Define se o assistente (bot) responde sozinho às mensagens do cliente. Com enabled: false, só atendentes respondem; com true, o assistente volta a atuar.
/api/v1/admin/whatsapp/threads/{id}/toggle-botAdminLiga ou desliga o assistente automático nesta conversa
Parâmetros de caminho
idstringobrigatórioCorpo da requisição
enabledbooleanobrigatóriotrue liga o assistente, false desliga.Exemplo de requisição (Ligar ou desligar o assistente)
curl -X POST "$BASE_URL/api/v1/admin/whatsapp/threads/014ff6d8-8ff0-40da-82ce-e5a349b57be6/toggle-bot" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"enabled": false
}'Resposta (Ligar ou desligar o assistente)
{
"success": true,
"thread": {
"id": "014ff6d8-8ff0-40da-82ce-e5a349b57be6",
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"vendor_name": "Loja Exemplo",
"customer_phone": "+5511999990428",
"customer_user_id": "f12f30a9-cbec-40ba-98f1-b7fa8f2e8e10",
"bot_enabled": false,
"last_inbound_at": "2026-10-11T14:52:49.987899Z",
"last_outbound_at": "2026-10-11T14:50:10.100000Z",
"unread_count": 1,
"created_at": "2026-10-01T02:52:49.971994Z",
"updated_at": "2026-10-11T14:52:49.987899Z",
"urgency_state": "manual_mode",
"tags": [
"vip"
]
}
}Campos da resposta
successbooleantrue.threadobjectErros (Ligar ou desligar o assistente)
| Status | Quando | Corpo |
|---|---|---|
| 400 | Corpo que não é JSON. | {"error":"invalid request body"} |
| 401 | Sem token, token inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O módulo WhatsApp Commerce está desligado na loja, o usuário não é administrador ou não tem o privilégio exigido. | {"error":"module_disabled","module":"whatsapp-commerce"} ou {"error":"insufficient privileges","required":"manage_orders"} ou {"error":"admin access required"} |
| 404 | A conversa não existe. | {"error":"thread not found"} |
Ação em lote
Aplica a mesma action às conversas listadas em thread_ids (até 200). Devolve quantas linhas mudaram. Com usuário vinculado a um seller, só as conversas desse seller são afetadas. A rota também aceita o modo "por critério" da API de lotes da plataforma (selecionar por filtro em vez de ids), com pré-visualização antes de aplicar.
/api/v1/admin/whatsapp/threads/bulkAdminAplica uma ação a várias conversas de uma vez
Parâmetros de consulta
vendor_idstringCorpo da requisição
thread_idsarrayobrigatórioactionstringobrigatórioclosereopenassign_to_usertransfertoggle_botadd_tagremove_tagparamsobjectuser_id para assign_to_user e transfer (string vazia remove o responsável); enabled (booleano) para toggle_bot; tag (texto) para add_tag e remove_tag.Exemplo de requisição (Ação em lote)
curl -X POST "$BASE_URL/api/v1/admin/whatsapp/threads/bulk" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"thread_ids": [
"014ff6d8-8ff0-40da-82ce-e5a349b57be6"
],
"action": "add_tag",
"params": {
"tag": "vip"
}
}'Resposta (Ação em lote)
{
"affected": 1
}Campos da resposta
affectedintegerErros (Ação em lote)
| Status | Quando | Corpo |
|---|---|---|
| 400 | thread_ids vazio ou acima de 200, action ausente ou inválida, ou parâmetro faltando. | {"error":"thread_ids required"} |
| 401 | Sem token, token inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O módulo WhatsApp Commerce está desligado na loja, o usuário não é administrador ou não tem o privilégio exigido. | {"error":"module_disabled","module":"whatsapp-commerce"} ou {"error":"insufficient privileges","required":"manage_orders"} ou {"error":"admin access required"} |