Node.js · algoritmo local + API
Validar CNPJ em Node.js
Para validar CNPJ em Node.js, recalcule os dois dígitos verificadores pelo mod-11 da Receita Federal, com pesos 5 a 2 e 9 a 2, tratando letras como ASCII menos 48. Isso cobre o CNPJ tradicional e o alfanumérico, em vigor desde 01/07/2026 (IN RFB 2.229/2024). Abaixo: uma função ES6 sem dependências, testes automatizados e conferência com CNPJs gerados pela API.
Fonte: Receita Federal. O CNPJ alfanumérico foi instituído pela Instrução Normativa RFB nº 2.229/2024, com vigência a partir de 01/07/2026.
TL;DR
const PESOS = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
const dv = (base, pesos) => {
const resto = [...base].reduce((acc, ch, i) => acc + (ch.charCodeAt(0) - 48) * pesos[i], 0) % 11;
return resto < 2 ? 0 : 11 - resto; // letra A-Z vale 17 a 42
};
const validaCnpj = (cnpj) => {
const c = cnpj.replace(/[./-]/g, '');
if (!/^[0-9A-Z]{12}\d{2}$/.test(c) || new Set(c).size === 1) return false;
return Number(c[12]) === dv(c.slice(0, 12), PESOS) && Number(c[13]) === dv(c.slice(0, 13), [6, ...PESOS]);
};
console.log(validaCnpj('11.222.333/0001-81')); // true (tradicional)
console.log(validaCnpj('12.ABC.345/01DE-35')); // true (alfanumérico)
console.log(validaCnpj('11.222.333/0001-82')); // falseNode 18+ (fetch nativo), sem npm install. Salve como .mjs e rode com node.
Rota 1: validar CNPJ em Node.js com o algoritmo local
Uma função só para os dois formatos. O parâmetro de modo legado rejeita letras para sistemas que ainda não migraram para o CNPJ alfanumérico.
// validador-cnpj.mjs (ES modules, Node 18+, zero dependências)
import { fileURLToPath } from 'node:url';
const FORMATO_CNPJ = /^[0-9A-Z]{2}\.?[0-9A-Z]{3}\.?[0-9A-Z]{3}\/?[0-9A-Z]{4}-?\d{2}$/;
const PESOS_1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
const PESOS_2 = [6, ...PESOS_1]; // pesos deslocados para o 2º DV (13 posições)
function digito(base, pesos) {
// '0'=0 ... '9'=9, 'A'=17 ... 'Z'=42 (código ASCII menos 48)
const soma = [...base].reduce((acc, ch, i) => acc + (ch.charCodeAt(0) - 48) * pesos[i], 0);
const resto = soma % 11;
return resto < 2 ? 0 : 11 - resto;
}
// aceitaLetras=true cobre o CNPJ alfanumérico (IN RFB 2.229/2024)
export function validaCnpj(cnpj, { aceitaLetras = true } = {}) {
if (typeof cnpj !== 'string' || !FORMATO_CNPJ.test(cnpj.trim())) return false;
const c = cnpj.trim().replace(/[./-]/g, '');
if (!aceitaLetras && !/^\d+$/.test(c)) return false;
if (new Set(c).size === 1) return false; // 00.000.000/0000-00 passa na conta, mas é inválido
return Number(c[12]) === digito(c.slice(0, 12), PESOS_1) && Number(c[13]) === digito(c.slice(0, 13), PESOS_2);
}
if (process.argv[1] === fileURLToPath(import.meta.url)) {
for (const cnpj of ['11.222.333/0001-81', '11222333000181', '12.ABC.345/01DE-35', '11.222.333/0001-82', '00.000.000/0000-00']) {
console.log(cnpj.padEnd(22), validaCnpj(cnpj));
}
console.log('alfa bloqueado:', validaCnpj('12.ABC.345/01DE-35', { aceitaLetras: false }));
}Como o cálculo do dígito verificador do CNPJ funciona
Um exemplo calculado à mão, para você conferir o código contra a conta.
CNPJ 11.222.333/0001-81
1º DV: soma dos 12 caracteres × pesos 5,4,3,2,9,8,7,6,5,4,3,2 = 102
102 mod 11 = 3 -> resto < 2 dá 0, senão 11 - resto -> DV1 = 8
2º DV: soma dos 13 caracteres × pesos 6,5,4,3,2,9,8,7,6,5,4,3,2 = 120
120 mod 11 = 10 -> DV2 = 1
CNPJ alfanumérico 12.ABC.345/01DE-35
Valor de cada caractere = código ASCII - 48: 0-9 valem 0 a 9, A=17, B=18, C=19 ... Z=42
Valores: [1, 2, 17, 18, 19, 3, 4, 5, 0, 1, 20, 21]
1º DV: soma = 459, 459 mod 11 = 8 -> DV1 = 3
2º DV: soma = 424, 424 mod 11 = 6 -> DV2 = 5Rota 2: conferir o validador com CNPJs da API do FakeForge
A API do FakeForge gera CNPJ tradicional (type=cnpj) e alfanumérico (type=cnpjAlfa), mas não tem endpoint de validação. Use os lotes gerados como oráculo: todos precisam passar, e com o último dígito trocado precisam falhar.
// confere-cnpj-api.mjs (Node 18+). Salve o validador da Rota 1 como validador-cnpj.mjs
import { validaCnpj } from './validador-cnpj.mjs';
async function gera(tipo, qtd = 20) {
const res = await fetch(`https://fakeforge.com.br/api/generate?type=${tipo}&quantity=${qtd}`);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return (await res.json()).data;
}
const trocaUltimoDigito = (cnpj) => cnpj.slice(0, -1) + ((Number(cnpj.at(-1)) + 1) % 10);
let falhou = false;
for (const [tipo, aceitaLetras] of [['cnpj', false], ['cnpjAlfa', true]]) {
const lote = await gera(tipo);
const rejeitados = lote.filter((c) => !validaCnpj(c, { aceitaLetras }));
const aceitos = lote.filter((c) => validaCnpj(trocaUltimoDigito(c), { aceitaLetras }));
console.log(`${tipo}: ${lote.length} gerados | válidos rejeitados: ${rejeitados.length} | inválidos aceitos: ${aceitos.length}`);
if (rejeitados.length || aceitos.length) falhou = true;
}
if (falhou) process.exit(1);Como testar o validador de CNPJ com Jest
Com Jest em modo ESM. Os casos cobrem válidos, inválidos e as bordas de CNPJ.
// validador-cnpj.test.mjs (Jest)
import { validaCnpj } from './validador-cnpj.mjs';
const NUMERICOS = ['11.222.333/0001-81', '11222333000181', '11.444.777/0001-61'];
const ALFANUMERICOS = ['12.ABC.345/01DE-35', '12ABC34501DE35', 'A1.B2C.3D4/0001-93'];
describe('validaCnpj', () => {
test.each([...NUMERICOS, ...ALFANUMERICOS])('aceita %s', (cnpj) => {
expect(validaCnpj(cnpj)).toBe(true);
});
test.each([
'11.222.333/0001-82', // DV errado
'00.000.000/0000-00', // repetidos
'11.222.333/0001-8', // curto demais
'12.abc.345/01de-35', // minúsculas não existem no padrão
'',
])('rejeita %p', (cnpj) => {
expect(validaCnpj(cnpj)).toBe(false);
});
test.each(ALFANUMERICOS)('modo legado rejeita letras em %s', (cnpj) => {
expect(validaCnpj(cnpj, { aceitaLetras: false })).toBe(false);
});
});Validar CNPJ: algoritmo local ou serviço externo
| Cenário | Algoritmo local | API FakeForge (geração) |
|---|---|---|
| Confere os dígitos verificadores | Sim | Não, a API só gera |
| Cobre CNPJ alfanumérico | Sim, com a função desta página | Gera com type=cnpjAlfa |
| Gera CNPJs válidos para teste | Não | Sim, até 10.000 por chamada |
| Funciona offline | Sim | Não |
| Confirma que a empresa existe | Não | Não |
| Custo | R$ 0 | Grátis até 50 chamadas por dia |
Perguntas frequentes sobre validar CNPJ em Node.js
Como validar CNPJ em Node.js?+
Use a função validaCnpj desta página. Ela confere os dois dígitos verificadores pelo mod-11 e aceita o CNPJ tradicional e o alfanumérico. Com aceitaLetras: false, rejeita letras para sistemas legados. Sem dependências.
Como funciona o cálculo do dígito verificador do CNPJ?+
Cada caractere vira um valor (dígito mantém o valor, letra usa o código ASCII menos 48). Multiplica-se pelos pesos 5,4,3,2,9,8,7,6,5,4,3,2, soma-se e toma-se o resto por 11. Resto menor que 2 dá DV 0, senão DV é 11 menos o resto. O segundo DV usa 13 caracteres e os pesos 6,5,4,3,2,9,8,7,6,5,4,3,2.
Como validar o CNPJ alfanumérico?+
Com o mesmo mod-11, tratando letras de A a Z como 17 a 42. A regra vale desde 01/07/2026 pela IN RFB 2.229/2024. Os dois dígitos verificadores continuam numéricos, e os CNPJs numéricos antigos seguem válidos.
CNPJ válido quer dizer que a empresa existe?+
Não. A validação confere só os dígitos verificadores. Saber se o CNPJ está ativo e qual a situação cadastral exige consulta à Receita Federal.
A API do FakeForge valida CNPJ?+
Não. A API gera CNPJ tradicional (type=cnpj) e alfanumérico (type=cnpjAlfa), e a validação roda no seu código. Use os lotes gerados como casos positivos e troque o último dígito para casos negativos.