CNPJ

Cadastro Nacional da Pessoa Jurídica, o número de 14 caracteres que identifica empresas e entidades. Alfanumérico desde julho de 2026, com dois dígitos verificadores numéricos por módulo 11.

  • Matriz de paridade

Validar

Valida um CNPJ: 12 caracteres de base e 2 dígitos verificadores por módulo 11.

  • options.version: 1 (padrão) aceita somente CNPJs numéricos. 2 também aceita o CNPJ alfanumérico, sem diferenciar maiúsculas de minúsculas. Qualquer outro valor é lido como 1.
  • Um CNPJ numérico com todos os dígitos iguais é rejeitado. O formato alfanumérico não tem lista de valores reservados.
  • Desde julho de 2026 os novos CNPJs podem ser alfanuméricos, o que a version: 1 padrão rejeita. Passe version: 2 para aceitá-los.
  • O conjunto oficial de caracteres do CNPJ alfanumérico são as letras maiúsculas A a Z e os dígitos; os 2 dígitos verificadores são sempre dígitos. Uma letra minúscula é aceita só como normalização da entrada, como um caractere da máscara: o valor é convertido para maiúsculas antes.
  • O Ex1 da pergunta 23 das Perguntas e Respostas da Receita Federal sobre o CNPJ alfanumérico, AA345678/0003-29, é um erro de impressão: seus dígitos verificadores são 86, então é rejeitado.

Decisão pendente

A referência (JS) ignora os caracteres de formatação (., -, /) e os espaços em branco em volta dos grupos e entre eles. As outras bibliotecas aceitam somente dígitos. Veja a decisão em aberto em docs/findings.md (em inglês).

ParâmetroTipoObrigatório
cnpjstringsim
optionsIsValidCnpjOptionsnão
options.version1 | 2não
retornaboolean

Valida um CNPJ.

  • Opções (IsValidCnpjOptions): version escolhe o formato aceito: 1 (padrão) apenas numérico, 2 numérico e alfanumérico. Qualquer outro valor é lido como 1.
  • Desde julho de 2026 os CNPJs novos podem ser alfanuméricos, e a version: 1 padrão os rejeita: passe version: 2 para aceitá-los.
  • Um número reservado (todos os dígitos iguais) é rejeitado nas duas versões; a versão 2 não tem lista de reservados para letras.
  • O conjunto oficial de caracteres do CNPJ alfanumérico são as letras maiúsculas de A a Z e os algarismos (os 2 dígitos verificadores são sempre algarismos). Uma letra minúscula só é aceita como normalização da entrada, como um caractere de máscara: a entrada é convertida para maiúsculas antes.
  • O Ex1 da pergunta 23 do perguntas e respostas da Receita Federal sobre o CNPJ alfanumérico, AA345678/0003-29, tem erro de impressão: os dígitos verificadores dele são 86, então ele é rejeitado.
import { isValidCnpj } from '@brazilian-utils/brazilian-utils';

isValidCnpj('15515147234255'); // false
isValidCnpj('q0slfmbd7vx439', { version: 2 }); // true (lido como Q0SLFMBD7VX439)

Fonte: Instrução Normativa RFB nº 2.229/2024 (Anexo XV da IN RFB nº 2.119/2022, pesos "da direita para esquerda" conforme a retificação no DOU de 25/10/2024), Receita Federal, Manual do DV do CNPJ, CNPJ alfanumérico.

Código: brazilian-utils/javascript
Teste com JavaScript isValidCnpj
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (42) e o resultado em cada biblioteca cnpj.isValid

Formatar

