Documentação da API

Publicado em · Atualizado em · Atualiza com: base do CNPJ e Simples (Receita Federal), mensal.

A API REST do CFO entrega dados de empresas do Brasil (dados abertos do governo federal) em JSON ou CSV, filtrados como na consulta web. Base de produção:

https://cfo.com.br/api
Para usar a API você precisa de uma conta liberada e de uma chave. Consultar grátis · Entrar · gere suas chaves no painel.

Início rápido

Toda chamada é um GET com sua chave no header e os filtros na query string.

curl "https://cfo.com.br/api?resource=empresas&uf=SP&cnae=6201&dias=30&per_page=50" \
  -H "Authorization: Bearer cfo_live_SUA_CHAVE"

URLs

Todos os recursos aceitam duas formas equivalentes — a clássica por querystring e o caminho REST introduzido em 08/2026 (usado por marketplaces e ferramentas que importam OpenAPI):

Forma clássicaCaminho REST
/api.php?resource=empresas&uf=SP/api/v1/empresas?uf=SP
/api.php?resource=empresa&cnpj=…/api/v1/empresa?cnpj=…
/api.php?resource=dl&recurso=dominios&cnpj=…/api/v1/dominios?cnpj=…

O contrato completo em OpenAPI é público e gerado do código (nunca diverge do comportamento real): /api/v1/openapi (3.1) · ?spec=3.0 (3.0.3, para importadores). Health check sem autenticação: GET /api/v1/ping.

Autenticação

Envie a chave de uma destas formas (em ordem de preferência):

FormaUsoExemplo
Authorization: Bearer <chave>Header padrão (recomendado).cfo_live_…
X-Api-Key: <chave>Header alternativo.
?api_key=<chave>Query string (evite em produção — vaza em logs).

A API REST usa chave de API. Os aplicativos de IA também podem usar OAuth no servidor MCP, com autorização pelo navegador. Tokens OAuth são exclusivos do MCP.

A chave aparece uma única vez na criação (guardamos só o hash). Perdeu? Gere outra no painel. Revogar uma chave a invalida na hora.

Limites & quota

Seu plano tem quatro réguas mensais, cada uma com contador próprio (numa conta com operadores, o pool é do contrato — compartilhado entre todos os logins):

Toda resposta traz os headers das três réguas de consumo:

X-RateLimit-Limit: 2000        # buscas/mês (ou "unlimited")
X-RateLimit-Remaining: 1987    # buscas restantes neste mês
X-RateLimit-Reset: 1751337600  # unix ts da virada do mês
X-Leads-Limit: 10000           # leads/mês
X-Leads-Remaining: 9958        # leads restantes
X-Empresas-Limit: 1000         # empresas com dossiê/mês
X-Empresas-Remaining: 993      # empresas restantes

GET?resource=empresas

Lista paginada de estabelecimentos pelos filtros. Período default = últimos 30 dias de abertura (use dias=0 para qualquer período). Consome 1 busca. E-mail e telefone saem mascarados por padrão — reveal=1 revela os contatos da página consumindo leads do plano (1 por empresa; linha já aberta pela janela de 30 dias não consome de novo).

Parâmetros

ParâmetroDescriçãoExemplo
diasAberta nos últimos N dias. 0 = qualquer período.30
de / ateIntervalo de data de abertura (YYYY-MM-DD). Tem prioridade sobre dias. Valor que não é data não vira número de dias: ate=30 não devolve nenhuma empresa e de=30 não limita o início. Para os últimos N dias, use dias.2026-05-01
cnpjCNPJ exato (14 caracteres). Tem prioridade sobre os demais filtros. Aceita numérico legado ou o novo formato alfanumérico (12 alfanuméricos + 2 dígitos); pontuação é ignorada.12.ABC.345/01DE-35
ufUnidade federativa (2 letras).SP
cidadeNome do município (busca parcial).Campinas
cnaeCódigo (prefixo) ou descrição da atividade. Aceita o formato oficial com pontuação (4711-3/02) ou só os dígitos (4711302).4711-3/02 / mercado
sitSituação cadastral (ver tabela). Default 2 (ativa).2
termoTexto na razão social / nome fantasia. Com várias palavras, vêm primeiro os registros que têm a frase exata; depois, os que têm todas as palavras em qualquer ordem. Aceita dois operadores: termo=sócio:NOME devolve as empresas em que a pessoa é sócia (prefixo no nome do QSA); termo=marca:TEXTO devolve as titulares da marca no INPI (inclui o vínculo titular pessoa física → sócio).sócio:JOAO / marca:NATURA
matriz1 = só matrizes.1
meionly = só MEI · exclude = exclui MEI.only
aeronavesim = proprietária/operadora de aeronave · prop = só proprietária · oper = só operadora. Conta apenas aeronave vigente (matrícula ativa no RAB) — matrícula cancelada não entra (a empresa teve, não tem). Fonte: ANAC/RAB.sim
bndessim = empresa que captou financiamento BNDES (operações não-automáticas).sim
finepsim = empresa com projeto/contrato FINEP.sim
pncpsim = empresa fornecedora do governo (contrato público no PNCP).sim
obrasim = empresa com obra em andamento no Cadastro Nacional de Obras (CNO/Receita Federal). Só conta obra ativa — obra encerrada/paralisada não entra. Vale como filtro seletivo para dias=0.sim
dividasim = com dívida ativa da União (PGFN). Dado aberto; indício, não prova. Vale como filtro seletivo para dias=0.sim
sancaosim = com sanção vigente em CEIS/CNEP (CGU). Dado aberto; indício, não prova. Vale como filtro seletivo para dias=0.sim
parcelamentosim = com parcelamento de débitos direto na Receita (regularização em curso — não é dívida ativa exigível). Dado aberto; snapshot mensal, não informa se está em dia. Vale como filtro seletivo para dias=0.sim
balancosim = publica demonstrações contábeis na Central de Balanços (gov.br/SERPRO). Sinal de transparência/porte, não de saúde financeira. Dado aberto. Vale como filtro seletivo para dias=0.sim
semalertasim = sem nenhum sinal negativo no rollup (sem dívida ativa e sem sanção). Como casa quase a base inteira, não habilita sozinho o período aberto (dias=0) — combine com uf, cnae etc.sim
capmin / capmaxFaixa de capital social (R$).100000
cepde / cepateIntervalo de CEP (prefixo).01000000
emailEmpresas com este e-mail de contato exato. Indício de escritório/portal/contador comum — indício, não prova de vínculo. Vale como filtro seletivo para dias=0.contato@exemplo.com.br
ddd + telEmpresas com este telefone exato (os dois juntos: ddd e tel). Mesmo indício de contato compartilhado. Vale para dias=0.ddd=11&tel=999990000
numeroNúmero do logradouro exato — combine com cepde=cepate= (mesmo CEP) para achar empresas no mesmo endereço/prédio. Ignora S/N. Vale para dias=0.100
reveal1 = revela os contatos das linhas desta página consumindo leads do plano (1 por empresa). Sem saldo suficiente, revela até onde alcança na ordem das linhas (resposta 200; o resto sai com contato_mascarado: "cota").1
leadcap1, junto de format=csv e reveal=1: o arquivo para na primeira linha que sairia com contato mascarado por falta de saldo de leads, com o aviso no rodapé (como a opção “só as completas” do CSV do site). Só as empresas das linhas entregues consomem lead ou abrem (e renovam) a janela de 30 dias do contato; as que ficariam depois do corte não são tocadas. Sem csv e reveal, responde 400.1
pagePágina (1-based), até a janela de 50.000 registros (com per_page=1000, até a página 50). Além disso: 400 page_out_of_range.2
per_pageRegistros por página (limitado pela sua conta).100
formatjson (default) ou csv.csv

Exemplos — empresas em que uma pessoa é sócia, empresas titulares de uma marca, e construtoras com obra ativa:

curl "https://cfo.com.br/api?resource=empresas&termo=s%C3%B3cio:JOAO%20DA%20SILVA&dias=0" \
  -H "Authorization: Bearer cfo_live_SUA_CHAVE"
curl "https://cfo.com.br/api?resource=empresas&termo=marca:NATURA&dias=0" \
  -H "Authorization: Bearer cfo_live_SUA_CHAVE"
