Conversa

8 funções do TermoSell para conversa.

// npm install termo_core --save-exact
import * as sell from "termo_core/sell";
// ou: import { sell } from "termo_core";
FunçãoRotaO que faz
buscar_paginador_conversaGET /conversaLista as conversas com paginação
criar_conversaPOST /conversaNão cria conversa pela tela
buscar_auto_complete_conversaGET /conversa/autocompleteLista básica de conversas para seleção
buscar_pelo_filtro_conversaGET /conversa/filtroBusca conversas por filtro
buscar_pelo_id_conversaGET /conversa/{id}Busca uma conversa pelo id
atualizar_pelo_id_conversaPATCH /conversa/{id}Atualiza uma conversa pelo id
deletar_pelo_id_conversaDELETE /conversa/{id}Exclui uma conversa do histórico pelo id
buscar_mensagens_conversaGET /conversa/{id}/mensagensLista as mensagens de uma conversa

buscar_paginador_conversa

GET/conversa Exige credencial

Lista as conversas com paginação

Exige qualquer permissão da área clientes (qualquer ação liberada na área já libera a leitura). Ordena da última mensagem mais recente para a mais antiga. pagina começa em 1 (padrão 1; valores menores viram 1). A página tem sempre 50 itens: tamanho é aceito, mas ignorado. status (opcional) limita a um status. total conta os registros não excluídos que casam com o status.

function buscar_paginador_conversa(
  credencial_de_acesso: CredencialDeAcesso,
  parametros: ParametrosDeBuscarPaginadorConversa = {},
  opcoes_da_chamada?: OpcoesDaChamada,
): Promise<tipos.PaginaConversa>
Exemplo
import { CredencialDeAcesso } from "termo_core";
import { buscar_paginador_conversa } from "termo_core/sell";

const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
const resposta = await buscar_paginador_conversa(credencial_de_acesso, { pagina: 1 });

Argumentos

Nome

Tipo

Retorno: Promise<tipos.PaginaConversa> · Rust: Result<tipos::PaginaConversa, ErroAoChamarServico> · veja PaginaConversa.

criar_conversa

POST/conversa Exige credencial

Não cria conversa pela tela

Exige a permissão criar da área clientes, mas responde sempre 403: a conversa é registrada pelos webhooks do Chatwoot e da Z-API, que gravam toda mensagem visível que passa pela conta do Chatwoot. Sem corpo.

function criar_conversa(
  credencial_de_acesso: CredencialDeAcesso,
  opcoes_da_chamada?: OpcoesDaChamada,
): Promise<void>
Exemplo
import { CredencialDeAcesso } from "termo_core";
import { criar_conversa } from "termo_core/sell";

const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
await criar_conversa(credencial_de_acesso);

Argumentos

Nome

Tipo

Retorno: Promise<void> · Rust: Result<(), ErroAoChamarServico> · sem corpo na resposta.

buscar_auto_complete_conversa

GET/conversa/autocomplete Exige credencial

Lista básica de conversas para seleção

Exige qualquer permissão da área clientes (qualquer ação liberada na área já libera a leitura). Devolve só id, id da conversa no Chatwoot, nome e telefone do contato, em ordem alfabética do nome do contato. busca procura o trecho no nome do contato (sem diferenciar maiúsculas) ou no telefone. pagina começa em 1 (padrão 1) e tamanho tem padrão 10, sem máximo; valores menores que 1 viram 1. total conta os registros que casam com a busca.

function buscar_auto_complete_conversa(
  credencial_de_acesso: CredencialDeAcesso,
  parametros: ParametrosDeBuscarAutoCompleteConversa = {},
  opcoes_da_chamada?: OpcoesDaChamada,
): Promise<tipos.PaginaConversaAutoComplete>
Exemplo
import { CredencialDeAcesso } from "termo_core";
import { buscar_auto_complete_conversa } from "termo_core/sell";

const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
const resposta = await buscar_auto_complete_conversa(credencial_de_acesso, { busca: "..." });

Argumentos

Nome

Tipo

Retorno: Promise<tipos.PaginaConversaAutoComplete> · Rust: Result<tipos::PaginaConversaAutoComplete, ErroAoChamarServico> · veja PaginaConversaAutoComplete.

buscar_pelo_filtro_conversa

GET/conversa/filtro Exige credencial

Busca conversas por filtro

Exige qualquer permissão da área clientes (qualquer ação liberada na área já libera a leitura). Devolve até 500 conversas que casam com o filtro, da última mensagem mais recente para a mais antiga. cliente_id, robo_id, config_system_z_api_id e chatwoot_conversa_id comparam o valor exato; status compara o status exato; contato procura o trecho no nome do contato, na razão social do cliente ou nos dígitos do telefone; texto procura o trecho no conteúdo de qualquer mensagem da conversa; todos sem diferenciar maiúsculas. Sem filtro, devolve as 500 mais recentes. É por cliente_id que a guia "Histórico de conversas" do cliente lê o histórico.

