bateCarimbo.
Endereçamento

Como o CEP é estruturado: o significado de cada dígito e as faixas por estado

Região, sub-região, setor, subsetor, divisor e sufixo explicados com exemplos reais decompostos, a tabela completa de faixas por unidade federativa, CEP geral contra CEP de logradouro e como validar sem depender de uma API.

Por · Publicado em · 11 min de leitura

Um CEP não identifica um endereço: identifica uma posição na árvore de distribuição dos Correios. Essa distinção explica quase tudo que atrapalha quem implementa cadastro de endereço — por que um município inteiro cabe em um único número, por que dois prédios da mesma rua têm CEPs diferentes e por que não existe conta matemática capaz de dizer se um CEP existe. Os oito dígitos são lidos da esquerda para a direita, do país inteiro até um trecho de calçada.

De cinco para oito dígitos

O CEP nasceu na década de 1970 com cinco dígitos, quando o volume de correspondência passou a exigir uma chave numérica para ordenar a triagem antes que qualquer pessoa lesse o endereço escrito no envelope. Cinco dígitos dão cem mil combinações — o bastante para separar municípios e bairros, insuficiente para chegar ao logradouro nas capitais que cresceram nas duas décadas seguintes.

Na década de 1990 vieram os três dígitos do sufixo, separados por hífen. O prefixo antigo foi preservado: quem tinha 01310 continuou com 01310, e o sufixo passou a detalhar o que havia dentro dele. Foi uma extensão, não uma renumeração — detalhe que importa quando você encontra uma base legada com CEPs de cinco posições.

A migração dessas bases costuma ser feita completando o número com 000, e isso só está certo quando o prefixo corresponde ao CEP geral de uma localidade. Em cidades grandes, 01310-000 não é o “CEP genérico da Avenida Paulista”: é um número que pode simplesmente não existir. Guarde sempre as oito posições e trate o hífen como formatação de exibição, não como dado.

Decompondo um CEP dígito a dígito

Cada posição do prefixo estreita a anterior. O primeiro dígito divide o país, o segundo divide aquela região, o terceiro divide aquela sub-região, e assim por diante. Nenhum dígito tem significado isolado: o setor 3 de São Paulo não tem relação nenhuma com o setor 3 da Bahia. Vale a decomposição de 01310-100, na Avenida Paulista, em São Paulo:

01310-100 — Avenida Paulista, São Paulo/SP
DígitoPosiçãoO que delimita
01ª — RegiãoRegião postal 0: São Paulo, capital e Grande São Paulo.
12ª — Sub-regiãoRecorte dentro da região 0.
33ª — SetorDivisão de triagem dentro da sub-região 01.
14ª — SubsetorDivisão dentro do setor 013.
05ª — Divisor de subsetorFecha o prefixo 01310.
1006ª a 8ª — SufixoIdentifica o logradouro atendido por esse prefixo.

O prefixo 01310 é a unidade de endereçamento propriamente dita; o sufixo 100 aponta para dentro dele. Como a leitura é hierárquica, cortar um CEP pela esquerda produz informação válida, só que mais grossa: 01 continua sendo São Paulo capital, e 013 continua sendo um setor de triagem dessa sub-região. Cortar pela direita não produz nada — 10-100 não significa coisa alguma.

Um segundo exemplo mostra o outro extremo da escala. Em 78200-000, o primeiro dígito é 7, região que cobre o Centro-Oeste e Rondônia, e o número inteiro cai na faixa de Mato Grosso segundo a tabela de faixas mais abaixo. O sufixo 000 indica que não há detalhamento por logradouro: o CEP vale para a localidade toda. A estrutura entrega a região, a UF e o tipo de CEP. Que município é esse, ela não entrega — para isso é preciso consultar a base dos Correios.

As dez regiões postais e a lógica geográfica

O país é dividido em dez regiões postais, numeradas de 0 a 9 a partir da capital paulista e seguindo pelo restante do território. São Paulo é a única unidade federativa que ocupa duas regiões inteiras — a 0, com a capital e a Grande São Paulo, e a 1, com o interior e o litoral —, o que reflete o volume de correspondência do estado na época em que a numeração foi desenhada.

Primeiro dígito do CEP e abrangência de cada região postal
DígitoAbrangência
0São Paulo — capital e municípios da Grande São Paulo
1São Paulo — interior e litoral
2Rio de Janeiro e Espírito Santo
3Minas Gerais
4Bahia e Sergipe
5Pernambuco, Alagoas, Paraíba e Rio Grande do Norte
6Ceará, Piauí, Maranhão, Pará, Amazonas, Acre, Amapá e Roraima
7Distrito Federal, Goiás, Tocantins, Mato Grosso, Mato Grosso do Sul e Rondônia
8Paraná e Santa Catarina
9Rio Grande do Sul

