curl · bash · Postman

Validar CEP via curl

Para validar CEP via curl, confira o formato de 8 dígitos com hífen opcional e consulte o ViaCEP, porque o CEP não tem dígito verificador. Formato correto não garante que o CEP existe: 00000-000 passa na regex e não está na base dos Correios. Abaixo: uma função em bash puro para o formato, a consulta de existência e testes sem depender de rede.

Fonte: estrutura do CEP definida pelos Correios. A consulta de existência usa o ViaCEP, serviço público e gratuito.

TL;DR

# Existe? 200 com dados = sim | 200 com "erro" = formato ok, CEP inexistente | 400 = formato inválido
curl -s "https://viacep.com.br/ws/01310100/json/"
curl -s "https://viacep.com.br/ws/99999999/json/"            # {"erro": "true"}
curl -s -o /dev/null -w "%{http_code}\n" "https://viacep.com.br/ws/1234/json/"   # 400

bash 4+ (Linux, Git Bash, WSL). O macOS traz bash 3.2: instale um bash atual pelo Homebrew.

Rota 1: validar o formato do CEP via curl

Validação offline, instantânea e sem rede. Serve para barrar erro de digitação no formulário antes de qualquer consulta.

#!/usr/bin/env bash
# validador-cep.sh: formato (offline, bash 4+). Use com source ou direto.
# Saída: 0 = formato válido, 1 = inválido

cep_formato_valido() {
  [[ $1 =~ ^[0-9]{5}-?[0-9]{3}$ ]]
}

normaliza_cep() {  # '01310-100' -> '01310100'
  cep_formato_valido "$1" || { echo "CEP com formato inválido: $1" >&2; return 1; }
  echo "${1//-/}"
}

if [[ ${BASH_SOURCE[0]} == "$0" ]]; then
  for cep in "01310-100" "01310100" "1310-100" "01310-10" "abcde-fgh"; do
    if cep_formato_valido "$cep"; then echo "$cep -> formato ok"; else echo "$cep -> formato inválido"; fi
  done
fi

Como o CEP é estruturado (e por que não existe dígito verificador)

Um exemplo calculado à mão, para você conferir o código contra a conta.

CEP 01310-100

0 1 3 1 0 - 1 0 0
| | | | |   +-- 3 últimos dígitos: sufixo de distribuição (identifica o logradouro ou a unidade)
| | | | +-- 5º dígito: subdivisor de subsetor
| | | +-- 4º dígito: subsetor
| | +-- 3º dígito: setor
| +-- 2º dígito: subregião
+-- 1º dígito: região postal (0 = Grande São Paulo)

Não há dígito verificador: nenhuma conta prova que o CEP existe.
Só a consulta à base (ViaCEP) confirma.

Rota 2: confirmar que o CEP existe com o ViaCEP

O ViaCEP responde 400 quando o formato é inválido e 200 com o campo erro quando o formato está certo mas o CEP não existe. O código abaixo trata os dois casos e deixa falha de rede propagar, sem confundir queda de serviço com CEP inexistente.

#!/usr/bin/env bash
# existencia-cep.sh: consulta ViaCEP. Salve a Rota 1 como validador-cep.sh
source ./validador-cep.sh

# Saída: 0 = existe, 1 = não existe ou formato inválido, 2 = falha de rede
cep_existe() {
  cep_formato_valido "$1" || return 1
  local resp
  resp=$(curl -s --max-time 5 "https://viacep.com.br/ws/$(normaliza_cep "$1")/json/") || return 2
  [[ -n $resp && $resp != *'"erro"'* ]]
}

if [[ ${BASH_SOURCE[0]} == "$0" ]]; then
  for cep in "01310-100" "99999-999" "1234"; do
    cep_existe "$cep"; status=$?
    case $status in
      0) echo "$cep -> existe" ;;
      1) echo "$cep -> não existe / formato inválido" ;;
      *) echo "$cep -> falha de rede" ;;
    esac
  done
fi

Como testar CEP 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:
// GET https://viacep.com.br/ws/{{cep}}/json/     (variável de ambiente cep = 01310100)

pm.test('status 200', () => pm.response.to.have.status(200));

pm.test('CEP existe (sem campo erro)', () => {
  const dados = pm.response.json();
  pm.expect(dados.erro, 'ViaCEP marcou o CEP como inexistente').to.be.undefined;
});

pm.test('resposta tem endereço coerente', () => {
  const dados = pm.response.json();
  pm.expect(dados.cep).to.match(/^\d{5}-\d{3}$/);
  pm.expect(dados.uf).to.have.lengthOf(2);
  pm.expect(dados.localidade).to.be.a('string').and.not.empty;
});

// Para o caso negativo, crie outro request com cep = 99999999 e troque o teste por:
// pm.expect(pm.response.json().erro).to.exist;

Validar CEP: algoritmo local ou serviço externo

CenárioRegex localConsulta ao ViaCEP
Confere o formato de 8 dígitosSimSim, responde 400
Confirma que o CEP existeNãoSim
Devolve logradouro, bairro, cidade e UFNãoSim
Funciona offlineSimNão
LatênciaDesprezívelDepende da rede
CustoR$ 0Gratuito

Perguntas frequentes sobre validar CEP via curl

Como validar CEP via curl?+

Rode curl -s https://viacep.com.br/ws/01310100/json/. Se o JSON trouxer o campo erro, o CEP não existe. Um HTTP 400 indica formato inválido. A função cep_existe desta página já traduz isso em código de saída.

CEP tem dígito verificador?+

Não. O CEP tem 8 dígitos, escritos como 5 + hífen + 3, e nenhum deles é verificador. Validar um CEP significa checar o formato e depois confirmar a existência numa base, como o ViaCEP.

Como checar se um CEP existe?+

Consulte GET https://viacep.com.br/ws/{cep}/json/ com os 8 dígitos. Resposta 200 com dados significa que existe. Resposta 200 com o campo erro significa formato certo e CEP inexistente. HTTP 400 significa formato inválido.

O CEP 00000-000 é válido?+

No formato, sim: são 8 dígitos. Na existência, não: o ViaCEP devolve erro. É o exemplo clássico de por que só a regex não basta.

A API do FakeForge valida CEP?+

Não. A API gera CEPs com prefixo de região coerente (type=cep), mas não garante que cada um exista na base dos Correios. Para confirmar existência, use o ViaCEP ou a página /buscar-cep.

Páginas relacionadas