curl "https://cfo.com.br/api?resource=empresas&cnae=4120&obra=sim&uf=SP&dias=0" \
  -H "Authorization: Bearer cfo_live_SUA_CHAVE"

Resposta

{
  "meta": {
    "total": 458, "total_capped": false,
    "page": 1, "per_page": 50, "returned": 50,
    "total_pages": 10, "capped": false,
    "fonte": "dados abertos do governo federal",
    "quota": { "limit": 2000, "remaining": 1987 }
  },
  "data": [
    {
      "cnpj": "12.345.678/0001-90",
      "cnpj_raw": "12345678000190",
      "razao_social": "EXEMPLO TECNOLOGIA LTDA",
      "nome_fantasia": "Exemplo",
      "matriz": true,
      "situacao": { "codigo": 2, "descricao": "Ativa" },
      "data_inicio": "2026-06-02",
      "cnae_principal": { "codigo": "6201501", "descricao": "Desenvolvimento de programas..." },
      "porte": { "codigo": "01", "descricao": "Micro (ME)" },
      "capital_social": 50000.0,
      "endereco": { "logradouro": "RUA EXEMPLO", "numero": "100", "bairro": "Centro",
                    "municipio": "São Paulo", "uf": "SP", "cep": "01000000" },
      "contato": { "telefone": "(11) 9****-**00", "email": "con***@exe***.com.br" },
      "contato_mascarado": "janela"
    }
  ]
}

Campos de cada linha (JSON)

CampoLeitura
contato.email_contador, contato.telefone_contadorO e-mail ou o telefone também consta em firma de contabilidade (CNAE 6920): { "clientes": N }, o número de empresas com esse contato; acima de ~30, provável contador ou portal genérico. Indício de que o contato é do contador, não da empresa. Vem mesmo em linha mascarada, sem revelar o contato; null na própria firma de contabilidade. Também no resource=empresa.
contato.email_invalido, contato.telefone_invalidotrue quando o e-mail tem formato inválido, domínio placeholder (ex.: email@email.com) ou domínio que a verificação de DNS em segundo plano confirmou que não recebe e-mail (domínio inexistente, sem MX nem A/AAAA, ou MX nulo da RFC 7505), em duas verificações em dias diferentes, com pelo menos 20 h entre elas; e quando o telefone é placeholder (dígitos repetidos ou curto demais). Provável erro de cadastro. A API não faz DNS na hora: lê o último resultado conclusivo do domínio; domínio ainda não verificado ou com erro de DNS sai false (benefício da dúvida). Fala do domínio, não da caixa (ninguém fala com o servidor de e-mail), e vem também em linha mascarada, sem revelar o contato. Também no resource=empresa.
socios_countNº de sócios no quadro societário da raiz (o mesmo quadro do dossiê, sem os titulares com restrição de exibição).
energiatrue quando a raiz é agente de geração no cadastro da ANEEL (detalhe no resource=empresa, bloco energia).
siteO site da empresa: { "dominio", "no_ar" } do domínio registrado no CNPJ (o que respondeu na última verificação, depois o mais curto), ou null. no_ar: false = domínio registrado sem site respondendo. Leitura com teto de 1 s: numa página com raiz de milhares de domínios, pode vir null.

Contatos: linha mascarada traz contato_mascarado com o motivo — "janela" (empresa fora da sua janela de 30 dias; use reveal=1) ou "cota" (saldo de leads do mês esgotado); só no MCP, também "teto_diario_mcp" (teto diário de leads da conexão atingido). Linha com contato aberto (revelada agora ou dentro da janela) não traz o campo. A máscara é aplicada no servidor — o contato completo não trafega em linha mascarada. Em CSV, linhas mascaradas geram um aviso no rodapé do arquivo.

Leia sempre total_capped: com false, total é a contagem exata da busca. Em buscas muito amplas (período aberto ou busca por termo) o total pode vir capado: a partir de ~2.000 ele deixa de ser exato e vira um piso — leia como “2.000+”. Nesse caso total_capped vem true e a lista traz os registros mais recentes. É uma proteção anti-DoS (evita COUNT sobre a base inteira), não um erro. Refine os filtros para uma contagem exata. total_pages conta só as páginas dentro da janela de 50.000 registros, mesmo quando total é maior.

GET?resource=empresa&cnpj=…

Detalhe completo de um CNPJ: cadastro, endereço, Simples/MEI e quadro societário. Consome 1 empresa com dossiê (régua própria, não busca) — e só na primeira consulta da empresa no mês: reabrir o mesmo CNPJ dentro do mês-calendário é grátis para o contrato inteiro. Consultar também abre a janela de 30 dias da empresa (downloads via resource=dl e contato aberto na lista). O cnpj tem 14 caracteres — aceita o numérico legado ou o novo formato alfanumérico (12 alfanuméricos + 2 dígitos, RFB IN 2.229/2024, válido a partir de jul/2026); pontuação é ignorada.

curl "https://cfo.com.br/api?resource=empresa&cnpj=12345678000190" \
  -H "Authorization: Bearer cfo_live_SUA_CHAVE"

Retorna { "data": { … , "simples": {…}, "socios": [ … ], "sinais": {…} } }. CPF de sócio pessoa física vem mascarado na origem (padrão da RFB). Até 100 sócios. Cada sócio traz tipo, nome, documento (CNPJ da sócia PJ; CPF mascarado da PF; para a sócia estrangeira, o CNPJ dela quando o nome resolve para uma única empresa de natureza 2216, senão null), qualificacao, faixa_etaria, data_entrada, representante ({ "nome", "qualificacao" } do representante legal, ou null) e pais (só do sócio estrangeiro).

O endereco aqui é mais completo que o da busca: além de logradouro/número/bairro/município/UF/CEP, traz complemento e codigo_ibge — o código IBGE do município com 7 dígitos, pronto para uso fiscal (ex.: campo cMun do DPS na emissão de NFS-e).

codigo_ibge pode vir null, e isso não é falha de consulta: (a) o estabelecimento é no exterior — a RFB o registra com o município 9707 EXTERIOR, que não tem contrapartida no IBGE porque não há município brasileiro (é o caso de 173.410 estabelecimentos na base de outubro/2026, em qualquer situação cadastral, quase todos matrizes de empresas estrangeiras; a contagem só das inscrições ativas, por natureza jurídica e país de domicílio, está em empresas estrangeiras com CNPJ no Brasil); ou (b) o código de município veio malformado na origem da RFB e não corresponde a nenhum município (47 estabelecimentos na base de setembro/2026, ~0,00006%). Nos demais o campo sempre resolve: o de-para RFB→IBGE cobre os 5.571 municípios, sincronizado mensalmente da API de localidades do IBGE.

cnae_secundario: lista (possivelmente vazia) de { "codigo", "descricao" } com todas as atividades secundárias registradas na RFB.

regime_tributario: objeto { "regime", "fonte", "ano_referencia" }. Para optantes, regime é "MEI" ou "Simples Nacional" (opção vigente na base do CNPJ; ano_referencia nulo). Para não-optantes, vem a forma de tributação declarada na ECF (dado aberto da RFB): "Lucro Real", "Lucro Presumido", "Lucro Arbitrado" ou imune/isenta — com ano_referencia do último ano-calendário publicado (defasagem típica de ~2 anos, ex.: em 2026 a referência é 2024). Empresa não-optante sem ECF publicada recebe o rótulo genérico "Lucro Presumido ou Real (não optante do Simples; sem ECF pública)".

Blocos do dossiê além do cadastro

Os mesmos blocos que o dossiê do site mostra para a mesma conta e plano, com as mesmas regras (titulares com restrição de exibição continuam fora). Bloco sem dado vem null. Nas listas com contagem (total, ou o campo de contagem que a tabela indica, como operacoes, projetos, em_operacao, contagem e total_documentos), o número é o real mesmo quando os itens param no teto. As listas marcadas sem total na tabela (indicios_socio, participacoes_exterior, procuradores, historico, regulado, inpi_contratos e os registros do BCB, da Lista Suja e de grande devedor estadual) param no teto sem dizer quantos ficaram de fora. Com chave de marketplace, as listas que também são seção própria (filiais, grupo, aeronaves, dominios, obras, contratos, ibama) vêm só com o total e itens: null: a lista sai pelo caminho da seção, cobrado por chamada.

