Verificar sanções e embargos de um CNPJ pela API
Antes de contratar um fornecedor, aprovar um cliente ou fechar uma parceria, vale saber se a empresa consta nos cadastros oficiais de sanções. Nos planos pagos, a CNPJAPI traz isso em toda consulta de CNPJ, no mesmo JSON dos dados cadastrais, sem chamada extra e sem custo adicional:
- CEIS (Cadastro Nacional de Empresas Inidôneas e Suspensas), da CGU;
- CNEP (Cadastro Nacional de Empresas Punidas), da CGU;
- CEPIM (entidades sem fins lucrativos impedidas de receber recursos federais), da CGU;
- Acordos de leniência em execução, da CGU;
- Áreas embargadas pelo IBAMA (embargos ambientais ativos).
A CGU atualiza o CEIS, o CNEP e os acordos de leniência várias vezes ao dia, e o CEPIM e o IBAMA, diariamente; a CNPJAPI coleta as fontes a cada 6 horas. A resposta traz a data do arquivo de cada fonte, para você saber de quando é a verificação.
Em compras públicas, a Lei 14.133/2021 (art. 91, § 4º) manda a administração consultar o CEIS e o CNEP antes de formalizar um contrato ou prorrogar a vigência dele. Para empresas privadas, a mesma verificação entra em due diligence de fornecedores, análise de crédito e programas de integridade.
Como funciona
Faça a consulta normal de CNPJ (GET /{cnpj}) com a API key de um plano pago. A resposta ganha o campo Sancoes no fim do JSON. Para uma empresa com registro, fica assim (CNPJ e dados fictícios):
curl https://api.cnpjapi.com.br/98765432000198 \
-H "Authorization: Bearer cnpj_sua_chave"
"Sancoes": {
"PossuiRegistros": true,
"Fontes": [
{ "Fonte": "CEIS", "AtualizadoEm": "2026-10-23" },
{ "Fonte": "CNEP", "AtualizadoEm": "2026-10-23" },
{ "Fonte": "CEPIM", "AtualizadoEm": "2026-10-22" },
{ "Fonte": "LENIENCIA", "AtualizadoEm": "2026-10-23" },
{ "Fonte": "IBAMA_EMBARGO", "AtualizadoEm": "2026-10-23" }
],
"Itens": [
{
"Fonte": "IBAMA_EMBARGO",
"CNPJRegistrado": "98765432000279",
"Tipo": "Termo de embargo",
"Municipio": "...",
"UF": "...",
"DataInicio": "2026-10-01",
"DataFim": null
}
]
}
Quatro pontos para ler a resposta direito:
- A busca é pela raiz do CNPJ. Sanção é aplicada à pessoa jurídica, e a filial é a mesma pessoa jurídica: a consulta de qualquer estabelecimento traz os registros da empresa inteira.
CNPJRegistradodiz qual CNPJ consta no cadastro (no exemplo, uma filial). Fonteslista todas as fontes consultadas, com ou sem registro, e a data de cada uma.- Só registros vigentes. Registro com data final já passada não aparece.
PossuiRegistros: falsecom a lista deFontesé o "nada consta", com a data de cada fonte. - Cada fonte tem seus campos. Além de
Fonte,CNPJRegistrado,Tipo,DataInicioeDataFim, o CEIS e o CNEP trazem órgão, esfera, fundamentação e processo (e a multa, no CNEP); o CEPIM traz o convênio e o motivo; a leniência, a situação e os efeitos do acordo; o IBAMA traz o número do termo, o local, a área em hectares e a decisão judicial mais recente, quando houver. A lista completa está no dicionário de campos.
Exemplo em código
Os exemplos Node usam
fetchnativo (Node 18+) eawaitno nível superior - rode como módulo ES (arquivo.mjs, ou"type": "module"nopackage.json), ou envolva o código numa funçãoasync.
Python:
import requests
cnpj = "98765432000198"
r = requests.get(
f"https://api.cnpjapi.com.br/{cnpj}",
headers={"Authorization": "Bearer cnpj_sua_chave"},
timeout=10,
)
r.raise_for_status()
empresa = r.json()
sancoes = empresa.get("Sancoes")
if sancoes is None:
# plano gratuito ("SancoesDisponivelEm") ou verificação indisponível agora ("SancoesErro")
print("Sanções não verificadas:", empresa.get("SancoesDisponivelEm") or empresa.get("SancoesErro"))
elif not sancoes["PossuiRegistros"]:
datas = ", ".join(f'{f["Fonte"]} em {f["AtualizadoEm"]}' for f in sancoes["Fontes"])
print("Nada consta. Fontes atualizadas:", datas)
else:
for item in sancoes["Itens"]:
print(item["Fonte"], item["Tipo"], "no CNPJ", item["CNPJRegistrado"], "desde", item["DataInicio"])
Node.js:
const cnpj = "98765432000198";
const r = await fetch(`https://api.cnpjapi.com.br/${cnpj}`, {
headers: { Authorization: "Bearer cnpj_sua_chave" },
});
if (!r.ok) throw new Error(`HTTP ${r.status}`);
const empresa = await r.json();
const { Sancoes: sancoes } = empresa;
if (sancoes === null || sancoes === undefined) {
console.log("Sanções não verificadas:", empresa.SancoesDisponivelEm ?? empresa.SancoesErro);
} else if (!sancoes.PossuiRegistros) {
console.log("Nada consta nas fontes:", sancoes.Fontes.map((f) => `${f.Fonte} (${f.AtualizadoEm})`).join(", "));
} else {
for (const item of sancoes.Itens) {
console.log(item.Fonte, item.Tipo, "no CNPJ", item.CNPJRegistrado, "desde", item.DataInicio);
}
}
Quando o bloco não vem
- Plano gratuito:
"Sancoes": nulle"SancoesDisponivelEm": "planos_pagos". Os dados do CNPJ vêm normalmente. - Verificação indisponível no momento:
"Sancoes": nulle"SancoesErro": "indisponivel". A consulta do CNPJ não é afetada; tente de novo mais tarde se a verificação for obrigatória para o seu fluxo. - Formato ReceitaWS (
?formato=receitawsou/v1/cnpj/{cnpj}): o campo não existe.
Muitos CNPJs de uma vez
No lote (POST /consulta/lote, até 20 CNPJs por chamada), cada item encontrado traz o mesmo bloco dentro de Dados. Bom para revisar a carteira de fornecedores inteira de uma vez.
No portal
Na plataforma, a consulta de CNPJ mostra o painel "Sanções e embargos" com os mesmos dados, e o PDF da consulta traz a seção com as fontes e as datas. Nas listas de empresas, dá para filtrar por sanções e embargos e exportar a lista com essas colunas.
Cuidados
- Os registros republicam os cadastros oficiais da CGU e do IBAMA; não são juízo da CNPJAPI sobre a empresa. Na dúvida, confira o registro na fonte.
- A consulta não substitui as certidões oficiais quando um processo as exige.
- Na descrição dos embargos, CPFs citados vêm mascarados.