Formata um CNPJ como 00.000.000/0000-00.

  • options.pad primeiro completa o valor com zeros à esquerda até 14 caracteres.
  • options.version: 1 (padrão) mantém somente dígitos. 2 (CNPJ alfanumérico) mantém letras (em maiúsculas) e dígitos. Qualquer outro valor é lido como 1.
  • options.obfuscate (padrão false, lido como verdadeiro ou falso, como pad) oculta os 2 primeiros caracteres e os 2 dígitos verificadores com *, depois do preenchimento. É uma convenção da biblioteca, sem fonte oficial: nenhuma lei ou ato da Receita Federal fixa regra de mascaramento para o CNPJ, cujos dados são públicos. Ela segue a regra que as Leis de Diretrizes Orçamentárias fixam para o CPF.
  • Um número só é lido se for um inteiro seguro não negativo. Um número negativo, fracionário, não finito ou inseguro retorna uma string vazia. A 2.4.0 lia os dígitos de qualquer número.
  • Um valor sem nenhum caractere que a versão mantém (vazio, ou só símbolos) retorna uma string vazia mesmo com options.pad. Até a 2.4.0, pad retornava a máscara inteira de zeros (00.000.000/0000-00).
  • O valor é lido até 14 caracteres: os caracteres depois do 14º são descartados, também com options.pad.
  • Desde julho de 2026 os novos CNPJs podem ser alfanuméricos. A version: 1 padrão descarta as letras deles; passe version: 2 para mantê-las. Um número perde os zeros à esquerda: passe uma string, ou use options.pad, para um CNPJ que começa com 0.

Decisão pendente

A referência (JS) formata só os caracteres que um valor incompleto tem. Ela retorna uma string vazia para entrada vazia ou inválida. As outras bibliotecas retornam null. Veja a decisão em aberto em docs/findings.md (em inglês).

ParâmetroTipoObrigatório
valuestring | numbersim
optionsFormatCnpjOptionsnão
options.padbooleannão
options.version1 | 2não
options.obfuscatebooleannão
retornastring

Formata um CNPJ.

  • Opções (FormatCnpjOptions): pad preenche o valor com zeros à esquerda até 14 caracteres antes de aplicar a máscara (padrão false); version escolhe o formato, 1 (padrão) apenas numérico, 2 alfanumérico; obfuscate esconde os 2 primeiros dígitos e os 2 dígitos verificadores. Um valor vazio, ou sem dígitos, devolve '' mesmo com pad.
  • A versão 2 mantém letras e dígitos, com uma letra minúscula convertida para maiúscula antes, já que o conjunto oficial é de A a Z; a versão 1 mantém apenas dígitos. Desde julho de 2026 os CNPJs novos podem ser alfanuméricos, então passe version: 2 para manter as letras deles.
  • obfuscate vale para as duas versões e é aplicada após o pad. É uma convenção desta biblioteca, não uma regra oficial: nenhuma lei ou ato da Receita Federal define mascaramento para o CNPJ, cujos dados são públicos, a ANPD diz que "não há um padrão para o mascaramento" e as regras do Pix do Banco Central mostram o CNPJ inteiro onde mascaram o CPF; ela esconde os 2 primeiros caracteres e os 2 dígitos verificadores, à semelhança da regra do CPF.
import { formatCnpj } from '@brazilian-utils/brazilian-utils';

formatCnpj('24522200000174'); // 24.522.200/0001-74
formatCnpj('245222000174', { pad: true }); // 00.245.222/0001-74
formatCnpj('12OUT345000199', { version: 2 }); // 12.OUT.345/0001-99
formatCnpj('12345678000195', { obfuscate: true }); // **.345.678/0001-**
Código: brazilian-utils/javascript
Teste com JavaScript formatCnpj
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (99) e o resultado em cada biblioteca cnpj.format

Interpretar

Remove a formatação do CNPJ e retorna o valor normalizado, limitado a 14 caracteres.

  • options.version: 1 (padrão) mantém somente dígitos. 2 mantém letras e dígitos, em maiúsculas. Qualquer outro valor é lido como 1.
  • Um número só é lido se for um inteiro seguro não negativo. Um número negativo, fracionário, não finito ou inseguro retorna uma string vazia. A 2.4.0 lia os dígitos de qualquer número.
  • Desde julho de 2026 os novos CNPJs podem ser alfanuméricos. A version: 1 padrão descarta as letras deles; passe version: 2 para mantê-las. Uma letra minúscula é convertida para maiúscula antes, pois o conjunto oficial é A a Z.
ParâmetroTipoObrigatório
valuestring | numbersim
optionsParseCnpjOptionsnão
options.version1 | 2não
retornastring

Remove a formatação do CNPJ, retorna um valor normalizado e limita o resultado a 14 caracteres.

  • Opções (ParseCnpjOptions): version escolhe o formato: 1 (padrão) mantém apenas dígitos, 2 mantém letras e dígitos, com uma letra minúscula convertida para maiúscula, já que o conjunto oficial é de A a Z (parseCnpj('12.abc.345/01de-35', { version: 2 }) retorna '12ABC34501DE35'). Desde julho de 2026 os CNPJs novos podem ser alfanuméricos, então o padrão descarta as letras deles: passe version: 2 para mantê-las.
