Ler as conversas (WhatsApp e E-mail) de um lead
Liste as conversas de um lead por canal e puxe as mensagens de cada thread para registrar o histórico de contato onde você quiser.
Ler as conversas de um lead
Acesse as trocas de WhatsApp e E-mail do GS Engage e leve o histórico para o seu sistema.
Você quer ter, em outro lugar (um CRM, um data warehouse, uma planilha, um relatório), o histórico completo do que foi conversado com cada lead. As mensagens de WhatsApp e E-mail que acontecem dentro do GS Engage podem ser lidas pela API e copiadas para onde você precisar.
Esta página mostra como fazer isso em dois passos: primeiro você lista as conversas (chamamos de threads), depois puxa as mensagens de cada uma.
Dica
Estas são operações de leitura (GET). Elas não enviam nada, não respondem ninguém e não alteram o lead. É seguro experimentar à vontade — nenhuma mensagem sai para o cliente.
Você vai precisar de uma apiKey (a sua chave de acesso à API). Ela é criada na plataforma em Configurações > Configurações de API e é enviada como parâmetro na própria URL, no formato ?apiKey=SUA_CHAVE.
Sua apiKey é uma senha
Como a chave vai na URL, ela aparece em logs de servidor, no histórico do navegador e em qualquer link compartilhado. Guarde-a numa variável de ambiente e nunca cole em canais públicos (chat, e-mail, tickets).
Se ainda não validou sua chave, dê uma passada rápida pelo Quickstart da API — lá explicamos como confirmar que a chave funciona antes de qualquer outra chamada.
O modelo é simples e tem dois níveis:
graph LR A["Lead"] --> B["Thread (uma conversa por canal)"] B --> C["Mensagem"] B --> D["Mensagem"] B --> E["Mensagem"]
- Thread é uma conversa — um fio de diálogo por canal. Um mesmo lead pode ter uma thread de WhatsApp e outra de E-mail.
- Mensagem é cada troca dentro daquela thread (o que foi enviado e o que foi recebido).
Por isso a leitura acontece em duas etapas: você lista as threads para descobrir quais conversas existem e, com o identificador de cada uma, puxa as mensagens dela.
O que é um endpoint?
Endpoint é só o endereço de uma função da API — a "porta" que você chama para pedir ou enviar dados. Aqui usamos dois: um que lista threads e outro que lista mensagens de uma thread.
Liste as conversas (threads)
Comece descobrindo quais conversas existem. Chame GET /api/v1/conversations/threads.
curl "https://api.gsengage.com/api/v1/conversations/threads?apiKey=SUA_CHAVE&limit=20&page=1"A resposta vem paginada, no formato padrão da API: uma lista em data e um resumo em meta.
{
"data": [
{
"id": "652f1a9c8b3e4c0012a4d7f1",
"channel": "WHATSAPP",
"leadId": "651a0b2f4d9c1e0033b8e5a2"
},
{
"id": "652f1b3e8b3e4c0012a4d802",
"channel": "EMAIL",
"leadId": "651a0b2f4d9c1e0033b8e5a2"
}
],
"meta": {
"limit": 20,
"count": 2,
"total": 2,
"page": 1,
"totalPages": 1
}
}Guarde o id da thread que te interessa — é ele que você usa no próximo passo.
Puxe as mensagens de uma thread
Com o id da thread em mãos, peça as mensagens dela em GET /api/v1/conversations/threads/{threadId}/messages.
curl "https://api.gsengage.com/api/v1/conversations/threads/652f1a9c8b3e4c0012a4d7f1/messages?apiKey=SUA_CHAVE&limit=50&page=1"A resposta traz o conteúdo trocado naquela conversa, também paginado.
{
"data": [
{
"id": "6531c04a8b3e4c0012a4e910",
"content": "Olá! Vi que você baixou nosso material. Posso ajudar?"
},
{
"id": "6531c07d8b3e4c0012a4e922",
"content": "Oi! Sim, queria entender os planos."
}
],
"meta": {
"limit": 50,
"count": 2,
"total": 2,
"page": 1,
"totalPages": 1
}
}Pronto: essas são as mensagens da conversa, prontas para serem salvas onde você quiser.
As duas chamadas usam a mesma paginação. Você controla o tamanho da página com limit e navega com page.
| Parâmetro | Para que serve | Exemplo |
|---|---|---|
limit | Quantos itens por página | limit=50 |
page | Qual página buscar (começa em 1) | page=2 |
No bloco meta da resposta você tem tudo para saber se acabou:
Campo em meta | O que significa |
|---|---|
limit | O tamanho de página que você pediu |
count | Quantos itens vieram nesta página |
total | Total de itens em todas as páginas |
page | A página atual |
totalPages | Quantas páginas existem no total |
A regra é: continue incrementando page enquanto page for menor que totalPages. Quando chegarem iguais, você leu tudo.
Dica
Você também pode ordenar os resultados com orderBy e orderDirection (asc para crescente, desc para decrescente) — útil para trazer as mensagens em ordem cronológica.
Este é o cenário mais comum: você quer que o histórico de conversas do GS Engage também apareça no seu CRM, num data warehouse ou num relatório. A lógica é sempre a mesma.
Liste todas as threads
Percorra GET /api/v1/conversations/threads página a página até page alcançar totalPages. Assim você tem todas as conversas, de todos os canais.
Para cada thread, puxe as mensagens
Use o id de cada thread em GET /api/v1/conversations/threads/{threadId}/messages, também paginando até o fim.
Grave no seu sistema
Salve as mensagens vinculadas ao leadId da thread. Numa próxima execução, você repete o processo e atualiza só o que for novo.
Um esqueleto em Python que amarra as duas chamadas:
import os
import requests
BASE = "https://api.gsengage.com/api/v1"
API_KEY = os.environ["GSENGAGE_API_KEY"] # nunca escreva a chave no código
def get_pages(path):
"""Percorre todas as páginas de um endpoint paginado e devolve os itens."""
page = 1
while True:
resp = requests.get(
f"{BASE}{path}",
params={"apiKey": API_KEY, "limit": 50, "page": page},
)
resp.raise_for_status()
body = resp.json()
for item in body["data"]:
yield item
meta = body["meta"]
if meta["page"] >= meta["totalPages"]:
break
page += 1
# 1) Todas as conversas
for thread in get_pages("/conversations/threads"):
# 2) Todas as mensagens de cada conversa
for message in get_pages(f"/conversations/threads/{thread['id']}/messages"):
# 3) Aqui você grava no seu sistema, vinculando ao lead
salvar_no_seu_sistema(thread["leadId"], thread["channel"], message)Cuidado com o rate limit
A API permite 200 requisições de leitura por minuto (janela fixa de 60s). Como este caso faz muitas chamadas seguidas, é fácil esbarrar no limite quando há muitas threads. Rate limit é o teto de chamadas que você pode fazer num intervalo.
Se passar do teto, a API responde com 429 e alguns cabeçalhos que te dizem exatamente quanto esperar:
| Cabeçalho | O que informa |
|---|---|
Retry-After | Quantos segundos esperar antes de tentar de novo |
X-RateLimit-Limit | Seu teto de requisições na janela |
X-RateLimit-Remaining | Quantas ainda restam |
X-RateLimit-Reset | Quando a janela reinicia |
- Respeite o
Retry-Aftere faça backoff exponencial (espere um pouco mais a cada nova tentativa). - Use um
limitmaior (ex.: 50) para trazer mais itens por chamada e reduzir o número de requisições.
- Não fique repetindo a mesma chamada em looping imediato — isso só prolonga o bloqueio.
- Não puxe tudo o tempo todo — grave o que já leu e, nas próximas execuções, atualize só o que mudou.
As mensagens de erro do GS Engage já vêm em português — leia-as com atenção, elas costumam dizer o que corrigir.
| Código | O que houve | Como resolver |
|---|---|---|
| 401 | apiKey ausente ou inválida | Confira se você incluiu ?apiKey=... na URL e se a chave está correta |
| 404 | Thread não encontrada | Verifique o threadId — ele precisa ter vindo da listagem de threads |
| 429 | Você passou do rate limit | Espere o tempo do Retry-After e tente de novo com backoff |
O corpo de um erro 400 segue o formato abaixo, apontando o campo problemático:
{
"error": {
"message": "Descrição do que deu errado.",
"errors": [
{ "field": ["page"], "message": "Deve ser um número maior que zero." }
]
}
}Um lead pode ter mais de uma conversa?
Pode. Cada canal tem sua própria thread — por exemplo, uma de WHATSAPP e outra de EMAIL para o mesmo lead. Por isso vale listar todas as threads antes de puxar as mensagens.
Consigo filtrar só as conversas de WhatsApp ou só de E-mail?
Os canais disponíveis são WHATSAPP e EMAIL. Ao listar as threads você recebe o channel de cada uma e pode selecionar no seu lado apenas o canal que interessa.
Ler as mensagens envia alguma coisa para o cliente?
Não. Estes endpoints são somente leitura. Nada é enviado, respondido ou alterado — você só consulta o histórico que já existe.
Preciso de código para isso?
Não necessariamente. Ferramentas no-code como Zapier, Make e n8n conseguem consumir a API REST do GS Engage e mover esses dados para outros sistemas sem você escrever código.
Toda chamada é real
Não existe ambiente de testes (sandbox) separado no GS Engage. Toda chamada atinge dados de produção. Como aqui só fazemos leitura, o risco é baixo — mas mantenha o cuidado com a chave e com o volume de requisições.
Antes de integrar
0/4Este artigo foi útil?
Extrair prospecções e atividades para um dashboard
Puxe suas prospecções e atividades do GS Engage de forma paginada para montar um dashboard de funil e calcular sua taxa de conversão.
Autenticação com apiKey
Aprenda a criar sua apiKey, usá-la na URL das chamadas e proteger essa chave como se fosse uma senha.