Validar CNPJ
Cole um CNPJ ou uma lista inteira e veja quais estão com o dígito certo e, quando não estão, por quê.
Validar CNPJ
Confere no seu navegador. Nada do que você digita ou cola é enviado.
Validar em lote: cole uma coluna da planilha
CSV (Excel) abre com dois cliques no Excel em português (ponto e vírgula, acentos certos). CSV usa vírgula, para programas e scripts.
O validador limpa a máscara, confere se o número tem 14 caracteres válidos e recalcula os dois dígitos verificadores por módulo 11. Se algo não bater, ele diz o que está errado, por exemplo "O 2º dígito deveria ser 5, e não 4". Ele aceita o formato numérico e o alfanumérico, mas confere só o cálculo: não diz se a empresa existe ou está ativa.
O que o validador confere
Cada número passa por estas etapas, nesta ordem. A primeira que falhar define a mensagem (com o campo vazio, a tela só pede o número):
- Limpeza: tira pontos, barra, traço e espaços, e passa as letras para maiúsculas.
- Caracteres: só entram letras de A a Z e números; símbolos e acentos são recusados.
- Tamanho: o CNPJ tem 14 caracteres, nem mais nem menos.
- Repetição: números com todos os caracteres iguais, como
00.000.000/0000-00, são recusados, mesmo os que passam na conta. - Dígitos verificadores: as 2 últimas posições têm de ser números.
- Cálculo: os dois dígitos são recalculados e comparados com os que vieram no número.
O que o validador não confere
Um CNPJ válido no cálculo não quer dizer que a empresa exista. O dígito verificador só pega erro de digitação: ele garante que o número foi montado pela regra, não que alguém o recebeu da Receita.
Para saber se uma empresa existe, está ativa ou qual é a razão social, consulte o Comprovante de Inscrição e de Situação Cadastral no site da Receita Federal. Este validador não consulta nenhuma base e não envia o número a lugar nenhum: a conta é feita no seu navegador.
Entenda as mensagens de erro
Cada recusa vem com uma frase que diz o problema. As mais comuns e o que fazer:
| Mensagem | O que significa | O que fazer |
|---|---|---|
| Tem 13 caracteres. O CNPJ tem 14. | Falta ou sobra caractere. | Confira se um zero à esquerda sumiu, comum em planilha. |
| O caractere "*" não é aceito. O CNPJ só tem letras de A a Z e números. | Há símbolo, acento ou caractere especial no meio. | Apague e digite de novo, sem colar de PDF. |
| Todos os caracteres são iguais. Um CNPJ assim não é aceito. | Sequência como 11111111111111. | Não é um CNPJ de verdade. Use outro número. |
| Os dois últimos caracteres são os dígitos verificadores e só podem ser números (veio "3A"). | Uma das 2 últimas posições é letra. | Os dígitos verificadores são sempre números. Confira a digitação. |
| O 2º dígito deveria ser 5, e não 4. | A base está certa, mas um dígito não confere. | Erro de digitação, ou número inventado sem a conta. |
| Os dois dígitos verificadores estão errados: deveriam ser 35, e não 53. | Nenhum dos dois dígitos confere. | Confira a base: pode haver caractere trocado ou invertido. |
Exemplo: um dígito errado
Digite 12.ABC.345/01DE-34. A base 12ABC34501DE gera o 1º dígito 3, que confere. O 2º dígito calculado é 5, mas veio 4. O validador recusa e mostra a conta completa, posição por posição, para você ver onde está a diferença.
Com 12.ABC.345/01DE-35, o exemplo oficial da Receita Federal, os dois dígitos conferem e o número é aceito.
Digite um número completo para ver a conta.
Conta feita com o número 12.ABC.345/01DE-35.
Gere ou valide outro acima e a conta muda junto.
1º dígito verificador
| 1º dígito | 1 | 2 | A | B | C | 3 | 4 | 5 | 0 | 1 | D | E |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Valor (ASCII − 48) | 1 | 2 | 17 | 18 | 19 | 3 | 4 | 5 | 0 | 1 | 20 | 21 |
| Peso | 5 | 4 | 3 | 2 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
| Produto | 5 | 8 | 51 | 36 | 171 | 24 | 28 | 30 | 0 | 4 | 60 | 42 |
Resto 8 é maior que 1, então DV = 11 − 8 = 3.
2º dígito verificador
| 2º dígito | 1 | 2 | A | B | C | 3 | 4 | 5 | 0 | 1 | D | E | 3 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Valor (ASCII − 48) | 1 | 2 | 17 | 18 | 19 | 3 | 4 | 5 | 0 | 1 | 20 | 21 | 3 |
| Peso | 6 | 5 | 4 | 3 | 2 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
| Produto | 6 | 10 | 68 | 54 | 38 | 27 | 32 | 35 | 0 | 5 | 80 | 63 | 6 |
Resto 6 é maior que 1, então DV = 11 − 6 = 5.
Validar uma lista de CNPJs
Copie uma coluna da planilha e cole no campo de lote, um CNPJ por linha, com ou sem máscara. O resultado mostra cada linha como válida ou inválida, com o motivo, e você pode baixar a lista conferida em CSV ou em CSV (Excel), que abre com acentos e colunas certas no Excel em português.
Isso ajuda o contador a revisar o cadastro de clientes e fornecedores antes de importar no sistema fiscal, e ajuda o QA a conferir se uma massa de teste está inteira. Como tudo roda no navegador, a lista não sai do seu computador.
Erros comuns em planilhas e cadastros
Boa parte dos CNPJs "inválidos" de uma planilha foi estragada no caminho. Os culpados de sempre:
- Excel tratando o CNPJ como número: apaga os zeros à esquerda e, em números grandes, mostra notação científica. Formate a coluna como texto antes de colar.
- Letra
Ono lugar do zero, ouIno lugar do 1, digitados à mão. No CNPJ alfanumérico, as duas letras existem, então o erro só aparece no dígito. - Espaço invisível ou quebra de linha copiados de PDF e e-mail.
- Traço longo ou barra invertida no lugar do traço e da barra da máscara.
- CNPJ alfanumérico recusado por um sistema antigo que só aceita dígitos. Nesse caso o número está certo e o sistema é que precisa de ajuste.
Como validar no seu código
A validação correta tem quatro partes: normalizar a entrada, conferir o formato com uma regex, recusar sequências repetidas e recalcular os dígitos. O código abaixo faz isso em JavaScript, Python e numa função do PostgreSQL, e já aceita o formato alfanumérico.
Devolva o motivo da recusa, e não só verdadeiro ou falso. Uma mensagem como "Tem 13 caracteres" poupa uma ligação para o suporte. Para a regra das letras e o cálculo com o exemplo oficial, veja a página do CNPJ alfanumérico.
function dvCnpj(base) {
const calc = (v) => {
let soma = 0;
for (let i = v.length - 1, peso = 2; i >= 0; i--, peso = peso === 9 ? 2 : peso + 1) {
soma += v[i] * peso;
}
const resto = soma % 11;
return resto < 2 ? 0 : 11 - resto;
};
const v = [...base].map((c) => c.charCodeAt(0) - 48);
const dv1 = calc(v);
return String(dv1) + String(calc([...v, dv1]));
}
// Devolve o motivo da recusa, não só true/false.
// Mesma ordem do validador do site: vazio, caractere, tamanho, repetido, letra no DV, DV.
function validarCnpj(entrada) {
const cnpj = entrada.replace(/[.\/\-\s]/g, '').toUpperCase();
if (cnpj.length === 0) return { valido: false, motivo: 'vazio' };
if (!/^[0-9A-Z]+$/.test(cnpj)) return { valido: false, motivo: 'caractere' };
if (cnpj.length !== 14) return { valido: false, motivo: 'tamanho' };
if (/^(.)\1+$/.test(cnpj)) return { valido: false, motivo: 'repetido' };
if (!/^[0-9]{2}$/.test(cnpj.slice(12))) return { valido: false, motivo: 'letra-no-dv' };
const esperado = dvCnpj(cnpj.slice(0, 12));
if (esperado !== cnpj.slice(12)) return { valido: false, motivo: 'dv', esperado };
return { valido: true };
}
validarCnpj('12.ABC.345/01DE-34'); // { valido: false, motivo: 'dv', esperado: '35' } import re
def dv_cnpj(base: str) -> str:
def calc(v):
soma = sum(x * (2 + i % 8) for i, x in enumerate(reversed(v)))
resto = soma % 11
return 0 if resto < 2 else 11 - resto
v = [ord(c) - 48 for c in base]
dv1 = calc(v)
return f"{dv1}{calc(v + [dv1])}"
def validar_cnpj(entrada: str) -> bool:
cnpj = re.sub(r"[.\-/\s]", "", entrada).upper()
if not re.fullmatch(r"[0-9A-Z]{12}[0-9]{2}", cnpj) or len(set(cnpj)) == 1:
return False
return dv_cnpj(cnpj[:12]) == cnpj[12:]
print(validar_cnpj("12.ABC.345/01DE-35")) # True CREATE OR REPLACE FUNCTION cnpj_valido(entrada text) RETURNS boolean AS $$
DECLARE
c text := upper(regexp_replace(entrada, '[./ -]', '', 'g'));
soma int;
resto int;
dv1 int;
dv2 int;
BEGIN
IF c !~ '^[0-9A-Z]{12}[0-9]{2}$' OR c ~ '^(.)\1{13}$' THEN
RETURN false;
END IF;
soma := 0;
FOR i IN 1..12 LOOP
soma := soma + (ascii(substr(c, i, 1)) - 48) * (2 + (12 - i) % 8);
END LOOP;
resto := soma % 11;
dv1 := CASE WHEN resto < 2 THEN 0 ELSE 11 - resto END;
soma := 0;
FOR i IN 1..13 LOOP
soma := soma + (ascii(substr(c, i, 1)) - 48) * (2 + (13 - i) % 8);
END LOOP;
resto := soma % 11;
dv2 := CASE WHEN resto < 2 THEN 0 ELSE 11 - resto END;
RETURN substr(c, 13, 1)::int = dv1 AND substr(c, 14, 1)::int = dv2;
END;
$$ LANGUAGE plpgsql IMMUTABLE;
-- SELECT cnpj, cnpj_valido(cnpj) FROM fornecedor; Perguntas frequentes
Como saber se um CNPJ é válido?
Recalcule os dois dígitos verificadores pelo módulo 11 e compare com os do número. Se baterem e o número tiver 14 caracteres, ele é válido no cálculo. Para saber se a empresa existe, consulte a situação cadastral no site da Receita Federal.
O validador aceita CNPJ alfanumérico?
Sim. Ele aceita letras de A a Z nas 12 primeiras posições, com letras maiúsculas ou minúsculas, e faz a conta com o código ASCII menos 48.
CNPJ válido quer dizer que a empresa existe?
Não. O dígito verificador só mostra que o número foi montado pela regra. Um número inventado pode passar na conta sem pertencer a ninguém.
Por que 00.000.000/0000-00 é recusado se a conta fecha?
Porque algumas sequências com todos os caracteres iguais passam no módulo 11 por coincidência, mas não são inscrições reais. Todo validador sério recusa esses números.
Posso validar vários CNPJs de uma vez?
Sim. Cole uma coluna da planilha, um por linha, e veja quais estão inválidos e o motivo de cada um. Dá para baixar o resultado em CSV ou CSV (Excel).
O CNPJ que eu digito é enviado para algum servidor?
Não. A validação roda no seu navegador e o número não é enviado nem guardado.
Leia também
Veja também
Gerador de CNPJ
Numérico ou alfanumérico, de 1 a 10.000, em CSV, JSON ou SQL.
13.712.274/0001-55CNPJ alfanumérico
O formato novo, com letras, em uso desde jul/2026. Gere, valide e veja a conta.
12.ABC.345/01DE-35Inscrição estadual
Inscrições fictícias das 27 UFs, cada uma com a regra do seu estado.
137.122.740.715Validar CPF
Diz se o CPF confere e, se não, qual dígito está errado.
502.931.507-10 · VálidoAtualizado em 14/11/2026.