Pular para o conteúdo principal
ℹ️ Conteúdo em atualização

Estamos revisando estes procedimentos. Pessoas técnicas podem encontrar ajustes em códigos de erro ou mapeamentos de payload; valide com os logs e o OpenAPI mais recente. Pessoas não técnicas podem continuar usando o passo a passo e acionar o time de suporte caso algo pareça diferente do descrito.

🤖 Atendimento - Cleo

Guia completo para integrar o assistente virtual Cleo e oferecer canais de atendimento aos seus clientes.

Introdução

Este serviço permite que você disponibilize informações de contato e atendimento do emissor, incluindo:

  • 🤖 Assistente virtual (Cleo)
  • 📞 Telefones de contato
  • 💬 Chat online
  • 📧 E-mail e WhatsApp
  • 🎧 Ouvidoria

URLs Base:

  • Produção: https://api.credsystem.com.br/private-label-app/api/v1
  • Homologação: https://apihml.credsystem.com.br/private-label-app/api/v1

Autenticação

Área Logada

Para usuários autenticados, use o token JWT no header:

Authorization: Bearer <seu_token_jwt>

Área Pública (Não Logada)

Para área pública, não é necessário token JWT. Basta informar o idApp na URL.

Flexibilidade

Este serviço pode ser usado tanto em áreas logadas quanto públicas, facilitando o acesso a informações de contato.

Endpoints Disponíveis

1. Obter Dados do Atendimento (Área Logada)

Retorne as informações completas de contato para usuários autenticados.

Endpoint: GET /cleo/dados

Headers:

Authorization: Bearer <seu_token_jwt>
Accept: application/json
Content-Type: application/json

Exemplo de Request:

GET /private-label-app/api/v1/atendimento/cleo/dados HTTP/1.1
Host: bff-app-privatelabel-hml.credsystem.com.br
Authorization: Bearer <token>
Accept: application/json

Resposta de Sucesso (200):

{
"whatsapp": "11999999999",
"email": "cleo@credsystem.com.br",
"nomeBot": "Cleo Assistente",
"statusCode": 200,
"telefones": {
"capitaisRegioesMetropolitanas": "1133334444",
"demaisRegioes": "1144445555",
"ouvidoria": "0800111111",
"ouvidoriaHorarios1": "08:00-17:00",
"ouvidoriaHorarios2": "seg-sex"
}
}

Campos da Resposta:

  • whatsapp: Número de WhatsApp para contato (formato com DDD)
  • email: E-mail de contato do suporte
  • nomeBot: Nome do assistente virtual
  • statusCode: Código HTTP da resposta
  • telefones: Objeto com todos os telefones de contato
    • capitaisRegioesMetropolitanas: Telefone para capitais
    • demaisRegioes: Telefone para outras regiões
    • ouvidoria: Número da ouvidoria
    • ouvidoriaHorarios1: Horário de funcionamento
    • ouvidoriaHorarios2: Dias de funcionamento

Exemplo de cURL:

curl -X 'GET' \
'https://bff-app-privatelabel-hml.credsystem.com.br/private-label-app/api/v1/atendimento/cleo/dados' \
-H 'accept: application/json' \
-H 'Authorization: Bearer SEU_TOKEN_JWT'
Uso Prático

Use essas informações para criar uma página de "Fale Conosco" ou seção de atendimento no app.

2. Obter Dados do Atendimento (Área Pública)

Retorne as mesmas informações para usuários não autenticados usando o ID da aplicação.

Endpoint: GET /cleo/dados/{idApp}

Parâmetros:

  • idApp (path, obrigatório): ID da aplicação para identificar o emissor

Exemplo de Request:

GET /private-label-app/api/v1/atendimento/cleo/dados/123 HTTP/1.1
Host: bff-app-privatelabel-hml.credsystem.com.br
Accept: application/json

Resposta: Mesma estrutura do endpoint para área logada.

Exemplo de cURL:

