curl · bash · Postman

Validar CNPJ via curl

Para validar CNPJ via curl, 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 em bash puro, 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

valida_cnpj() {
  local c=${1//[.\/-]/} p1=(5 4 3 2 9 8 7 6 5 4 3 2) p2=(6 5 4 3 2 9 8 7 6 5 4 3 2) n k v soma r dv
  [[ $c =~ ^[0-9A-Z]{12}[0-9]{2}$ && -n ${c//${c:0:1}/} ]] || return 1
  for n in 12 13; do
    soma=0
    for ((k = 0; k < n; k++)); do
      printf -v v '%d' "'${c:k:1}"  # código ASCII: letra A = 65, menos 48 = 17
      if ((n == 12)); then soma=$((soma + (v - 48) * p1[k])); else soma=$((soma + (v - 48) * p2[k])); fi
    done
    r=$((soma % 11)); dv=$((r < 2 ? 0 : 11 - r))
    ((dv == ${c:n:1})) || return 1
  done
  return 0
}

valida_cnpj "11.222.333/0001-81" && echo "válido" || echo "inválido"
valida_cnpj "12.ABC.345/01DE-35" && echo "válido" || echo "inválido"
valida_cnpj "11.222.333/0001-82" && echo "válido" || echo "inválido"

bash 4+ (Linux, Git Bash, WSL). O macOS traz bash 3.2: instale um bash atual pelo Homebrew.

Rota 1: validar CNPJ via curl 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.

#!/usr/bin/env bash
# validador-cnpj.sh: bash 4+, sem dependências. Use com source ou direto.
# valida_cnpj <cnpj> [--so-numerico]    Saída: 0 = válido, 1 = inválido

PESOS_1=(5 4 3 2 9 8 7 6 5 4 3 2)
PESOS_2=(6 5 4 3 2 9 8 7 6 5 4 3 2)  # deslocados para o 2º DV

_dv_cnpj() {  # $1 = base (12 ou 13 caracteres), $2 = nome do array de pesos
  local base=$1 k v soma=0 resto
  local -n pesos=$2
  for ((k = 0; k < ${#base}; k++)); do
    printf -v v '%d' "'${base:k:1}"   # '0'=48 ... 'A'=65
    soma=$((soma + (v - 48) * pesos[k]))
  done
  resto=$((soma % 11))
  echo $((resto < 2 ? 0 : 11 - resto))
}

valida_cnpj() {
  local c=${1//[.\/-]/}
  [[ $1 =~ ^[0-9A-Z]{2}\.?[0-9A-Z]{3}\.?[0-9A-Z]{3}/?[0-9A-Z]{4}-?[0-9]{2}$ ]] || return 1
  [[ $2 == "--so-numerico" && ! $c =~ ^[0-9]+$ ]] && return 1
  [[ -z ${c//${c:0:1}/} ]] && return 1  # 00.000.000/0000-00 passa na conta, mas é inválido
  [[ ${c:12:1} == "$(_dv_cnpj "${c:0:12}" PESOS_1)" && ${c:13:1} == "$(_dv_cnpj "${c:0:13}" PESOS_2)" ]]
}

if [[ ${BASH_SOURCE[0]} == "$0" ]]; then
  for cnpj in "11.222.333/0001-81" "11222333000181" "12.ABC.345/01DE-35" "11.222.333/0001-82" "00.000.000/0000-00"; do
    if valida_cnpj "$cnpj"; then echo "$cnpj -> válido"; else echo "$cnpj -> inválido"; fi
  done
  valida_cnpj "12.ABC.345/01DE-35" --so-numerico || echo "alfa bloqueado no modo legado"
fi

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.

#!/usr/bin/env bash
# confere-cnpj-api.sh: salve o validador da Rota 1 como validador-cnpj.sh
source ./validador-cnpj.sh

falhas=0
for tipo in cnpj cnpjAlfa; do
  total=0
  while read -r cnpj; do
    total=$((total + 1))
    valida_cnpj "$cnpj" || { echo "válido rejeitado: $cnpj"; falhas=$((falhas + 1)); }
    errado="${cnpj%?}$(( (${cnpj: -1} + 1) % 10 ))"
    valida_cnpj "$errado" && { echo "inválido aceito: $errado"; falhas=$((falhas + 1)); }
  done < <(curl -s "https://fakeforge.com.br/api/generate?type=$tipo&quantity=20&formatted=false" \
    | grep -oE '"[0-9A-Z]{14}"' | tr -d '"')
  echo "$tipo: $total CNPJs conferidos"
  (( total > 0 )) || falhas=$((falhas + 1))
done

echo "falhas: $falhas"
(( falhas == 0 ))

Como testar CNPJ no Postman

Cole o script na aba Tests do request. O Postman roda a mesma validação sobre a resposta e marca cada caso como passou ou falhou.

// Postman > aba Tests do request:
// GET https://fakeforge.com.br/api/generate?type=cnpjAlfa&quantity=20

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;
};
function 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]);
}

pm.test('status 200', () => pm.response.to.have.status(200));

pm.test('todos os CNPJs alfanuméricos passam no mod-11', () => {
  const { data } = pm.response.json();
  pm.expect(data).to.have.lengthOf(20);
  data.forEach((cnpj) => pm.expect(validaCnpj(cnpj), cnpj).to.be.true);
});

pm.test('validador rejeita CNPJ com DV trocado', () => {
  const [cnpj] = pm.response.json().data;
  const errado = cnpj.slice(0, -1) + ((Number(cnpj.slice(-1)) + 1) % 10);
  pm.expect(validaCnpj(errado)).to.be.false;
});
// Para o CNPJ tradicional, use type=cnpj. Para validar a SUA API: pm.response.json().empresa.cnpj

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 via curl

Como validar CNPJ via curl?+

Carregue o arquivo com source validador-cnpj.sh e chame valida_cnpj 11.222.333/0001-81. Saída 0 é válido e 1 é inválido. O flag --so-numerico rejeita letras para sistemas legados. Precisa de bash 4.3 ou superior.

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