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
-
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 -
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 -
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
| Campo | Perfil | Descrição |
|---|---|---|
cnpj | basic | CNPJ 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_social | basic | Nome empresarial registrado na Receita Federal. É o único nome sempre presente. |
nome_fantasia | basic | Nome fantasia declarado para o estabelecimento, na Receita Federal. null quando a empresa não declarou. |
situacao_cadastral.codigo | basic | Có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.descricao | basic | Descrição da situação cadastral, traduzida do código pela tabela de domínio da Receita Federal. |
data_situacao_cadastral | basic | Data do evento que gerou a situação cadastral atual, campo da Receita Federal. |
matriz_filial.descricao | basic | Descrição do código de matriz/filial, traduzida pela tabela de domínio da Receita Federal. |
data_inicio_atividade | basic | Data de início de atividade do estabelecimento (abertura), campo da Receita Federal, em formato ISO YYYY-MM-DD. |
endereco.municipio | basic | Nome do município de jurisdição do estabelecimento, traduzido pela tabela de municípios da Receita Federal. |
endereco.uf | basic | Sigla da unidade da federação do estabelecimento, campo da Receita Federal. |
natureza_juridica.descricao | basic | Nome da natureza jurídica, traduzido do código pela tabela de domínio da Receita Federal. |
simples.optante | basic | Indica 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
- Ativa é
02: os demais códigos desituacao_cadastral(nula, suspensa, inapta, baixada) estão na tabela de Campos da resposta;motivo_situacao_cadastralexplica o porquê. - Filial não é erro:
matriz_filialdiz se o CNPJ é o estabelecimento principal;raiz_cnpjliga matriz e filiais. - Data da base:
meta.data_as_ofé a foto mensal que respondeu. Uma empresa aberta este mês pode ainda não constar; trate404 not_foundcomo “não encontrada na base de agosto/2026”, não como inexistente. - Sem CPF: o cadastro PJ não recebe dado de pessoa física além do quadro societário público, no perfil
full, se você precisar dele.
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
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
Atualizado em