Listar interações (linha do tempo global por período)
v1.0.0https://api.growthaisystem.com/api/v1/interactions- Exige
Authorization: Bearer gos_…— Chave de API (gos_…)· escoposcontacts.read
Toda interação com contatos do workspace, mais recente primeiro (createdAt DESC, id DESC). Mensagem do inbox: createdAt é a data do ENVIO registrada pelo provedor — o histórico importado do GHL sai na data original, não na do import. No histórico importado, actor vem do source do CRM antigo quando não há carimbo de autor: workflow/campanha/disparo em massa = automation, api = api. paginada por cursor. Fontes: mensagens do inbox (WhatsApp/Instagram/Facebook, e as conversas de canal phone — importadas ou abertas pela telefonia), ligações, e-mails (resposta enviada pelo painel, resposta recebida do contato, e-mail de automação) e notas. id = <fonte>:<id da linha>.
actor diz QUEM agiu: user = pessoa do time no app (só quando o userId de quem mandou está gravado); contact = o lead (toda interação inbound); ia / automation / system / api = robôs; unknown = mensagem outbound sem autor conhecido (histórico antigo, importado sem source reconhecido, ou sem carimbo). userId é o usuário do app que mandou — carimbado no MOMENTO DO ENVIO, imutável, e só preenchido com actor=user. Para o Speed-to-Lead, filtre direction=outbound&actor=user.
Mensagem do inbox: userId NUNCA é inferido do responsável atual da conversa — antes de 0728 (issue #728) uma mensagem sem carimbo saía atribuída a quem estivesse dono do atendimento NA HORA DA CONSULTA, e o valor mudava sozinho quando a conversa era reatribuída (bug medido pelo cliente: pior que devolver vazio numa auditoria de comissão). Hoje, sem carimbo, userId: null e actor: "unknown". conversationAssigneeUserId é o campo separado e honesto pra "quem é o dono do atendimento HOJE" — mutável, não é quem mandou. channelInstanceId (id da conexão) e senderPhone (o número/identificador dela) ajudam a resolver a autoria sem depender de quem digitou, quando a linha do SDR é separada da dos closers; null quando a mensagem não tem conexão associada ou a fonte não é mensagem de inbox.
Ligação: durationSec (segundos) e status = answered | no_answer | demais estados crus do provedor (ex.: ringing).
NÃO entram: campanhas de e-mail em massa, tarefas, reuniões (vivem em /appointments) e os marcadores internos do fio da conversa ("Automação X rodou", "Reunião cancelada", "Negócio foi de A para B", atribuição de atendente) — são anotação para quem atende, nunca chegam ao contato. opportunityId só vem preenchido na nota; nas demais o vínculo com o negócio é pelo contactId.
Mensagem: status = sent | delivered | read | failed (com statusReason) | received; updatedAt é a última mudança de estado.
Contato na Lixeira não aparece: nada dele sai aqui, nem com contactId (a Lixeira fica fora da API).
Filtros: contactId, userId, channel (CSV de whatsapp,instagram,facebook,phone,call,email,note), direction, actor, createdAfter / createdBefore e updatedAfter / updatedBefore (ISO-8601, exclusivos). limit até 500.
Parâmetros de consulta
Vão na querystring, depois do ?.
- contactIdstringopcional
- tamanho 1–80
- userIdstringopcional
- tamanho 1–80
- channelstringopcional
- tamanho 1–120
- directionstringopcional
- um de"inbound""outbound"
- actorstringopcional
- um de"user""contact""ia""automation""system""api""unknown"
- createdAfterstringopcional
- createdBeforestringopcional
- updatedAfterstringopcional
- updatedBeforestringopcional
- cursorstringopcional
- limitintegeropcional
- padrão 100
- faixa 1–500
Respostas
6 respostas documentadas — o código, o que ele significa nesta rota e a forma do corpo.
Página de interações do workspace, mais recente primeiro. data: [] é sucesso (não há interação no recorte); nextCursor: null é o fim da lista.
Cada item — V1Interaction
- idstring
- kindstring
- um de"message""call""email""note"
- channelstring
- directionstring
- um de"inbound""outbound"
- actorstring
- um de"user""contact""ia""automation""system""api""unknown"
- userIdstring | null
- contactIdstring | null
- opportunityIdstring | null
- conversationIdstring | null
- conversationAssigneeUserIdstring | null
- channelInstanceIdstring | null
- senderPhonestring | null
- createdAtstring
- updatedAtstring
- durationSecinteger | null
- statusstring | null
- statusReasonstring | null
- previewstring | null
- nextCursorstring | null
Cursor opaco da PRÓXIMA página — passe em
?cursor=.null= acabou a lista.