# Validador de CNPJ (numérico e alfanumérico)

> O validador de CNPJ confere se o número tem 14 caracteres e se os dois dígitos verificadores batem com o cálculo de módulo 11, aceitando tanto o CNPJ numérico tradicional quanto o novo CNPJ alfanumérico. Isso indica formato válido, mas não prova que a empresa existe.

- Endereço oficial: https://pradev.com.br/validador-de-cnpj
- Categoria: Documentos brasileiros
- Tipo: Validador
- Atualizado em: 2026-09-30
- Autor: Leonardo Gaertner (https://pradev.com.br/sobre)
- Preço: grátis, sem cadastro. O processamento acontece no navegador de quem usa.

## Como usar

1. Digite ou cole o CNPJ, com ou sem pontuação. Letras são aceitas.
2. O resultado aparece assim que o número tiver 14 caracteres.
3. Se for inválido, leia o motivo logo abaixo do campo.

## Como funciona

O formato aceito é [A-Z0-9]{12}[0-9]{2}: doze caracteres entre números e letras maiúsculas seguidos de dois dígitos numéricos. A ferramenta ignora pontos, barra e traço e converte letras minúsculas para maiúsculas.

Cada caractere vira um valor: o código ASCII menos 48, de modo que 0 a 9 valem 0 a 9 e A a Z valem 17 a 42. Com pesos de 2 a 9 (da direita para a esquerda), soma-se, divide-se por 11 e o dígito é 0 se o resto for menor que 2, ou 11 menos o resto. O segundo dígito repete a conta incluindo o primeiro.

Este validador só verifica a regra matemática. Ele não consulta a Receita Federal, então não informa se a empresa existe, se está ativa ou qual é a razão social.

## Em código

Para validar CNPJ no seu sistema, este código aceita o formato numérico e o alfanumérico e confere os dois dígitos verificadores.

```javascript
function validarCNPJ(valor) {
  const cnpj = String(valor).toUpperCase().replace(/[^0-9A-Z]/g, '');
  if (!/^[0-9A-Z]{12}[0-9]{2}$/.test(cnpj)) return false; // 12 caracteres + 2 dígitos
  if (/^(.)\1{13}$/.test(cnpj)) return false; // todos os caracteres iguais

  // Valor de cada caractere: código ASCII menos 48
  // ('0' a '9' valem 0 a 9, 'A' vale 17, 'B' vale 18...)
  const valorDoCaractere = (c) => c.charCodeAt(0) - 48;

  // Módulo 11 com pesos de 2 a 9, da direita para a esquerda
  const digito = (base) => {
    let soma = 0;
    let peso = 2;
    for (let i = base.length - 1; i >= 0; i--) {
      soma += valorDoCaractere(base[i]) * peso;
      peso = peso === 9 ? 2 : peso + 1;
    }
    const resto = soma % 11;
    return resto < 2 ? 0 : 11 - resto;
  };

  const d1 = digito(cnpj.slice(0, 12));
  const d2 = digito(cnpj.slice(0, 13));
  return d1 === Number(cnpj[12]) && d2 === Number(cnpj[13]);
}
```

_JavaScript_

```python
import re


def validar_cnpj(valor: str) -> bool:
    cnpj = re.sub(r"[^0-9A-Z]", "", str(valor).upper())
    if not re.fullmatch(r"[0-9A-Z]{12}[0-9]{2}", cnpj):
        return False  # 12 caracteres + 2 dígitos
    if len(set(cnpj)) == 1:
        return False  # todos os caracteres iguais

    def digito(base: str) -> int:
        # Valor do caractere: ASCII menos 48. Pesos de 2 a 9, da direita para a esquerda
        soma, peso = 0, 2
        for caractere in reversed(base):
            soma += (ord(caractere) - 48) * peso
            peso = 2 if peso == 9 else peso + 1
        resto = soma % 11
        return 0 if resto < 2 else 11 - resto

    return digito(cnpj[:12]) == int(cnpj[12]) and digito(cnpj[:13]) == int(cnpj[13])
```

_Python_

```php
<?php
function validarCnpj(string $valor): bool
{
    $cnpj = preg_replace('/[^0-9A-Z]/', '', strtoupper($valor));
    if (!preg_match('/^[0-9A-Z]{12}[0-9]{2}$/', $cnpj) || preg_match('/^(.)\1{13}$/', $cnpj)) {
        return false; // formato errado ou todos os caracteres iguais
    }

    // Valor do caractere: ASCII menos 48. Pesos de 2 a 9, da direita para a esquerda
    $digito = function (string $base): int {
        $soma = 0;
        $peso = 2;
        for ($i = strlen($base) - 1; $i >= 0; $i--) {
            $soma += (ord($base[$i]) - 48) * $peso;
            $peso = $peso === 9 ? 2 : $peso + 1;
        }
        $resto = $soma % 11;
        return $resto < 2 ? 0 : 11 - $resto;
    };

    return $digito(substr($cnpj, 0, 12)) === (int) $cnpj[12]
        && $digito(substr($cnpj, 0, 13)) === (int) $cnpj[13];
}
```

_PHP_

## Perguntas frequentes

### Validar um CNPJ confirma que a empresa existe?

Não. A validação confere apenas o formato e os dígitos verificadores. Para saber a situação cadastral de uma empresa, é preciso consultar a Receita Federal.

### Este validador aceita CNPJ com letras?

Sim. Ele aceita o novo CNPJ alfanumérico da Receita Federal, com letras nas 12 primeiras posições e dígitos verificadores numéricos, além do CNPJ numérico tradicional.

### Preciso digitar pontos, barra e traço?

Não. O campo aceita o CNPJ com ou sem pontuação.

### O CNPJ que eu digito é enviado a algum servidor?

Não. A conferência é feita no seu navegador, e o número não é enviado nem armazenado pelo PraDev.

## Fontes

- [Receita Federal: perguntas e respostas sobre o CNPJ alfanumérico](https://www.gov.br/receitafederal/pt-br/centrais-de-conteudo/publicacoes/perguntas-e-respostas/cnpj/cnpj-alfanumerico.pdf)

## Guias

- [Máscara de CPF, CNPJ, CEP e telefone em JavaScript](https://pradev.com.br/guias/mascara-cpf-cnpj-cep-telefone-javascript): Máscaras de CPF, CNPJ (inclusive alfanumérico), CEP e telefone em JavaScript puro, aplicadas enquanto a pessoa digita, e a formatação em Python e PHP.
- [CNPJ alfanumérico: o que muda e como validar em código](https://pradev.com.br/guias/cnpj-alfanumerico-como-validar): Entenda o CNPJ alfanumérico (letras e números), o que muda para quem desenvolve e veja funções testadas para validar em JavaScript, Python e PHP.

## Ferramentas relacionadas

- [Gerador de CNPJ](https://pradev.com.br/gerador-de-cnpj): Gere CNPJ válido para testes, no formato numérico ou no novo alfanumérico da Receita Federal. Grátis, direto no navegador.
- [Validador de CPF](https://pradev.com.br/validador-de-cpf): Confira se um CPF é válido pelo cálculo dos dígitos verificadores. Grátis, sem cadastro, e o número não sai do seu navegador.
- [Gerador de CPF](https://pradev.com.br/gerador-de-cpf): Gere CPF válido para testar sistemas e formulários. Grátis, com ou sem pontuação, direto no navegador. Só para testes de software.
- [Gerador de CNH](https://pradev.com.br/gerador-de-cnh): Gere número de CNH válido para testar sistemas e formulários. Os dois dígitos verificadores estão certos. Grátis, no navegador, só para testes.
- [Gerador de Pessoas](https://pradev.com.br/gerador-de-pessoas): Gere pessoas fictícias com nome, CPF válido, nascimento, e-mail, celular e endereço para testar sistemas. Exporta JSON e CSV. Grátis, no navegador.
- [Gerador de PIS/PASEP](https://pradev.com.br/gerador-de-pis-pasep): Gere número de PIS, PASEP, NIS ou NIT válido para testar sistemas de RH e cadastros. Com ou sem pontuação, grátis, no navegador, só para testes.
