
Técnico
Por Dionys Erlich · 13 de setembro de 2026
Desenvolvedor independente e especialista em documentos fiscais eletrônicos.
Em 31 de julho de 2026, a Receita Federal emitiu o primeiro CNPJ alfanumérico do país: 00.000.000/E08G-12, uma filial do Banco do Brasil. Não foi um teste, não foi um piloto em ambiente de homologação. É um CNPJ real, válido, que pode aparecer como emitente ou destinatário em qualquer NF-e a partir de agora.
Se o seu sistema lê, grava, valida ou imprime nota fiscal eletrônica, essa mudança importa mais do que parece. E não é pelo motivo óbvio.
O motivo óbvio é que o CNPJ passou a ter letras. Isso todo mundo já leu. O motivo menos comentado, e bem mais perigoso, é que a chave de acesso da NF-e deixou de ser uma sequência de 44 números. Ela continua com 44 posições, mas agora pode conter letras no meio. Toda validação, máscara, coluna de banco e código de barras que assume "44 dígitos numéricos" está tecnicamente errado desde 1º de julho de 2026.
Este artigo cobre o que mudou, o algoritmo exato do dígito verificador (com código testado contra casos reais), e um checklist do que costuma quebrar. É um texto técnico, mas escrito para ser útil também para quem não programa.
O CNPJ alfanumérico foi criado pela Instrução Normativa RFB nº 2.229, de 15 de outubro de 2024, que alterou a IN RFB nº 2.119/2022. A motivação declarada pela Receita é simples e nada polêmica: a demanda por novos números de CNPJ vem crescendo e o espaço de combinações puramente numéricas tem limite. Adicionar letras multiplica as combinações possíveis e evita o esgotamento.
O formato continua com 14 posições e a mesma máscara visual de sempre:
AA.AAA.AAA/AAAA-DVOnde:
Quatro pontos que evitam a maior parte da confusão:
Um detalhe que passa batido e que já vi gerar discussão em equipe: a Receita afirma no material oficial de perguntas e respostas que o sufixo 0001, tradicionalmente associado à matriz, continua indicando a matriz no momento da geração, mas deixa de ser um identificador definitivo. Com o tempo, uma filial pode se tornar o estabelecimento principal mantendo um número de ordem diferente. Se o seu sistema decide "é matriz" olhando para 0001, essa regra já estava frágil e agora está oficialmente obsoleta.

Aqui está o ponto central deste artigo.
A chave de acesso da NF-e tem 44 posições, e as posições 7 a 20 são exatamente o CNPJ do emitente. Se o CNPJ pode ter letras, a chave também pode.
A composição campo a campo continua idêntica:
Campo | Posições | Tamanho | Conteúdo |
|---|---|---|---|
| 1 a 2 | 2 | Código IBGE da UF |
| 3 a 6 | 4 | Ano e mês da emissão |
| 7 a 20 | 14 | CNPJ do emitente (pode ter letras) |
| 21 a 22 | 2 | Modelo (55 = NF-e, 65 = NFC-e) |
| 23 a 25 | 3 | Série |
| 26 a 34 | 9 | Número da nota |
| 35 | 1 | Tipo de emissão |
| 36 a 43 | 8 | Código numérico aleatório |
| 44 | 1 | Dígito verificador da chave |
Como os dois últimos caracteres do CNPJ são sempre numéricos, o padrão da chave passou de [0-9]{44} para:
[0-9]{6}[A-Z0-9]{12}[0-9]{26}Ou seja: 6 numéricos, 12 possivelmente alfanuméricos, 26 numéricos. Total de 44.
Um exemplo concreto, montado e validado para este artigo a partir do CNPJ de exemplo da própria Receita (12.ABC.345/01DE-35), nota modelo 55, série 001, número 1234, emitida em São Paulo em setembro de 2026:
35260912ABC34501DE35550010000012341123456788Repare no que acontece se você jogar essa chave nas validações tradicionais:
const chave = "35260912ABC34501DE35550010000012341123456788";
console.log(/^[0-9]{44}$/.test(chave)); // false, rejeita chave válida
console.log(/^[0-9]{6}[A-Z0-9]{12}[0-9]{26}$/.test(chave)); // true
console.log(chave.replace(/\D/g, "").length); // 39, silenciosamenteA primeira linha é um problema visível: a nota é rejeitada e alguém abre chamado. A terceira linha é o problema de verdade. replace(/\D/g, "") é o idioma mais comum do mundo para "limpar" um documento antes de gravar, e com CNPJ alfanumérico ele não lança erro, não avisa nada: apenas apaga as letras e devolve uma string de 39 caracteres que o sistema vai gravar, comparar e provavelmente exibir como se fosse legítima. É corrupção silenciosa de dado fiscal, o pior tipo de bug para descobrir seis meses depois.
Vale dizer que encontrei exatamente esse padrão no código deste próprio projeto ao pesquisar para escrever o artigo. Não estou apontando dedo para ninguém: é um idioma tão automático que ninguém revisa.