CampoConteúdo
situacao.data, situacao.motivoData da situação cadastral e o motivo dela ({ "codigo", "descricao" }, tabela da RFB).
contato.telefone2Segundo telefone do cadastro, no formato do primeiro.
simples.data_exclusao_simples, simples.data_exclusao_meiData de exclusão do Simples Nacional e do MEI (null se não houve).
responsavel_qualificacaoQualificação do responsável pela empresa na RFB ({ "codigo", "descricao" }).
ente_federativoEnte federativo responsável, para órgão público (null nas demais).
endereco.pais, endereco.cidade_exteriorSó para empresa domiciliada no exterior: país ({ "codigo", "descricao" }) e cidade.
referencia_setorPerfil do setor no município pelo CEMPRE/IBGE (estabelecimentos, assalariados, média por estabelecimento, salário médio mensal e % do pessoal sem vínculo), no nível de CNAE mais específico com dado. Não são números desta empresa: o bloco traz o aviso.
filiaisFiliais da raiz (o estabelecimento consultado não entra): total, ativas, inativas e itens com até 100, as ativas primeiro (CNPJ, nome fantasia, situação e data, início, endereço e telefone). A lista inteira, sem telefone, sai por resource=dl&recurso=filiais.
indicios_socioIndícios por nome de sócio pessoa física (domínios, marcas e PEP, com veredito_cpf), sem total: até 50 domínios, 50 marcas e 60 registros de PEP. Nos domínios vêm também dns e ip; nas marcas, classe, natureza e apresentacao.
participacoes_exteriorSó para empresa estrangeira (natureza 2216): até 50 empresas brasileiras de que ela é sócia, sem total, pelo nome no QSA (CNPJ, razão social, situação e o procurador dela naquela empresa). Indício por nome.
procuradoresSó para empresa estrangeira: os procuradores que a representam no QSA das empresas de que é sócia (nome, qualificacao, empresas), tirados das mesmas até 50 participações, sem total.
controladasEmpresas em que esta é sócia pessoa jurídica (as controladoras já vêm em socios): total e até 50 itens com CNPJ da matriz, razão social, situação e a qualificação dela no quadro. Vínculo cadastral, não reconhecimento de controle jurídico.
grupoGrupo econômico pelo critério do site: empresas que dividem sócio (mesmo documento e nome no QSA). total e até 100 itens, os de mais sócios em comum primeiro (CNPJ da matriz, razão social, nome fantasia, situação, socios_em_comum e flags entre aeronave, veiculo, dominio, obra, usina e saude). Vínculo cadastral: indício, não reconhecimento de grupo. A lista inteira sai por resource=dl&recurso=grupo, que agora traz a coluna cnpj (matriz) no fim.
restricoesQuando a rede societária desta empresa está sob contestação (Termos de Uso, cláusula 6): { "grupo": "ressalva", "aviso": "…" }. A rede continua nos blocos acima, com o aviso. O resource=dl&recurso=grupo traz o mesmo aviso no JSON e numa linha # aviso: no fim do CSV. null sem contestação.
historicoHistórico de mudanças na base da RFB, mês a mês (até 50 eventos, o mais recente primeiro, sem total): desde (primeiro mês comparado) e eventos com ref_mes, entidade (socio ou empresa) e tipo (entrada, saida, alteracao de sócio, ou campo da empresa: razao, capital, porte, natureza, qualif_resp, com antes/depois e a descrição dos códigos). retroativa: true é sócio antigo que a RFB só propagou agora, não entrada nova. Inclui quem já saiu do quadro.
aeronavesAeronaves do RAB/ANAC em que a empresa é proprietária ou operadora: total e até 100 itens (matrícula, fabricante, modelo, ano, tipo_desc e motor, nome_mercado, papeis, percentual, situacao ativa/cancelada/reservada, cva com vencido só para matrícula ativa, gravame e até 3 contrapartes de leasing ou operação, com contrapartes_total). Contraparte pessoa física sai só com o nome.
dominiosDomínios .br registrados no CNPJ: total e até 100 itens (domínio, titular, datas, ativo, dns, ip e site com http_status, redireciona_para e url_final da última verificação). O resource=dl&recurso=dominios ganhou as mesmas três colunas no fim.
obrasObras do Cadastro Nacional de Obras (CNO/RFB): total e até 100 itens, as em andamento primeiro, com o endereço da obra (cep, logradouro, bairro) e a data_situacao. O resource=dl&recurso=obras ganhou essas quatro colunas no fim.
bndesOperações de financiamento do BNDES: operacoes, contratado e desembolsado (R$, todas as operações) e até 50 itens, as mais recentes primeiro (datas, valores, projeto, produto, modalidade e situação).
finepProjetos e contratos da FINEP: projetos, aprovado e liberado (R$) e até 50 itens, os mais recentes primeiro (datas, valor FINEP e pago, título, instrumento e status).
contratos_publicosContratos com órgãos públicos (PNCP), como fornecedora: total, vigentes e valor_vigente (só os vigentes: fim da vigência hoje ou adiante, ou sem prazo) e até 50 itens, os vigentes primeiro (datas, vigente, valor global, objeto, órgão, UF e esfera).
energiaUsinas de geração da raiz no cadastro de agentes da ANEEL (casado por CNPJ): total de usinas, em_operacao e kw_proprio (soma das em operação), os três contados sobre todas as usinas da raiz, e até 60 itens, as em operação primeiro (CEG, nome, UF, tipo, fase, fonte, municípios, potência outorgada, pct_participacao, kw_proprio = outorgada × participação, entrada em operação e regime).
saudeUnidades de saúde do CNES/DataSUS com o CNPJ da empresa (vinculo: "propria") ou mantidas por ela ("mantida"): competencia (AAAA-MM), total, ativas, por_tipo e até 30 itens, as ativas primeiro.
reguladoRegistros regulados: CVM (CVM_CIA companhia aberta, CVM_FI fundos) e ANP (revenda, bandeira), com registro, situação, detalhe, UF e data de referência. Até 20, sem total.
inpiDetalhe no INPI de patentes, desenhos e softwares em nome da empresa: cada um com total (processos distintos com detalhe carregado, o mesmo universo dos itens; a contagem por tipo em sinais.positivos.inpi conta linhas de titular e pode ser maior) e até 25 itens, os mais recentes (número, título, situação, depósito; classificação, autores e prioridade nas patentes e desenhos; autores, linguagens, tipos e campos nos programas). As marcas saem por resource=dl&recurso=marcas.
inpi_contratosContratos de transferência de tecnologia e licenças averbados no INPI: recebidos (a empresa é cessionária) e cedidos (é cedente), até 25 de cada, sem total, com número, data do processo, contraparte, país, modalidades e situação (último despacho). O CNPJ do contrato é resolvido pelo nome exato na fonte: não é o universo inteiro.
sinais.positivos.bcb.registrosOs registros da empresa no cadastro de supervisionadas do Banco Central (até 10, sem total: nome, tipo, situação, UF e data-base); pix_detalhe traz modalidade, tipo de participante e início de operação no Pix (pix segue booleano).
sinais.positivos.central_balancosconsta_participante, total_documentos e dt_fim (fim do exercício) em cada documento. Empresa que consta como participante da Central de Balanços sem documento carregado vem com total_documentos: 0 e lista vazia (antes vinha null). anos cobre todos os documentos, não só os 40 listados.
sinais.negativos.grande_devedor_uf.registrosAté 15 registros das listas de grandes devedores estaduais, sem total: UF, cobertura, nome_devedor (o nome com que a empresa aparece na lista), valor, competência e fonte_url (a lista publicada).
sinais.negativos.trabalho_escravoCadastro de Empregadores do MTE ("Lista Suja", trabalho análogo ao de escravo): até 20 registros, sem total (ano da ação fiscal, UF, estabelecimento, trabalhadores encontrados, CNAE, data da decisão e de inclusão), com trabalho_escravo_aviso. É decisão administrativa irrecorrível, não condenação judicial. Lista vazia = sem registro.
sinais.negativos.ibamaAutos de infração e embargos do IBAMA: contagem de todos e as listas (até 50 no total, os vigentes primeiro) embargos_vigentes (restrição ambiental ativa), autos (ato lavrado, cabe defesa; não é condenação) e desembargados (histórico), com aviso. null sem registro. A lista completa sai por resource=dl&recurso=ibama.
fontes_atualizacaoData (AAAA-MM-DD) da última carga de cada fonte, por chave: anac, aneel, bcb, bndes, cbal, cgu, cnes, cno, dominio, finep, ibama, inpi, pgfn, pncp, regulado e as demais. É o “atualizado em” de cada bloco do site.
contato.email_contador, contato.telefone_contadorO contato também consta em firma de contabilidade ({ "clientes": N }), como na busca; null na própria firma de contabilidade.
contato.email_invalido, contato.telefone_invalidoContato provavelmente inválido, pela mesma regra da busca (formato, placeholder ou domínio confirmado sem e-mail pela verificação de DNS em segundo plano; sem DNS na hora).
parcialnull quando todos os blocos terminaram. Senão, { "blocos": [...], "aviso" }, com o nome de cada bloco no dossiê (grupo, historico, sinais.positivos.inpi...): ele saiu null (ou fora do dossiê) ou incompleto, sem erro, porque a consulta passou do tempo limite (3 s por consulta; 4 s nas participações no exterior, que também dão os procuradores) ou porque o dossiê já tinha usado os 8 s dele e o bloco nem começou. Peça o dossiê de novo depois de 5 minutos.

