Pular para o conteúdo
cnpj/ob

CNPJ alfanumérico: o que muda e como adaptar seu sistema

Desde julho de 2026 a Receita Federal pode emitir CNPJs com letras. Os antigos continuam iguais, mas qualquer sistema que trate CNPJ como número vai recusar os novos. Veja o formato, a conta dos dígitos verificadores e o que revisar no código.

← Blog · DesenvolvimentoBlog do cnpj/ob

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, NUMERIC ou INTEGER não guarda letras. Use texto de tamanho fixo (CHAR(14) ou VARCHAR(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" ou inputmode="numeric" impedem a digitação de letras. Use type="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

  1. Procure no código por \d{14}, replace(/\D/g, parseInt e conversões de CNPJ para número.
  2. Revise o tipo da coluna de CNPJ em todas as tabelas e nas tabelas de integração.
  3. Troque a validação pela versão acima e rode os testes com CNPJs dos dois formatos.
  4. Teste o formulário digitando letras, com e sem pontuação.
  5. 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