import { parseCnpj } from '@brazilian-utils/brazilian-utils';

parseCnpj('24.522.200/0001-74'); // 24522200000174
parseCnpj('12.OUT.345/0001-99', { version: 2 }); // 12OUT345000199
Código: brazilian-utils/javascript
Teste com JavaScript parseCnpj
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (25) e o resultado em cada biblioteca cnpj.parse

Gerar

Gera um CNPJ aleatório e válido, sem formatação.

  • versionOrParams escolhe a versão: 1 (padrão, numérico) ou 2 (alfanumérico). Também pode ser um objeto { version, branch }, em que branch define a filial (número de ordem), um inteiro de 1 a 9999. A filial é aleatória por padrão, e uma filial inválida é ignorada.
  • Uma filial dada em branch é escrita com 4 dígitos nas duas versões (3 dá 0003). Uma filial sorteada na versão 2 pode ter letras, como a raiz.
  • Uma filial sorteada nunca é 0000: os estabelecimentos de uma raiz são numerados a partir de 0001, a matriz. A 2.4.0 podia retornar 0000, cerca de uma vez a cada 10.000 CNPJs numéricos.
  • Um valor inválido de branch (0, acima de 9999, fracionário, não numérico) é ignorado e uma filial aleatória é usada. Um versionOrParams que não seja 2 nem um objeto gera um CNPJ numérico.
ParâmetroTipoObrigatório
versionOrParams1 | 2 | GenerateCnpjParamsnão
retornastring

Gera um CNPJ válido aleatório.

  • O primeiro argumento é a versão, 1 (padrão) numérico ou 2 alfanumérico, ou um objeto GenerateCnpjParams com version mais branch.
  • branch é o bloco do "número de ordem" (filial), um inteiro de 1 a 9999 (aleatório por padrão). Um branch inválido é ignorado. O bloco continua numérico nas duas versões.
  • Um bloco de ordem aleatório nunca é 0000: os estabelecimentos de uma raiz são numerados a partir de 0001, a matriz, então esse bloco nunca é atribuído.
import { generateCnpj } from '@brazilian-utils/brazilian-utils';

generateCnpj();
generateCnpj(2); // CNPJ alfanumérico, ex. 'Q0SLFMBD7VX439'
generateCnpj({ branch: 3 }); // bloco de ordem '0003', ex. '12345678000357'
generateCnpj({ version: 2, branch: 1 }); // CNPJ alfanumérico cujo bloco de ordem é '0001'
Código: brazilian-utils/javascript
Teste com JavaScript generateCnpj
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (9) e o resultado em cada biblioteca cnpj.generate

Decodificar

Lê os campos de um CNPJ: raiz, filial e dígitos verificadores, e se a filial é 0001. Retorna null exatamente quando cnpj.isValid é false para os mesmos argumentos.

  • root são as posições 1 a 8. branch são as posições 9 a 12, o número de ordem do estabelecimento. checkDigits são as posições 13 e 14. O nome branch é o mesmo de cnpj.generate.
  • options.version funciona como em cnpj.isValid: 1 (padrão) lê só CNPJ numérico, 2 lê CNPJ numérico e alfanumérico, e qualquer outro valor é lido como 1. Um CNPJ alfanumérico lido na versão 1 retorna null.
  • Os campos de um CNPJ alfanumérico vêm em maiúsculas.
  • isInitialHeadquarters é true quando a filial é 0001. Indica a matriz só no momento da geração do CNPJ: uma filial pode virar matriz sem ter a ordem 0001 (pergunta 25 das Perguntas e Respostas da Receita Federal sobre o CNPJ alfanumérico). Só o cadastro da Receita Federal diz qual é a matriz atual.
  • O resultado não tem campo format. Use cnpj.format para a máscara.
  • Retorna um objeto novo a cada chamada.
ParâmetroTipoObrigatório
valuestringsim
optionsGetCnpjInfoOptionsnão
options.version1 | 2não
retornaCnpjInfo | null