Cache do dia: o dossiê completo de uma empresa fica guardado até a meia-noite (horário de Brasília) e vale para todas as contas, até mudar a base, a fonte de algum bloco, uma restrição de exibição ou o código do serviço. A validade do e-mail (contato.email_invalido) é recalculada em todo pedido. A cobrança não muda: cada pedido reserva a cota de dossiês, registra a consulta (janela de 30 dias do dl) e conta no uso, venha o dossiê do cache ou não. Dossiê com parcial fica guardado só 5 minutos; dossiê em que a leitura de algum bloco falhou não fica guardado.

Bloco sinais (KYC · dado aberto)

Presente só quando a empresa tem algum sinal (negativo ou positivo — inclui registro no INPI ou no cadastro do BCB). Camada de compliance/KYC agregada dos dados abertos do governo federal. Leitura honesta: cada item é indício, não prova, é auditável na fonte, e traz fonte + data. Não há score nem nota — só a contagem e os itens; a decisão é de quem consulta. Sanção com prazo já vencido vem com vigente: false (histórico, não alerta ativo).

"sinais": {
  "aviso": "Indício, não prova. Dado aberto/auditável...; sem score.",
  "contagem": { "negativos": 1, "positivos": 0 },
  "negativos": {
    "divida_ativa": false, "divida_ativa_valor": null, "divida_ajuizada": false,
    "inidonea_ceis": true, "punida_cnep": false,
    "sancao_vigente": true, "sancao_multa": null,
    "sancoes": [
      { "cadastro": "CEIS", "categoria": "Impedimento...", "orgao": "...",
        "processo": "27222/2021", "data_inicio": "2022-06-20",
        "data_final": "2027-06-20", "valor_multa": null, "vigente": true }
    ],
    "dividas": [
      { "tipo_debito": "NAO_PREV", "situacao": "Em cobrança",
        "receita_principal": "...", "data_inscricao": "2021-03-10",
        "ajuizado": false, "valor": 12345.67 }
    ]
  },
  "parcelamento_rfb": {
    "total": 2, "saldo_devedor": 18234.56,
    "itens": [
      { "programa": "especial_sn", "modalidade": "RELP-SN",
        "adesao": "2022-05-01", "qtde_parcelas": 77, "fim_estimado": "2028-10-01",
        "valor_parcelado": 22412.08, "saldo_devedor": 5907.79 }
    ]
  },
  "positivos": {
    "bndes": false, "bndes_total": null, "finep": false,
    "fornecedor_gov": false, "pncp_total": null, "aeronave": false,
    "cvm": false, "anp": false,
    "inpi": { "marcas": 567, "patentes": 5, "desenhos_industriais": 0, "softwares": 24 },
    "bcb":  { "tipo": "Banco Múltiplo", "situacao": "Autorizada em Atividade", "pix": true },
    "dominios": 12, "veiculos": null, "obras": 8
  },
  "fontes": ["CGU/Portal da Transparência (CEIS/CNEP)", "PGFN (Dívida Ativa)", "BNDES", "FINEP", "PNCP", "ANAC/RAB", "CVM", "ANP", "INPI", "BCB (entidades supervisionadas/Pix)", "ANM/SIGMINE (títulos minerários)", "ANM/CFEM (royalty mineral)", "Portal da Transparência (emendas parlamentares)", "Transferegov/SICONV (convênios)", "SIASG/Compras.gov.br (fornecedor federal)", "RFB — Parcelamentos de débitos"],
  "atualizado": "2026-07-01 22:23:11"
}

Sanções (CEIS/CNEP) vêm da CGU/Portal da Transparência; dívidas vêm da PGFN (Dívida Ativa da União). Cada lista traz até 50 itens, os mais relevantes primeiro. inpi resume marcas, patentes, desenhos industriais e programas de computador em nome da empresa (titular/depositante; fonte INPI) — null quando não há registro. bcb indica entidade do cadastro de supervisionadas do Banco Central (a situacao é a do cadastro e inclui autorizações encerradas) e se é participante do Pix/SPI — null quando fora do cadastro. Ausência de sinal ≠ idoneidade comprovada — significa apenas que nada foi encontrado nas bases abertas.

GET?resource=screening&cnpjs=…

Triagem KYC em lote: até 50 CNPJs por chamada, com os sinais agregados de cada um (alertas + capacidade). Aceita GET ou POST (form ou JSON). Cada item da lista pode ser o CNPJ completo de 14 caracteres (numérico ou alfanumérico; pontuação é ignorada) ou só a raiz de 8 (cnpj_basico) — a leitura é sempre por raiz, com razão social e situação da matriz.

curl "https://cfo.com.br/api?resource=screening&cnpjs=53113791000122,11396646000156" \
  -H "Authorization: Bearer cfo_live_SUA_CHAVE"

# ou POST com JSON (lista como array):
curl "https://cfo.com.br/api?resource=screening" \
  -H "Authorization: Bearer cfo_live_SUA_CHAVE" -H "Content-Type: application/json" \
  -d '{"cnpjs": ["53113791000122", "11396646000156"]}'

Custo: 1 empresa (régua de dossiês) por CNPJ encontrado e novo no mês — CNPJ não encontrado não conta, e CNPJ já consumido no mês do contrato (por screening ou por resource=empresa) não conta de novo: re-screening do mesmo portfólio dentro do mês custa 0. O campo meta.custo_empresas informa quantos foram cobrados na chamada. Se o saldo mensal não comportar os CNPJs novos do lote, a chamada retorna 429 empresa_quota_exceeded e nada é cobrado (o lote é negado inteiro — divida-o ou aguarde a virada).

Resposta

Uma entrada por CNPJ enviado, na mesma ordem. CNPJ inexistente na base (ou item inválido) vem como { "cnpj": "…", "found": false }. Empresa existente sem nenhum sinal vem com found: true e todos os flags false / contagens 0.