Essa é a melhor notícia técnica da mudança, e é a parte que mais vejo sendo explicada de forma desnecessariamente complicada.
A regra de conversão definida pela Receita é: cada caractere vale o seu código ASCII menos 48.
Isso significa que:
'0' tem ASCII 48, então vale 48 - 48 = 0'9' tem ASCII 57, então vale 57 - 48 = 9'A' tem ASCII 65, então vale 65 - 48 = 17'Z' tem ASCII 90, então vale 90 - 48 = 42Perceba a elegância: para os dígitos de 0 a 9, ASCII menos 48 devolve exatamente o próprio valor numérico. O algoritmo antigo é um caso particular do novo. Você não precisa de duas funções, nem de um if para detectar se o CNPJ tem letras. Precisa de uma função só, e ela valida corretamente tanto os CNPJs legados quanto os novos.
O resto do cálculo é o módulo 11 de sempre:
11 - restoEm JavaScript:
function digitosVerificadoresCnpj(base12) {
const base = base12.toUpperCase()
const valor = (c) => c.charCodeAt(0) - 48
const calcular = (str) => {
let soma = 0
let peso = 2
for (let i = str.length - 1; i >= 0; i--) {
soma += valor(str[i]) * peso
peso = peso === 9 ? 2 : peso + 1
}
const resto = soma % 11
return resto < 2 ? 0 : 11 - resto
}
const dv1 = calcular(base)
const dv2 = calcular(base + String(dv1))
return `${dv1}${dv2}`
}E para o dígito verificador da chave de acesso, que fica na posição 44, a lógica é a mesma sobre os 43 primeiros caracteres:
function dvChaveAcesso(chave43) {
const s = chave43.toUpperCase()
let soma = 0
let peso = 2
for (let i = s.length - 1; i >= 0; i--) {
soma += (s.charCodeAt(i) - 48) * peso
peso = peso === 9 ? 2 : peso + 1
}
const resto = soma % 11
return resto < 2 ? 0 : 11 - resto
}Antes de publicar, rodei essas funções contra casos reais para não propagar código errado pela internet. Os resultados:
Entrada | Esperado | Calculado | Origem do caso |
|---|---|---|---|
|
|
| Exemplo oficial do Serpro e da Receita Federal |
|
|
| Primeiro CNPJ alfanumérico real emitido |
|
|
| CNPJ legado numérico (Banco do Brasil matriz) |
|
|
| CNPJ legado numérico (Petrobras matriz) |
Chaves de NF-e reais, 44 posições numéricas | DV da chave | confere | XMLs de teste do projeto |
Os dois últimos casos numéricos são o ponto importante: confirmam na prática que a mesma função atende o formato antigo, sem ramificação condicional. Se a sua implementação nova quebrar CNPJs legados, tem erro nela, não na especificação.
Um detalhe de implementação: normalize para maiúsculas antes de calcular. A especificação só prevê letras maiúsculas, mas dados chegam de formulário, planilha e integração de terceiro. Um 'a' tem ASCII 97, o que daria valor 49 e um dígito verificador silenciosamente errado.
Com base na especificação e no que já apareceu em código real, esta é a lista que uso para revisar um sistema:
Validação e formatação
^\d{14}$, ^[0-9]{14}$, ^\d{44}$ para CNPJ e chavereplace(/\D/g, "") ou replace(/[^0-9]/g, "") aplicado a CNPJ ou chave(\d{2})(\d{3}) e similaresBanco de dados
INTEGER, BIGINT, NUMERIC ou DECIMALDocumentos e impressão
Regras de negócio
0001
Data | Marco |
|---|---|
15/10/2024 | Publicação da IN RFB nº 2.229/2024, que altera a IN RFB nº 2.119/2022 e cria o formato alfanumérico |
06/04/2026 | Ambiente de homologação dos DF-e adaptado, conforme a NT Conjunta 2025.001 |
15/06/2026 | Homologação dos schemas de NF-e e NFC-e, conforme a NT 2026.004 (a versão 1.01, de 08/06/2026, adiou a data original de 1º de junho) |
01/07/2026 a 06/07/2026 | Entrada em produção do suporte a CNPJ alfanumérico nos documentos fiscais eletrônicos |
31/07/2026 | Emissão do primeiro CNPJ alfanumérico real: |
A NT Conjunta 2025.001 não vale só para a NF-e. Ela padroniza o CNPJ alfanumérico em praticamente todo o ecossistema de documentos fiscais eletrônicos: NF-e, NFC-e, CT-e, CT-e OS, GTV-e, MDF-e, BP-e, BP-e TM, NF3-e e NFCom, além dos novos documentos que a Reforma Tributária está criando. Se você integra com mais de um tipo de DF-e, a mudança é transversal.
A adoção, segundo a própria Receita, é progressiva e controlada: poucas empresas recebem CNPJ com letras no início. Na prática, isso significa que o seu sistema pode passar meses sem encontrar um único CNPJ alfanumérico e, quando encontrar, falhar em produção sem aviso. É o pior cenário possível para bugs desse tipo, porque a ausência de erro hoje não é evidência de que está funcionando.
São duas mudanças independentes que caíram quase juntas, e é comum ver as duas misturadas na mesma conversa. Vale separar:
Uma não depende da outra. Mas elas se encontram no mesmo lugar: o XML da sua nota fiscal. Se você vai mexer no parser mesmo assim, faz sentido tratar as duas frentes na mesma janela de trabalho.
Se a segunda frente ainda não está clara para você, temos material dedicado:
Três caminhos práticos, do mais simples ao mais completo:
12.ABC.345/01DE-35, como dado de teste fixo na sua suíte. Ele tem dígito verificador oficialmente correto, então serve como caso de referência confiável.Se você quiser só conferir como uma DANFE se comporta com um XML real em mãos, dá para gerar o documento aqui mesmo, sem instalar nada: a DANFE Completa monta o PDF a partir do XML direto no navegador, e a página de consulta de NF-e pela chave de acesso ajuda a recuperar o XML quando você só tem a chave em mãos.
Vou ser direto sobre o que acho dessa mudança, separando o que é técnico do que é opinião.
Tecnicamente, a especificação é boa. A escolha de ASCII menos 48 como regra de conversão é a decisão mais inteligente do desenho todo, e acho que ela não recebeu o crédito que merece. Ela faz o algoritmo novo conter o antigo como caso particular, o que significa que ninguém precisa manter dois validadores, nem escrever lógica condicional para detectar formato, nem migrar base histórica. Quem implementa direito escreve uma função e ela atende os dois mundos. Muita especificação pública brasileira não tem esse cuidado, e essa tem.
Na prática, minha preocupação é outra: o modo de falha. A adoção gradual significa que a maioria dos sistemas vai passar meses sem ver um CNPJ alfanumérico. Equipe nenhuma prioriza uma correção para um cenário que nunca aconteceu. Aí, num dia qualquer, chega a primeira nota de um fornecedor novo e o sistema quebra, ou pior, não quebra: apenas grava uma string truncada porque alguém escreveureplace(/\D/g, "")em 2019 e ninguém revisou desde então. Quando esse bug aparecer, ele vai aparecer em dado fiscal já gravado, não em tela de erro.
A parte que eu chamo de mal calibrada é a comunicação, não a norma. A maior parte do conteúdo que encontrei sobre o tema para em "o CNPJ vai ter letras" e no cronograma. Pouquíssimo material diz com todas as letras que a chave de acesso da NF-e deixou de ser numérica, que existe um problema específico de código de barras porque CODE-128C não aceita letra, ou que a regra do sufixo0001como identificador de matriz caiu. Esses três pontos estão nos documentos oficiais, mas exigem ler a nota técnica e o material de perguntas e respostas até o fim. Quem depende de resumo de portal vai descobrir em produção.
Minha recomendação concreta, na ordem em que eu faria: primeiro, adicione o CNPJ de exemplo da Receita como caso fixo na suíte de testes, porque isso transforma um risco invisível em um teste que passa ou falha. Segundo, faça umgrepno projeto inteiro por\d{14},\d{44}ereplace(/\D/ge revise cada ocorrência relacionada a documento fiscal. Terceiro, confira o tipo das colunas de CNPJ e chave no banco, porque essa é a correção mais cara de fazer depois que tem volume gravado. As três primeiras coisas cabem numa tarde e cobrem a maior parte do risco real.
E uma observação honesta para fechar: ao pesquisar para escrever este artigo, encontrei esse mesmo padrão de código no projeto que mantenho. A formatação do CNPJ degrada de forma inofensiva, mostra o número sem máscara, mas o agrupamento visual da chave de acesso quebra de verdade com letras. Se aconteceu aqui, num projeto cujo assunto é literalmente documento fiscal eletrônico, provavelmente está acontecendo no seu também. Vale os quinze minutos degrep.
Meu CNPJ atual vai mudar? Não. CNPJs já emitidos permanecem exatamente os mesmos, com os mesmos dígitos verificadores, e continuam válidos indefinidamente. Não há nenhuma providência a tomar junto à Receita Federal.
O CNPJ alfanumérico tem quantos caracteres? Catorze, exatamente como o numérico, e com a mesma máscara AA.AAA.AAA/AAAA-DV. O que muda é que as 12 primeiras posições aceitam letras, enquanto as duas últimas seguem numéricas.
A chave de acesso da NF-e continua com 44 posições? Sim, o tamanho não mudou. O que mudou é que ela deixou de ser exclusivamente numérica: as posições 7 a 20 carregam o CNPJ do emitente e podem conter letras.
Preciso de dois algoritmos de validação, um para cada formato? Não. Com a regra de converter cada caractere para ASCII menos 48, o mesmo cálculo de módulo 11 atende os dois formatos. Validei isso contra CNPJs legados reais e contra o exemplo oficial da Receita.
O CNPJ alfanumérico pode ter letras minúsculas? Não. A especificação prevê apenas letras maiúsculas de A a Z. Normalize a entrada para maiúsculas antes de validar, porque o cálculo do dígito verificador dá resultado errado com minúsculas.
As letras do CNPJ significam alguma coisa? Não. A Receita Federal afirma que a atribuição é completamente aleatória e que não há relação com UF, natureza jurídica ou qualquer outro atributo da empresa.
Os exemplos de código e a chave de acesso usada neste artigo foram executados e conferidos contra o exemplo oficial da Receita Federal e do Serpro, contra o primeiro CNPJ alfanumérico realmente emitido e contra chaves de NF-e numéricas reais, antes da publicação.