Python · algoritmo local + API

Validar CNPJ em Python

Para validar CNPJ em Python, 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 Python só com a biblioteca padrão, 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

def valida_cnpj(cnpj: str) -> bool:
    c = [ord(ch) - 48 for ch in cnpj if ch.isalnum()]  # dígito = valor, letra A-Z = 17 a 42
    if len(c) != 14 or len(set(c)) == 1:
        return False
    for i, pesos in ((12, [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]), (13, [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2])):
        resto = sum(v * p for v, p in zip(c[:i], pesos)) % 11
        if c[i] != (0 if resto < 2 else 11 - resto):
            return False
    return True


print(valida_cnpj("11.222.333/0001-81"))  # True (tradicional)
print(valida_cnpj("12.ABC.345/01DE-35"))  # True (alfanumérico)
print(valida_cnpj("11.222.333/0001-82"))  # False

Python 3.9+, sem pip install. Salve cada bloco no arquivo indicado no topo.

Rota 1: validar CNPJ em Python 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.py (só stdlib)
import re

FORMATO_CNPJ = re.compile(r"[0-9A-Z]{2}\.?[0-9A-Z]{3}\.?[0-9A-Z]{3}/?[0-9A-Z]{4}-?\d{2}")
PESOS_1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
PESOS_2 = [6] + PESOS_1  # pesos deslocados para o 2º DV (13 posições)


def _digito(base: str, pesos: list[int]) -> int:
    soma = sum((ord(c) - 48) * p for c, p in zip(base, pesos))  # '0'=0 ... '9'=9, 'A'=17 ... 'Z'=42
    resto = soma % 11
    return 0 if resto < 2 else 11 - resto


def valida_cnpj(cnpj: str, aceita_letras: bool = True) -> bool:
    """mod-11 da Receita Federal. Com aceita_letras=True cobre o CNPJ alfanumérico (IN RFB 2.229/2024)."""
    if not FORMATO_CNPJ.fullmatch(cnpj.strip()):
        return False
    c = re.sub(r"[./-]", "", cnpj.strip())
    if not aceita_letras and not c.isdigit():
        return False
    if len(set(c)) == 1:  # 00.000.000/0000-00 passa na conta, mas é inválido
        return False
    return int(c[12]) == _digito(c[:12], PESOS_1) and int(c[13]) == _digito(c[:13], PESOS_2)


if __name__ == "__main__":
    for cnpj in ("11.222.333/0001-81", "11222333000181", "12.ABC.345/01DE-35", "11.222.333/0001-82", "00.000.000/0000-00"):
        print(f"{cnpj:22} -> {valida_cnpj(cnpj)}")
    print("alfa bloqueado:", valida_cnpj("12.ABC.345/01DE-35", aceita_letras=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.py (stdlib). Salve o validador da Rota 1 como validador_cnpj.py
import json
import urllib.request

from validador_cnpj import valida_cnpj


def gera(tipo: str, qtd: int = 20) -> list[str]:
    with urllib.request.urlopen(f"https://fakeforge.com.br/api/generate?type={tipo}&quantity={qtd}", timeout=10) as resp:
        return json.load(resp)["data"]


def troca_ultimo_digito(cnpj: str) -> str:
    return cnpj[:-1] + str((int(cnpj[-1]) + 1) % 10)


for tipo, aceita_letras in (("cnpj", False), ("cnpjAlfa", True)):
    lote = gera(tipo)
    rejeitados = [c for c in lote if not valida_cnpj(c, aceita_letras)]
    aceitos = [c for c in lote if valida_cnpj(troca_ultimo_digito(c), aceita_letras)]
    print(f"{tipo}: {len(lote)} gerados | válidos rejeitados: {len(rejeitados)} | inválidos aceitos: {len(aceitos)}")
    assert not rejeitados and not aceitos

Como testar o validador de CNPJ com pytest

Rode com pytest -q. Os casos cobrem válidos, inválidos e as bordas de CNPJ.

# test_validador_cnpj.py (pytest)
import pytest

from validador_cnpj import valida_cnpj

NUMERICOS = ["11.222.333/0001-81", "11222333000181", "11.444.777/0001-61"]
ALFANUMERICOS = ["12.ABC.345/01DE-35", "12ABC34501DE35", "A1.B2C.3D4/0001-93"]
INVALIDOS = [
    "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",  # letras minúsculas não existem no padrão
    "",
]


@pytest.mark.parametrize("cnpj", NUMERICOS + ALFANUMERICOS)
def test_aceita_cnpj_valido(cnpj):
    assert valida_cnpj(cnpj) is True


@pytest.mark.parametrize("cnpj", INVALIDOS)
def test_rejeita_cnpj_invalido(cnpj):
    assert valida_cnpj(cnpj) is False


@pytest.mark.parametrize("cnpj", ALFANUMERICOS)
def test_modo_legado_rejeita_letras(cnpj):
    assert valida_cnpj(cnpj, aceita_letras=False) is 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 Python

Como validar CNPJ em Python?+

Use a função valida_cnpj desta página. Ela confere os dois dígitos verificadores pelo mod-11 e aceita o CNPJ tradicional e o alfanumérico. Com aceita_letras=False, rejeita letras para sistemas legados. Só biblioteca padrão.

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