← Voltar ao blog

CNPJ Alfanumérico: checklist completo para migrar antes de 01/07/2026

·9 min de leitura

Em 01/07/2026, o CNPJ passa a aceitar caracteres alfanuméricos. A mudança vem da Instrução Normativa RFB nº 2229/2024 e afeta qualquer sistema que valida, armazena ou processa CNPJ — banco de dados, APIs, formulários, ERPs. Este checklist cobre os pontos técnicos que precisam de atenção antes da virada.

O que muda no CNPJ a partir de 01/07/2026

Formato atual vs. formato alfanumérico

O CNPJ tem 14 posições: 8 dígitos de raiz, 4 de ordem e 2 dígitos verificadores. No formato atual, todas as 14 posições são numéricas. A partir de julho de 2026, as 8 posições da raiz podem conter letras maiúsculas além de números. Os 4 dígitos de ordem e os 2 verificadores continuam numéricos.

PosiçãoDescriçãoFormato atualFormato novo
1–8CNPJ raiz0–90–9, A–Z
9–12Ordem0–90–9
13–14Dígitos verificadores0–90–9

Quais caracteres serão permitidos

A IN RFB nº 2229/2024 prevê letras maiúsculas de A a Z nas posições da raiz. À data de publicação deste artigo, a Receita Federal não excluiu explicitamente vogais — portanto, trate todos os 26 caracteres como possíveis e implemente validação para [A-Z0-9]. Monitore o portal da Receita para atualizações antes de maio de 2026.

Retrocompatibilidade: CNPJs numéricos existentes não mudam

CNPJs emitidos antes da mudança permanecem válidos e não são renumerados. A base de CNPJs ativos estimada em 58 milhões (Receita Federal, 2024) continua intacta. O novo formato se aplica apenas a CNPJs emitidos a partir de julho de 2026.

Quem é obrigado a se adequar e até quando

Empresas que emitem ou recebem NF-e, NFS-e, CT-e

O leiaute de NF-e 4.0 aceita o CNPJ como string. Porém, sistemas que fazem parse do XML e armazenam o CNPJ em campo numérico quebram na primeira nota com letra. A SEFAZ publica cronograma próprio — acompanhe o Portal NF-e para atualizações de schema.

Instituições financeiras e o prazo BACEN

O BACEN exige adequação dos sistemas SPB e PIX até 01/07/2026. Isso inclui chaves PIX do tipo CNPJ, TED corporativa e registros de boleto. Consulte a Circular BACEN nº 3.978/2020 e os comunicados subsequentes para o cronograma detalhado.

Sistemas internos que validam CNPJ em cadastros

Qualquer sistema com campo de CNPJ em cadastro de cliente, fornecedor, funcionário (MEI) ou parceiro precisa ser revisado. Isso inclui CRMs, ERPs legados, sistemas de cobrança e pipelines de ETL.

Banco de dados — o que revisar

Colunas definidas como NUMERIC, INT ou BIGINT quebram primeiro

CNPJ armazenado como número é o erro mais comum em bases legadas. Uma coluna BIGINT não aceita AB00000000134 e lança exceção no INSERT. Audite com:

-- PostgreSQL: encontrar colunas com nome sugestivo e tipo numérico
SELECT table_name, column_name, data_type
FROM information_schema.columns
WHERE column_name ILIKE '%cnpj%'
  AND data_type IN ('integer', 'bigint', 'numeric', 'decimal');

Migração de tipo: VARCHAR(14) com CHECK constraint

-- PostgreSQL
ALTER TABLE empresas
  ALTER COLUMN cnpj TYPE VARCHAR(14) USING cnpj::text;

ALTER TABLE empresas
  ADD CONSTRAINT cnpj_formato
  CHECK (cnpj ~ '^[A-Z0-9]{12}[0-9]{2}$');

-- MySQL 8
ALTER TABLE empresas
  MODIFY COLUMN cnpj VARCHAR(14) NOT NULL,
  ADD CONSTRAINT chk_cnpj
  CHECK (cnpj REGEXP '^[A-Z0-9]{12}[0-9]{2}$');

-- SQL Server
ALTER TABLE empresas
  ALTER COLUMN cnpj NVARCHAR(14) NOT NULL;

ALTER TABLE empresas
  ADD CONSTRAINT chk_cnpj
  CHECK (cnpj LIKE '[A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][0-9][0-9][0-9][0-9][0-9][0-9]');

