Skip to main content

📋 Documentação da API - Leads Unificados RSC

Endpoint

GET /bifrost/leads-unificados/rsc/

Descrição

Retorna uma lista unificada e otimizada de leads de vendas, com suporte a filtros avançados, paginação, agrupamento de leads repetidos e controle de permissões de usuário. Esta é a versão refatorada e otimizada com circuit breaker e processamento paralelo.


🔐 Autenticação

Esta rota requer autenticação via token API Key.

Headers obrigatórios:

api-key: <sua-api-key>

🌐 Hostnames

DEV:

  • VPN: 100.113.139.94:3001
  • PUBLIC: 136.116.58.209:3001

URL Completa de Exemplo (DEV):

http://136.116.58.209:3001/bifrost/leads-unificados/rsc/

📥 Parâmetros de Query

ParâmetroTipoObrigatórioDescriçãoExemplo
startDatestringNãoData inicial para filtro (formato: YYYY-MM-DD)2026-01-01
endDatestringNãoData final para filtro (formato: YYYY-MM-DD)2026-02-06
userIdnumberNãoID do usuário para filtrar leads específicos123
usePermissionsstring/number/booleanNãoAplicar permissões do usuário (1 ou '0')1
cachedstring/numberNãoTempo de cache (0=sem cache, 1=15min, padrão=5min)1
fetchAllstring/number/booleanNãoBuscar todos os registros sem paginaçãotrue

📤 Resposta de Sucesso

Status Code: 200 OK

Estrutura da Resposta

{
"data": [{...}],
"total": 0,
"page": 1,
"limit": 100,
"totalPages": 0,
"hasNextPage": false,
"hasPreviousPage": false,
"repeatedTotal": 0,
"cached": false,
"responseTime": 1234
}

Campos da Resposta

CampoTipoDescrição
dataarrayArray de objetos contendo os leads unificados
totalnumberQuantidade total de leads encontrados
pagenumberPágina atual
limitnumberLimite de registros por página
totalPagesnumberTotal de páginas disponíveis
hasNextPagebooleanIndica se existe próxima página
hasPreviousPagebooleanIndica se existe página anterior
repeatedTotalnumberQuantidade total de leads repetidos (filhos)
cachedbooleanIndica se o resultado veio do cache (sempre false na versão atual)
responseTimenumberTempo de resposta em milissegundos

Estrutura de um Lead no Array data

{
"id": 20626,
"source": "custom-funil",
"customSourceId": 30,
"customSourceName": "Instagram",
"customSourceSlug": "Instagram",
"originConsolidated": "Instagram",
"blocked": "0",
"name": "Nádia Caroline Charaf Edine",
"mail": "[email protected]",
"phone": "8781464575",
"pfOrPj": "PJ",
"long_id": "29062119-f318-11f0-a29c-02420a4d0002",
"shortLongId": "29062119",
"sprintId": null,
"sprintName": null,
"cpf": "-",
"cnpj": "-",
"etapa_kanban": "5",
"gestor_user_Id": 19,
"corretor_nome": "Paloma Soares de Souza",
"balcaoId": null,
"nome_balcao": null,
"date_created": "2026-01-16T23:15:54.000Z",
"date": "2026-01-28T17:29:47.000Z",
"time": "",
"files": "-",
"attributedToPersonIn": false,
"campaignName": "Forms Vendas PJ - UNC 0061 25 VIRADA DE TABELA",
"motiveCancelling": null,
"novu_hash": "ddc12c5e9050c3df5031d966511a222dbda4092e",
"isFollowUp": false,
"timeContact": "-",
"prefContact": "whatsapp",
"interestPlan": "-",
"proposeNumber": null,
"proposalCreatedBy": null,
"temperature": 3,
"temperatureLabel": "Morno",
"temperatureScore": 52,
"saledLifes": 0,
"saledPlan": null,
"qttPersons": "1",
"size": "-",
"ans_plano_unimed": "-",
"email_valido": "1",
"cliente_unimed": "0",
"isOrganic": false,
"origem_personalizada": null,
"isParent": true,
"clusterSize": 2,
"childrenCount": 1,
"repeated": 1,
"tipo_lead": "Lead com reincidência",
"cluster": {
"totalRegistros": 2,
"primeiroRegistro": "2025-10-30T02:10:11.000Z",
"ultimoRegistro": "2026-01-16T23:15:54.000Z",
"idsGrupo": [
"19590",
"20626"
]
}
}

Campos Detalhados do Lead

