curl · bash · Postman
Validar RG via curl
Para validar RG via curl, use o mod-11 do formato de São Paulo: pesos 2 a 9 sobre os 8 primeiros dígitos, com dígito verificador que pode ser X. Não existe regra federal única para o RG: outros estados usam formatos próprios, e a nova CIN adota o CPF como número. Abaixo: uma função em bash puro, vetores de teste e testes automatizados.
Fonte: regra de dígito verificador usada no RG de São Paulo. Não há norma federal única; a CIN (Decreto 10.977/2022) usa o CPF como número.
TL;DR
valida_rg() {
local s=${1//[.\- ]/} k soma=0 dv
s=${s^^}
[[ $s =~ ^[0-9]{8}[0-9X]$ && -n ${s//${s:0:1}/} ]] || return 1
for ((k = 0; k < 8; k++)); do soma=$((soma + ${s:k:1} * (k + 2))); done
dv=$(( (11 - soma % 11) % 11 )); ((dv == 10)) && dv=X
[[ ${s:8:1} == "$dv" ]]
}
valida_rg "12.345.678-2" && echo "válido" || echo "inválido"
valida_rg "10.000.006-X" && echo "válido" || echo "inválido"
valida_rg "12.345.678-3" && 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 RG via curl com o algoritmo local
Regra do RG de São Paulo, o formato mais aceito em formulários nacionais. Aceita pontuação, o X em maiúsculo ou minúsculo e rejeita dígitos repetidos.
#!/usr/bin/env bash
# validador-rg.sh: bash 4+, sem dependências. Regra do RG de São Paulo.
# Use com source ou direto. Saída: 0 = válido, 1 = inválido
valida_rg() {
local s=${1//[.\- ]/} k soma=0 dv
s=${s^^} # x minúsculo vira X
[[ $s =~ ^[0-9]{8}[0-9X]$ ]] || return 1
[[ -z ${s//${s:0:1}/} ]] && return 1 # dígitos repetidos
for ((k = 0; k < 8; k++)); do
soma=$((soma + ${s:k:1} * (k + 2))) # pesos 2 a 9
done
dv=$(( (11 - soma % 11) % 11 )) # resto 0 e resto 1 caem em DV 0 e DV X
((dv == 10)) && dv=X
[[ ${s:8:1} == "$dv" ]]
}
if [[ ${BASH_SOURCE[0]} == "$0" ]]; then
for rg in "12.345.678-2" "12345678-2" "10.000.006-X" "10.000.006-x" "12.345.678-3" "11.111.111-1" "123"; do
if valida_rg "$rg"; then echo "$rg -> válido"; else echo "$rg -> inválido"; fi
done
fiComo o cálculo do dígito verificador do RG funciona
Um exemplo calculado à mão, para você conferir o código contra a conta.
RG 12.345.678-2
1×2 + 2×3 + 3×4 + 4×5 + 5×6 + 6×7 + 7×8 + 8×9
= 240
240 mod 11 = 9 -> (11 - 9) mod 11 = 2 -> DV = 2
RG 10.000.006-X
1×2 + 0×3 + 0×4 + 0×5 + 0×6 + 0×7 + 0×8 + 6×9
= 56
56 mod 11 = 1 -> (11 - 1) mod 11 = 10 -> DV = X (10 vira X)Rota 2: testar o validador com vetores conhecidos
Como cada estado tem a sua regra, o teste mais confiável é uma tabela de casos fixos: um por resto possível, incluindo o caso do X, mais os inválidos. Se mudar a regra, você muda a tabela.
#!/usr/bin/env bash
# vetores-rg.sh: tabela de casos conhecidos. Salve a Rota 1 como validador-rg.sh
source ./validador-rg.sh
# RG|esperado (1 = válido, 0 = inválido)|por quê
VETORES=(
"12.345.678-2|1|resto 9, DV 2"
"34.567.890-4|1|resto 7, DV 4"
"50.000.000-1|1|resto 10, DV 1"
"24.680.135-9|1|resto 2, DV 9"
"10.000.006-X|1|resto 1, DV 10 vira X"
"12.345.678-3|0|DV errado"
"10.000.006-0|0|deveria ser X"
"11.111.111-1|0|dígitos repetidos"
"12.345.678|0|sem DV"
)
falhas=0
for linha in "${VETORES[@]}"; do
IFS='|' read -r rg esperado motivo <<< "$linha"
valida_rg "$rg" && obtido=1 || obtido=0
if [[ $obtido != "$esperado" ]]; then echo "FALHOU: $rg ($motivo)"; falhas=$((falhas + 1)); fi
done
echo "$(( ${#VETORES[@]} - falhas ))/${#VETORES[@]} vetores ok"
(( falhas == 0 ))Como testar RG 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 da SUA API (exemplo: POST /clientes devolve { "rg": "12.345.678-2" })
function validaRg(rg) {
const s = rg.toUpperCase().replace(/[^0-9X]/g, '');
if (!/^\d{8}[0-9X]$/.test(s) || new Set(s).size === 1) return false;
const soma = [...s.slice(0, 8)].reduce((acc, n, i) => acc + Number(n) * (i + 2), 0);
const dv = (11 - (soma % 11)) % 11;
return s[8] === (dv === 10 ? 'X' : String(dv));
}
pm.test('status 201', () => pm.response.to.have.status(201));
pm.test('RG devolvido passa no mod-11 (formato SP)', () => {
const { rg } = pm.response.json();
pm.expect(rg, 'campo rg ausente').to.be.a('string');
pm.expect(validaRg(rg), rg).to.be.true;
});
pm.test('validador rejeita RG com DV trocado', () => {
pm.expect(validaRg('12.345.678-3')).to.be.false;
pm.expect(validaRg('10.000.006-0')).to.be.false;
});
// Na pré-request, guarde um RG de teste: pm.variables.set('rg', '12.345.678-2');Validar RG: algoritmo local ou serviço externo
| Cenário | Validação local | Consulta ao órgão emissor |
|---|---|---|
| Confere o dígito verificador | Sim, regra de SP | Não se aplica |
| Cobre todos os estados | Não, só o formato SP | Sim, cada estado no seu instituto |
| Confirma que o RG foi emitido | Não | Sim |
| Funciona offline | Sim | Não |
| API pública disponível | Não precisa | Varia por estado |
| Custo | R$ 0 | Varia por estado |
Perguntas frequentes sobre validar RG via curl
Como validar RG via curl?+
Carregue o arquivo com source validador-rg.sh e chame valida_rg 12.345.678-2. Saída 0 é válido e 1 é inválido. A função aceita X ou x como verificador. Vale para o formato de São Paulo e precisa de bash 4 ou superior.
Existe algoritmo oficial para validar RG?+
Não há regra federal única. Cada estado emissor definiu o seu formato, e o RG de São Paulo usa mod-11 com pesos de 2 a 9. A Carteira de Identidade Nacional (Decreto 10.977/2022) passa a usar o CPF como número único.
Como calcular o dígito verificador do RG de SP?+
Multiplique os 8 primeiros dígitos por pesos de 2 a 9, some, tome o resto por 11 e calcule (11 menos o resto) mod 11. Resultado 10 é escrito como X.
Por que o RG pode terminar em X?+
O X representa o valor 10 do dígito verificador, que não cabe em um algarismo. Um validador precisa aceitar X e x, e nunca deve aceitar X nas 8 primeiras posições.
A API do FakeForge valida RG?+
Não. A API não tem endpoint de validação, e a validação roda no seu código. A função desta página cobre o formato de São Paulo. RGs de outros estados têm regras próprias.