Interpreta um CNPJ nos campos que o número codifica. Aceita as mesmas formas de entrada que isValidCnpj e retorna null sempre que ela retornaria false para os mesmos argumentos, então um CNPJ alfanumérico lido na versão 1 é null.

  • Opções (GetCnpjInfoOptions): version é lida como isValidCnpj a lê, 1 (padrão) apenas o formato numérico, 2 tanto o numérico quanto o alfanumérico.
  • Retorna um CnpjInfo, as 14 posições como o Anexo XV as dispõe: 8 (root, a raiz que identifica a entidade) + 4 (branch, o número de ordem do estabelecimento) + 2 (checkDigits, os dígitos verificadores, sempre numéricos). O nome branch segue o parâmetro branch do generateCnpj, que preenche as mesmas quatro posições.
  • isInitialHeadquarters diz se o número de ordem é 0001, a que a Receita Federal atribui à matriz quando a raiz é inscrita. Uma filial pode depois se tornar a matriz mantendo o seu número de ordem, então só o cadastro da Receita Federal diz qual é a matriz atual.
  • Os campos de um CNPJ alfanumérico são retornados em maiúsculas.
import { getCnpjInfo } from '@brazilian-utils/brazilian-utils';

getCnpjInfo('12.345.678/0001-95');
// {
//   root: '12345678',
//   branch: '0001',
//   checkDigits: '95',
//   isInitialHeadquarters: true
// }

getCnpjInfo('12.abc.345/01de-35', { version: 2 });
// {
//   root: '12ABC345',
//   branch: '01DE',
//   checkDigits: '35',
//   isInitialHeadquarters: false
// }

getCnpjInfo('12.ABC.345/01DE-35'); // null (alfanumérico, lido na versão 1)
getCnpjInfo('12.345.678/0001-90'); // null (dígitos verificadores incorretos)

Fonte: Instrução Normativa RFB nº 2.229/2024, cujo Anexo Único é o Anexo XV da IN RFB nº 2.119/2022 e dispõe as 14 posições, Perguntas e Respostas da Receita Federal sobre o CNPJ alfanumérico (perguntas 21, 23 e 25).

Código: brazilian-utils/javascript
Teste com JavaScript getCnpjInfo
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (26) e o resultado em cada biblioteca cnpj.getInfo

Guias

Especificação

Resumo

O CNPJ é o número de identificação que a Receita Federal atribui a empresas, órgãos públicos e outras entidades no Brasil. Tem 14 caracteres: 8 da raiz, 4 da ordem do estabelecimento e 2 dígitos verificadores. Os CNPJs emitidos antes do início do formato alfanumérico usam apenas dígitos. Desde julho de 2026, novas inscrições podem conter letras maiúsculas e dígitos nos 12 primeiros caracteres. Os 2 dígitos verificadores continuam apenas numéricos.

Regras de validação

  1. A entrada deve conter exatamente 14 caracteres.

  2. Os 12 primeiros caracteres podem conter dígitos de 0 a 9 e letras de A a Z. Com version: 2, a validação lê letras minúsculas como maiúsculas.

  3. Os 2 últimos caracteres são os dígitos verificadores e devem ser numéricos.

  4. Os dígitos verificadores devem vir do algoritmo do módulo 11.

  5. Para calcular os dígitos verificadores, converta os 12 primeiros caracteres em valores numéricos. Use o código ASCII decimal de cada caractere e subtraia 48.

    Exemplos:

    • 0 → 48 - 48 = 0
    • 9 → 57 - 48 = 9
    • A → 65 - 48 = 17
    • B → 66 - 48 = 18
    • Z → 90 - 48 = 42

