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/" # 400bash 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
fiComo 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
fiComo 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ário | Regex local | Consulta ao ViaCEP |
|---|---|---|
| Confere o formato de 8 dígitos | Sim | Sim, responde 400 |
| Confirma que o CEP existe | Não | Sim |
| Devolve logradouro, bairro, cidade e UF | Não | Sim |
| Funciona offline | Sim | Não |
| Latência | Desprezível | Depende da rede |
| Custo | R$ 0 | Gratuito |
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.