O que mudou
A Instrução Normativa RFB nº 2.229/2024 criou o CNPJ alfanumérico, usado nas inscrições novas a partir de julho de 2026. O número continua com 14 posições, mas as 12 primeiras podem ter letras:
- 8 primeiras posições (raiz): letras maiúsculas ou números.
- 4 posições seguintes (ordem: matriz ou filial): letras maiúsculas ou números.
- 2 últimas (dígitos verificadores): continuam sendo só números.
Exemplo oficial: 12.ABC.345/01DE-35. A máscara de pontuação é a mesma de sempre.
Os CNPJs já existentes não mudam. Uma empresa aberta em 2010 continua com o mesmo número. O que muda é que, a partir de agora, o seu sistema vai receber os dois formatos misturados.
Como calcular os dígitos verificadores
A conta é o mesmo módulo 11 de sempre. A única novidade é o valor de cada caractere: o código ASCII menos 48. Para números nada muda ("0" vale 0, "9" vale 9). Letras passam a valer de 17 a 42: A = 17, B = 18 … Z = 42.
Passo a passo com o exemplo oficial 12ABC34501DE:
Primeiro dígito. Pesos 5 4 3 2 9 8 7 6 5 4 3 2:
1×5 + 2×4 + A(17)×3 + B(18)×2 + C(19)×9 + 3×8 + 4×7 + 5×6 + 0×5 + 1×4 + D(20)×3 + E(21)×2
= 5 + 8 + 51 + 36 + 171 + 24 + 28 + 30 + 0 + 4 + 60 + 42 = 459
459 mod 11 = 8 → 11 − 8 = 3
Segundo dígito. Acrescente o 3 ao final e use os pesos 6 5 4 3 2 9 8 7 6 5 4 3 2:
soma = 424
424 mod 11 = 6 → 11 − 6 = 5
Resultado: 35. Se o resto for 0 ou 1, o dígito é 0, como antes.
Quer conferir um número sem escrever código? Use o validador de CNPJ, que mostra essa conta para qualquer CNPJ, numérico ou alfanumérico.
Código de validação
JavaScript:
function validarCnpj(entrada) {
const c = String(entrada).toUpperCase().replace(/[^0-9A-Z]/g, "");
if (!/^[0-9A-Z]{12}[0-9]{2}$/.test(c) || /^(.)\1{13}$/.test(c)) return false;
const valor = (ch) => ch.charCodeAt(0) - 48;
const dv = (base, pesos) => {
const resto = pesos.reduce((s, p, i) => s + valor(base[i]) * p, 0) % 11;
return resto < 2 ? 0 : 11 - resto;
};
const d1 = dv(c, [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]);
const d2 = dv(c.slice(0, 12) + d1, [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]);
return c.endsWith(`${d1}${d2}`);
}
validarCnpj("12.ABC.345/01DE-35"); // true
validarCnpj("11.222.333/0001-81"); // true (formato antigo continua válido)
Python:
import re
def validar_cnpj(entrada: str) -> bool:
c = re.sub(r"[^0-9A-Z]", "", str(entrada).upper())
if not re.fullmatch(r"[0-9A-Z]{12}[0-9]{2}", c) or len(set(c)) == 1:
return False
def dv(base, pesos):
resto = sum((ord(ch) - 48) * p for ch, p in zip(base, pesos)) % 11
return 0 if resto < 2 else 11 - resto
d1 = dv(c, [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2])
d2 = dv(c[:12] + str(d1), [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2])
return c.endswith(f"{d1}{d2}")
O que revisar no seu sistema
- Banco de dados: coluna de CNPJ em
BIGINT,NUMERICouINTEGERnão guarda letras. Use texto de tamanho fixo (CHAR(14)ouVARCHAR(14)) e grave sem pontuação, em maiúsculas. Cuidado com campos numéricos que hoje perdem o zero à esquerda: isso já era um bug com o formato antigo. - Validação: troque expressões como
^\d{14}$por^[0-9A-Z]{12}[0-9]{2}$e use o cálculo acima. Normalize para maiúsculas antes de validar. - Formulários e máscaras: campos com
type="number"ouinputmode="numeric"impedem a digitação de letras. Usetype="text", aceite letras e converta para maiúsculas enquanto o usuário digita. - Chaves e ordenação: se o CNPJ é chave de cache, nome de arquivo ou parte de uma URL, garanta que todos os pontos normalizam da mesma forma (sem pontuação, maiúsculas). Ordenação textual mistura números e letras:
"9"vem antes de"A". - Integrações: confirme com cada fornecedor (ERP, emissor de nota, banco, gateway de pagamento) se ele já aceita o formato novo. Um único elo que converte CNPJ para número quebra o fluxo inteiro.
- Testes: inclua CNPJs alfanuméricos nos testes automatizados. O gerador de CNPJ cria números válidos nos dois formatos, sem pertencer a nenhuma empresa.
E a API do cnpj/ob?
A API do cnpj/ob aceita os dois formatos. Envie o CNPJ com ou sem pontuação, em maiúsculas ou minúsculas: a API normaliza para 14 posições em maiúsculas e valida os dígitos verificadores pela regra nova. Vale para a consulta, a consulta em lote, a validação, a busca de sócio pessoa jurídica e os monitores. CNPJs antigos funcionam do mesmo jeito.
Um checklist rápido
- Procure no código por
\d{14},replace(/\D/g,parseInte conversões de CNPJ para número. - Revise o tipo da coluna de CNPJ em todas as tabelas e nas tabelas de integração.
- Troque a validação pela versão acima e rode os testes com CNPJs dos dois formatos.
- Teste o formulário digitando letras, com e sem pontuação.
- Pergunte a cada integração externa se ela já aceita o formato novo.
Perguntas frequentes
Meu CNPJ vai mudar?
Não. Os CNPJs já emitidos continuam com o mesmo número. O formato alfanumérico vale para inscrições novas.
Os dígitos verificadores podem ter letras?
Não. Só as 12 primeiras posições podem ter letras. Os 2 dígitos finais continuam numéricos.
Letras minúsculas são aceitas?
O CNPJ usa letras maiúsculas. Ao receber o número de um usuário, converta para maiúsculas antes de validar e gravar.
A conta dos dígitos mudou para CNPJs antigos?
Não. Como cada número continua valendo ele mesmo (ASCII − 48), um CNPJ só de números dá exatamente o mesmo resultado de antes.
Teste seus dadosValide qualquer CNPJ com a conta passo a passo, ou gere CNPJs alfanuméricos para os seus testes.
Abrir o validador