CampoTipoDescrição
idnumberID único do lead
sourcestringTipo de origem do lead (ex: "custom-funil")
customSourceIdnumberID da origem personalizada
customSourceNamestringNome da origem personalizada
customSourceSlugstringSlug da origem personalizada
originConsolidatedstringNome consolidado da origem
blockedstringStatus de bloqueio ("0" = não bloqueado, "1" = bloqueado)
namestringNome completo do lead
mailstringE-mail do lead
phonestringTelefone do lead (apenas números)
pfOrPjstringTipo de pessoa ("PF" = Pessoa Física, "PJ" = Pessoa Jurídica)
long_idstringIdentificador longo único do lead (UUID)
shortLongIdstringVersão curta do long_id (8 primeiros caracteres)
sprintIdnumber | nullID da sprint associada
sprintNamestring | nullNome da sprint associada
cpfstringCPF do lead ("-" se não informado)
cnpjstringCNPJ do lead ("-" se não informado)
etapa_kanbanstringID da etapa atual no kanban
gestor_user_IdnumberID do usuário gestor/corretor responsável
corretor_nomestringNome do corretor responsável
balcaoIdnumber | nullID do balcão (se aplicável)
nome_balcaostring | nullNome do balcão (se aplicável)
date_createdstring (ISO 8601)Data/hora de criação do lead
datestring (ISO 8601)Data/hora da última atualização
timestringHorário adicional (pode estar vazio)
filesstringArquivos anexados ("-" se nenhum)
attributedToPersonInbooleanIndica se foi atribuído a uma pessoa
campaignNamestringNome da campanha de origem
motiveCancellingstring | nullMotivo de cancelamento se aplicável
novu_hashstringHash de identificação do Novu (notificações)
isFollowUpbooleanIndica se está em follow-up
timeContactstringHorário preferido de contato
prefContactstringPreferência de contato (ex: "whatsapp")
interestPlanstringPlano de interesse ("-" se não especificado)
proposeNumberstring | nullNúmero da proposta associada
proposalCreatedBynumber | nullID do usuário que criou a proposta
temperaturenumberTemperatura do lead (1-5)
temperatureLabelstringLabel da temperatura ("Frio", "Morno", "Quente")
temperatureScorenumberScore de temperatura (0-100)
saledLifesnumberQuantidade de vidas vendidas
saledPlanstring | nullPlano vendido
qttPersonsstringQuantidade de pessoas no lead
sizestringTamanho/categoria ("-" se não aplicável)
ans_plano_unimedstringCódigo ANS do plano Unimed
email_validostringValidação de e-mail ("0" = inválido, "1" = válido)
cliente_unimedstringCliente Unimed ("0" = não, "1" = sim)
isOrganicbooleanIndica se é lead orgânico
repeatednumberNúmero de reincidências

❌ Respostas de Erro

503 - Service Unavailable

Retornado quando o circuit breaker está aberto devido a falhas consecutivas.

{
"error": "Service temporarily unavailable",
"message": "O sistema está temporariamente indisponível. Tente novamente em alguns instantes.",
"requestId": "abc-123-def-456",
"responseTime": 500
}

500 - Internal Server Error

Retornado em caso de erro interno não tratado.

{
"error": "Internal server error",
"message": "Descrição do erro",
"requestId": "abc-123-def-456",
"responseTime": 1500
}

📊 Exemplos de Uso

Exemplo 1: Buscar leads por período com permissões de usuário

curl -X GET "https://api.exemplo.com/bifrost/leads-unificados/rsc/?startDate=2026-01-01&endDate=2026-02-06&userId=123&usePermissions=1" \
-H "Authorization: Bearer seu-token-jwt" \
-H "api-key: sua-api-key"

Exemplo 2: Buscar todos os leads (puro)

curl -X GET "https://api.exemplo.com/bifrost/leads-unificados/rsc/?fetchAll=true" \
-H "Authorization: Bearer seu-token-jwt" \
-H "api-key: sua-api-key"

Sistema de Permissões

Quando usePermissions=1 e userId é fornecido:

  • O sistema busca as permissões do usuário no banco de dados
  • Filtra os leads retornados baseado nas permissões
  • Respeita departamentos e sprints autorizados

⚡ Performance e Otimizações

Circuit Breaker

A rota utiliza circuit breakers para:

  • Chamadas ao banco de dados
  • Requisições HTTP externas (API do Gestor)
  • Proteção contra falhas em cascata

Rate Limiting

Aplicado através do middleware limiterHeavyEndpoints para prevenir sobrecarga.

Cache (Atualmente Desabilitado)

Nota: O cache está desabilitado na versão atual (cached: false). Todas as requisições buscam dados diretamente do banco de dados para garantir consistência.


📝 Notas Importantes

  1. Multi-tenant: A rota é multi-tenant, identifica o tenant através da configuração da requisição (primeiro path após o host)

🔧 Middlewares Aplicados

  1. verificaToken: Validação de token JWT
  2. limiterHeavyEndpoints: Rate limiting para endpoints pesados

📌 Versão

  • Versão da API: Refatorada (v2)
  • Controller: funil.controller.refactored.js
  • Última atualização: Fevereiro 2026

🤝 Suporte

Para dúvidas ou problemas com esta API, entre em contato com a equipe de desenvolvimento.