curl -X 'GET' \
'https://bff-app-privatelabel-hml.credsystem.com.br/private-label-app/api/v1/atendimento/cleo/dados/123' \
-H 'accept: application/json'
Quando Usar

Use este endpoint em telas de login, recuperação de senha ou qualquer área onde o usuário ainda não está autenticado.

Crie um link único para iniciar uma conversa com o assistente virtual Cleo.

Endpoint: GET /cleo/chat/link

Headers:

Authorization: Bearer <seu_token_jwt>
Accept: application/json
Content-Type: application/json

Exemplo de Request:

GET /private-label-app/api/v1/atendimento/cleo/chat/link HTTP/1.1
Host: bff-app-privatelabel-hml.credsystem.com.br
Authorization: Bearer <token>
Accept: application/json

Resposta de Sucesso (200):

{
"link": "https://chat.credsystem.com.br/cleo/session/abc123def456",
"protocolo": "PROTO-2025-12-03-001"
}

Campos da Resposta:

  • link: URL única para iniciar o chat com o assistente
  • protocolo: Número de protocolo da sessão (útil para rastreamento)

Exemplo de cURL:

curl -X 'GET' \
'https://bff-app-privatelabel-hml.credsystem.com.br/private-label-app/api/v1/atendimento/cleo/chat/link' \
-H 'accept: application/json' \
-H 'Authorization: Bearer SEU_TOKEN_JWT'
Como Usar
  1. Obtenha o link do chat
  2. Guarde o protocolo para rastreamento
  3. Redirecione o cliente para o link
  4. O chat será aberto em uma nova sessão autenticada

Códigos de Resposta

CódigoStatusDescrição
200✅ SucessoDados retornados com sucesso
204∅ Sem conteúdoNenhum dado disponível
400⚠️ Bad RequestParâmetros inválidos ou ausentes
401⛔ UnauthorizedToken inválido ou expirado (área logada)
500💥 Internal ErrorErro interno do servidor

Tratamento de Erros

Erro de Autenticação (401)

{
"error": {
"message": "Não foi possível validar o token",
"code": 401
}
}

Erro de Requisição (400)

{
"error": {
"message": "Authorization é uma informação obrigatória.",
"code": 400
}
}

Casos de Uso

1. Página "Fale Conosco"

Crie uma página completa com todos os canais de atendimento:

// Exemplo de implementação
async function carregarDadosAtendimento() {
const response = await fetch(
'https://bff-app-privatelabel-hml.credsystem.com.br/private-label-app/api/v1/atendimento/cleo/dados',
{
headers: {
'Authorization': `Bearer ${token}`,
'Accept': 'application/json'
}
}
);

const dados = await response.json();

// Exibir informações na página
document.getElementById('whatsapp').href = `https://wa.me/${dados.whatsapp}`;
document.getElementById('email').href = `mailto:${dados.email}`;
document.getElementById('telefoneCapital').textContent = dados.telefones.capitaisRegioesMetropolitanas;
document.getElementById('telefoneInterior').textContent = dados.telefones.demaisRegioes;
document.getElementById('ouvidoria').textContent = dados.telefones.ouvidoria;
document.getElementById('horarioOuvidoria').textContent =
`${dados.telefones.ouvidoriaHorarios1} - ${dados.telefones.ouvidoriaHorarios2}`;
}

2. Botão "Chat com Assistente"

Implemente um botão para abrir o chat:

async function abrirChatCleo() {
const response = await fetch(
'https://bff-app-privatelabel-hml.credsystem.com.br/private-label-app/api/v1/atendimento/cleo/chat/link',
{
headers: {
'Authorization': `Bearer ${token}`,
'Accept': 'application/json'
}
}
);

const { link, protocolo } = await response.json();

// Guardar protocolo para rastreamento
localStorage.setItem('protocoloAtendimento', protocolo);

// Abrir chat em nova janela
window.open(link, '_blank', 'width=400,height=600');
}

3. Área Pública - Tela de Login

