para quem cadastra clientes PJ · base agosto/2026

API de CNPJ para onboarding de PJ

Valide o CNPJ no cadastro em uma chamada: existência, situação cadastral e sua data, matriz ou filial, razão social e endereço. Aceita alfanumérico.

No cadastro de um cliente pessoa jurídica, a pergunta é simples: esse CNPJ existe, qual é a situação cadastral e quais dados estão registrados na Receita Federal? Uma consulta basic (1 crédito) responde com situação cadastral e sua data, matriz ou filial, razão social, nome fantasia, endereço e natureza jurídica, na base da Receita Federal de agosto/2026. CNPJ malformado ou inexistente custa 0.

O fluxo em três passos

  1. Normalize e consulte

    Envie o CNPJ como o usuário digitou, com ou sem pontuação, numérico ou alfanumérico. A API normaliza e valida o dígito verificador.

    GET /v1/cnpjs/00.000.000/0001-91
  2. Decida pela situação, não pelo 200

    situacao_cadastral.codigo diz se a empresa está ativa; data_situacao_cadastral e matriz_filial contextualizam. Preencha razão social e endereço do cadastro.

    data.situacao_cadastral.codigo == "02" → Ativa
  3. Trate os três resultados do cadastro

    400 invalid_cnpj é formato ou dígito errado; 404 not_found é CNPJ válido que não existe; nenhum dos dois consome crédito. Só o 200 é cobrado, no peso do perfil.

    400 invalid_cnpj · 404 not_found · 200 → cobrado no peso do basic

Código pronto

Python
import os, requests

HEADERS = {"Authorization": f"Bearer {os.environ['CNPJIA_KEY']}"}

def validar_cnpj(cnpj_digitado: str) -> dict:
    cnpj = "".join(ch for ch in cnpj_digitado if ch.isalnum())  # tira pontuação: "/" quebraria a rota
    r = requests.get(f"https://api.cnpj.ia.br/v1/cnpjs/{cnpj}", headers=HEADERS, timeout=10)
    if r.status_code == 400:
        return {"ok": False, "motivo": "CNPJ inválido"}
    if r.status_code == 404:
        return {"ok": False, "motivo": "CNPJ não encontrado na base"}
    r.raise_for_status()
    d = r.json()["data"]
    return {
        "ok": d["situacao_cadastral"]["codigo"] == "02",
        "situacao": d["situacao_cadastral"]["descricao"],
        "desde": d["data_situacao_cadastral"],
        "razao_social": d["razao_social"],
        "matriz": d["matriz_filial"]["descricao"],
        "cidade": f'{d["endereco"]["municipio"]}/{d["endereco"]["uf"]}',
    }
Node
const headers = { Authorization: `Bearer ${process.env.CNPJIA_KEY}` };

async function validarCnpj(cnpjDigitado) {
  const res = await fetch(`https://api.cnpj.ia.br/v1/cnpjs/${encodeURIComponent(cnpjDigitado)}`, { headers });
  if (res.status === 400) return { ok: false, motivo: "CNPJ inválido" };
  if (res.status === 404) return { ok: false, motivo: "CNPJ não encontrado na base" };
  if (!res.ok) throw new Error(`HTTP ${res.status}`);
  const { data: d } = await res.json();
  return {
    ok: d.situacao_cadastral.codigo === "02",
    situacao: d.situacao_cadastral.descricao,
    desde: d.data_situacao_cadastral,
    razaoSocial: d.razao_social,
    matriz: d.matriz_filial.descricao,
    cidade: `${d.endereco.municipio}/${d.endereco.uf}`,
  };
}

Campos mais usados

CampoPerfilDescrição
cnpjbasicCNPJ do estabelecimento, 14 caracteres sem pontuação, com zeros à esquerda. Vem da Receita Federal; aceita entrada numérica ou alfanumérica, com ou sem pontuação.
razao_socialbasicNome empresarial registrado na Receita Federal. É o único nome sempre presente.
nome_fantasiabasicNome fantasia declarado para o estabelecimento, na Receita Federal. null quando a empresa não declarou.
situacao_cadastral.codigobasicCódigo da situação cadastral do estabelecimento na Receita Federal, com dois dígitos. É o campo que diz se a empresa está ativa.
situacao_cadastral.descricaobasicDescrição da situação cadastral, traduzida do código pela tabela de domínio da Receita Federal.
data_situacao_cadastralbasicData do evento que gerou a situação cadastral atual, campo da Receita Federal.
matriz_filial.descricaobasicDescrição do código de matriz/filial, traduzida pela tabela de domínio da Receita Federal.
data_inicio_atividadebasicData de início de atividade do estabelecimento (abertura), campo da Receita Federal, em formato ISO YYYY-MM-DD.
endereco.municipiobasicNome do município de jurisdição do estabelecimento, traduzido pela tabela de municípios da Receita Federal.
endereco.ufbasicSigla da unidade da federação do estabelecimento, campo da Receita Federal.
natureza_juridica.descricaobasicNome da natureza jurídica, traduzido do código pela tabela de domínio da Receita Federal.
simples.optantebasicIndica opção pelo Simples Nacional, dos dados do Simples publicados pela Receita Federal. null quando o indicador vem em branco (caso ‘outros’ do layout).

O que muda com o CNPJ alfanumérico

Desde 2026 a Receita Federal emite CNPJs com letras nas doze primeiras posições. A API aceita o formato antigo e o novo, com ou sem pontuação, e devolve cnpj sempre normalizado. No seu cadastro, guarde como texto, aceite letras na máscara e valide o dígito verificador pelo algoritmo novo, que continua correto para os numéricos. Detalhes em CNPJ alfanumérico.

Decisões que o código deve tomar

Tier indicado

Free é o plano indicado: este fluxo não usa a busca de empresas.

  • 60 créditos por mês
  • 3 requisições por minuto

Todos os planos, os pesos por operação e os pacotes avulsos

Perguntas frequentes

A consulta valida o dígito verificador?

Sim. Formato ou dígito inválido responde 400 invalid_cnpj, sem consumir crédito, tanto para CNPJ numérico quanto alfanumérico. Um 200 já significa que o CNPJ é válido e existe na base.

Um CNPJ que não existe consome crédito?

Não. 404 not_found não consome crédito, como todo erro. Só respostas 200 são cobradas; validar cadastros com muitos CNPJs errados não gasta a franquia.

Como sei se a empresa está ativa?

Pelo código 02 em situacao_cadastral.codigo. Os demais códigos e o motivo_situacao_cadastral seguem as tabelas da Receita Federal publicadas em /docs/campos; data_situacao_cadastral diz desde quando.

Uma empresa aberta esta semana aparece?

Depende da carga mensal. A base é a foto dos dados abertos da Receita Federal com a data em meta.data_as_of; uma inscrição nova entra na próxima carga. Trate 404 como não encontrada na base dessa data.

O cadastro precisa aceitar CNPJ com letras?

Sim, para inscrições novas. A API aceita os dois formatos e normaliza; do seu lado, guarde o CNPJ como texto, aceite letras nas doze primeiras posições da máscara e use o algoritmo novo de dígito verificador, que continua válido para os numéricos.

Posso fazer a validação direto do formulário no navegador?

Não com a sua chave, que gastaria os seus créditos em nome de qualquer visitante. Chame a API do seu backend ou de uma função serverless. Os únicos endpoints sem chave são GET /v1/status e GET /v1/demo, e só eles aceitam CORS.

Para continuar

Criar chave grátis

Atualizado em