Python · algoritmo local + API

Validar RENAVAM em Python

Pra validar RENAVAM em Python, use o algoritmo mod-11 do DENATRAN: pesos 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 sobre os 10 primeiros dígitos, soma vezes 10, mod 11. Abaixo: função só com stdlib, tabela de vetores conhecidos, testes com pytest e dicas de produção.

Fonte: algoritmo oficial do DENATRAN pra dígito verificador do RENAVAM (11 dígitos, estrutura 10 + DV).

TL;DR

def valida_renavam(renavam: str) -> bool:
    s = "".join(c for c in renavam if c.isdigit()).zfill(11)
    if len(s) != 11 or len(set(s)) == 1:
        return False
    pesos = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
    soma = sum(int(d) * p for d, p in zip(s[:10], pesos))
    resto = (soma * 10) % 11
    dv = 0 if resto >= 10 else resto
    return int(s[10]) == dv


print(valida_renavam("1234567890 5"))  # True ou False dependendo do DV
print(valida_renavam("00000000000"))   # False (todos iguais)

Python 3.8+, sem pip install. Copia o bloco e salva como validador_renavam.py.

Rota 1: validar RENAVAM em Python com algoritmo local

Função pronta pra copiar. Aceita RENAVAM com ou sem pontuação, com 9 ou 11 dígitos (completa com zeros à esquerda), rejeita todos iguais.

# validador_renavam.py (só stdlib)
import re


def valida_renavam(renavam: str) -> bool:
    """mod-11 DENATRAN com pesos 3,2,9,8,7,6,5,4,3,2 sobre 10 dígitos base.

    Aceita 9 ou 11 dígitos (completa com zeros à esquerda pra padronizar).
    Rejeita strings com todos os dígitos iguais (ex: 11111111111).
    """
    s = re.sub(r"\D", "", renavam).zfill(11)
    if len(s) != 11 or len(set(s)) == 1:
        return False
    pesos = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
    soma = sum(int(d) * p for d, p in zip(s[:10], pesos))
    resto = (soma * 10) % 11
    dv = 0 if resto >= 10 else resto
    return int(s[10]) == dv


if __name__ == "__main__":
    for r in ("12345678901", "12345678900", "00000000000", "123"):
        print(f"{r:16} -> {valida_renavam(r)}")

Como o cálculo do DV do RENAVAM funciona

Exemplo calculado à mão pra conferir contra o código.

RENAVAM 1234567890X (X = DV a calcular)

Pesos:  3  2  9  8  7  6  5  4  3  2
Dígito: 1  2  3  4  5  6  7  8  9  0

Produtos:
1×3=3  2×2=4   3×9=27  4×8=32  5×7=35
6×6=36 7×5=35  8×4=32  9×3=27  0×2=0

Soma = 3+4+27+32+35+36+35+32+27+0 = 231
Soma × 10 = 2310
2310 mod 11 = 0

Resto 0: DV = 0 (quando resto < 10, DV = resto)
Resultado: RENAVAM válido é 12345678900

Rota 2: testar o validador com vetores conhecidos

Tabela de casos fixos cobre os resíduos possíveis do mod-11, incluindo a borda do resto 10/11 onde o DV vira 0.

# vetores_renavam.py — tabela de casos conhecidos
from validador_renavam import valida_renavam

VETORES = [
    ("12345678900", True,  "DV calculado via mod-11"),
    ("98765432100", False, "DV errado"),
    ("00000000000", False, "11 zeros (todos iguais)"),
    ("11111111111", False, "todos iguais"),
    ("1234567890",  False, "menos de 11 dígitos sem zfill"),
    ("",            False, "vazio"),
]

falhas = [(r, pq) for r, esperado, pq in VETORES if valida_renavam(r) != esperado]
for r, pq in falhas:
    print(f"FALHOU: {r!r} ({pq})")
print(f"{len(VETORES) - len(falhas)}/{len(VETORES)} vetores ok")
assert not falhas

Como testar o validador de RENAVAM com pytest

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

# test_validador_renavam.py (pytest)
import pytest
from validador_renavam import valida_renavam


@pytest.mark.parametrize("renavam", ["12345678900", "1234567890-0", "123 456 789 00"])
def test_aceita_renavam_valido(renavam):
    assert valida_renavam(renavam) is True


@pytest.mark.parametrize("renavam", ["12345678901", "00000000000", "11111111111", "123", "abc"])
def test_rejeita_renavam_invalido(renavam):
    assert valida_renavam(renavam) is False

Validar RENAVAM: algoritmo local ou API do DETRAN

CenárioValidação localAPI DETRAN estadual
Confere o DV mod-11SimNão se aplica (acesso direto à base)
Confirma que o veículo existeNãoSim
Devolve dados do veículo (modelo, placa)NãoSim
Funciona offlineSimNão
API pública disponívelNão precisaVaria por estado
CustoR$ 0Varia (SP: R$ 5-10/consulta)

Perguntas frequentes sobre validar RENAVAM em Python

Como validar RENAVAM em Python?+

Use a função valida_renavam desta página: remove não-dígitos, exige 11 dígitos, rejeita todos iguais e confere o mod-11 DENATRAN com pesos 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 sobre os 10 primeiros dígitos.

Qual o algoritmo oficial do DV do RENAVAM?+

Multiplicar os 10 dígitos base pelos pesos 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 da esquerda pra direita, somar, multiplicar por 10, calcular mod 11. Se o resto for 10 ou 11, o DV é 0. Senão, o DV é o próprio resto.

O RENAVAM tem 9 ou 11 dígitos?+

Documentos emitidos antes de 2007 têm 9 dígitos, mas o DETRAN completa com zeros à esquerda pra padronizar em 11 dígitos (10 base + 1 DV). Validadores modernos esperam 11 dígitos.

A validação local garante que o veículo existe?+

Não. A validação só confirma que o dígito verificador está matematicamente correto. Pra confirmar que o RENAVAM corresponde a um veículo real registrado, é preciso consultar o DETRAN estadual ou a base SNG via API oficial.

O FakeForge valida RENAVAM via API?+

Não. A API do FakeForge é focada em geração de dados sintéticos. Validação roda no seu código. A função desta página cobre o algoritmo oficial do DENATRAN sem dependência externa.

Páginas relacionadas