Python · SDK + algoritmo

Gerador de RENAVAM em Python

Para gerar RENAVAM válido em Python, instale pip install fakeforge-br e chame FakeForge().renavam(n), ou calcule localmente os 10 dígitos de base mais o dígito verificador mod-11 do DENATRAN. Os dois caminhos geram números com 11 dígitos que passam em qualquer validador de formato. Abaixo estão o SDK, o algoritmo completo e testes prontos.

TL;DR

pip install fakeforge-br

from fakeforge import FakeForge
renavams = FakeForge().renavam(100)  # 100 RENAVAMs válidos mod-11

Free 50 chamadas/dia sem cadastro. Quer ver o gerador no navegador? Use o Gerador de RENAVAM.

Como gerar RENAVAM em Python com o SDK?

A rota mais curta. .renavam(n) devolve uma lista de strings.

from fakeforge import FakeForge

ff = FakeForge()

# 1 RENAVAM formatado (grupos de 4 pra leitura)
renavam = ff.renavam(1)[0]
print(renavam)  # "5821 0347 696"

# 1000 RENAVAMs só com os 11 dígitos
renavams = ff.renavam(1000, formatted=False)

# Veículo de teste: RENAVAM + placa Mercosul
renavams = ff.renavam(10, formatted=False)
placas = ff.placa(10)
veiculos = list(zip(renavams, placas))

Requer internet, porque o SDK chama o endpoint HTTP. O RENAVAM não é correlacionado com a placa: são dois sorteios independentes, o que basta pra cadastro de teste.

Qual é o algoritmo do RENAVAM em Python?

O RENAVAM (Registro Nacional de Veículos Automotores) tem 11 dígitos. Os 10 primeiros são sequenciais e o último é o dígito verificador, calculado por mod-11 com pesos fixos do DENATRAN. Versão offline, sem dependência:

# renavam.py - implementação pura, offline
import random

PESOS = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2]


def calcula_dv(base: list[int]) -> int:
    """DV = 11 - (soma ponderada % 11). Resultado 10 ou 11 vira 0."""
    soma = sum(d * p for d, p in zip(base, PESOS))
    dv = 11 - (soma % 11)
    return 0 if dv >= 10 else dv


def gera_renavam() -> str:
    base = [random.randint(0, 9) for _ in range(10)]
    return "".join(map(str, base + [calcula_dv(base)]))


def valida_renavam(renavam: str) -> bool:
    d = [int(c) for c in renavam if c.isdigit()]
    if len(d) != 11 or len(set(d)) == 1:
        return False
    return calcula_dv(d[:10]) == d[10]

Alguns manuais descrevem a mesma conta como (soma * 10) % 11 com resultado 10 virando 0. Os dois jeitos dão o mesmo dígito para todas as somas, e o código do FakeForge usa essa segunda forma. Vantagens do local: zero deps e offline. Limitação: só RENAVAM, sem placa nem outros documentos do veículo.

Como testar RENAVAM em pytest?

Teste unitário que garante que o gerador só produz dígito verificador correto e que o validador rejeita número adulterado.

# tests/test_renavam.py
import pytest
from renavam import gera_renavam, valida_renavam


def test_renavam_gerado_tem_11_digitos():
    assert len(gera_renavam()) == 11


@pytest.mark.parametrize("_", range(500))
def test_renavam_gerado_passa_no_validador(_):
    assert valida_renavam(gera_renavam())


def test_validador_rejeita_dv_errado():
    renavam = gera_renavam()
    dv_errado = str((int(renavam[-1]) + 1) % 10)
    assert not valida_renavam(renavam[:-1] + dv_errado)


def test_validador_rejeita_sequencia_repetida():
    assert not valida_renavam("11111111111")


# Com o SDK, em tests/conftest.py
@pytest.fixture(scope="session")
def renavams_sdk():
    from fakeforge import FakeForge
    return FakeForge().renavam(50, formatted=False)


def test_renavams_do_sdk_sao_validos(renavams_sdk):
    assert all(valida_renavam(r) for r in renavams_sdk)

Como popular um banco Django com RENAVAM?

# frota/management/commands/seed_veiculos.py
from django.core.management.base import BaseCommand
from fakeforge import FakeForge
from frota.models import Veiculo


class Command(BaseCommand):
    help = "Cria veículos de teste com RENAVAM e placa válidos"

    def add_arguments(self, parser):
        parser.add_argument("--qtd", type=int, default=500)

    def handle(self, *args, **options):
        qtd = options["qtd"]
        ff = FakeForge()
        renavams = ff.renavam(qtd, formatted=False)
        placas = ff.placa(qtd)

        Veiculo.objects.bulk_create(
            [Veiculo(renavam=r, placa=p) for r, p in zip(renavams, placas)],
            ignore_conflicts=True,  # renavam unique: colisão é rara, não quebra o seed
        )
        self.stdout.write(f"{qtd} veículos criados")

SDK ou algoritmo local: qual escolher?

CenárioSDK fakeforge-brAlgoritmo local
Só RENAVAM simplesSimSim
RENAVAM + placa MercosulSimNão (só RENAVAM)
Preset com pessoa correlacionadaSimNão
100% offlineNãoSim
Zero deps runtimeSimSim
Bulk 10k+1 chamadaLoop
CustoFree 50/diaR$0

Precisa de mais de 50 chamadas por dia ou de 10 mil itens por request? Veja os planos.

Perguntas frequentes

Como gerar RENAVAM válido em Python?+

Instale pip install fakeforge-br e chame FakeForge().renavam(n). Sem SDK, sorteie 10 dígitos, multiplique pelos pesos 3, 2, 9, 8, 7, 6, 5, 4, 3, 2, some os produtos e calcule o dígito verificador como 11 menos o resto da divisão por 11, usando 0 quando o resultado for 10 ou 11.

Quantos dígitos tem o RENAVAM?+

11 dígitos: 10 dígitos de base mais 1 dígito verificador. Registros antigos tinham 9 dígitos, mas o padrão atual do DENATRAN (hoje Senatran) usa 11, e é o que o gerador e o validador deste guia seguem.

Como validar um RENAVAM em Python?+

Remova tudo que não for dígito, confira que sobraram 11 números e que eles não são todos iguais, recalcule o dígito verificador com os pesos 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 e compare com o último dígito. A função valida_renavam desta página faz isso em 6 linhas.

O RENAVAM gerado pertence a um veículo real?+

Não. O número passa na conta do dígito verificador, mas é sorteado e não está vinculado a nenhum veículo no sistema do DENATRAN. Serve para testar formulários, validações e cadastros em ambiente de teste, nunca para consulta ou fraude.

O SDK fakeforge-br gera RENAVAM?+

Sim. O método ff.renavam(n) retorna lista de RENAVAMs válidos, formatados em grupos de 4 por padrão. Use formatted=False para receber só os 11 dígitos. O endpoint HTTP chama o mesmo gerador que roda no site.

Próximos passos