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. CNPJRegistrado diz qual CNPJ consta no cadastro (no exemplo, uma filial).
  • Fontes lista 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: false com a lista de Fontes é o "nada consta", com a data de cada fonte.
  • Cada fonte tem seus campos. Além de Fonte, CNPJRegistrado, Tipo, DataInicio e DataFim, 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 fetch nativo (Node 18+) e await no nível superior - rode como módulo ES (arquivo .mjs, ou "type": "module" no package.json), ou envolva o código numa função async.

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": null e "SancoesDisponivelEm": "planos_pagos". Os dados do CNPJ vêm normalmente.
  • Verificação indisponível no momento: "Sancoes": null e "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=receitaws ou /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.

Próximos passos