Pular para o conteúdo

Construir um CRM simples

Com o log local do LiteZap você monta uma caixa de entrada de atendimento sem banco próprio de mensagens.

Janela do terminal
curl -s "localhost:8787/v1/instances/$ID/chats?limit=30" -H "Authorization: Bearer $TOK"

Cada chat traz jid, name, is_group, last_message_at e unread_count, já ordenados pela última mensagem. Pagine com next_cursor.

Janela do terminal
curl -s "localhost:8787/v1/instances/$ID/chats/$JID/messages?limit=50" -H "Authorization: Bearer $TOK"

Mensagens vêm da mais recente para a mais antiga. from_me separa os lados; status mostra received (recebida) ou pending → sent → delivered → read (enviadas). Mídia traz media.url para baixar com o token.

Quando o atendente abre a conversa:

Janela do terminal
curl -s -X POST "localhost:8787/v1/instances/$ID/chats/$JID/read" -H "Authorization: Bearer $TOK"

Envia a confirmação de leitura (os “tiques azuis”) e zera unread_count.

Janela do terminal
curl -s -X POST "localhost:8787/v1/instances/$ID/messages" -H "Authorization: Bearer $TOK" \
-d "{\"to\":\"$JID\",\"type\":\"text\",\"text\":\"Oi! Já verifico para você.\",\"client_message_id\":\"ticket-881-r1\"}"

Respostas a quem falou com você nas últimas 24 horas saem a qualquer hora (a janela de envio só vale para contatos frios) e não contam na rampa.

  • Backend com URL pública: um webhook com message.* atualiza a lista quando chega message.received e os tiques quando chega message.status.
  • Painel interno: consuma o SSE no backend e repasse ao navegador (WebSocket ou SSE seu).
  • Depois de um history.synced (logo após parear), recarregue a lista de chats.

message.sent com "source":"device" significa que alguém respondeu pelo celular do número. Use isso para marcar a conversa como “em atendimento humano” e pausar automações.

  • Use sempre o jid vindo da API nas rotas de chat (o 9º dígito pode diferir do número digitado).
  • Guarde o client_message_id de cada resposta: reenviar após um erro de rede não duplica.
  • Atendentes múltiplos no mesmo número: o LiteZap não tem distribuição de atendentes; faça no seu CRM, usando o log e os eventos.