{
  "meta": {
    "aviso": "Indício, não prova. Dado aberto/auditável do governo federal; sanção vale pela vigência...; sem score.",
    "solicitados": 2, "encontrados": 2, "custo_empresas": 2,
    "fontes": ["CGU/Portal da Transparência (CEIS/CNEP)", "PGFN (Dívida Ativa)", "BNDES", "FINEP", "PNCP", "ANAC/RAB", "CVM", "ANP", "INPI", "BCB (entidades supervisionadas/Pix)", "ANM/SIGMINE (títulos minerários)", "ANM/CFEM (royalty mineral)", "Portal da Transparência (emendas parlamentares)", "Transferegov/SICONV (convênios)", "SIASG/Compras.gov.br (fornecedor federal)", "RFB — Parcelamentos de débitos"],
    "quota": { "limit": 2000, "remaining": 1987 },
    "empresas": { "limit": 1000, "remaining": 991 }
  },
  "data": [
    {
      "cnpj": "53113791000122",
      "cnpj_basico": "53113791",
      "found": true,
      "razao_social": "TOTVS S.A.",
      "situacao_cadastral": { "codigo": 2, "descricao": "Ativa" },
      "alertas": {
        "divida_ativa": { "flag": true, "valor": 30235487.48, "ajuizada": true },
        "ceis_vigente": false,
        "cnep_vigente": false,
        "sancao_multa": null
      },
      "capacidade": { "bndes": true, "finep": true, "gov": true, "aeronave": false,
                      "cvm": true, "anp": false, "inpi": true, "bcb": false },
      "neg_count": 1,
      "pos_count": 5
    },
    {
      "cnpj": "11396646000156",
      "cnpj_basico": "11396646",
      "found": true,
      "razao_social": "MARMORARIA NACIONAL COMERCIO DE ARTEFATOS DE CIMENTO E SERVICOS DE MAO DE OBRA LTDA",
      "situacao_cadastral": { "codigo": 2, "descricao": "Ativa" },
      "alertas": {
        "divida_ativa": { "flag": false, "valor": null, "ajuizada": false },
        "ceis_vigente": false,
        "cnep_vigente": true,
        "sancao_multa": 6865.99
      },
      "capacidade": { "bndes": false, "finep": false, "gov": false, "aeronave": false,
                      "cvm": false, "anp": false, "inpi": false, "bcb": false },
      "neg_count": 1,
      "pos_count": 0
    }
  ]
}
CampoLeitura
alertas.divida_ativaDívida ativa da União (PGFN): flag, valor total inscrito (R$) e se há débito ajuizada (executado judicialmente).
alertas.ceis_vigente / cnep_vigenteSanção vigente hoje no CEIS (inidôneas/impedidas) / CNEP (Lei Anticorrupção), da CGU. Sanção com prazo já vencido não acende esses flags — é histórico, não alerta ativo (o histórico aparece no resource=empresa).
alertas.sancao_multaValor de multa associado a sanção CNEP, quando houver (R$).
alertas.trabalho_escravoConsta no Cadastro de Empregadores do MTE (“Lista Suja”, trabalho análogo ao de escravo). Decisão administrativa, não condenação judicial; o detalhe está no resource=empresa.
alertas.ibamaAuto de infração e/ou embargo ambiental vigente no IBAMA. Indício: o detalhe, que separa embargo vigente de auto e de desembargado, está no resource=empresa.
capacidadeSinais positivos/capacidade: financiamento BNDES, contrato FINEP, fornecedora do governo (gov, via PNCP), aeronave vigente no RAB, registro CVM, autorização ANP, propriedade intelectual no INPI e cadastro de supervisionada ativa do BCB.
neg_count / pos_countContagem transparente de alertas ativos e de sinais positivos. Não há score nem nota — a decisão é de quem consulta.

O screening é o resumo (flags do rollup, reconstruído a cada carga das fontes). Para o detalhe auditável — sanções item a item com órgão/processo/vigência, dívidas por natureza, marcas/patentes INPI, situação BCB/Pix e quadro societário — consulte resource=empresa de cada CNPJ que acender alerta. Ausência de sinal ≠ idoneidade comprovada: significa apenas que nada foi encontrado nas bases abertas na data da última carga.

GET?resource=dl&recurso=…&cnpj=…

Baixa uma seção detalhada de uma empresa que você consultou nos últimos 30 dias — no site ou pela API (resource=empresa). Não consome consulta: o acesso já foi pago pela consulta, e o consumo é unificado site + API (consultou no site hoje, baixa pela API amanhã). Se a empresa não estiver na janela de 30 dias, retorna 403 not_consulted.

recurso ∈ marcas, dominios, veiculos, obras, aeronaves, contratos, grupo, filiais, divida, sancoes, ibama. cnpj = 14 caracteres (numérico ou alfanumérico; pontuação ignorada). format=json (padrão) ou csv.

curl "https://cfo.com.br/api?resource=dl&recurso=marcas&cnpj=12345678000190" \
  -H "Authorization: Bearer cfo_live_SUA_CHAVE"

Retorna { "recurso": "marcas", "cnpj": "…", "count": N, "data": [ {…}, … ] } (até 50.000 linhas por seção). Com &format=csv devolve um CSV (mesmas colunas do download do site). Fluxo: consulte a empresa (site ou resource=empresa) → por 30 dias baixe qualquer seção dela por aqui, sem nova cobrança; consultar de novo renova a janela.

Cada seção também tem caminho próprio

As nove seções abaixo respondem igualmente em /api/v1/<seção>?cnpj=… — mesmo motor, mesma trava de 30 dias, mesma resposta, custo zero. Existem porque um caminho por seção é o que os marketplaces (e a maioria dos clientes gerados por OpenAPI) esperam:

curl "https://cfo.com.br/api/v1/dominios?cnpj=33000167000101" \
  -H "Authorization: Bearer cfo_live_SUA_CHAVE"

# equivalente a:
curl "https://cfo.com.br/api?resource=dl&recurso=dominios&cnpj=33000167000101" \
  -H "Authorization: Bearer cfo_live_SUA_CHAVE"

/api/v1/ + dominios, marcas, contratos, grupo, filiais, veiculos, obras, aeronaves, ibama.

divida e sancoes ficam fora dos caminhos próprios de propósito: elas já saem completas dentro do resource=empresa (bloco sinais.negativos), então não há o que buscar em separado — continuam disponíveis via ?recurso= para quem quiser só o CSV.

Chaves de marketplace têm tetos próprios

Chave emitida para um marketplace (RapidAPI) tem dois limites por requisição que não valem para a integração direta, porque lá a cobrança é por chamada: com reveal=1 a página traz no máximo 25 linhas (sem reveal, a página vai cheia), e o screening aceita no máximo 10 CNPJs por lote. Sua chave do painel continua com 1.000 registros por página e 50 CNPJs por lote. Nessas chaves, resource=meta traz os dados da base, a lista de recursos e um bloco account só com um aviso, sem limites nem uso: a chave é compartilhada entre os assinantes do anúncio.

GET?resource=consultadas

As empresas que você consultou: com dossiê (no site ou pela API) ou só com o contato revelado (lead). Mostra até quando o resource=dl vale para cada uma sem nova consulta. Não consome quota. Vale só para a chave do painel: chave de marketplace recebe 403 not_available, porque é compartilhada pelos assinantes do anúncio.

curl "https://cfo.com.br/api?resource=consultadas&tipo=dossie" -H "Authorization: Bearer cfo_live_SUA_CHAVE"

Parâmetros: tipo (dossie, lead ou omitido para os dois), page e per_page (até 500; padrão 100). Cada item traz cnpj, razao_social, tipo, primeira_em e ultima_em (do dossiê; null em linha só de lead), lead_em, vezes e dl_ate (até quando o download vale; null = consulte a empresa de novo). Só as suas linhas, sem IP; o dono de uma organização vê as dos operadores no painel da organização.

GET?resource=meta

Introspecção: limites e uso da sua conta + horizonte dos dados. Não consome quota.

curl "https://cfo.com.br/api?resource=meta" -H "Authorization: Bearer cfo_live_SUA_CHAVE"

POST?resource=rotate_key

Rotaciona a própria chave: autentica com a chave atual e devolve uma nova. Não consome quota. Serve para trocar o segredo periodicamente ou reagir a uma suspeita de vazamento sem passar pelo painel.

# corte imediato (default): a chave antiga morre no mesmo instante
curl -X POST "https://cfo.com.br/api?resource=rotate_key" \
  -H "Authorization: Bearer cfo_live_SUA_CHAVE_ATUAL"

# com carência: a antiga continua valendo por 30 min (troca sem downtime)
curl -X POST "https://cfo.com.br/api?resource=rotate_key" \
  -H "Authorization: Bearer cfo_live_SUA_CHAVE_ATUAL" \
  -d "grace_minutes=30"
{
  "data": {
    "api_key": "cfo_live_a1b2c3…",          // única vez que a chave aparece
    "key_prefix": "cfo_live_a1b2c3…",
    "label": "producao",
    "rotated_at": "2026-08-05T21:30:00-03:00",
    "anterior": {
      "key_prefix": "cfo_live_9f8e7d…",
      "grace_minutes": 30,
      "valida_ate": "2026-08-05T22:00:00-03:00"   // null quando grace_minutes=0
    },
    "aviso": "Guarde agora: a chave não será exibida de novo…"
  }
}

