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
fi

Como 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árioValidação localConsulta ao órgão emissor
Confere o dígito verificadorSim, regra de SPNão se aplica
Cobre todos os estadosNão, só o formato SPSim, cada estado no seu instituto
Confirma que o RG foi emitidoNãoSim
Funciona offlineSimNão
API pública disponívelNão precisaVaria por estado
CustoR$ 0Varia 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.

Páginas relacionadas