Índices e performance após mudança de tipo

Índices em colunas numéricas são mais compactos que em VARCHAR. Após a migração, monitore o plano de execução das queries que filtram por CNPJ. Em PostgreSQL, use btree com COLLATION "C" para evitar overhead de locale em strings.

Validação de CNPJ — o algoritmo muda

Como funciona o módulo-11 atual

O algoritmo multiplica cada dígito da raiz e da ordem por pesos decrescentes, soma os produtos, calcula o resto da divisão por 11 e deriva o dígito verificador. Funciona exclusivamente com valores numéricos.

Como o dígito verificador se comporta com alfanuméricos

No novo formato, cada caractere é convertido para um valor numérico antes do cálculo: dígitos mantêm seu valor ('0' = 0, '9' = 9) e letras recebem código ASCII - 48 ('A' = 17, 'B' = 18, ..., 'Z' = 42). O restante do algoritmo é idêntico ao atual.

Bibliotecas populares que ainda não suportam o novo formato

BibliotecaVersão atualSuporte alfanuméricoObservação
cpf-cnpj-validator1.0.3NãoValida apenas dígitos
cpfcnpj1.0.2NãoRemove não-dígitos antes
brvalidador2.1.0NãoFalha silenciosa com letras
@viannas/cnpj0.xNãoRegex exclui A–Z

Veja a comparação completa em /comparacao/fakeforge-vs-alternativas.

AVISO: não confie em atualizações automáticas dessas bibliotecas antes de testar. Uma lib que "suporta alfanumérico" pode validar o formato mas usar o algoritmo errado para os dígitos verificadores.

Como escrever sua própria validação até as libs atualizarem

// cnpj-alfanumerico.ts — compatível com Node.js 18+ e browsers modernos

function charToValue(c: string): number {
  // '0'–'9': ASCII 48–57 → valores 0–9
  // 'A'–'Z': ASCII 65–90 → valores 17–42
  return c.charCodeAt(0) - 48;
}

function calcDigit(cnpj: string, weights: number[]): number {
  let sum = 0;
  for (let i = 0; i < weights.length; i++) {
    sum += charToValue(cnpj[i]) * weights[i];
  }
  const remainder = sum % 11;
  return remainder < 2 ? 0 : 11 - remainder;
}

export function validarCNPJAlfanumerico(raw: string): boolean {
  const cnpj = raw.replace(/[.\-/]/g, '').toUpperCase();

  if (cnpj.length !== 14) return false;
  if (!/^[A-Z0-9]{12}[0-9]{2}$/.test(cnpj)) return false;

  // Rejeita sequências homogêneas
  if (/^(.)\1+$/.test(cnpj)) return false;

  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 d1 = calcDigit(cnpj, weights1);
  const d2 = calcDigit(cnpj, weights2);

  return parseInt(cnpj[12]) === d1 && parseInt(cnpj[13]) === d2;
}

Use o validador de CNPJ do FakeForge BR para conferir resultados enquanto você desenvolve a função.

APIs e integrações — pontos de falha mais comuns

Regex de validação em campos de formulário e payloads JSON

O regex ^\d{14}$ falha em CNPJs alfanuméricos. Substitua:

// Antes (numérico apenas)
const cnpjRegex = /^\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}$/;

// Depois (alfanumérico)
const cnpjRegex = /^[A-Z0-9]{2}\.[A-Z0-9]{3}\.[A-Z0-9]{3}\/[0-9]{4}-[0-9]{2}$/i;

Serviços de terceiros: gateways de pagamento, ERPs, Receita Federal WS

Gateways como PagSeguro, Mercado Pago e Cielo têm validadores server-side próprios. Abra chamados com cada parceiro para confirmar a data de suporte. O WebService da Receita Federal retorna CNPJs como string — mas a maioria dos clientes HTTP dessa API faz parse numérico no lado do consumidor.

Headers e query params que truncam ou sanitizam o CNPJ

WAFs configurados para bloquear [A-Z] em query params de CNPJ vão rejeitar requisições legítimas após julho. Revise as regras de sanitização e whitelists antes do prazo.

Frontend — inputs, máscaras e formatação

Máscaras numéricas que bloqueiam letras

Bibliotecas como react-input-mask, cleave.js e imask usam padrões numéricos por padrão. Atualize:

// imask — padrão atualizado para alfanumérico
const cnpjMask = {
  mask: 'AA.AAA.AAA/0000-00',
  definitions: {
    A: /[A-Z0-9]/i,
  },
};

Validação client-side com Zod

import { z } from 'zod';
import { validarCNPJAlfanumerico } from './cnpj-alfanumerico';

const schemaCNPJ = z
  .string()
  .transform((val) => val.replace(/[.\-/]/g, '').toUpperCase())
  .refine(validarCNPJAlfanumerico, {
    message: 'CNPJ inválido (numérico ou alfanumérico)',
  });

UX: exibição formatada com letras

O formato visual XX.XXX.XXX/XXXX-XX mantém a estrutura familiar. Não invente novos separadores para a versão alfanumérica — a Receita Federal usa o mesmo padrão de pontuação.

Testes automatizados — o que adicionar ao seu suite

Casos de teste obrigatórios

// cnpj-alfanumerico.test.ts — Vitest
import { describe, it, expect } from 'vitest';
import { validarCNPJAlfanumerico } from './cnpj-alfanumerico';

describe('CNPJ alfanumérico', () => {
  it('valida CNPJ numérico convencional', () => {
    expect(validarCNPJAlfanumerico('11.222.333/0001-81')).toBe(true);
  });

  it('rejeita CNPJ com dígito verificador errado', () => {
    expect(validarCNPJAlfanumerico('AB.CDE.FGH/0001-00')).toBe(false);
  });

  it('rejeita sequência homogênea', () => {
    expect(validarCNPJAlfanumerico('AA.AAA.AAA/AAAA-AA')).toBe(false);
  });

  it('rejeita comprimento errado', () => {
    expect(validarCNPJAlfanumerico('AB.CDE.FG/0001-34')).toBe(false);
  });

  it('rejeita caracteres fora do conjunto permitido', () => {
    expect(validarCNPJAlfanumerico('AB!CDE.FGH/0001-34')).toBe(false);
  });

  it('valida CNPJ alfanumérico gerado pelo FakeForge BR', () => {
    // Gere fixtures em /gerador-cnpj-alfanumerico — nunca use CNPJs reais
    const fixtures = ['/* insira aqui valores gerados */'];
    fixtures.forEach((cnpj) => expect(validarCNPJAlfanumerico(cnpj)).toBe(true));
  });
});

Geração de CNPJs alfanuméricos fictícios para testes

Use o gerador de CNPJ alfanumérico do FakeForge BR para obter valores com dígitos verificadores corretos. Via API:

curl "https://fakeforge.com.br/api/generate?type=cnpj_alfanumerico&quantity=10&format=json"

Nunca use CNPJs reais em fixtures — mesmo que "públicos", o CNPJ de MEI contém dados do sócio e pode enquadrar o sistema nas obrigações da LGPD.

LGPD e o novo formato — riscos de conformidade

CNPJ como dado de pessoa jurídica vs. dado de sócio (MEI)

O CNPJ de pessoa jurídica não é, por si só, dado pessoal. Porém, o CNPJ de MEI está vinculado ao CPF e ao nome do titular — é dado pessoal nos termos da LGPD Art. 5º, I. Pipelines que processam CNPJs em massa devem identificar e tratar MEIs de forma diferenciada.

LGPD Art. 7º, IX e o tratamento em pipelines de validação

O tratamento de CNPJ de MEI em pipelines de validação pode enquadrar-se no legítimo interesse (LGPD Art. 7º, IX), mas exige registro no ROPA e avaliação de impacto se o volume for significativo.

Logs que armazenam CNPJ precisam de revisão de retenção

Logs de requisição com CNPJ no path ou body precisam de política de retenção definida. A Resolução CD/ANPD nº 2/2022 orienta prazos mínimos para incidentes — mas não justifica retenção indefinida de logs com dados pessoais. Mascare o CNPJ em logs de produção: exiba apenas os 4 primeiros caracteres.

Checklist consolidado — o que fazer semana a semana até julho

Semanas 1–2: auditoria de banco de dados e APIs internas

  • Mapear todas as colunas de CNPJ com o script de auditoria SQL acima.
  • Listar endpoints que recebem ou retornam CNPJ.
  • Identificar regex de validação em middlewares e schemas de API.