Mostre informações de contato antes do login:

async function carregarContatoPublico(idApp) {
const response = await fetch(
`https://bff-app-privatelabel-hml.credsystem.com.br/private-label-app/api/v1/atendimento/cleo/dados/${idApp}`,
{
headers: {
'Accept': 'application/json'
}
}
);

const dados = await response.json();

// Exibir apenas informações básicas
exibirRodape({
whatsapp: dados.whatsapp,
telefone: dados.telefones.capitaisRegioesMetropolitanas,
email: dados.email
});
}

Fluxo Recomendado

Para Área Logada

1. Usuário clica em "Ajuda" ou "Fale Conosco"

2. Chamar GET /cleo/dados (com token JWT)

3. Exibir todos os canais de atendimento

4. SE cliente escolher "Chat Online":
├─ Chamar GET /cleo/chat/link
├─ Guardar protocolo
└─ Redirecionar para o link do chat

5. Cliente inicia atendimento via chat

Para Área Pública

1. Usuário acessa tela de login/recuperação de senha

2. Chamar GET /cleo/dados/{idApp} (sem token)

3. Exibir informações básicas no rodapé:
├─ Telefone
├─ WhatsApp
└─ E-mail

4. Cliente pode entrar em contato mesmo sem login

Boas Práticas

1. Cache de Informações

// Cache por 1 hora
const CACHE_TIME = 3600000; // 1 hora em ms

async function getDadosAtendimentoComCache() {
const cache = localStorage.getItem('dadosAtendimento');
const cacheTime = localStorage.getItem('dadosAtendimentoTime');

if (cache && cacheTime && (Date.now() - cacheTime < CACHE_TIME)) {
return JSON.parse(cache);
}

const dados = await buscarDadosAtendimento();
localStorage.setItem('dadosAtendimento', JSON.stringify(dados));
localStorage.setItem('dadosAtendimentoTime', Date.now());

return dados;
}

2. Formatação de Telefones

function formatarTelefone(numero) {
// Remove caracteres não numéricos
const limpo = numero.replace(/\D/g, '');

// Formata baseado no tamanho
if (limpo.length === 10) {
return limpo.replace(/(\d{2})(\d{4})(\d{4})/, '($1) $2-$3');
} else if (limpo.length === 11) {
return limpo.replace(/(\d{2})(\d{5})(\d{4})/, '($1) $2-$3');
}

return numero; // Retorna original se não conseguir formatar
}
function criarLinksAtendimento(dados) {
return {
whatsappLink: `https://wa.me/${dados.whatsapp.replace(/\D/g, '')}`,
emailLink: `mailto:${dados.email}`,
telefoneCapitalLink: `tel:${dados.telefones.capitaisRegioesMetropolitanas.replace(/\D/g, '')}`,
telefoneInteriorLink: `tel:${dados.telefones.demaisRegioes.replace(/\D/g, '')}`,
ouvidoriaLink: `tel:${dados.telefones.ouvidoria.replace(/\D/g, '')}`
};
}

4. Rastreamento de Protocolos

function salvarProtocoloAtendimento(protocolo) {
const historico = JSON.parse(localStorage.getItem('protocolosAtendimento') || '[]');

historico.push({
protocolo,
dataHora: new Date().toISOString(),
tipo: 'chat'
});

// Manter apenas últimos 10 protocolos
if (historico.length > 10) {
historico.shift();
}

localStorage.setItem('protocolosAtendimento', JSON.stringify(historico));
}

5. Tratamento de Erros

async function buscarDadosAtendimentoSeguro() {
try {
const response = await fetch(url, options);

if (!response.ok) {
throw new Error(`Erro ${response.status}: ${response.statusText}`);
}

return await response.json();
} catch (error) {
console.error('Erro ao buscar dados de atendimento:', error);

// Retornar dados fallback
return {
whatsapp: '0800-XXX-XXXX',
email: 'suporte@empresa.com.br',
nomeBot: 'Assistente',
telefones: {
capitaisRegioesMetropolitanas: '0800-XXX-XXXX',
demaisRegioes: '0800-XXX-XXXX',
ouvidoria: '0800-XXX-XXXX',
ouvidoriaHorarios1: 'Consulte o site',
ouvidoriaHorarios2: 'seg-sex'
}
};
}
}

