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 é 12345678900Rota 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 falhasComo 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 FalseValidar RENAVAM: algoritmo local ou API do DETRAN
| Cenário | Validação local | API DETRAN estadual |
|---|---|---|
| Confere o DV mod-11 | Sim | Não se aplica (acesso direto à base) |
| Confirma que o veículo existe | Não | Sim |
| Devolve dados do veículo (modelo, placa) | Não | Sim |
| Funciona offline | Sim | Não |
| API pública disponível | Não precisa | Varia por estado |
| Custo | R$ 0 | Varia (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.