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.
Validar
- JavaScript, biblioteca
- Python, biblioteca4 casos falham
- Go, biblioteca3 casos falham
- Ruby, biblioteca3 casos falham
- Rust, biblioteca2 casos falham
- .NET, biblioteca4 casos falham
- Erlang, biblioteca4 casos falham
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.2também aceita o CNPJ alfanumérico, sem diferenciar maiúsculas de minúsculas. Qualquer outro valor é lido como1.- 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: 1padrão rejeita. Passeversion: 2para aceitá-los. - O conjunto oficial de caracteres do CNPJ alfanumérico são as letras maiúsculas
AaZe 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ão86, 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âmetro | Tipo | Obrigatório |
|---|---|---|
cnpj | string | sim |
options | IsValidCnpjOptions | não |
options.version | 1 | 2 | não |
| retorna | boolean |
Valida um CNPJ.
- Opções (
IsValidCnpjOptions):versionescolhe o formato aceito:1(padrão) apenas numérico,2numérico e alfanumérico. Qualquer outro valor é lido como1. - Desde julho de 2026 os CNPJs novos podem ser alfanuméricos, e a
version: 1padrão os rejeita: passeversion: 2para aceitá-los. - Um número reservado (todos os dígitos iguais) é rejeitado nas duas versões; a versão
2não tem lista de reservados para letras. - O conjunto oficial de caracteres do CNPJ alfanumérico são as letras maiúsculas de
AaZe 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ão86, 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/javascriptTeste com JavaScript isValidCnpj
Casos de teste compartilhados (42) e o resultado em cada biblioteca cnpj.isValid
Formatar
- JavaScript, biblioteca
- Python, biblioteca36 casos falham
- Go, biblioteca15 casos falham
- Ruby, biblioteca36 casos falham
- Rust, biblioteca18 casos falham
- .NET, biblioteca7 casos falham
- Erlang, biblioteca36 casos falham
Formata um CNPJ como 00.000.000/0000-00.
options.padprimeiro 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 como1.options.obfuscate(padrãofalse, lido como verdadeiro ou falso, comopad) 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,padretornava 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: 1padrão descarta as letras deles; passeversion: 2para mantê-las. Um número perde os zeros à esquerda: passe uma string, ou useoptions.pad, para um CNPJ que começa com0.
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âmetro | Tipo | Obrigatório |
|---|---|---|
value | string | number | sim |
options | FormatCnpjOptions | não |
options.pad | boolean | não |
options.version | 1 | 2 | não |
options.obfuscate | boolean | não |
| retorna | string |
Formata um CNPJ.
- Opções (
FormatCnpjOptions):padpreenche o valor com zeros à esquerda até 14 caracteres antes de aplicar a máscara (padrãofalse);versionescolhe o formato,1(padrão) apenas numérico,2alfanumérico;obfuscateesconde os 2 primeiros dígitos e os 2 dígitos verificadores. Um valor vazio, ou sem dígitos, devolve''mesmo compad. - A versão
2mantém letras e dígitos, com uma letra minúscula convertida para maiúscula antes, já que o conjunto oficial é deAaZ; a versão1mantém apenas dígitos. Desde julho de 2026 os CNPJs novos podem ser alfanuméricos, então passeversion: 2para manter as letras deles. obfuscatevale para as duas versões e é aplicada após opad. É 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-**Teste com JavaScript formatCnpj
Casos de teste compartilhados (99) e o resultado em cada biblioteca cnpj.format
Interpretar
- JavaScript, biblioteca
- Python, biblioteca
- Go, biblioteca
- Ruby, biblioteca3 casos falham
- Rust, biblioteca
- .NET, biblioteca
- Erlang, biblioteca
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.2mantém letras e dígitos, em maiúsculas. Qualquer outro valor é lido como1.- 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: 1padrão descarta as letras deles; passeversion: 2para mantê-las. Uma letra minúscula é convertida para maiúscula antes, pois o conjunto oficial éAaZ.
| Parâmetro | Tipo | Obrigatório |
|---|---|---|
value | string | number | sim |
options | ParseCnpjOptions | não |
options.version | 1 | 2 | não |
| retorna | string |
Remove a formatação do CNPJ, retorna um valor normalizado e limita o resultado a 14 caracteres.
- Opções (
ParseCnpjOptions):versionescolhe o formato:1(padrão) mantém apenas dígitos,2mantém letras e dígitos, com uma letra minúscula convertida para maiúscula, já que o conjunto oficial é deAaZ(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: passeversion: 2para mantê-las.
import { parseCnpj } from '@brazilian-utils/brazilian-utils';
parseCnpj('24.522.200/0001-74'); // 24522200000174
parseCnpj('12.OUT.345/0001-99', { version: 2 }); // 12OUT345000199Teste com JavaScript parseCnpj
Casos de teste compartilhados (25) e o resultado em cada biblioteca cnpj.parse
Gerar
- JavaScript, biblioteca
- Python, biblioteca5 casos falham
- Go, biblioteca
- Ruby, biblioteca
- Rust, biblioteca
- .NET, biblioteca
- Erlang, biblioteca5 casos falham
Gera um CNPJ aleatório e válido, sem formatação.
versionOrParamsescolhe a versão:1(padrão, numérico) ou2(alfanumérico). Também pode ser um objeto{ version, branch }, em quebranchdefine 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 (3dá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 de0001, a matriz. A 2.4.0 podia retornar0000, 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. UmversionOrParamsque não seja2nem um objeto gera um CNPJ numérico.
| Parâmetro | Tipo | Obrigatório |
|---|---|---|
versionOrParams | 1 | 2 | GenerateCnpjParams | não |
| retorna | string |
Gera um CNPJ válido aleatório.
- O primeiro argumento é a versão,
1(padrão) numérico ou2alfanumérico, ou um objetoGenerateCnpjParamscomversionmaisbranch. branché o bloco do "número de ordem" (filial), um inteiro de 1 a 9999 (aleatório por padrão). Umbranchinvá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 de0001, 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'Teste com JavaScript generateCnpj
Casos de teste compartilhados (9) e o resultado em cada biblioteca cnpj.generate
Decodificar
- JavaScript, biblioteca
- Python, biblioteca
- Go, biblioteca
- Ruby, biblioteca
- Rust, biblioteca
- .NET, biblioteca
- Erlang, biblioteca
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.
rootsão as posições 1 a 8.branchsão as posições 9 a 12, o número de ordem do estabelecimento.checkDigitssão as posições 13 e 14. O nomebranché o mesmo decnpj.generate.options.versionfunciona como emcnpj.isValid:1(padrão) lê só CNPJ numérico,2lê CNPJ numérico e alfanumérico, e qualquer outro valor é lido como1. Um CNPJ alfanumérico lido na versão 1 retornanull.- Os campos de um CNPJ alfanumérico vêm em maiúsculas.
isInitialHeadquartersétruequando a filial é0001. Indica a matriz só no momento da geração do CNPJ: uma filial pode virar matriz sem ter a ordem0001(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. Usecnpj.formatpara a máscara. - Retorna um objeto novo a cada chamada.
| Parâmetro | Tipo | Obrigatório |
|---|---|---|
value | string | sim |
options | GetCnpjInfoOptions | não |
options.version | 1 | 2 | não |
| retorna | CnpjInfo | 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 comoisValidCnpja lê,1(padrão) apenas o formato numérico,2tanto 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 nomebranchsegue o parâmetrobranchdogenerateCnpj, que preenche as mesmas quatro posições. isInitialHeadquartersdiz 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/javascriptTeste com JavaScript getCnpjInfo
Casos de teste compartilhados (26) e o resultado em cada biblioteca cnpj.getInfo
Guias
- Campo de documentoUm campo que aplica máscara e valida CPF, CNPJ, CEP ou telefone enquanto você digita, com Brazilian Utils em React, Angular, Vue e JavaScript puro.
- Bibliotecas de schemaOs validadores do Brazilian Utils dentro de um schema do Zod, do Valibot ou do ArkType, ou como um Standard Schema próprio.
- Guia de migração: v1 para v2Como migrar um projeto do Brazilian Utils v1.x para a v2: os exports renomeados, os aliases descontinuados que ainda funcionam e um checklist para seguir.
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
-
A entrada deve conter exatamente 14 caracteres.
-
Os 12 primeiros caracteres podem conter dígitos de
0a9e letras deAaZ. Comversion: 2, a validação lê letras minúsculas como maiúsculas. -
Os 2 últimos caracteres são os dígitos verificadores e devem ser numéricos.
-
Os dígitos verificadores devem vir do algoritmo do módulo 11.
-
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 = 09→57 - 48 = 9A→65 - 48 = 17B→66 - 48 = 18Z→90 - 48 = 42
Algoritmo
- Verificar se a entrada tem exatamente 14 caracteres.
- Verificar se os 12 primeiros caracteres são alfanuméricos e os 2 últimos são numéricos.
- 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.
- Calcular o primeiro dígito verificador (DV1):
- Para os 12 primeiros caracteres, distribuir os pesos de
2a9da direita para a esquerda. Recomeçar em2após o peso9. - Multiplicar cada valor pelo seu peso e somar os resultados.
- Calcular o resto da divisão da soma por
11. - Se o resto for
0ou1, o DV1 é0. Se não, o DV1 é11 - resto.
- Para os 12 primeiros caracteres, distribuir os pesos de
- Calcular o segundo dígito verificador (DV2):
- Adicionar o DV1 ao fim da sequência. Para esses 13 caracteres, distribuir os pesos de
2a9da 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
0ou1, o DV2 é0. Se não, o DV2 é11 - resto.
- Adicionar o DV1 ao fim da sequência. Para esses 13 caracteres, distribuir os pesos de
- 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ções | Campo | Chave em getCnpjInfo |
|---|---|---|
| 1 a 8 | raiz, comum a todos os estabelecimentos da entidade | root |
| 9 a 12 | número de ordem do estabelecimento | branch |
| 13 e 14 | dígitos verificadores, sempre numéricos | checkDigits |
getCnpjInfo(value, { version })retorna esses campos eisInitialHeadquarters. Retornanullexatamente quandoisValidCnpj(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 campoformat.isInitialHeadquartersétruequando a filial é0001. A Receita Federal dá0001à matriz quando a raiz é inscrita. Uma filial pode depois virar matriz sem ter a ordem0001(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 de0001. A 2.4.0 podia retornar0000(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")retornanull(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.formatCnpjeparseCnpjtambé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
- Instrução Normativa RFB nº 2119, de 6 de dezembro de 2022
- Instrução Normativa RFB nº 2229, de 15 de outubro de 2024
- Cálculo dos dígitos verificadores de CNPJ alfanumérico
- CNPJ, Receita Federal
- Manual de cálculo do dígito verificador do CNPJ, Receita Federal
- CNPJ Alfanumérico, Receita Federal
- Perguntas e respostas: CNPJ alfanumérico, Receita Federal
- Instrução Normativa RFB nº 2.229/2024, no Sijut2
Veja também CPF, Inscrição estadual, Natureza jurídica
Atualizado em