grace_minutes (opcional, 0–1440): quanto tempo a chave anterior ainda funciona depois da rotação.

A chave em carência aparece no painel com o selo “expira dd/mm hh:mm” em vez de “ativa”, e pode ser revogada antes da hora pelo botão Revogar. Valor fora da faixa (ou não inteiro) devolve 400.

Chave em carência não gera outra. Rotacionar uma chave que já tem prazo devolve 409: ela segue valendo até o fim da carência, e a próxima rotação parte da chave nova. Assim, a rotação nunca aumenta o número de chaves sem prazo da conta.

Aviso por e-mail. A cada rotação pela API, o e-mail da conta recebe os prefixos da chave anterior e da nova, a data e o IP de origem. Se a rotação não foi sua, o painel mostra de qual chave cada uma nasceu e oferece Revogar esta e as derivadas, que funciona também numa chave já revogada.

Guarde a resposta. O servidor só armazena o hash — se você perder o corpo desta chamada, não há como recuperar a chave; crie outra pelo painel (você não perde o acesso à conta, só àquela chave).

Só POST. Em GET a resposta traria o segredo numa requisição que costuma ser registrada em log/histórico/proxy, e um prefetch poderia disparar rotação sem intenção — por isso GET devolve 405. Limite de 5 rotações por hora por conta (429 acima disso), como proteção contra laço de integração. O label da chave é preservado.

Precisa de troca sem downtime (duas chaves válidas ao mesmo tempo)? Crie a segunda chave pelo painel, migre os serviços e revogue a antiga — o limite de chaves ativas do seu plano se aplica.

Auditoria. Toda rotação fica registrada na trilha da conta como apikey_rotacionada, com data, IP de origem e os prefixos da chave anterior e da nova, e também no log de chamadas da API. O segredo nunca é gravado: só o prefixo (primeiros caracteres) e o hash SHA-256.

Exportar CSV

Adicione format=csv para receber um arquivo (UTF-8 com BOM, separador ;, pronto pro Excel). O streaming permite páginas grandes — respeitando o teto da sua conta.

curl -L "https://cfo.com.br/api?resource=empresas&uf=RS&dias=60&per_page=1000&format=csv" \
  -H "Authorization: Bearer cfo_live_SUA_CHAVE" -o empresas.csv

Planilha. Abra com o separador ;. Texto que começa com =, +, - ou @ sai com um apóstrofo na frente, para a planilha não executar como fórmula, inclusive numero ou bairro iguais a -, que saem como '-. Número puro sai igual.

Tempo limite. Cada requisição CSV tem cerca de 25 segundos para ler as linhas. Se o tempo acabar antes (página muito grande com o servidor ocupado), o arquivo traz as linhas já lidas e termina com a linha # aviso: exportação parcial — N de M linha(s) desta página…. Só as linhas entregues contam como registros. Confira o rodapé antes de seguir para a próxima página: peça a mesma página de novo ou use um per_page menor.

Exemplos em código

const r = await fetch(
  "https://cfo.com.br/api?resource=empresas&uf=SP&cnae=6201&dias=30",
  { headers: { Authorization: "Bearer cfo_live_SUA_CHAVE" } }
);
const { meta, data } = await r.json();
console.log(meta.total, data.length);

MCP — consultas por agentes de IA

O servidor MCP (Model Context Protocol) conecta aplicativos de IA às consultas de empresas brasileiras do CFO. Adicione https://mcp.cfo.com.br/v1 no seu aplicativo.

Exige plano pago e autenticação. Toda requisição MCP exige chave de API ou token OAuth válido, inclusive a descoberta do servidor e a listagem de ferramentas. Status da conta, organização, permissões, cotas e bloqueios globais de IP continuam valendo. A allowlist de IP configurada na conta aplica-se à API REST; o MCP dispensa essa lista.

Conectar por OAuth

  1. No aplicativo compatível com MCP remoto, adicione a URL https://mcp.cfo.com.br/v1, com transporte Streamable HTTP e autenticação OAuth.
  2. Entre no CFO quando o aplicativo abrir a autorização. Confira a conta, quem publicou o aplicativo (ou o aviso de registro anônimo) e a origem de retorno antes de permitir o acesso. O nome é informado pelo próprio aplicativo.
  3. Volte ao aplicativo e teste: “Mostre o dossiê do CNPJ 00.000.000/0001-91.”

Os nomes das opções variam conforme o aplicativo. A tela Painel → Integrações / MCP reúne o passo a passo. Você pode negar uma solicitação ou revogar o acesso em Aplicativos conectados.

A compatibilidade do protocolo permite configurar clientes MCP; cada aplicativo e conta precisa ser validado no seu próprio ambiente.

Ferramentas e guia de uso

FerramentaEntrada e finalidadeCota do plano
buscar_empresasFiltros como uf, cidade, cnae, período de abertura e capital social; page para paginação; revelar_contatos opcional. Lista um conjunto de empresas.1 busca por chamada; leads só com revelar_contatos
buscar_empresas_por_socionome de sócio, de 5 a 120 caracteres; filtros de empresas e page. Retorna empresas vinculadas ao nome.1 busca por chamada; leads só com revelar_contatos
buscar_empresas_por_dominiodominio; filtros de empresas e page. Retorna empresas vinculadas a domínio .br. Aceita host, prefixo ou URL HTTP(S), sem acessar o site; com ponto busca host exato, sem ponto busca prefixo.1 busca por chamada; leads só com revelar_contatos
buscar_empresas_por_marcamarca, de 3 a 120 caracteres; filtros de empresas e page. Retorna empresas vinculadas à marca.1 busca por chamada; leads só com revelar_contatos
dossie_empresa{"cnpj":"00000000000191"}. Consulta o cadastro e os sinais públicos de uma empresa.1 empresa nova no mês
triagem_kyc{"cnpjs":["00000000000191","33000167000101"]}. Confere situação cadastral e sinais públicos de uma lista de 1 a 50 CNPJs (até 10 via RapidAPI).1 empresa por CNPJ novo no mês
whoami{}. Informa a identidade, o plano e as permissões da conexão, sem expor credenciais, e o saldo de leads do mês e do dia (mcp_daily_leads).Sem consulta cadastral

As três buscas por vínculo aceitam os filtros de empresas, como uf, cidade, cnae e page. Por padrão, usam dias=0 (sem corte de abertura) e situacao="2" (ativas). Informe outros valores quando necessário. Cada chamada usa a cota de buscas; total zero estorna a busca, mas uma página vazia com total positivo continua consumindo a cota.

Os vínculos são indícios para conferência: nomes podem ter homônimos, e a seleção é limitada a 2.000 raízes de CNPJ. Um retorno vazio não comprova inexistência de vínculo; os resultados não são exaustivos. As ferramentas retornam empresas, no mesmo formato da busca de empresas.

Contatos. As quatro buscas aceitam revelar_contatos (booleano, padrão false), o equivalente a reveal=1 da busca de empresas na API REST. Sem ele, telefone e e-mail saem mascarados, com contato_mascarado. Com true, os contatos da página são revelados e consomem leads do plano, pela mesma régua da API REST: empresa já revelada ou com dossiê consultado nos últimos 30 dias, no site, na API ou no MCP, não consome; sem saldo, o restante sai mascarado com contato_mascarado: "cota". O whoami mostra o saldo de leads.

Teto diário de leads no MCP. Cada conexão do MCP revela no máximo 50 leads por dia (dia de Brasília, renova à meia-noite), sempre dentro do saldo do mês do plano: vale o menor dos dois. Conexão é a autorização OAuth de um aplicativo (a mesma depois de reautorizar); uma chave de API usada no MCP conta pela própria chave. Empresa que não consome lead (já revelada ou consultada nos últimos 30 dias) não conta. Acima do teto, o restante da página sai mascarado com contato_mascarado: "teto_diario_mcp", sem consumir leads, e a resposta traz, no envelope do MCP, mcp.teto_diario_mcp com limite, usados_hoje, restantes_hoje, renova_em, mascarados e aviso; o whoami mostra os mesmos números em mcp_daily_leads. O teto protege o saldo de leads de chamadas em sequência que o usuário não pediu (por exemplo, induzidas por texto de terceiros dentro dos dados); o CFO pode ajustá-lo, e com teto 0 o revelar_contatos fica desligado no MCP. A API REST não tem esse teto: ela é chamada pelo código do próprio cliente.

