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
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ássica | Caminho 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):
| Forma | Uso | Exemplo |
|---|---|---|
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):
- Buscas por mês — cada requisição de
resource=empresascom resultado conta 1. Requisições que retornam 0 registros não consomem (são estornadas). Ao estourar, a API responde429 quota_exceededaté a virada do mês. - Leads revelados por mês — na lista, e-mail e telefone saem mascarados (
fin***@emp***.com.br,(51) 9****-**34). Revelar o contato de 1 empresa = 1 lead: adicionereveal=1à busca. O estouro é parcial-gracioso: a resposta é200, revela até onde o saldo alcança na ordem das linhas e mascara o resto comcontato_mascarado: "cota". Empresa revelada (ou com dossiê consultado) fica aberta por 30 dias para o mesmo usuário, sem novo consumo. - Empresas com dossiê integrado por mês —
resource=empresaconsome 1 por empresa nova no mês; reabrir a mesma empresa dentro do mês-calendário é grátis (vale para o contrato inteiro).resource=screeningconsome desta mesma régua: 1 por CNPJ encontrado e novo no mês. Ao estourar:429 empresa_quota_exceeded. - Registros por busca — teto de linhas por requisição: o
per_pageé limitado ao seu plano (max_records) e, no máximo, a 1.000 em JSON / 50.000 em CSV. Usepagepara paginar além disso (cada página é 1 busca). A paginação cobre os 50.000 registros mais recentes de cada busca: página que começa depois disso responde400 page_out_of_range(sem consumir a busca) com a última página válida emmax_page; refine os filtros para chegar aos demais. - Buscas simultâneas — no máximo 2 requisições de
resource=empresas(JSON ou CSV) em andamento ao mesmo tempo por contrato usam o índice de busca, somando todas as chaves, os operadores e o painel web. A 3ª simultânea (ou qualquer uma com o índice ocupado ou fora do ar) segue pela rota secundária: os filtros são os mesmos, a resposta é mais lenta, o total pode vir aproximado (total_capped) e a busca muito ampla pode terminar em500 query_error(veja o tempo limite, abaixo). Integrações em lote rendem mais com as chamadas em série. - Tempo limite — a busca que não termina a tempo responde
500 query_errore não é cobrada (o corpo do erro traz"charged": false). Ela só acontece na rota secundária, a que atende a busca quando o índice de busca não pode (filtro que o índice não tem, índice ocupado ou fora do ar). Da 3ª busca do mesmo usuário (o dono da chave ou do token; no painel, o login) que passa do tempo limite na mesma hora (contada a partir da 1ª) em diante, esse usuário fica 10 minutos sem a rota secundária: nesse intervalo, as buscas que o índice atende (a maioria) e a busca por CNPJ exato seguem normais, e a que precisaria da rota secundária responde429 too_many_timeoutscomRetry-After(segundos) e"applies_to": "user", sem consumir a cota. Com 10 na mesma hora somando os usuários do contrato (no máximo 3 de cada um), a pausa vale para o contrato inteiro ("applies_to": "contract"). Vale para JSON e CSV, a API e o painel juntos (no RapidAPI, a conta é a do assinante). Erro interno não conta. Refine a busca com período, UF, cidade ou situação antes de repetir. - Restrição de IP da API REST — se sua conta tiver allowlist, só os IPs listados podem usar suas chaves na API REST (
403 ip_not_allowedcaso contrário). O MCP dispensa essa allowlist; bloqueios globais de IP continuam valendo. resource=metaeresource=dlnão consomem quota.
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âmetro | Descrição | Exemplo |
|---|---|---|
dias | Aberta nos últimos N dias. 0 = qualquer período. | 30 |
de / ate | Intervalo 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 |
cnpj | CNPJ 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 |
uf | Unidade federativa (2 letras). | SP |
cidade | Nome do município (busca parcial). | Campinas |
cnae | Có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 |
sit | Situação cadastral (ver tabela). Default 2 (ativa). | 2 |
termo | Texto 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 |
matriz | 1 = só matrizes. | 1 |
mei | only = só MEI · exclude = exclui MEI. | only |
aeronave | sim = 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 |
bndes | sim = empresa que captou financiamento BNDES (operações não-automáticas). | sim |
finep | sim = empresa com projeto/contrato FINEP. | sim |
pncp | sim = empresa fornecedora do governo (contrato público no PNCP). | sim |
obra | sim = 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 |
divida | sim = com dívida ativa da União (PGFN). Dado aberto; indício, não prova. Vale como filtro seletivo para dias=0. | sim |
sancao | sim = com sanção vigente em CEIS/CNEP (CGU). Dado aberto; indício, não prova. Vale como filtro seletivo para dias=0. | sim |
parcelamento | sim = 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 |
balanco | sim = 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 |
semalerta | sim = 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 / capmax | Faixa de capital social (R$). | 100000 |
cepde / cepate | Intervalo de CEP (prefixo). | 01000000 |
email | Empresas 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 + tel | Empresas com este telefone exato (os dois juntos: ddd e tel). Mesmo indício de contato compartilhado. Vale para dias=0. | ddd=11&tel=999990000 |
numero | Nú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 |
reveal | 1 = 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 |
leadcap | 1, 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 |
page | Pá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_page | Registros por página (limitado pela sua conta). | 100 |
format | json (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)
| Campo | Leitura |
|---|---|
contato.email_contador, contato.telefone_contador | O 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_invalido | true 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_count | Nº de sócios no quadro societário da raiz (o mesmo quadro do dossiê, sem os titulares com restrição de exibição). |
energia | true quando a raiz é agente de geração no cadastro da ANEEL (detalhe no resource=empresa, bloco energia). |
site | O 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.
| Campo | Conteúdo |
|---|---|
situacao.data, situacao.motivo | Data da situação cadastral e o motivo dela ({ "codigo", "descricao" }, tabela da RFB). |
contato.telefone2 | Segundo telefone do cadastro, no formato do primeiro. |
simples.data_exclusao_simples, simples.data_exclusao_mei | Data de exclusão do Simples Nacional e do MEI (null se não houve). |
responsavel_qualificacao | Qualificação do responsável pela empresa na RFB ({ "codigo", "descricao" }). |
ente_federativo | Ente federativo responsável, para órgão público (null nas demais). |
endereco.pais, endereco.cidade_exterior | Só para empresa domiciliada no exterior: país ({ "codigo", "descricao" }) e cidade. |
referencia_setor | Perfil 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. |
filiais | Filiais 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_socio | Indí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_exterior | Só 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. |
procuradores | Só 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. |
controladas | Empresas 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. |
grupo | Grupo 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. |
restricoes | Quando 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. |
historico | Histó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. |
aeronaves | Aeronaves 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. |
dominios | Domí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. |
obras | Obras 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. |
bndes | Operaçõ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). |
finep | Projetos 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_publicos | Contratos 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). |
energia | Usinas 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). |
saude | Unidades 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. |
regulado | Registros 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. |
inpi | Detalhe 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_contratos | Contratos 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.registros | Os 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_balancos | consta_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.registros | Até 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_escravo | Cadastro 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.ibama | Autos 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_atualizacao | Data (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_contador | O 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_invalido | Contato 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). |
parcial | null 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
}
]
}
| Campo | Leitura |
|---|---|
alertas.divida_ativa | Dívida ativa da União (PGFN): flag, valor total inscrito (R$) e se há débito ajuizada (executado judicialmente). |
alertas.ceis_vigente / cnep_vigente | Sançã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_multa | Valor de multa associado a sanção CNEP, quando houver (R$). |
alertas.trabalho_escravo | Consta 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.ibama | Auto 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. |
capacidade | Sinais 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_count | Contagem 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.
0(default) — corte imediato: no instante em que a chamada retorna200, a antiga já responde401. Use quando estiver rotacionando por suspeita de vazamento — qualquer carência mantém quem tem a chave dentro pelo mesmo tempo.1–1440(24h) — as duas chaves valem durante a janela: aplique a nova nos seus serviços com calma e a antiga se encerra sozinha no vencimento. Depois disso ela responde401com"code": "key_expired"e a hora exata em que venceu.
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);
import requests
r = requests.get("https://cfo.com.br/api", params={
"resource": "empresas", "uf": "SP", "cnae": "6201", "dias": 30
}, headers={"Authorization": "Bearer cfo_live_SUA_CHAVE"})
payload = r.json()
print(payload["meta"]["total"], len(payload["data"]))
$ch = curl_init("https://cfo.com.br/api?resource=empresas&uf=SP&cnae=6201&dias=30");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Authorization: Bearer cfo_live_SUA_CHAVE"],
]);
$res = json_decode(curl_exec($ch), true);
echo $res["meta"]["total"];
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.
Conectar por OAuth
- No aplicativo compatível com MCP remoto, adicione a URL
https://mcp.cfo.com.br/v1, com transporte Streamable HTTP e autenticação OAuth. - 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.
- 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
| Ferramenta | Entrada e finalidade | Cota do plano |
|---|---|---|
buscar_empresas | Filtros 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_socio | nome 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_dominio | dominio; 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_marca | marca, 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ço | Finalidade |
|---|---|
https://mcp.cfo.com.br/.well-known/oauth-protected-resource/v1 | Metadados do recurso MCP. |
https://cfo.com.br/.well-known/oauth-protected-resource/mcp | Metadados do endereço legado https://cfo.com.br/mcp. |
https://cfo.com.br/.well-known/oauth-authorization-server | Endpoints, grants e métodos de PKCE do emissor. |
/oauth/register | Registro dinâmico de cliente público com seus endereços de retorno. |
/oauth/authorize | Login e consentimento. O endereço de retorno precisa coincidir com o registrado; em loopback HTTP, somente a porta pode variar. |
/oauth/token | Troca 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/revoke | Revogaçã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.
| HTTP | Como continuar |
|---|---|
401 | Informe uma credencial válida ou autorize novamente. O header WWW-Authenticate aponta os metadados de autenticação. |
403 | Confira 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 / 415 | Confira o método e o tipo de conteúdo usados pelo transporte MCP. |
413 | Reduza o corpo da requisição. |
429 | Aguarde 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
| URL | O que traz |
|---|---|
/dados.json | Catá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.json | Delta 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}.json | O 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.json | Reconciliaçã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.json | Empresas (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}.json | O 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âmetro | Descrição | Exemplo |
|---|---|---|
ref | Mê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
| Campo | O que é |
|---|---|
| dataset | Identificador estável do conjunto (o mesmo da URL). |
| titulo | Nome do conjunto, em português. |
| url | A página humana equivalente (absoluta). |
| feed | A URL deste próprio JSON — para citar sem montar à mão. |
| ref_mes | Mês de referência servido (AAAA-MM). |
| refs_disponiveis | Todos os meses que este feed serve, em ordem. Um mês só entra quando está completo. |
| calculado_em | Quando o resumo foi materializado (ISO 8601 com fuso). É o que alimenta o ETag e o Last-Modified. |
| fonte | Lista 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. |
| atualizacao | Cadência: mensal, após a carga da Receita Federal. |
| dados | Os 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
| HTTP | erro | Quando |
|---|---|---|
| 404 | dataset_desconhecido | Caminho que não é um feed. A resposta traz a URL do catálogo. |
| 404 | referencia_indisponivel | ref inexistente ou fora do formato. A resposta traz refs_disponiveis. |
| 404 | dataset_em_calculo | O resumo do conjunto ainda não foi materializado (janela da carga mensal). |
| 405 | metodo_nao_suportado | Só 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.
| HTTP | code | Quando |
|---|---|---|
| 400 | bad_request | Parâmetro inválido (ex.: CNPJ sem 14 caracteres; lista de screening sem nenhum CNPJ válido). |
| 400 | too_many_cnpjs | Screening com mais de 50 CNPJs — divida o lote. |
| 400 | filter_required | Período aberto (dias=0) sem nenhum filtro seletivo (uf, cnae, cidade, termo, cnpj, capital, CEP, divida ou sancao). |
| 401 | missing_key / invalid_key | Chave ausente, inválida ou revogada. |
| 403 | ip_blocked / ip_not_allowed / account_inactive | IP bloqueado, fora da allowlist, ou conta inativa. |
| 404 | not_found / unknown_resource | CNPJ inexistente ou recurso desconhecido. |
| 429 | quota_exceeded | Cota mensal de buscas atingida (veja Retry-After). |
| 429 | too_many_timeouts | A 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. |
| 429 | empresa_quota_exceeded | Cota 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"). |
| 500 | query_error | Erro 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). |
| 503 | maintenance | Base 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ódigo | Situação |
|---|---|
1 | Nula |
2 | Ativa |
3 | Suspensa |
4 | Inapta |
8 | Baixada |
Porte
| Código | Porte |
|---|---|
00 | — |
01 | Micro (ME) |
03 | Pequeno (EPP) |
05 | Demais |
Dados públicos (dados abertos do governo federal), atualizados com frequência. CFO não é um órgão público.