Como a numeração acompanha a geografia, ordenar uma lista de CEPs é quase ordenar por proximidade. Isso é útil na prática: tabelas de frete por faixa, roteirização e regras de cobertura de entrega quase sempre são expressas como intervalos de CEP justamente porque um intervalo contínuo tende a corresponder a uma área contígua. A garantia não é absoluta nas bordas entre regiões, mas erra pouco.

É o mesmo tipo de leitura geográfica embutida em outro documento brasileiro: o nono dígito do CPF indica a região fiscal em que o cadastro foi feito. A diferença é que o dígito do CPF registra onde o documento foi emitido, enquanto o CEP descreve onde o endereço está agora.

Tabela completa de faixas por unidade federativa

Estas são as faixas que o gerador de CEP usa para sortear números dentro do estado escolhido e para localizar a UF de um CEP colado na ferramenta. Repare que a maioria das UFs ocupa um intervalo contínuo, mas três delas não: Amazonas, Distrito Federal e Goiás aparecem com duas faixas cada, porque os intervalos se intercalam.

Faixas de CEP por unidade federativa
UFEstadoFaixa
ACAcre69900-000 a 69999-999
ALAlagoas57000-000 a 57999-999
AMAmazonas69000-000 a 69299-999 · 69400-000 a 69899-999
APAmapá68900-000 a 68999-999
BABahia40000-000 a 48999-999
CECeará60000-000 a 63999-999
DFDistrito Federal70000-000 a 72799-999 · 73000-000 a 73699-999
ESEspírito Santo29000-000 a 29999-999
GOGoiás72800-000 a 72999-999 · 73700-000 a 76799-999
MAMaranhão65000-000 a 65999-999
MGMinas Gerais30000-000 a 39999-999
MSMato Grosso do Sul79000-000 a 79999-999
MTMato Grosso78000-000 a 78899-999
PAPará66000-000 a 68899-999
PBParaíba58000-000 a 58999-999
PEPernambuco50000-000 a 56999-999
PIPiauí64000-000 a 64999-999
PRParaná80000-000 a 87999-999
RJRio de Janeiro20000-000 a 28999-999
RNRio Grande do Norte59000-000 a 59999-999
RORondônia76800-000 a 76999-999
RRRoraima69300-000 a 69399-999
RSRio Grande do Sul90000-000 a 99999-999
SCSanta Catarina88000-000 a 89999-999
SESergipe49000-000 a 49999-999
SPSão Paulo01000-000 a 19999-999
TOTocantins77000-000 a 77999-999

Duas observações que economizam tempo de depuração. A primeira: a tabela começa em 01000-000, e não em 00000-000 — todo o intervalo iniciado por 00 está fora de uso, o que faz de 00000-000 um ótimo caso de teste para o caminho de erro. A segunda: a cobertura das faixas não é total. O intervalo 78900-000 a 78999-999, por exemplo, não é atribuído a nenhuma UF nesta tabela, de modo que uma função de busca devolve “não encontrado” para números ali dentro. Trate esse resultado como desconhecido, nunca como inválido.

CEP geral de município, CEP de logradouro e os sufixos especiais

O sufixo é o que diferencia os tipos de CEP, e ignorar essa distinção é a origem do bug mais comum em telas de endereço. Quando o sufixo é 000, o CEP atende uma localidade inteira: municípios pequenos, distritos e boa parte da zona rural não têm numeração por logradouro. Uma consulta a esse CEP devolve município e UF, e devolve o campo de logradouro vazio — corretamente.

Nas cidades com detalhamento, o sufixo identifica o logradouro, e ruas longas são fatiadas em vários CEPs por trecho ou por lado da via. Existem ainda sufixos reservados para casos que não são ruas: unidades dos Correios, caixas postais e os chamados grandes usuários — empresas, universidades e órgãos que recebem correspondência em volume suficiente para ganhar um CEP próprio. Um CEP de grande usuário aponta para uma entidade, não para um trecho de via, e é por isso que uma consulta pode devolver o nome de uma empresa onde seu formulário esperava o nome de uma rua. A documentação dos Correios, linkada nas fontes, detalha quais intervalos de sufixo correspondem a cada caso.

A consequência prática é direta: nenhum campo preenchido por consulta de CEP pode ser obrigatório só porque a consulta costuma preenchê-lo. Se o seu formulário exige logradouro não vazio, ele rejeita endereços legítimos de milhares de municípios.

Por que o CEP não tem dígito verificador

Dígitos verificadores existem para proteger números que circulam sozinhos, ditados ao telefone ou digitados sem nenhum contexto que permita checá-los — é o caso do CPF, do CNPJ e do PIS, todos apoiados no cálculo de módulo 11. O CEP nunca viaja sozinho: ele chega acompanhado de rua, número, cidade e estado, e cada um desses campos é uma chance de detectar a inconsistência sem precisar de aritmética.