Exemplos ilustrativos, sem promessa de resultados: “Busque empresas ativas vinculadas ao sócio pessoa jurídica EMPRESA EXEMPLO HOLDING”; “Busque empresas vinculadas ao domínio example.com”; “Busque empresas vinculadas à marca EXEMPLO em SP, sem corte de abertura”.

O recurso cfo://guide orienta a escolha das ferramentas, os filtros e a leitura dos resultados. O catálogo autenticado tools/list publica os schemas de entrada e saída; envie somente os campos declarados.

Todas as ferramentas são de somente leitura (readOnlyHint: true). As consultas usam as mesmas cotas do site e da API REST. As respostas MCP trazem o mesmo dado que a API REST entrega à mesma conta e plano, com as mesmas regras: régua de leads, restrição de exibição de titulares, janela de 30 dias da empresa consultada e cotas. O dossiê inclui o contato cadastral e o quadro societário; o CPF de sócio pessoa física já vem mascarado da Receita Federal.

Exemplos de pedidos: “Busque empresas ativas de software em Curitiba, PR” e “Faça a triagem dos CNPJs 00.000.000/0001-91 e 33.000.167/0001-01, com fontes e datas”. Sinais de dívida ou sanção devem ser interpretados com a fonte e a data de corte, como indícios que exigem conferência.

Alternativa: autenticar com chave de API

Em aplicativos que aceitam headers fixos, use a mesma URL MCP e configure o header abaixo. Substitua o marcador pela chave criada em Painel → Chaves de API.

Authorization: Bearer <SUA_CHAVE_DE_API>

A chave aparece uma única vez ao ser criada. Guarde-a no campo de credenciais do aplicativo; evite conversas, URLs e configurações compartilhadas.

Transporte e versões do protocolo

O servidor usa Streamable HTTP com o SDK oficial PHP do MCP. Atende as revisões 2025-06-18, 2025-11-25 e 2026-07-28. As revisões de 2025 usam initialize; a revisão de 2026 informa versão e capacidades em cada requisição. Veja as versões na documentação oficial do SDK.

As entradas são validadas pelo schema antes da consulta. Resultados têm conteúdo estruturado; falhas da consulta são sinalizadas por isError. Respostas extensas são recortadas com aviso, preservando um JSON válido. No dossiê de uma rede grande, as maiores listas são encurtadas por elementos inteiros; os totais e contagens de cada bloco continuam os da empresa inteira, e o dossiê pela API REST vem completo.

OAuth para quem implementa um cliente

O emissor é https://cfo.com.br. O fluxo é Authorization Code com PKCE S256 e escopo mcp, para consultas. Há registro dinâmico de cliente público (DCR, sem segredo) e identificação por Client ID Metadata Document (CIMD) em HTTPS.

