← Blog · Inteligência de Mercado

Mapeamento de Concorrentes:
encontre todos os competidores por CNAE e município

O Radar de Concorrentes certo não é o que aparece no Google Meu Negócio. É o cadastro completo da Receita Federal, com 100% das empresas ativas — incluindo as que não têm site, não anunciam e trabalham no boca a boca.

19 de maio de 2026 · 10 min de leitura · Python & Node.js

Inteligência competitiva de verdade começa com um inventário completo. Saber que a empresa "X" é sua concorrente não é suficiente — você precisa saber quantas empresas competem no mesmo espaço, com que tamanho, há quanto tempo estão no mercado e se estão se expandindo ou retraindo.

A boa notícia: o Brasil obriga toda empresa a registrar seu CNAE no CNPJ. Isso torna a base da Receita Federal no banco de dados de inteligência competitiva mais completo e confiável do país.

O que você consegue descobrir

Pergunta Endpoint Plano
Quantos concorrentes ativos existem na cidade?GET /empresas?cnae=&uf=&municipio=Pro
Qual o CNPJ de cada concorrente?Incluso no resultado acimaPro
Quem são os sócios do concorrente?GET /cnpj/:cnpj/sociosFree
Quantas filiais o concorrente tem?GET /cnpj/:cnpj/estabelecimentosPro
Quando foi fundado?Campo data_inicio_atividadeFree
Qual o porte declarado?Campo porte (ME, EPP, etc.)Free

Montando o radar passo a passo

Passo 1 — Liste os concorrentes diretos

O parâmetro cnae aceita um código de 7 dígitos. Combine com situacao=ativa para filtrar apenas empresas operantes.

# Exemplo: escritórios de contabilidade em Campinas/SP (CNAE 6920601)
curl "https://api.cnpjob.com.br/empresas?cnae=6920601&uf=SP&municipio=Campinas&situacao=ativa&limit=50" \
  -H "X-API-Key: SUA_CHAVE"

Passo 2 — Construa o perfil de cada concorrente

Para cada CNPJ retornado, faça uma consulta completa para obter endereço, capital social, porte, data de abertura e sócios:

// Node.js — monta perfil completo de todos os concorrentes
const API_KEY = process.env.CNPJOB_KEY;
const BASE    = "https://api.cnpjob.com.br";

async function get(path) {
  const r = await fetch(BASE + path, { headers: { "X-API-Key": API_KEY } });
  return r.json();
}

async function radarConcorrentes({ cnae, uf, municipio }) {
  const lista = await get(`/empresas?cnae=${cnae}&uf=${uf}&municipio=${encodeURIComponent(municipio)}&situacao=ativa`);

  console.log(`\n🔍 ${lista.total} concorrentes encontrados em ${municipio}/${uf}\n`);

  const perfis = [];

  for (const empresa of lista.empresas.slice(0, 20)) {  // primeiros 20 como exemplo
    const [detalhes, socios] = await Promise.all([
      get(`/cnpj/${empresa.cnpj}`),
      get(`/cnpj/${empresa.cnpj}/socios`),
    ]);

    perfis.push({
      razao_social:  detalhes.razao_social,
      cnpj:          detalhes.cnpj,
      fundacao:      detalhes.data_inicio_atividade,
      porte:         detalhes.porte,
      capital_social: detalhes.capital_social,
      socios:        socios.socios?.map(s => s.nome_socio),
      municipio:     detalhes.endereco?.municipio,
    });
  }

  // Ordena por capital social (proxy de porte)
  perfis.sort((a, b) => (b.capital_social || 0) - (a.capital_social || 0));

  console.log("Top 5 por capital social:");
  perfis.slice(0, 5).forEach((p, i) => {
    console.log(`  ${i + 1}. ${p.razao_social} | Fundada: ${p.fundacao} | Capital: R$ ${p.capital_social?.toLocaleString("pt-BR")}`);
  });

  return perfis;
}

radarConcorrentes({ cnae: "6920601", uf: "SP", municipio: "Campinas" });

Passo 3 — Identifique grupos econômicos

Um concorrente aparentemente pequeno pode ser uma filial de um grande grupo. Use GET /cnpj/:cnpj/estabelecimentos para ver se a matriz tem filiais espalhadas:

import os, requests

API_KEY = os.getenv("CNPJOB_KEY")
BASE    = "https://api.cnpjob.com.br"
HDR     = {"X-API-Key": API_KEY}

def analisar_grupo(cnpj: str) -> dict:
    # Busca estabelecimentos (filiais + matriz)
    r = requests.get(f"{BASE}/cnpj/{cnpj}/estabelecimentos", headers=HDR)
    r.raise_for_status()
    data = r.json()

    filiais_ativas = [e for e in data.get("estabelecimentos", []) if e.get("situacao_cadastral") == "ATIVA"]
    estados = {e["endereco"]["uf"] for e in filiais_ativas if e.get("endereco")}

    return {
        "cnpj": cnpj,
        "total_estabelecimentos": len(filiais_ativas),
        "estados_presenca": sorted(estados),
        "nacional": len(estados) > 3,
    }

# CNPJ de um concorrente encontrado no passo anterior
info = analisar_grupo("00000000000191")  # substitua pelo CNPJ real
print(f"Filiais ativas: {info['total_estabelecimentos']}")
print(f"Estados: {', '.join(info['estados_presenca'])}")
print(f"Concorrente nacional: {'Sim' if info['nacional'] else 'Não'}")

Segmentando por porte para priorizar ameaças

Nem todo concorrente merece o mesmo nível de atenção. A Receita Federal classifica as empresas pelo porte declarado: MEI, ME (Microempresa), EPP (Empresa de Pequeno Porte), Demais. Filtrando só por EPP e Demais, você isola os concorrentes com estrutura para realmente ameaçar seu market share.

Insight estratégico

Se a maioria dos seus concorrentes é MEI ou ME e você vai entrar como EPP, você tem vantagem estrutural em capacidade de investimento. Se a maioria é Demais (grande porte), o mercado já está dominado por players consolidados — sua estratégia precisará ser de nicho.

Automatizando o monitoramento contínuo

Um radar de concorrentes não é uma foto, é um vídeo. Novas empresas abrem toda semana. Concorrentes encerram atividades. Sócios mudam. Configure uma tarefa agendada para rodar o script acima semanalmente e enviar um relatório por e-mail ou Slack:

# cron: toda segunda às 8h, gera relatório da semana
# 0 8 * * 1 node radar-concorrentes.js >> /var/log/radar.log

# No script, compare o total atual com o total da semana passada
# armazenado em um arquivo JSON ou banco de dados simples

const hoje = await radarConcorrentes({ cnae: "6920601", uf: "SP", municipio: "Campinas" });
const semanaPassada = JSON.parse(fs.readFileSync("snapshot.json"));

const novos     = hoje.filter(e => !semanaPassada.find(p => p.cnpj === e.cnpj));
const fecharam  = semanaPassada.filter(e => !hoje.find(p => p.cnpj === e.cnpj));

if (novos.length > 0)    console.log(`🆕 ${novos.length} novo(s) concorrente(s) esta semana`);
if (fecharam.length > 0) console.log(`🔴 ${fecharam.length} concorrente(s) encerrado(s) esta semana`);

fs.writeFileSync("snapshot.json", JSON.stringify(hoje));

Casos de uso por setor

Construa seu radar de concorrentes hoje

Os endpoints de filtragem por CNAE e município estão disponíveis a partir do Plano Pro. Comece grátis e faça upgrade quando precisar de mais volume.

Criar conta grátis