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')); // false

Node 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 = 5

Rota 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árioAlgoritmo localAPI FakeForge (geração)
Confere os dígitos verificadoresSimNão, a API só gera
Cobre CNPJ alfanuméricoSim, com a função desta páginaGera com type=cnpjAlfa
Gera CNPJs válidos para testeNãoSim, até 10.000 por chamada
Funciona offlineSimNão
Confirma que a empresa existeNãoNão
CustoR$ 0Grá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.

Páginas relacionadas