O DCR aceita endereços de retorno conhecidos, de loopback (http://localhost, http://127.0.0.1 ou http://[::1]) e de aplicativos instalados (cursor:, vscode:, vscode-insiders:, windsurf:, zed:, claude: e chatgpt:). Endereço HTTPS desconhecido não entra na inscrição: se sobrar algum endereço permitido, o cliente é registrado só com eles e a resposta traz a lista registrada (RFC 7591 §3.2.1); sem nenhum permitido, a resposta é invalid_redirect_uri. Aplicativo web se identifica por CIMD, e o retorno HTTPS precisa estar no mesmo host do client_id ou em um subdomínio dele. A tela de consentimento mostra esse host como publicador; cliente DCR aparece como registrado anonimamente.

EndereçoFinalidade
https://mcp.cfo.com.br/.well-known/oauth-protected-resource/v1Metadados do recurso MCP.
https://cfo.com.br/.well-known/oauth-protected-resource/mcpMetadados do endereço legado https://cfo.com.br/mcp.
https://cfo.com.br/.well-known/oauth-authorization-serverEndpoints, grants e métodos de PKCE do emissor.
/oauth/registerRegistro dinâmico de cliente público com seus endereços de retorno.
/oauth/authorizeLogin e consentimento. O endereço de retorno precisa coincidir com o registrado; em loopback HTTP, somente a porta pode variar.
/oauth/tokenTroca do código de uso único e renovação. Código válido por 60 segundos; uma troca recusada também consome o código.
/oauth/revokeRevogação de tokens; cliente público, sem autenticação (none).

Descubra o recurso nos metadados e envie resource na autorização e na troca ou renovação do token. Cada endereço tem o seu documento, e o resource anunciado é o próprio endereço: https://mcp.cfo.com.br/v1 ou, no legado, https://cfo.com.br/mcp. Os dois dão acesso ao mesmo servidor. O token fica vinculado ao recurso concedido. O client_id de um cliente CIMD é a URL HTTPS do documento que declara sua identificação e os endereços de retorno.

O access token vale 1 hora; o refresh token, 30 dias, com rotação a cada renovação. Reutilizar um refresh token consumido revoga a família correspondente e exige nova autorização. Desconectar no painel revoga o acesso daquele aplicativo para a sua conta.

O código de autorização vale uma tentativa: uma troca recusada consome o código e traz o erro correspondente: invalid_grant para code_verifier, redirect_uri ou client_id de outro aplicativo, invalid_target para resource errado e invalid_client para client_id inexistente. A tentativa seguinte com o mesmo código, mesmo correta, recebe invalid_grant.

Cada conexão (a mesma conta, o mesmo aplicativo e o mesmo recurso) renova no máximo 10 vezes por minuto e 300 por dia. O minuto é de relógio, e o dia é o dia UTC (vira às 21:00 de Brasília). Acima disso a resposta é 429 temporarily_unavailable com Retry-After até o fim da janela: até 60 segundos no minuto e até cerca de 24 horas no dia. O refresh token não é consumido: o mesmo refresh continua válido depois da espera. Só conta o pedido que giraria o token (refresh válido, do mesmo aplicativo e do mesmo recurso). O teto é por conexão, não por IP.

Tokens OAuth são exclusivos do MCP. Integrações com /api/v1/* devem usar chave de API. Consulte o guia de autenticação do CFO e a especificação oficial de autorização MCP.

Limites e falhas de acesso

Além das cotas comerciais do plano, há teto de 120 requisições MCP por minuto e 5.000 por dia, por credencial ou conexão, incluindo descoberta, catálogo e whoami. O corpo da requisição tem limite de 1 MiB; a resposta, de 200 KiB.

Credencial ausente, vencida ou revogada recebe 401 sem penalidade. Credenciais desconhecidas ou malformadas contam por IP (em IPv6, por bloco /48): acima de 120 em um minuto vindas do mesmo IP, as seguintes recebem 429. Esse limite nunca barra uma credencial válida, nem a descoberta sem credencial.

/oauth/token e /oauth/revoke não limitam o pedido válido por IP: a troca de código, a renovação e a revogação de um token existente não contam em nenhum limite por IP (a renovação tem só o teto por conexão, acima). Só a falha conta, por IP (em IPv6, por bloco /48) e somando os dois endpoints: código, refresh ou token desconhecido, malformado ou ausente, e pedido malformado (método, tipo de conteúdo, grant_type inválido, cliente inexistente). Acima de 30 falhas em um minuto vindas do mesmo IP, as falhas seguintes recebem 429 com Retry-After; o pedido válido desse IP continua atendido. Código ou refresh token conhecido, mesmo vencido, já usado ou revogado, não conta e nunca recebe esse 429: a resposta é o erro exato (como invalid_grant), para o cliente pedir nova autorização. No /oauth/revoke, token desconhecido recebe 200 (RFC 7009) enquanto o IP está abaixo do teto. O volume total por IP tem um teto de infraestrutura (20 pedidos por segundo, rajada de 100); acima dele a resposta é 429.

/oauth/authorize e /oauth/register aceitam juntos até 60 pedidos por minuto por IP; acima disso a resposta é 429 com Retry-After.

HTTPComo continuar
401Informe uma credencial válida ou autorize novamente. O header WWW-Authenticate aponta os metadados de autenticação.
403Confira plano pago, status da conta, organização, permissões e bloqueios globais de IP. A allowlist da API REST não se aplica ao MCP.
405 / 415Confira o método e o tipo de conteúdo usados pelo transporte MCP.
413Reduza o corpo da requisição.
429Aguarde o período informado em Retry-After antes de tentar novamente.
WWW-Authenticate: Bearer realm="CFO", scope="mcp",
  resource_metadata="https://mcp.cfo.com.br/.well-known/oauth-protected-resource/v1"

O desafio aponta o documento do endereço chamado. No legado https://cfo.com.br/mcp, aponta https://cfo.com.br/.well-known/oauth-protected-resource/mcp.

Feeds JSON dos observatórios (sem chave)

Os observatórios — as páginas públicas de dado agregado — servem o mesmo resumo mensal em JSON, na mesma URL com .json no fim. Não exigem chave, não exigem cadastro e não consomem cota: é dado público sob licença aberta, publicado para um agente chamar o dado em vez de raspar a página.

curl -s https://cfo.com.br/dados.json                       # catálogo de todos os feeds
curl -s https://cfo.com.br/movimentacoes-empresariais-sc.json
curl -s "https://cfo.com.br/movimentacoes-empresariais-sc.json?ref=2026-07"  # outro mês

Feeds no ar

URLO que traz
/dados.jsonCatálogo: todos os datasets, os meses disponíveis de cada um, cobertura, licença, contato e a forma de citar. É a porta de entrada.
/movimentacoes-empresariais-brasil.jsonDelta mensal do CNPJ no Brasil: aberturas, baixas, inaptidões, reativações, recuperação judicial, falência, liquidação, migração entre estados e mudanças cadastrais. Com a série mensal.
/movimentacoes-empresariais-{uf}.jsonO mesmo por estado (27 feeds, ex.: -sc, -sp), mais a participação e a posição do estado no país.
/quantas-empresas-existem-brasil.jsonReconciliação das contagens: CNPJs registrados, estabelecimentos por situação, empresas ativas, MEI e Simples, natureza jurídica, porte e as unidades locais do IBGE (CEMPRE).
/divida-ativa-estadual.jsonEmpresas (CNPJ raiz) inscritas na dívida ativa de 9 estados: listas completas de MG, PB, PE, PR, RS, SC e GO e maiores devedores de RJ e SP, por estado, com valor, tributo, situação cadastral e o cruzamento com a Dívida Ativa da União; o campo maiores_devedores traz a lista nominal só dos estados em que ela está publicada (maiores_devedores.estados); totais.empresas_em_2_ou_mais_estados_integrados conta o CNPJ raiz que consta de 2 ou mais das listas dos 9 estados integrados (as 7 completas e as de maiores devedores de RJ e SP). Carga semanal: ?ref=AAAA-MM-DD (data da carga) escolhe outra semana.
/divida-ativa-estadual-{uf}.jsonO mesmo para cada um dos 9 estados (ex.: -pr, -rj); maiores_devedores só consta do feed de estado com a lista publicada.

A URL do feed é sempre a da página humana + .json. A própria página anuncia o feed no <head> (<link rel="alternate" type="application/json">) e no JSON-LD schema.org/Dataset, como uma DataDownload de application/json.

Parâmetros

ParâmetroDescriçãoExemplo
refMês de referência, AAAA-MM. Sem ele, vem o mês mais recente. Os meses válidos estão em refs_disponiveis, no próprio feed.?ref=2026-07

Campos da resposta

CampoO que é
datasetIdentificador estável do conjunto (o mesmo da URL).
tituloNome do conjunto, em português.
urlA página humana equivalente (absoluta).
feedA URL deste próprio JSON — para citar sem montar à mão.
ref_mesMês de referência servido (AAAA-MM).
refs_disponiveisTodos os meses que este feed serve, em ordem. Um mês só entra quando está completo.
calculado_emQuando o resumo foi materializado (ISO 8601 com fuso). É o que alimenta o ETag e o Last-Modified.
fonteLista de {nome, data}: o órgão de origem e a data da carga (o CEMPRE, anual, traz o ano).
licenca{nome, url, atribuicao} — ver abaixo.
atualizacaoCadência: mensal, após a carga da Receita Federal.
dadosOs números, em unidades naturais (inteiros; percentuais como número, nunca texto formatado), com nomes autoexplicativos em snake_case, mais as derivadas que a página mostra. Inclui serie: a mesma estrutura para cada mês disponível — a página mostra um mês; o feed traz a série completa.

Cache e requisição condicional

Um mês não muda depois de calculado, então vale a pena não baixar duas vezes:

ETag: "43b12dcdec097e9f9f874fea2b22b1b61074627c"
Last-Modified: Thu, 10 Sep 2026 04:21:59 GMT
Cache-Control: public, max-age=3600, s-maxage=86400
Access-Control-Allow-Origin: *

Reenvie o ETag em If-None-Match e a resposta é 304 sem corpo. O feed também responde a HEAD e é liberado para fetch() de qualquer origem (CORS *).

Licença e citação

Os feeds estão sob CC BY 4.0, com atribuição a CFO (cfo.com.br). O dado bruto é público (Receita Federal, IBGE); o que se licencia é a compilação — o recorte mensal, as derivadas e a série, que só existem porque a versão anterior da base foi preservada antes da substituição pela Receita Federal. Forma sugerida de citar:

CFO (cfo.com.br), <dataset>, referência <mês>, acessado em <data>

Erros

HTTPerroQuando
404dataset_desconhecidoCaminho que não é um feed. A resposta traz a URL do catálogo.
404referencia_indisponivelref inexistente ou fora do formato. A resposta traz refs_disponiveis.
404dataset_em_calculoO resumo do conjunto ainda não foi materializado (janela da carga mensal).
405metodo_nao_suportadoSó GET e HEAD.

Estes feeds são agregados: nenhuma empresa, sócio ou CNPJ é identificado. Para dado por empresa, é a API (com chave).

Erros

Erros vêm como { "error": { "code": "...", "message": "..." } } com o status HTTP correspondente.

HTTPcodeQuando
400bad_requestParâmetro inválido (ex.: CNPJ sem 14 caracteres; lista de screening sem nenhum CNPJ válido).
400too_many_cnpjsScreening com mais de 50 CNPJs — divida o lote.
400filter_requiredPeríodo aberto (dias=0) sem nenhum filtro seletivo (uf, cnae, cidade, termo, cnpj, capital, CEP, divida ou sancao).
401missing_key / invalid_keyChave ausente, inválida ou revogada.
403ip_blocked / ip_not_allowed / account_inactiveIP bloqueado, fora da allowlist, ou conta inativa.
404not_found / unknown_resourceCNPJ inexistente ou recurso desconhecido.
429quota_exceededCota mensal de buscas atingida (veja Retry-After).
429too_many_timeoutsA busca precisaria da rota secundária e ela está em pausa: 3 ou mais buscas do usuário ("applies_to": "user"), ou 10 do contrato somando os usuários ("applies_to": "contract"), passaram do tempo limite na última hora. As buscas que o índice atende seguem normais; espere o Retry-After (até 10 minutos) ou refine os filtros. Não consome cota. Veja Limites.
429empresa_quota_exceededCota mensal de empresas com dossiê atingida (resource=empresa/screening; veja Retry-After). Estouro de leads não gera erro: a resposta é 200 com as linhas além do saldo mascaradas (contato_mascarado: "cota").
500query_errorErro interno ao consultar, ou busca que não terminou a tempo (por exemplo, termo raro em período aberto enquanto o índice de texto está indisponível): refine com período, UF ou cidade. A busca não é cobrada ("charged": false); a partir da 3ª do mesmo usuário que passa do tempo limite na mesma hora, ele fica 10 minutos sem a rota secundária (veja Limites).
503maintenanceBase em recarga mensal (ver Retry-After). Não exige chave nem consome cota.

Durante a atualização mensal da base a API responde 503 maintenance com o header Retry-After (segundos). É um estado transitório de poucos minutos — repita a chamada após o intervalo indicado. Nenhuma requisição nesse período consome sua cota.

Tabelas de código

Situação cadastral (sit)

CódigoSituação
1Nula
2Ativa
3Suspensa
4Inapta
8Baixada

Porte

CódigoPorte
00—
01Micro (ME)
03Pequeno (EPP)
05Demais

Dados públicos (dados abertos do governo federal), atualizados com frequência. CFO não é um órgão público.