function buscar_pelo_filtro_conversa(
  credencial_de_acesso: CredencialDeAcesso,
  parametros: ParametrosDeBuscarPeloFiltroConversa = {},
  opcoes_da_chamada?: OpcoesDaChamada,
): Promise<Array<tipos.Conversa>>
Exemplo
import { CredencialDeAcesso } from "termo_core";
import { buscar_pelo_filtro_conversa } from "termo_core/sell";

const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
const resposta = await buscar_pelo_filtro_conversa(credencial_de_acesso, { cliente_id: "..." });

Argumentos

Nome

Tipo

Retorno: Promise<Array<tipos.Conversa>> · Rust: Result<Vec<tipos::Conversa>, ErroAoChamarServico>

buscar_pelo_id_conversa

GET/conversa/{id} Exige credencial

Busca uma conversa pelo id

Exige qualquer permissão da área clientes (qualquer ação liberada na área já libera a leitura). Devolve a conversa do histórico interno com o nome do número do WhatsApp, do cliente e do robô, o status espelhado do Chatwoot (pending com o robô, open com a equipe, resolved, snoozed), a etapa atual do fluxo, a última mensagem de cada lado, transferida_em/transferida_motivo (sem_resposta quando o gatilho passou a conversa para a equipe), quantidade_mensagens e chatwoot_endereco_conversa (link da conversa no painel do Chatwoot). Datas em RFC 3339. Conversa excluída responde 404.

function buscar_pelo_id_conversa(
  credencial_de_acesso: CredencialDeAcesso,
  id: string,
  opcoes_da_chamada?: OpcoesDaChamada,
): Promise<tipos.Conversa>
Exemplo
import { CredencialDeAcesso } from "termo_core";
import { buscar_pelo_id_conversa } from "termo_core/sell";

const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
const resposta = await buscar_pelo_id_conversa(credencial_de_acesso, id);

Argumentos

Nome

Tipo

Retorno: Promise<tipos.Conversa> · Rust: Result<tipos::Conversa, ErroAoChamarServico> · veja Conversa.

atualizar_pelo_id_conversa

PATCH/conversa/{id} Exige credencial

Atualiza uma conversa pelo id

Exige a permissão editar da área clientes. Atualização parcial: só os campos enviados mudam. cliente_id vincula a conversa a um cliente, robo_id a um robô e status corrige o status gravado (pending, open, resolved ou snoozed) sem alterar nada no Chatwoot. As mensagens e os demais campos vêm só dos webhooks.

function atualizar_pelo_id_conversa(
  credencial_de_acesso: CredencialDeAcesso,
  id: string,
  corpo_da_requisicao: tipos.ConversaAtualizar,
  opcoes_da_chamada?: OpcoesDaChamada,
): Promise<tipos.Conversa>
Exemplo
import { CredencialDeAcesso } from "termo_core";
import { atualizar_pelo_id_conversa } from "termo_core/sell";

const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
const resposta = await atualizar_pelo_id_conversa(credencial_de_acesso, id, corpo_da_requisicao);

Argumentos

Nome

Tipo

Retorno: Promise<tipos.Conversa> · Rust: Result<tipos::Conversa, ErroAoChamarServico> · veja Conversa.

deletar_pelo_id_conversa

DELETE/conversa/{id} Exige credencial

Exclui uma conversa do histórico pelo id

Exige a permissão deletar da área clientes. A exclusão é lógica e leva junto as mensagens, na mesma transação: a conversa some do histórico interno e não há como restaurar. A conversa no Chatwoot não é alterada; uma mensagem nova dela cria um registro novo no histórico.

function deletar_pelo_id_conversa(
  credencial_de_acesso: CredencialDeAcesso,
  id: string,
  opcoes_da_chamada?: OpcoesDaChamada,
): Promise<void>
Exemplo
import { CredencialDeAcesso } from "termo_core";
import { deletar_pelo_id_conversa } from "termo_core/sell";

const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
await deletar_pelo_id_conversa(credencial_de_acesso, id);

Argumentos

Nome

Tipo

Retorno: Promise<void> · Rust: Result<(), ErroAoChamarServico> · sem corpo na resposta.

buscar_mensagens_conversa

GET/conversa/{id}/mensagens Exige credencial

Lista as mensagens de uma conversa

Exige qualquer permissão da área clientes (qualquer ação liberada na área já libera a leitura). Devolve as mensagens gravadas no histórico interno, em ordem de envio, sem as notas privadas da equipe. autor é contato, atendente ou robo; etapa_id é a etapa do fluxo em que o robô mandou a mensagem; criada_em é a data de criação no Chatwoot, em RFC 3339. anexos lista os arquivos da mensagem (tipo do Chatwoot, nome, endereco no Chatwoot); cada um é copiado para o TermoBucket (arquivo privado do app spark-sell) logo depois do webhook e, quando já está lá, traz arquivo_id, tipo_mime, tamanho e url, o download assinado por 15 minutos. O que falhar é tentado de novo a cada 30 minutos, até 5 vezes.