Algoritmo

  1. Verificar se a entrada tem exatamente 14 caracteres.
  2. Verificar se os 12 primeiros caracteres são alfanuméricos e os 2 últimos são numéricos.
  3. Converter os caracteres alfanuméricos em valores numéricos:
    • Os dígitos mantêm o seu valor.
    • As letras passam a valer o seu código ASCII decimal menos 48.
  4. Calcular o primeiro dígito verificador (DV1):
    • Para os 12 primeiros caracteres, distribuir os pesos de 2 a 9 da direita para a esquerda. Recomeçar em 2 após o peso 9.
    • Multiplicar cada valor pelo seu peso e somar os resultados.
    • Calcular o resto da divisão da soma por 11.
    • Se o resto for 0 ou 1, o DV1 é 0. Se não, o DV1 é 11 - resto.
  5. Calcular o segundo dígito verificador (DV2):
    • Adicionar o DV1 ao fim da sequência. Para esses 13 caracteres, distribuir os pesos de 2 a 9 da direita para a esquerda.
    • Multiplicar cada valor pelo seu peso e somar os resultados.
    • Calcular o resto da divisão da soma por 11.
    • Se o resto for 0 ou 1, o DV2 é 0. Se não, o DV2 é 11 - resto.
  6. Comparar os dígitos verificadores calculados com os 2 últimos caracteres do CNPJ.

Campos do número

A IN RFB nº 2.229/2024 (Anexo XV da IN RFB nº 2.119/2022) divide as 14 posições assim:

PosiçõesCampoChave em getCnpjInfo
1 a 8raiz, comum a todos os estabelecimentos da entidaderoot
9 a 12número de ordem do estabelecimentobranch
13 e 14dígitos verificadores, sempre numéricoscheckDigits
  • getCnpjInfo(value, { version }) retorna esses campos e isInitialHeadquarters. Retorna null exatamente quando isValidCnpj(value, { version }) é false, então um CNPJ alfanumérico lido na versão 1 dá null. Os campos de um CNPJ alfanumérico vêm em maiúsculas. O resultado não tem campo format.
  • isInitialHeadquarters é true quando a filial é 0001. A Receita Federal dá 0001 à matriz quando a raiz é inscrita. Uma filial pode depois virar matriz sem ter a ordem 0001 (pergunta 25 das Perguntas e Respostas da Receita Federal sobre o CNPJ alfanumérico), então o indicador só diz o que o número dizia na geração.
  • generateCnpj({ branch }) usa o mesmo nome. Uma filial sorteada nunca é 0000, porque os estabelecimentos são numerados a partir de 0001. A 2.4.0 podia retornar 0000 (cerca de uma vez a cada 10.000 CNPJs numéricos).

Exemplos:

  • getCnpjInfo("12.345.678/0001-95") retorna { root: "12345678", branch: "0001", checkDigits: "95", isInitialHeadquarters: true }.
  • getCnpjInfo("12.abc.345/01de-35", { version: 2 }) retorna { root: "12ABC345", branch: "01DE", checkDigits: "35", isInitialHeadquarters: false }.
  • getCnpjInfo("12.ABC.345/01DE-35") retorna null (alfanumérico, lido na versão 1).

Máscara de ocultação e números

  • formatCnpj(value, { obfuscate: true }) oculta os 2 primeiros caracteres e os 2 dígitos verificadores (**.345.678/0001-**). É uma convenção da biblioteca, sem fonte oficial: nenhuma lei ou ato da Receita Federal fixa regra de mascaramento para o CNPJ, cujos dados são públicos. Ela segue a regra que as Leis de Diretrizes Orçamentárias fixam para o CPF.
  • formatCnpj e parseCnpj também recebem número. Ele só é lido quando é um inteiro seguro não negativo. Número negativo, fracionário, não finito ou inseguro retorna string vazia. A 2.4.0 lia os dígitos de qualquer número.

Regex

  • CNPJ sem formatação: ^[A-Z0-9]{12}[0-9]{2}$
  • CNPJ formatado: ^[A-Z0-9]{2}\.[A-Z0-9]{3}\.[A-Z0-9]{3}/[A-Z0-9]{4}-[0-9]{2}$

Exemplos

  • Válido: 03560714000142 (CNPJ numérico válido)
  • Válido: 9359QAG9000184 (CNPJ alfanumérico válido)
  • 03.560.714/0001-42: decisão pendente. A referência (JS) aceita, as outras bibliotecas não.
  • Inválido: 00111222000133 (dígitos verificadores inválidos)
  • Inválido: 12ABC34501DE3X (os dígitos verificadores devem ser numéricos)
  • Inválido: 12ABC34501DE3 (deve conter exatamente 14 caracteres)
  • Inválido: 12ABC34501DE345 (deve conter exatamente 14 caracteres)

Fontes oficiais

Veja também CPF, Inscrição estadual, Natureza jurídica

Atualizado em

Nesta página