Semanas 3–4: atualizar bibliotecas e escrever validações próprias

  • Verificar release notes das libs de validação usadas.
  • Implementar validarCNPJAlfanumerico() com os testes unitários.
  • Atualizar schemas Zod, Yup ou valibot.

Semanas 5–6: atualizar testes automatizados e frontend

  • Adicionar casos de teste para CNPJ alfanumérico no suite existente.
  • Atualizar máscaras de input e exibição.
  • Gerar fixtures com o gerador de CNPJ alfanumérico.

Semanas 7–8: homologar com parceiros e gateways

  • Abrir chamados com gateways de pagamento e ERPs.
  • Testar fluxo completo de emissão de NF-e com CNPJ alfanumérico em sandbox.
  • Revisar regras de WAF e proxies reversos.

Semana final: smoke test em produção com CNPJ alfanumérico de teste

Gere um CNPJ alfanumérico fictício com o FakeForge BR e execute o fluxo completo em produção com feature flag. Monitore logs de erro por 48 horas antes de 01/07/2026. Consulte a documentação da API para geração em lote via endpoint.

Resumo

  • Banco de dados primeiro: colunas NUMERIC e BIGINT com CNPJ quebram na primeira inserção após julho. Migre para VARCHAR(14) com CHECK constraint — é a mudança de maior impacto e menor reversibilidade.
  • Escreva sua própria validação agora: cpf-cnpj-validator, cpfcnpj e brvalidador não suportam o novo formato. Use a função charToValue() com módulo-11 adaptado apresentada acima e adicione ao suite de testes antes de confiar em qualquer lib atualizada.
  • MEI é dado pessoal: o CNPJ de MEI contém CPF e nome do titular. Pipelines que processam CNPJs em massa precisam de avaliação de impacto LGPD e registro no ROPA.
  • Parceiros não estarão prontos automaticamente: gateways, ERPs e integrações com a Receita Federal precisam de confirmação explícita de suporte. Abra chamados com SLA definido nas semanas 7–8.
  • Use dados fictícios nos testes: o gerador de CNPJ alfanumérico do FakeForge BR gera valores com dígitos verificadores corretos via web ou via API — sem risco de usar CNPJ real de MEI em fixtures.
  • Monitor pós-virada: a curva de CNPJs alfanuméricos em circulação cresce gradualmente após julho, mas escala. Configure alertas para erros de validação e revise-os semanalmente nos primeiros 30 dias.

Perguntas frequentes

Se não migrar coluna CNPJ de BIGINT antes de julho, o que exatamente acontece?+

A primeira inserção com alfanumérico falha com erro de tipo (integer overflow ou invalid input). Se você usar CAST::NUMERIC, as letras são truncadas ou geram erro. O bloqueio pode ser silencioso em alguns ORMs — registro não é criado, sem log explícito. Teste ALTER COLUMN em staging antes.

Como gerar CNPJs alfanuméricos válidos para testes sem usar dados reais?+

Use o endpoint /api/generate?type=cnpj_alfanumerico do FakeForge BR — retorna valores com dígitos verificadores corretos. Ou implemente charToValue() em test fixtures. Nunca commit CNPJ real de MEI em código: mesmo que 'público', incide LGPD. Dados fictícios protegem você de auditoria.

CNPJs puramente numéricos emitidos antes de julho continuam validando no novo algoritmo?+

Sim. O novo algoritmo trata '0' = 0, '9' = 9, logo mantém o cálculo original para numéricos. Porém regex ^[A-Z0-9]{12}[0-9]{2}$ rejeita CNPJ 100% numérico. Use ^([A-Z0-9]|\d){12}[0-9]{4}[0-9]{2}$ ou trate formatos explicitamente no IF.

Se meu gateway de pagamento não suportar CNPJ alfanumérico em julho, o que faço?+

Abra chamado com SLA definido agora — não em junho. Se rejeitar, use feature flag: rota requisições com alfanumérico para fluxo alternativo ou bloqueia cadastro até suporte. Não tente contornar server-side validação — o gargalo crítico é downstream. Comunique prazo ao PO.

Qual é a ordem correta: database, validação client ou integração com parceiros?+

Database first — é irreversível e bloqueia tudo. Depois validação server (Zod, CHECK constraint, módulo-11). Client-side (máscaras) é apenas cosmético. Parceiros em paralelo com feature flag. Banco é o gargalo crítico; não deixe para última semana antes de julho.