O modelo
Pense em dois tipos de nó que se alternam: empresas (CNPJ) e pessoas (CPF). Uma aresta liga uma empresa a quem é sócio dela.- Grau 0 — a empresa de onde você parte.
- Grau 1 — as outras empresas dos sócios diretos.
- Grau 2 — as empresas dos sócios dessas empresas.
- …e assim sucessivamente.
Partir de uma pessoa (CPF) é simétrico: o grau 0 são as empresas onde ela é sócia, e a partir daí o caminho é o mesmo.
Duas rotas, ida e volta
A travessia usa apenas dois endpoints, que são o inverso um do outro:Empresa → sócios
GET /empresas/cnpj/{cnpj} retorna a empresa já com o array socios. Cada sócio traz documento (CPF/CNPJ) e tipo.Pessoa → empresas
GET /empresas/cpf/{cpf} faz a busca reversa: todas as empresas onde o CPF é sócio — cada uma também já com seu socios.Como o retorno encadeia
Formato da resposta
GET /empresas/cnpj/{cnpj} (grau 0 a partir de uma empresa):
GET /empresas/cpf/{cpf} (grau 1 — as outras empresas do sócio, com sócios aninhados):
Maria Souza é o nó de grau 2 pronto para ser expandido.
Percorrendo a rede
A travessia é uma busca em largura (BFS): você processa um grau inteiro antes de descer para o próximo. Três controles são essenciais:1
Profundidade máxima (max_depth)
Quantos graus descer. O número de nós cresce exponencialmente — raramente faz sentido passar de 2 ou 3.
2
Amplitude por nó (fan-out)
Quantos sócios/empresas expandir por nó. Sócios de uma holding ou empresas de um sócio profissional podem chegar a centenas — limite para não explodir.
3
Deduplicação (visited)
A rede tem ciclos (A é sócio de B, B é sócio de A). Sem um conjunto de “já visitados”, o percurso entra em loop.
Código — travessia a partir de uma empresa
Otimização — aproveitando os sócios aninhados
Quando você expande uma pessoa, o/empresas/cpf já devolve os sócios de cada empresa. Dá para descer um grau extra sem nenhuma chamada nova:
Calculando o tamanho máximo da rede
O número de nós cresce de forma exponencial com a profundidade. Se cada nó tem em médiaf conexões (fan-out) e você desce d graus:
Limitando o orçamento na prática
Boas práticas
1
Comece raso
max_depth=1 ou 2 resolve a maioria dos casos. Cada grau a mais multiplica o custo.2
Sempre deduplique
Mantenha
visited para CPFs e CNPJs. Redes societárias têm ciclos.3
Aproveite os sócios aninhados
Ao expandir uma pessoa, leia os
socios que já vêm no /empresas/cpf antes de fazer chamadas novas.4
Defina um teto de chamadas
Um limite global de requisições protege contra holdings com centenas de participações.
5
Filtre por relevância
Ignore sócios com
data_saida antiga ou empresas Baixada se só interessa o vínculo ativo.APIs utilizadas
Perfil da empresa
GET /empresas/cnpj/{cnpj} — dados cadastrais + quadro societário (socios).Vínculos societários
GET /empresas/cpf/{cpf} — empresas de uma pessoa, cada uma com seus sócios.