Atualizado em 02/08/2026: o primeiro CNPJ alfanumérico do Brasil já existe. A Receita Federal anunciou a emissão de
00.000.000/E08G-12, uma filial do Banco do Brasil. O assunto deixou de ser preparação para uma data futura: o formato está em produção e passa a circular em cadastros, integrações e documentos fiscais. Se o seu sistema ainda valida CNPJ com^\d{14}$, ele já está rejeitando um documento válido — a seção "Impacto em sistemas existentes", mais abaixo, é o roteiro do que revisar.Atualizações anteriores — 10/03/2026: a Nota Técnica ENCAT 2025.001 confirmou as datas de homologação (06/04/2026) e produção (06/07/2026) para os documentos fiscais eletrônicos, e a Receita sinalizou rollout gradual, começando por grandes empresas.
A Receita Federal publicou em outubro de 2024 a Instrução Normativa RFB nº 2.229/2024, determinando que a partir de julho de 2026, novas inscrições no CNPJ passariam a incluir caracteres alfanuméricos — letras de A a Z além dos dígitos de 0 a 9. O prazo venceu: o primeiro CNPJ alfanumérico já foi emitido.
A mudança não afeta CNPJs já existentes. Se a sua empresa tem CNPJ 12.345.678/0001-95, ele continua exatamente assim. O novo formato vale apenas para novas inscrições a partir da data de corte.
O motivo é prático: o sistema numérico atual suporta cerca de 100 milhões de combinações. Com aproximadamente 60 milhões de registros ativos e cerca de 6 milhões de novas empresas por ano, o esgotamento das combinações disponíveis é uma questão de poucos anos. A introdução de letras expande o espaço de endereçamento para bilhões de combinações.
Este artigo aborda o tema sob a ótica do desenvolvedor: o que muda no formato, como calcular o novo dígito verificador, o que revisar nos seus sistemas e código funcional para validação.
O que muda no formato
O CNPJ continua com 14 posições — o mesmo tamanho de sempre. A diferença está no conjunto de caracteres aceitos em cada grupo de posições:
| Posições | Função | Formato atual | Formato novo |
|---|---|---|---|
| 1–8 | Raiz (identificação) | Somente dígitos (0–9) | Alfanumérico (0–9, A–Z) |
| 9–12 | Ordem do estabelecimento | Somente dígitos (0–9) | Alfanumérico (0–9, A–Z) |
| 13–14 | Dígitos verificadores | Somente dígitos (0–9) | Somente dígitos (0–9) |
Na prática, as 12 primeiras posições passam a aceitar letras maiúsculas, enquanto os dois dígitos verificadores permanecem numéricos.
A máscara de exibição com pontos, barra e hífen segue o mesmo padrão — o que muda é o conteúdo de cada posição.
Letras aceitas
Há indicações em discussões técnicas do ENCAT de que algumas letras podem ser excluídas do conjunto permitido (possivelmente I, O, U, Q e F, para evitar confusão visual). Até a data de publicação deste artigo, a Receita Federal não confirmou oficialmente a lista restrita. A recomendação é codificar de forma defensiva: aceitar A–Z por enquanto e ajustar quando a lista definitiva for publicada.
Acompanhe a página oficial da RFB: CNPJ Alfanumérico.
Novo cálculo do dígito verificador
O cálculo do dígito verificador continua usando Módulo 11 com pesos de 2 a 9 — o mesmo algoritmo conceitual dos CNPJs numéricos. A diferença é como cada caractere é convertido para valor numérico antes da multiplicação.
Regra de conversão
Cada caractere (dígito ou letra) é convertido pelo seu valor decimal ASCII subtraído de 48:
Valor para DV = código ASCII do caractere − 48
Isso produz a seguinte tabela:
| Caractere | ASCII | Valor DV |
|---|---|---|
0 |
48 | 0 |
1 |
49 | 1 |
2 |
50 | 2 |
| ... | ... | ... |
9 |
57 | 9 |
A |
65 | 17 |
B |
66 | 18 |
C |
67 | 19 |
| ... | ... | ... |
Z |
90 | 42 |
O detalhe elegante dessa abordagem: para CNPJs numéricos, ord('0') - 48 = 0, ord('1') - 48 = 1, etc. — ou seja, a conversão reproduz o comportamento atual. O novo algoritmo é retrocompatível por design.
Passo a passo com exemplo
Usando o CNPJ alfanumérico fictício 12ABC34501DE (exemplo da documentação oficial do SERPRO):
Primeiro dígito verificador:
- Converter cada caractere para o valor DV:
CNPJ: 1 2 A B C 3 4 5 0 1 D E
Valor: 1 2 17 18 19 3 4 5 0 1 20 21
- Distribuir pesos de 2 a 9 da direita para a esquerda (reiniciando após o 9):
Peso: 5 4 3 2 9 8 7 6 5 4 3 2
- Multiplicar valor × peso e somar:
5 + 8 + 51 + 36 + 171 + 24 + 28 + 30 + 0 + 4 + 60 + 42 = 459
- Calcular o resto:
459 % 11 = 8 - Como o resto é ≥ 2: 1º DV = 11 − 8 = 3
Segundo dígito verificador:
Repetir o processo incluindo o primeiro DV como 13º caractere:
CNPJ: 1 2 A B C 3 4 5 0 1 D E 3
Valor: 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
Somatório: 6 + 10 + 68 + 54 + 38 + 27 + 32 + 35 + 0 + 5 + 80 + 63 + 6 = 424
Resto: 424 % 11 = 6 → 2º DV = 11 − 6 = 5
Resultado final: 12.ABC.345/01DE-35
Se o resto for 0 ou 1, o dígito verificador é 0 (zero).
Impacto em sistemas existentes
A mudança é simples em conceito, mas o impacto depende de quantos pontos do seu sistema tocam em campos de CNPJ. Abaixo, os principais pontos de atenção.
Banco de dados
Se o campo de CNPJ está armazenado como INT, BIGINT ou qualquer tipo numérico, ele precisa migrar para VARCHAR(14) ou CHAR(14). Sem essa mudança, o banco rejeita qualquer CNPJ com letras.
Para quem já usa VARCHAR ou TEXT, verifique se há constraints que rejeitam letras — um CHECK com regex do tipo ^\d{14}$ vai barrar os novos CNPJs. Índices criados sobre colunas numéricas podem ter comportamento diferente (collation, ordenação) ao migrar para string — vale testar a performance de queries críticas após a conversão.
Validação no código
A maioria dos sistemas valida CNPJ com regex como ^\d{14}$ ou ^\d{2}\.\d{3}\.\d{3}/\d{4}-\d{2}$. Ambos rejeitam letras.
A regex atualizada para o CNPJ sem máscara deve aceitar alfanuméricos nas 12 primeiras posições e dígitos nos 2 últimos:
^[A-Z0-9]{12}\d{2}$
Com máscara:
^[A-Z0-9]{2}\.[A-Z0-9]{3}\.[A-Z0-9]{3}/[A-Z0-9]{4}-\d{2}$
Além da regex, a função de cálculo do DV precisa ser atualizada para usar a conversão ASCII descrita na seção anterior.
Frontend e máscaras de input
Campos de formulário que formatam CNPJ com máscara (pontos, barra, hífen) geralmente só aceitam dígitos — a função de máscara costuma fazer um replace(/\D/g,'') que apaga as letras a cada tecla. É esse o defeito a corrigir: permitir [A-Z0-9] nas 12 primeiras posições do input.
Já o inputmode="numeric" é decisão de UX, não de correção. Ele apenas sugere qual teclado virtual o celular abre — não impede digitação nem colagem de letras num campo type="text". Mantê-lo favorece a maioria numérica e faz o CNPJ alfanumérico entrar por copiar/colar; trocá-lo por text torna o documento com letras digitável no celular, ao custo do teclado grande. Qualquer uma das duas funciona, desde que a máscara pare de descartar as letras — o que não funciona é consertar o teclado e deixar o replace no lugar.
Integrações
APIs que enviam ou recebem CNPJ precisam aceitar o novo formato. Isso inclui integrações com gateways de pagamento, emissores de nota fiscal (NF-e, NFS-e), sistemas bancários, CRMs e ERPs. Os schemas XML de documentos fiscais eletrônicos já foram atualizados pela SEFAZ para aceitar o formato alfanumérico. Vale lembrar que o mesmo leiaute da NF-e passa por outra virada em 2026 por conta da Reforma Tributária — os grupos de IBS/CBS e as novas regras do campo indIEDest, tratados em Inscrição Estadual e Reforma Tributária: o que muda em 03/08/2026.
Testes
A Receita Federal disponibilizou um Simulador Nacional de CNPJ Alfanumérico que gera CNPJs fictícios no novo formato. Use-o para criar dados de teste — e inclua CNPJs alfanuméricos na sua suíte automatizada agora, porque o formato já está em circulação.
A Nota Técnica ENCAT 2025.001 definiu que o ambiente de homologação das SEFAZs aceitaria CNPJs alfanuméricos a partir de 06 de abril de 2026, e o de produção a partir de 06 de julho de 2026 — ambas as datas já passaram.
Vale um aviso que só aparece na prática: cada sistema da cadeia se adequa no seu próprio ritmo. Portais governamentais com máscara de input em JavaScript, gateways de pagamento e ERPs podem continuar descartando as letras por um tempo, mesmo depois de a norma entrar em vigor. Se você integra com terceiros, vale testar cada um com um CNPJ alfanumérico em vez de presumir que a data resolveu.
Código: validando CNPJ alfanumérico
Abaixo, implementações funcionais em Python e JavaScript. Ambas aceitam CNPJ com ou sem máscara, suportam o formato numérico atual e o novo alfanumérico, e calculam os dois dígitos verificadores pelo Módulo 11 com conversão ASCII.
Python
import re
def validar_cnpj(cnpj: str) -> bool:
"""
Valida CNPJ numérico ou alfanumérico.
Aceita com ou sem máscara (pontos, barra, hífen).
"""
# Remove máscara
cnpj = re.sub(r'[.\-/]', '', cnpj).upper()
# 14 caracteres: 12 alfanuméricos + 2 dígitos
if not re.match(r'^[A-Z0-9]{12}\d{2}$', cnpj):
return False
# Rejeitar sequências uniformes (ex: "00000000000000")
if len(set(cnpj)) == 1:
return False
def char_value(c: str) -> int:
return ord(c) - 48
def calc_dv(chars: str, weights: list[int]) -> int:
total = sum(char_value(c) * w for c, w in zip(chars, weights))
remainder = total % 11
return 0 if remainder < 2 else 11 - remainder
# Primeiro DV: 12 caracteres, pesos [5,4,3,2,9,8,7,6,5,4,3,2]
weights_1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
dv1 = calc_dv(cnpj[:12], weights_1)
# Segundo DV: 13 caracteres, pesos [6,5,4,3,2,9,8,7,6,5,4,3,2]
weights_2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
dv2 = calc_dv(cnpj[:12] + str(dv1), weights_2)
return cnpj[-2:] == f"{dv1}{dv2}"
# Testes
assert validar_cnpj("12.ABC.345/01DE-35") == True # alfanumérico (exemplo SERPRO)
assert validar_cnpj("12ABC34501DE35") == True # sem máscara
assert validar_cnpj("11.222.333/0001-81") == True # numérico tradicional
assert validar_cnpj("11.222.333/0001-82") == False # DV inválido
assert validar_cnpj("00.000.000/0000-00") == False # sequência uniforme
print("Todos os testes passaram.")
JavaScript / Node.js
/**
* Valida CNPJ numérico ou alfanumérico.
* Aceita com ou sem máscara (pontos, barra, hífen).
* @param {string} cnpj
* @returns {boolean}
*/
function validarCnpj(cnpj) {
// Remove máscara
cnpj = cnpj.replace(/[.\-/]/g, "").toUpperCase();
// 14 caracteres: 12 alfanuméricos + 2 dígitos
if (!/^[A-Z0-9]{12}\d{2}$/.test(cnpj)) return false;
// Rejeitar sequências uniformes
if (new Set(cnpj).size === 1) return false;
const charValue = (c) => c.charCodeAt(0) - 48;
function calcDv(chars, weights) {
const total = chars
.split("")
.reduce((sum, c, i) => sum + charValue(c) * weights[i], 0);
const remainder = total % 11;
return remainder < 2 ? 0 : 11 - remainder;
}
const weights1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
const weights2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
const dv1 = calcDv(cnpj.slice(0, 12), weights1);
const dv2 = calcDv(cnpj.slice(0, 12) + dv1, weights2);
return cnpj.slice(-2) === `${dv1}${dv2}`;
}
// Testes
console.assert(validarCnpj("12.ABC.345/01DE-35") === true);
console.assert(validarCnpj("12ABC34501DE35") === true);
console.assert(validarCnpj("11.222.333/0001-81") === true);
console.assert(validarCnpj("11.222.333/0001-82") === false);
console.assert(validarCnpj("00.000.000/0000-00") === false);
console.log("Todos os testes passaram.");
cURL + API FonteData
Se você não quer manter a lógica de validação no seu sistema, pode delegar para uma API que já trata ambos os formatos. A FonteData aceita CNPJ alfanumérico em todas as consultas:
# Consulta com CNPJ alfanumérico — o exemplo usa o primeiro CNPJ
# alfanumérico emitido no Brasil, uma filial do Banco do Brasil
curl -H "X-API-Key: SUA_API_KEY" \
"https://app.fontedata.com/api/v1/consulta/cadastro-pj-basica?cnpj=00000000E08G12"
A resposta retorna os dados cadastrais completos do CNPJ, sem que o desenvolvedor precise implementar validação, conversão de formato ou tratamento de erro relacionado ao novo padrão. A API aceita tanto o formato numérico atual quanto o alfanumérico, com ou sem máscara.
Checklist de preparação
Resumo acionável para levar ao time de engenharia:
- Banco de dados: auditar campos de CNPJ — migrar tipos numéricos para
VARCHAR(14)ouCHAR(14), revisar constraints e índices - Regex de validação: atualizar para aceitar
[A-Z0-9]nas 12 primeiras posições - Cálculo do DV: implementar conversão via ASCII (
ord(char) - 48) ou adotar API que já suporta - Frontend: atualizar máscaras de input para aceitar letras maiúsculas, remover
inputmode="numeric"de campos de CNPJ - Integrações: verificar que APIs, webhooks e schemas XML aceitam caracteres alfanuméricos no campo de CNPJ
- Testes automatizados: incluir CNPJs alfanuméricos gerados pelo Simulador da RFB
- Monitoramento: acompanhar comunicados da RFB sobre a lista definitiva de letras aceitas
Conclusão
A migração para CNPJ alfanumérico é direta em conceito — letras entram no identificador, o cálculo do DV ganha uma conversão via ASCII, e o tamanho permanece o mesmo. O impacto real depende de quantos sistemas na sua stack tocam campos de CNPJ: banco de dados, validações, máscaras, integrações fiscais, gateways de pagamento.
Os primeiros CNPJs com letras já estão circulando, então não há mais o que antecipar — o que resta é descobrir onde o seu sistema quebra antes que um cliente descubra por você. O checklist acima cobre os pontos principais; comece pela auditoria do banco de dados e pelas funções de validação, que é onde o ^\d{14}$ costuma estar escondido.
Um detalhe que engana: o modo de falha mais comum não é um erro barulhento, é o silencioso. Um replace(/\D/g,'') não rejeita 00.000.000/E08G-12 — ele o transforma em 000000000812, um documento de 12 dígitos que segue adiante e vira erro em outro lugar, longe da causa. Procure pelos filtros de dígito, não só pelas validações.
A FonteData já suporta CNPJ alfanumérico em todas as consultas. Crie sua conta grátis e dobre sua primeira recarga — até R$ 500 em bônus, sem cartão para criar a conta.
Referências
Experimente a API da FonteData
Consulte dados empresariais e de pessoas via API — CNPJ, CPF, KYC, compliance e mais. Dobro da primeira recarga — até R$ 500 em bônus.
Criar conta gratuita →