function buscar_mensagens_conversa(
  credencial_de_acesso: CredencialDeAcesso,
  id: string,
  opcoes_da_chamada?: OpcoesDaChamada,
): Promise<Array<tipos.ConversaMensagem>>
Exemplo
import { CredencialDeAcesso } from "termo_core";
import { buscar_mensagens_conversa } from "termo_core/sell";

const credencial_de_acesso = CredencialDeAcesso.token_do_usuario_logado(token_do_usuario);
const resposta = await buscar_mensagens_conversa(credencial_de_acesso, id);

Argumentos

Nome

Tipo

Retorno: Promise<Array<tipos.ConversaMensagem>> · Rust: Result<Vec<tipos::ConversaMensagem>, ErroAoChamarServico>

Tipos

Tipos usados pelas funções desta página. O nome é o mesmo nos dois pacotes.

AnexoDaMensagem

import type { AnexoDaMensagem } from "termo_core/sell";

export interface AnexoDaMensagem {
  arquivo_id?: string | null;
  endereco: string;
  nome: string;
  tamanho?: number | null;
  tentativas?: number;
  tipo: string;
  tipo_mime?: string | null;
  url?: string | null;
}

Conversa

import type { Conversa } from "termo_core/sell";

export interface Conversa {
  atualizado_em: string;
  chatwoot_contato_id?: number | null;
  chatwoot_conversa_id: number;
  chatwoot_endereco_conversa?: string | null;
  cliente_id?: string | null;
  cliente_razao_social?: string | null;
  config_system_chatwoot_id: string;
  config_system_whatsapp_id?: string | null;
  config_system_whatsapp_nome?: string | null;
  config_system_z_api_id?: string | null;
  config_system_z_api_nome?: string | null;
  contato_nome: string;
  contato_telefone: string;
  criado_em: string;
  etapa_id?: string | null;
  id: string;
  quantidade_mensagens: number;
  robo_id?: string | null;
  robo_nome?: string | null;
  status: string;
  transferida_em?: string | null;
  transferida_motivo?: string | null;
  ultima_mensagem: string;
  ultima_mensagem_do_contato_em?: string | null;
  ultima_mensagem_do_robo_em?: string | null;
  ultima_mensagem_em?: string | null;
}

ConversaAtualizar

import type { ConversaAtualizar } from "termo_core/sell";

export interface ConversaAtualizar {
  cliente_id?: string | null;
  robo_id?: string | null;
  status?: string | null;
}

ConversaMensagem

import type { ConversaMensagem } from "termo_core/sell";

export interface ConversaMensagem {
  anexos: Array<AnexoDaMensagem>;
  autor: string;
  chatwoot_mensagem_id: number;
  conteudo: string;
  conversa_id: string;
  criada_em: string;
  etapa_id?: string | null;
  id: string;
  quantidade_anexos: number;
}

PaginaConversa

import type { PaginaConversa } from "termo_core/sell";

export interface PaginaConversa {
  itens: Array<PaginaConversaItensItem>;
  pagina: number;
  tamanho: number;
  total: number;
}

PaginaConversaAutoComplete

import type { PaginaConversaAutoComplete } from "termo_core/sell";

export interface PaginaConversaAutoComplete {
  itens: Array<PaginaConversaAutoCompleteItensItem>;
  pagina: number;
  tamanho: number;
  total: number;
}

PaginaConversaAutoCompleteItensItem

import type { PaginaConversaAutoCompleteItensItem } from "termo_core/sell";

export interface PaginaConversaAutoCompleteItensItem {
  chatwoot_conversa_id: number;
  contato_nome: string;
  contato_telefone: string;
  id: string;
}

PaginaConversaItensItem

import type { PaginaConversaItensItem } from "termo_core/sell";

export interface PaginaConversaItensItem {
  atualizado_em: string;
  chatwoot_contato_id?: number | null;
  chatwoot_conversa_id: number;
  chatwoot_endereco_conversa?: string | null;
  cliente_id?: string | null;
  cliente_razao_social?: string | null;
  config_system_chatwoot_id: string;
  config_system_whatsapp_id?: string | null;
  config_system_whatsapp_nome?: string | null;
  config_system_z_api_id?: string | null;
  config_system_z_api_nome?: string | null;
  contato_nome: string;
  contato_telefone: string;
  criado_em: string;
  etapa_id?: string | null;
  id: string;
  quantidade_mensagens: number;
  robo_id?: string | null;
  robo_nome?: string | null;
  status: string;
  transferida_em?: string | null;
  transferida_motivo?: string | null;
  ultima_mensagem: string;
  ultima_mensagem_do_contato_em?: string | null;
  ultima_mensagem_do_robo_em?: string | null;
  ultima_mensagem_em?: string | null;
}

Nesta página