📋 Documentação da API - Detalhamento de Lead Individual
Endpoint
POST /bifrost/funil/details
Descrição
Retorna o detalhamento completo de um único lead específico através do seu longId. Esta rota consolida informações de diversas fontes (funil PF, funil PJ, balcão, formulários, origens personalizadas, etc.) e retorna dados completos incluindo beneficiários, anexos, histórico de movimentação, cancelamentos e informações do colaborador responsável.
🔐 Autenticação
Esta rota requer autenticação via token JWT 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/funil/details
📥 Parâmetros do Body (JSON)
| Parâmetro | Tipo | Obrigatório | Descrição | Exemplo |
|---|---|---|---|---|
longId | string | Sim | Identificador longo único do lead (UUID) | 29062119-f318-11f0-a29c-02420a4d0002 |
source | string | Sim | Origem do lead | custom-funil, funil-pf, funil-pj, funil-balcao, etc. |
Valores válidos para source:
custom-funil- Origem Personalizada
📤 Resposta de Sucesso
Status Code: 200 OK
Estrutura da Resposta
{
"message": {
"id": 182,
"source": "custom-funil",
"blocked": 0,
"isFollowUp": false,
"novu_hash": "6984d56d55d71cefcacdd25e",
"name": "andre",
"mail": "[email protected]",
"saledLifes": 0,
"saledPlan": "-",
"customSourceName": "Superlead",
"slugOrigin": "superlead",
"customSourceSlug": "superlead",
"phone": "62998315092",
"pfOrPj": "PJ",
"long_id": "4d8874e3-e8a7-4f9b-89d6-35db04116b8c",
"sprintId": 1,
"sprintName": "Sprint Padrão",
"shortLongId": "4D8874",
"status_risk_flow": 0,
"size": "-",
"propostaConsolidada": 0,
"cpf": "70255710160",
"cnpj": "44.148.296/0001-68",
"qttPersons": "1",
"interestPlan": "-",
"timeContact": "-",
"prefContact": "-",
"temperature": 1,
"date_created": "05/02/2026",
"date": "05/02/2026",
"time": "",
"files": "-",
"ans_plano_unimed": "-",
"email_valido": null,
"cliente_unimed": "0",
"etapa_kanban": "0",
"gestor_user_Id": null,
"attributedToPersonIn": false,
"motiveCancelling": [],
"desistenciasReaberturasProposta": [],
"beneficiarios": [],
"anexos": [],
"repeated": [
{
"id": 182,
"source": "custom-funil",
"date_created": "05/02/2026",
"gestor_user_Id": null,
"mail": "[email protected]",
"etapa_kanban": "0",
"motiveCancelling": [],
"movimentationLogs": []
}
]
}
}
📊 Campos Detalhados da Resposta
Campos Principais do Lead
| Campo | Tipo | Descrição |
|---|---|---|
id | number | ID único do lead no banco de dados |
source | string | Origem do lead (funil-pf, funil-pj, custom-funil, etc.) |
blocked | number | Status de bloqueio (0 = não bloqueado, 1 = bloqueado) |
isFollowUp | boolean | Indica se o lead está em follow-up |
novu_hash | string | null | Hash de identificação do Novu (notificações) |
name | string | Nome completo do lead |
mail | string | E-mail do lead |
saledLifes | number | Quantidade de vidas vendidas para este lead |
saledPlan | string | Nome do plano vendido (ou "-" se não houver) |
customSourceName | string | Nome da origem personalizada |
slugOrigin | string | Slug da origem personalizada |
customSourceSlug | string | Slug da origem (duplicado para compatibilidade) |
phone | string | Telefone do lead (apenas números) |
pfOrPj | string | Tipo de pessoa ("PF" = Pessoa Física, "PJ" = Pessoa Jurídica) |
long_id | string | Identificador longo único do lead (UUID) |
sprintId | number | null | ID da sprint associada ao lead |
sprintName | string | Nome da sprint (ou "-" se não houver) |
shortLongId | string | Versão curta do long_id (8 primeiros caracteres) |
status_risk_flow | number | Status do fluxo de risco (0 = sem risco) |
propostaConsolidada | number | Indica se há proposta consolidada (0 = não, 1 = sim) |
cpf | string | CPF do lead ("-" se não informado) |
cnpj | string | CNPJ do lead ("-" se não informado) |
qttPersons | string | Quantidade de pessoas no lead |
interestPlan | string | Plano de interesse do lead |
timeContact | string | Horário preferido para contato |
prefContact | string | Preferência de contato (whatsapp, telefone, email, etc.) |
date_created | string | Data de criação do lead (formato DD/MM/YYYY) |
date | string | Data da última atualização (formato DD/MM/YYYY) |
time | string | Horário adicional (pode estar vazio) |
email_valido | string | Validação de e-mail ("0" = inválido, "1" = válido) |
cliente_unimed | string | Cliente Unimed ("0" = não, "1" = sim) |
etapa_kanban | string | ID da etapa atual no kanban |
gestor_user_Id | number | null | ID do usuário gestor/corretor responsável |
attributedToPersonIn | string | boolean | Data de atribuição ao corretor (DD/MM/YYYY) ou false |
proposeNumber | string | null | Número da proposta associada (se houver) |
Campos do Colaborador Responsável
| Campo | Tipo | Descrição |
|---|---|---|
collab_responsible_team_name | string | Nome da equipe do colaborador responsável |
collab_responsible_name | string | Nome do colaborador responsável pelo lead |
collab_responsible_color | string | Cor hexadecimal do ranking do colaborador |
Arrays Relacionados
motiveCancelling (Array)
Lista de motivos de cancelamento/desistência do lead.
[
{
"id": 123,
"id_longo_lead": "29062119-f318-11f0-a29c-02420a4d0002",
"id_tipo_motivo": 1,
"titulo_tipo_motivo_cancelamento": "Cliente desistiu",
"gestor_user_Id": 19,
"collabResponsibleCancellingName": "Paloma Soares de Souza",
"numero_proposta": null,
"criado_em": "2026-01-20T14:30:00.000Z",
"typeMotive": "lead"
}
]
desistenciasReaberturasProposta (Array)
Lista de motivos de cancelamento/reabertura da proposta associada ao lead.
[
{
"id": 124,
"id_longo_lead": "29062119-f318-11f0-a29c-02420a4d0002",
"id_tipo_motivo": 3,
"titulo_tipo_motivo_cancelamento": "Documentação incompleta",
"gestor_user_Id": 19,
"collabResponsibleCancellingName": "Paloma Soares de Souza",
"numero_proposta": "2026010001",
"criado_em": "2026-01-22T10:15:00.000Z",
"typeMotive": "propose"
}
]
beneficiarios (Array)
Lista de beneficiários da proposta (colaboradores ou dependentes).
[
{
"nome": "Maria Silva Santos",
"cpf": "12345678900",
"tipoVenda": "titular",
"dataNascimento": "1985-05-15"
},
{
"nome": "Jo ão Silva Santos",
"cpf": "98765432100",
"tipoVenda": "dependente",
"dataNascimento": "2010-08-20"
}
]
anexos (Array)
Lista de anexos/documentos do lead (apenas com status_arquivo = 1).
[
{
"id": 456,
"id_longo_lead": "29062119-f318-11f0-a29c-02420a4d0002",
"nome_arquivo": "documento_identidade.pdf",
"url_arquivo": "https://storage.example.com/anexos/documento_identidade.pdf",
"tipo_arquivo": "RG",
"status_arquivo": 1,
"criado_em": "2026-01-17T09:00:00.000Z"
}
]
repeated (Array)
Histórico de registros e movimentações do lead (pode conter múltiplas entradas se o lead for repetido).
[
{
"id": 20626,
"source": "custom-funil",
"date_created": "16/01/2026",
"gestor_user_Id": 19,
"mail": "[email protected]",
"etapa_kanban": "5",
"motiveCancelling": [],
"movimentationLogs": [
{
"id": 789,
"id_longo_lead": "29062119-f318-11f0-a29c-02420a4d0002",
"etapa_kanban_anterior": "3",
"etapa_kanban_nova": "5",
"gestor_user_Id": 19,
"collabResponsibleLead": "Paloma Soares de Souza",
"atualizado_em": "2026-01-28T17:29:47.000Z"
}
]
}
]
Campos do movimentationLogs:
id: ID do log de movimentaçãoid_longo_lead: Long ID do leadetapa_kanban_anterior: Etapa anterior no kanbanetapa_kanban_nova: Nova etapa no kanbangestor_user_Id: ID do colaborador que movimentoucollabResponsibleLead: Nome do colaborador responsável pela movimentaçãoatualizado_em: Data/hora da movimentação
❌ Respostas de Erro
400 - Bad Request (Parâmetros Inválidos)
Retornado quando parâmetros obrigatórios não são fornecidos.
{
"message": "erro: parâmetros não atendem a requisição, falta longId ou source"
}
400 - Bad Request (Lead Não Encontrado)
Retornado quando o lead com o longId informado não existe.
{
"message": "lead não encontrado longId->29062119-f318-11f0-a29c-02420a4d0002"
}
500 - Internal Server Error
Retornado em caso de erro interno não tratado.
{
"error": "Internal server error",
"message": "Descrição do erro"
}
📊 Exemplos de Uso
Exemplo 1: Buscar detalhes de um lead por longId
Request:
curl -X POST "http://136.116.58.209:3001/bifrost/funil/details" \
-H "Authorization: Bearer seu-token-jwt" \
-H "api-key: sua-api-key" \
-H "Content-Type: application/json" \
-d '{
"longId": "4d8874e3-e8a7-4f9b-89d6-35db04116b8c",
"source": "custom-funil"
}'
Response:
{
"message": {
"id": 182,
"source": "custom-funil",
"blocked": 0,
"name": "andre",
"mail": "[email protected]",
"phone": "62998315092",
"long_id": "4d8874e3-e8a7-4f9b-89d6-35db04116b8c",
"shortLongId": "4D8874",
"sprintId": 1,
"sprintName": "Sprint Padrão",
"cpf": "70255710160",
"cnpj": "44.148.296/0001-68",
"etapa_kanban": "0",
"gestor_user_Id": null,
"customSourceName": "Superlead",
"beneficiarios": [],
"anexos": [],
"repeated": [...]
}
}
Exemplo 2: Buscar lead do funil PF
Request:
curl -X POST "http://136.116.58.209:3001/bifrost/funil/details" \
-H "Authorization: Bearer seu-token-jwt" \
-H "api-key: sua-api-key" \
-H "Content-Type: application/json" \
-d '{
"longId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"source": "funil-pf",
"leadId": 12345
}'
Exemplo 3: Buscar lead do balcão
Request:
curl -X POST "http://136.116.58.209:3001/bifrost/funil/details" \
-H "Authorization: Bearer seu-token-jwt" \
-H "api-key: sua-api-key" \
-H "Content-Type: application/json" \
-d '{
"longId": "xyz123-def456-ghi789",
"source": "funil-balcao"
}'
🔄 Fluxo de Processamento
- Validação de Parâmetros: Verifica se
longIdesourceforam fornecidos - Busca Unificada: Consulta o lead em todas as origens possíveis (funil PF, PJ, balcão, custom, etc.)
- Verificação de Bloqueio: Checa se o email do lead está na blocklist
- Enriquecimento de Dados:
- Busca informações do colaborador responsável
- Busca logs de movimentação
- Busca cancelamentos e reaberturas
- Busca anexos do lead
- Busca sprint associada
- Busca vidas vendidas
- Busca proposta associada e beneficiários
- Consolidação: Monta o objeto final com todas as informações relacionadas
- Resposta: Retorna o objeto completo do lead
🔐 Segurança
- ✅ Autenticação JWT obrigatória via middleware
verificaToken - ✅ Validação de entrada de dados
⚡ Performance
Otimizações Implementadas
- Busca paralela de dados relacionados (usuários, logs, anexos, etc.)
- Cache de dados de usuários para reduzir chamadas à API do Gestor
- Filtros em memória para evitar múltiplas queries ao banco
Tempo Médio de Resposta
- Lead simples: 300-500ms
- Lead com proposta e beneficiários: 500-800ms
- Lead complexo com múltiplos anexos: 800-1200ms
🔧 Middlewares Aplicados
- verificaToken: Validação de token JWT para autenticação
📝 Notas Importantes
- Multi-tenant: A rota identifica automaticamente o tenant através da configuração da requisição
- Source Externo: Origens com sufixo
(externo)são automaticamente tratadas e o sufixo é removido - Beneficiários: Só são retornados se houver proposta associada ao CPF do lead e o tipo de pessoa corresponder
- Anexos: Apenas anexos com
status_arquivo = 1são retornados - Shortcode: O
shortLongIdé gerado automaticamente a partir dos primeiros 8 caracteres dolong_id - Data de Atribuição: É calculada automaticamente através dos logs de movimentação quando o lead é atribuído a um colaborador
🆕 Versão Refatorada
Existe também uma versão refatorada deste endpoint:
POST /bifrost/funil/details/refatored
Esta versão utiliza a função quickLeadDetailsRefactored que oferece:
- Melhor performance com queries otimizadas
- Código mais limpo e manutenível
- Busca paralela de dados relacionados
Consulte a documentação específica para detalhes desta versão.
📌 Versão da API
Versão: 1.0
Última Atualização: Fevereiro de 2026
Mantido por: Equipe de Desenvolvimento UNI API