Exemplo de Interface

Card de Atendimento

<div class="atendimento-card">
<h2>Precisa de Ajuda?</h2>

<div class="canal">
<img src="whatsapp-icon.png" alt="WhatsApp">
<div>
<strong>WhatsApp</strong>
<a href="#" id="whatsapp-link">Enviar mensagem</a>
</div>
</div>

<div class="canal">
<img src="chat-icon.png" alt="Chat">
<div>
<strong id="nome-bot">Chat Online</strong>
<button onclick="abrirChatCleo()">Iniciar conversa</button>
</div>
</div>

<div class="canal">
<img src="phone-icon.png" alt="Telefone">
<div>
<strong>Telefone</strong>
<p>Capitais: <a href="#" id="tel-capital"></a></p>
<p>Interior: <a href="#" id="tel-interior"></a></p>
</div>
</div>

<div class="canal">
<img src="email-icon.png" alt="E-mail">
<div>
<strong>E-mail</strong>
<a href="#" id="email-link"></a>
</div>
</div>

<div class="canal ouvidoria">
<img src="ouvidoria-icon.png" alt="Ouvidoria">
<div>
<strong>Ouvidoria</strong>
<p><a href="#" id="ouvidoria-tel"></a></p>
<small id="ouvidoria-horario"></small>
</div>
</div>
</div>

Dicas de UX

  1. Priorize canais digitais: WhatsApp e Chat devem aparecer primeiro
  2. Destaque horários: Mostre claramente quando cada canal está disponível
  3. Salve protocolos: Permita que o cliente veja histórico de atendimentos
  4. Ícones claros: Use ícones reconhecíveis para cada canal
  5. Click-to-action: Transforme todos os contatos em links clicáveis
  6. Responsividade: Em mobile, use tel: e mailto: para abrir apps nativos
  7. Feedback visual: Mostre quando o chat está sendo carregado

Integração com Outros Serviços

Com Notificações

// Notificar cliente quando chat for iniciado
async function iniciarChatComNotificacao() {
const { link, protocolo } = await getChatLink();

// Enviar notificação
await enviarNotificacao({
titulo: 'Atendimento Iniciado',
mensagem: `Seu protocolo: ${protocolo}`,
tipo: 'atendimento'
});

window.open(link, '_blank');
}

Com Analytics

// Rastrear qual canal o cliente usa
function rastrearCanalAtendimento(canal) {
analytics.track('Atendimento Iniciado', {
canal: canal, // 'whatsapp', 'chat', 'telefone', 'email'
origem: 'fale-conosco',
timestamp: new Date().toISOString()
});
}

Glossário

TermoSignificado
CleoNome do assistente virtual/bot de atendimento
ProtocoloNúmero único de identificação de uma sessão de atendimento
OuvidoriaCanal para reclamações e sugestões
idAppIdentificador único da aplicação/emissor
Bearer TokenTipo de token JWT usado para autenticação

Perguntas Frequentes

1. Posso usar o serviço sem autenticação? Sim! Use o endpoint /cleo/dados/{idApp} para áreas públicas.

2. O link do chat expira? Sim, links de chat têm validade limitada. Gere um novo link a cada sessão.

3. Como rastreio atendimentos? Use o campo protocolo retornado ao gerar o link do chat.

4. Posso customizar o nome do bot? O nome retorna do backend via campo nomeBot. A customização é feita no backoffice.

5. Como funciona em mobile? Use tel: para telefones e https://wa.me/ para WhatsApp - abrem os apps nativos.

Suporte

Para dúvidas ou problemas com a integração, entre em contato com a equipe de suporte técnico.