Skip to main content
A rede societária brasileira é um grafo: empresas se conectam a pessoas (e a outras empresas) pelo quadro de sócios. A partir de um único CNPJ ou CPF você consegue mapear toda a vizinhança — sócios diretos, as outras empresas desses sócios, os sócios dessas empresas, e assim por diante. Cada salto nesse caminho é um grau de conexão.

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 /empresas/cpf já devolve os sócios de cada empresa, ao expandir a rede a partir de uma pessoa você ganha o próximo grau na mesma resposta — sem precisar voltar no /empresas/cnpj para cada empresa descoberta. Menos chamadas, menos latência.

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):
Repare que cada empresa do array já carrega seus próprios sóciosMaria 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édia f conexões (fan-out) e você desce d graus:
E como cada nó expandido custa aproximadamente uma chamada, o número de chamadas à API segue a mesma ordem de grandeza (antes da deduplicação, que reduz o real).
A tabela é o teto teórico. Na prática, a deduplicação (visited) corta muito, porque redes reais são densamente interligadas — os mesmos sócios e empresas reaparecem. Ainda assim, trate fan_out e max_depth como orçamento de chamadas: 2 graus com fan-out 10 já é o ponto de equilíbrio para a maioria das investigações.

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.