Há também um motivo estrutural. Um DV consumiria uma das oito posições, e as oito já estavam comprometidas com a hierarquia geográfica. Gastar um dígito com controle significaria dividir por dez a capacidade de endereçamento que o sufixo acabara de criar.

O preço disso é que erros de digitação são silenciosos. Trocar 01310-100 por 01810-100 gera outro número com formato impecável, na mesma região, provavelmente também existente. A única defesa é a redundância do próprio endereço: comparar a UF derivada da faixa com a UF que o usuário selecionou, comparar a cidade retornada pela consulta com a cidade digitada, e avisar quando divergirem. Esse é um caso em que a validação forte não está no número, e sim na coerência entre campos — assunto que aparece de outras formas no guia de erros comuns em validadores.

Validar formato e faixa contra consultar existência

Vale separar três perguntas que costumam ser tratadas como uma só. A primeira é se o valor tem formato de CEP: oito dígitos, com ou sem máscara. A segunda é se ele pertence a uma faixa conhecida, o que já entrega a UF sem nenhuma chamada de rede. A terceira é se ele existe e a que logradouro corresponde — e essa só a base dos Correios responde. É a mesma escada de formato, verificação e existência que vale para CPF e CNPJ.

TypeScript
import { CEP_UFS } from "./cep-ufs";

export type CepCheck =
  | { level: "formato"; ok: false; reason: string }
  | { level: "faixa"; ok: true; uf: string | null };

export function checkCep(input: string): CepCheck {
  const digits = input.replace(/\D/g, "");

  if (digits.length !== 8) {
    return { level: "formato", ok: false, reason: "CEP deve ter 8 dígitos." };
  }

  const value = Number(digits);
  const entry = CEP_UFS.find((uf) =>
    uf.ranges.some(([start, end]) => value >= start && value <= end),
  );

  // uf === null significa "fora das faixas conhecidas", nunca "CEP inválido".
  return { level: "faixa", ok: true, uf: entry?.uf ?? null };
}
Os dois primeiros níveis rodam offline. O terceiro exige consulta.

Repare no tipo de retorno: uf: null não é erro. Faixas são redistribuídas ao longo do tempo, e uma tabela embutida no código envelhece. Um validador que rejeita o que não reconhece transforma desatualização em bloqueio de cadastro. Se o objetivo é apenas normalizar e conferir formato, uma expressão regular resolve — o guia de regex para documentos brasileiros traz os padrões com e sem máscara.

Para o terceiro nível, trate a consulta como qualquer integração externa: timeout curto, cache por CEP consultado (o dado muda pouco) e degradação graciosa. Um checkout não pode ficar impossível de concluir porque um serviço de endereço está fora do ar; quando a consulta falha, libere o preenchimento manual e siga.

Boas práticas de formulário de endereço

  • Armazene os oito dígitos, sem hífen, em coluna de tamanho fixo. Formatação é responsabilidade da camada de apresentação.
  • Aceite a colagem suja. O usuário vai colar 01310-100, 01310 100 e 01.310-100; normalize retirando tudo que não é dígito antes de validar.
  • Use inputMode="numeric" para abrir o teclado numérico no celular e os valores de autocomplete corretos em cada campo — postal-code, address-level2 para cidade e address-level1 para estado.
  • Não bloqueie os campos preenchidos pela consulta. Loteamentos novos entram na base com atraso, e o morador precisa poder corrigir.
  • Divergência entre a UF da faixa e a UF escolhida merece um aviso visível, não um erro que impede o envio: em regiões de fronteira municipal a confusão é genuína.
  • Ofereça caminho para quem não sabe o CEP. Endereços rurais e comunidades sem logradouro nomeado dependem do CEP geral do município, e o restante da localização vai no complemento.

Massa de teste coerente por estado

Um CEP de teste isolado serve para pouco. O que quebra em homologação é a incoerência entre campos: ficha com endereço em Recife, DDD de Porto Alegre e CPF com dígito de região de Minas. Ao montar a massa, fixe a UF primeiro e derive os demais campos dela — é assim que o gerador de pessoas e o gerador de empresas mantêm CEP, telefone e documento apontando para o mesmo estado.

Além dos casos felizes sorteados dentro de cada faixa, mantenha fixtures fixas para os limites que a estrutura do CEP impõe: um CEP geral com sufixo 000, para exercitar o caminho em que o logradouro volta vazio; um número no intervalo 00000-000, que não pertence a faixa nenhuma; um valor de cinco dígitos vindo de base legada; e as bordas exatas de uma faixa, como 01000-000 e 19999-999, onde comparações com < em vez de <= costumam se esconder. A estratégia geral de montagem está no guia de massa de dados de teste, e o motivo de nada disso vir de base de produção está no de LGPD e dados de teste.

Fontes e referências