CEP

Código de Endereçamento Postal, o código postal de 8 dígitos administrado pelos Correios.

  • Matriz de paridade

Validar

Valida um CEP: exatamente 8 dígitos.

  • cep pode ser uma string ou um número. Um CEP que começa com 0 precisa ser uma string.
  • Espaços, pontos, hífens e barras são ignorados, onde quer que apareçam. Qualquer outro caractere torna o valor inválido.
  • Um número só é lido se for um inteiro seguro não negativo: -20040020 e 2004002.1 são inválidos. isValid e getState leem o número 1310100 como 7 dígitos e o rejeitam, enquanto getAddressInfo e format com pad o completam com zeros.

Decisão pendente

A referência (JS) ignora espaços, pontos e hífens (01310-200 é válido). As outras bibliotecas aceitam somente dígitos. Veja a decisão em aberto em docs/findings.md (em inglês).

ParâmetroTipoObrigatório
cepstring | numbersim
retornaboolean

Valida um CEP (código de endereçamento postal).

  • Aceita string ou number. Um CEP que começa com 0 precisa ser string, já que um número não preserva o zero à esquerda, e um número só é lido quando é um inteiro seguro não negativo.
  • Espaços, pontos, hífens e barras são ignorados. Qualquer outro caractere invalida o valor.
  • getAddressInfoByCep e formatCep com pad: true são mais tolerantes com números: preenchem um número com zeros à esquerda até 8 dígitos (1310100 vira 01310-100), enquanto isValidCep e getStateByCep leem 1310100 como 7 dígitos e o rejeitam.
import { isValidCep } from '@brazilian-utils/brazilian-utils';

isValidCep('01310100'); // true
isValidCep('92500-000'); // true (hífen entre os grupos)
isValidCep('92.500-000'); // true (ponto e hífen)
isValidCep('013 10 100'); // true (espaços em qualquer posição entre os dígitos)
isValidCep(20040020); // true (entrada numérica)
isValidCep(-20040020); // false (não é um inteiro seguro não negativo)
isValidCep('9250000A'); // false (letras são rejeitadas)
isValidCep('12345'); // false (tamanho inválido)
Código: brazilian-utils/javascript
Teste com JavaScript isValidCep
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (30) e o resultado em cada biblioteca cep.isValid

Formatar

Formata um CEP como 00000-000.

  • options.pad primeiro completa o valor com zeros à esquerda até 8 dígitos. Sem isso, um CEP que começa com 0 e chega como número perde esse zero.
  • Todo caractere que não é dígito é removido, e os dígitos depois do 8º são descartados. Um valor incompleto recebe a máscara só até onde vai (010010 vira 01001-0).
  • Um valor vazio, ou sem dígitos, retorna uma string vazia mesmo com pad. Até a 2.4.0 o pad retornava a máscara toda de zeros (00000-000).
  • Um número só é lido se for um inteiro seguro não negativo. Qualquer outro número (negativo, fracionário, não finito) retorna uma string vazia, com ou sem pad.

Decisão pendente

A referência (JS) formata só os caracteres que um valor incompleto tem. Ela retorna uma string vazia para entrada vazia ou inválida. As outras bibliotecas retornam null. Veja a decisão em aberto em docs/findings.md (em inglês).

ParâmetroTipoObrigatório
valuestring | numbersim
optionsFormatCepOptionsnão
options.padbooleannão
retornastring

Formata um CEP (código de endereçamento postal).

  • Opções (FormatCepOptions): pad preenche o valor com zeros à esquerda até 8 dígitos antes de aplicar a máscara (padrão false). Um valor vazio, ou sem dígitos, devolve '' mesmo com pad.
  • Um CEP que começa com 0 passado como número perde esse zero: passe uma string ou use pad. Um número só é lido quando é um inteiro seguro não negativo; qualquer outro número retorna ''.
import { formatCep } from '@brazilian-utils/brazilian-utils';

formatCep('92500000'); // 92500-000
formatCep('9250000', { pad: true }); // 09250-000
formatCep(-92500000); // '' (não é um inteiro seguro não negativo)
Código: brazilian-utils/javascript
Teste com JavaScript formatCep
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (27) e o resultado em cada biblioteca cep.format

Interpretar

Remove a formatação do CEP e mantém só os dígitos, limitados a 8.

  • Os caracteres que não são dígitos são removidos, e o resultado é limitado a 8 dígitos.
  • Um número só é lido se for um inteiro seguro não negativo. Qualquer outro número (negativo, fracionário, não finito, fora da faixa segura) retorna uma string vazia. null e outros valores que não são string nem número retornam uma string vazia.
ParâmetroTipoObrigatório
valuestring | numbersim
retornastring

Remove a formatação do CEP, mantém apenas os dígitos e limita o resultado a 8 dígitos.

import { parseCep } from '@brazilian-utils/brazilian-utils';

parseCep('92500-000'); // 92500000
Código: brazilian-utils/javascript
Teste com JavaScript parseCep
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (20) e o resultado em cada biblioteca cep.parse

Gerar

Gera um CEP aleatório: 8 dígitos, sem máscara.

  • O CEP não tem dígito verificador, então toda string de 8 dígitos é estruturalmente válida.
  • O CEP é sorteado dentro das faixas que os Correios atribuem aos estados, cada CEP com a mesma chance. Ele sempre pertence a um estado, então cep.getState nunca retorna null para ele.
  • 00000-000 a 00999-999 e 78900-000 a 78999-999, que nenhum estado possui, nunca são gerados. Até a 2.4.0 qualquer string de 8 dígitos podia sair, cerca de 1 em 90 numa dessas duas faixas.
  • A faixa é o bloco que um estado possui, não uma garantia de que todo CEP dentro dela esteja em uso, então o CEP gerado pode não ser o CEP de um endereço real.
ParâmetroTipoObrigatório
retornastring

Gera um CEP aleatório. Um CEP não tem dígito verificador, então o CEP é sorteado dentro das faixas que os Correios atribuem aos estados, com a mesma chance para cada CEP. Ele sempre pertence a um estado, então getStateByCep nunca responde null para ele; 00000-000 a 00999-999 e 78900-000 a 78999-999, que nenhum estado possui, nunca são gerados. Uma faixa é o bloco que um estado possui, não uma garantia de que todo CEP dela está em uso, então o CEP pode não ser o de um endereço real.

import { generateCep } from '@brazilian-utils/brazilian-utils';

generateCep(); // '92500000'
Código: brazilian-utils/javascript
Teste com JavaScript generateCep
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (1) e o resultado em cada biblioteca cep.generate

Get address info

Busca o endereço de um CEP em vários provedores ao mesmo tempo e retorna a primeira resposta com sucesso (chamada de rede).

  • De um cep string, todo caractere que não é dígito é removido ("CEP 01310-100" funciona). Precisam sobrar exatamente 8 dígitos.
  • Um número precisa ser um inteiro seguro não negativo. Ele é completado com zeros à esquerda até 8 dígitos só a partir de 1000000 (01000-000, o menor CEP dos Correios). Um número menor é rejeitado. A 2.4.0 completava qualquer número, então 123 era buscado como 00000-123.
  • O resultado traz cep (8 dígitos, sem máscara), state (código de duas letras), city, neighborhood e street. neighborhood e street vêm vazios quando o CEP cobre uma cidade inteira.
  • options.providers escolhe quais provedores consultar. A função tenta de novo as falhas transitórias de rede, por provedor.
  • options.timeoutMs limita a busca inteira, novas tentativas incluídas. Quando o tempo acaba, a chamada falha com erro de serviço. Precisa ser um número finito positivo.
  • options.signal (um AbortSignal no JavaScript) cancela a busca, e a chamada falha com o motivo do signal, como no fetch. Um signal já abortado falha antes de qualquer requisição. Sem essas opções, a busca não tem limite de tempo.
  • Falha com um erro. O erro distingue um CEP ou uma opção inválida, um CEP que nenhum provedor conhece e uma falha do serviço.
  • Provedor fora do ar não é "não encontrado". A BrasilAPI responde 404 tanto para um CEP desconhecido quanto quando os serviços por trás dela falham. O 404 dela só conta como não encontrado se nenhum outro provedor deixou de responder (erro de rede ou status HTTP de erro). Junto de uma falha assim, a chamada falha com erro de serviço. Um 404 isolado da BrasilAPI, ou um 404 dela junto com erro: true da ViaCEP, continua sendo não encontrado. A 2.4.0 deixava o 404 vencer, então uma indisponibilidade podia aparecer como CEP desconhecido.
  • Um endereço só é aceito quando concorda com o CEP pedido: seus dígitos, completados com zeros à esquerda até 8, precisam ser o CEP (um provedor que responde 1310100 para 01310-100 quer dizer o mesmo CEP e é aceito, enquanto 1310101 é outro CEP e não é) e o estado, quando ele traz um, precisa ser o estado dono da faixa do CEP (veja cep.getState). Caso contrário, esse provedor conta como se não conhecesse o CEP. A BrasilAPI, por exemplo, respondeu 99999-999, um CEP do Rio Grande do Sul, com uma cidade do Paraná. Até a 2.4.0 essa resposta era devolvida.
  • Quando a busca termina, as requisições dos provedores que perderam a corrida são abortadas.
  • options.providers aceita viacep, brasilapi e widenet, disputados na ordem dada (padrão ["viacep", "brasilapi"]). Um nome que não é provedor conhecido é ignorado. Uma lista sem nenhum provedor conhecido é uma opção inválida. widenet está obsoleto e fora da lista padrão: o endpoint dele agora redireciona para ws.apicep.com, que costuma estar indisponível, então só acrescenta um provedor que falha à corrida.
Esta função chama um serviço externo.
ParâmetroTipoObrigatório
cepstring | numbersim
optionsGetAddressInfoByCepOptionsnão
options.providersCepProvider[]não
options.signalAbortSignalnão
options.timeoutMsnumbernão
retornaPromise<AddressInfo>

Busca o endereço de um CEP em vários provedores ao mesmo tempo e resolve com a primeira resposta bem-sucedida. O resultado é um AddressInfo: cep, state, city, neighborhood e street.

  • Opções (GetAddressInfoByCepOptions):
    • providers (CepProvider[]) lista os provedores a disputar (padrão ['viacep', 'brasilapi']). 'widenet' está descontinuado, fica fora da lista padrão e costuma estar indisponível: seu endpoint agora redireciona para ws.apicep.com, que respondia 502 na última verificação, então ele só acrescenta um provedor que falha à disputa.
    • timeoutMs (number) limita a busca inteira, tentativas incluídas (padrão: sem limite). Quando o tempo acaba, todas as requisições são abortadas e a chamada rejeita com GetAddressInfoByCepServiceError.
    • signal (AbortSignal) cancela a busca; a chamada rejeita com signal.reason, como o fetch.
  • Aceita string ou número. Uma string tem removido todo caractere que não é dígito ('CEP 01310-100' é 01310100) e precisa sobrar com 8 dígitos. Um número é preenchido com zeros à esquerda até 8 dígitos, já que não carrega o zero inicial de um CEP de São Paulo, mas só a partir de 1000000 (01000-000, o menor CEP que os Correios atribuem). Um número menor, negativo ou fracionário é rejeitado com GetAddressInfoByCepValidationError antes de qualquer requisição.
  • Repete falhas transitórias de rede por provedor.
  • Rejeita com GetAddressInfoByCepValidationError quando o CEP é inválido, providers não nomeia nenhum provedor conhecido ou timeoutMs não é um número finito positivo, com GetAddressInfoByCepNotFoundError quando todos os provedores falharam e pelo menos um informou que o CEP é desconhecido, e com GetAddressInfoByCepServiceError quando todos os provedores falharam por outro motivo.
  • A BrasilAPI responde 404 tanto para um CEP desconhecido quanto quando os serviços por trás dela estão fora do ar, então o 404 dela só conta como "CEP desconhecido" quando nenhum outro provedor deixou de responder.
  • Um endereço só é aceito quando concorda com o CEP pedido: seus dígitos, preenchidos com zeros à esquerda até 8 (um provedor que responde 1310100 para 01310-100 quer dizer o mesmo CEP), precisam ser o CEP e o estado dele, quando informado, precisa ser o estado dono da faixa do CEP (veja getStateByCep). Caso contrário, esse provedor conta como não conhecendo o CEP. A BrasilAPI, por exemplo, respondeu o 99999-999, um CEP do Rio Grande do Sul, com uma cidade do Paraná.
  • Quando a busca termina, as requisições dos provedores que perderam a disputa são abortadas.
  • Os três estendem GetAddressInfoByCepError, então um único catch cobre todos.
import { getAddressInfoByCep, GetAddressInfoByCepNotFoundError } from '@brazilian-utils/brazilian-utils';

// Usando os provedores padrão (['viacep', 'brasilapi'])
const address = await getAddressInfoByCep('01310100');
// { cep: '01310100', state: 'SP', city: 'São Paulo', neighborhood: 'Bela Vista', street: 'Avenida Paulista' }

// Usando um provedor específico, e distinguindo um CEP desconhecido de uma falha
try {
  await getAddressInfoByCep('01310-100', { providers: ['brasilapi'] });
} catch (error) {
  if (error instanceof GetAddressInfoByCepNotFoundError) {
    // nenhum provedor conhece o CEP
  }
}

// Usando número como entrada (será preenchido automaticamente com zeros à esquerda)
const addressFromNumber = await getAddressInfoByCep(1310100);

// Desistindo depois de 5 segundos
const addressWithinFiveSeconds = await getAddressInfoByCep('01310100', { timeoutMs: 5000 });
Código: brazilian-utils/javascript
Teste com JavaScript getAddressInfoByCep
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (0) e o resultado em cada biblioteca cep.getAddressInfo

Esta função ainda não tem casos de teste compartilhados.

Get info by address

Consulta todos os CEPs de um logradouro no serviço ViaCEP (chamada de rede).

  • params traz a UF (lida sem diferenciar maiúsculas de minúsculas e sem os espaços das pontas), o município e o logradouro. Antes da consulta, a função remove os espaços das pontas e os acentos do município e do logradouro.
  • Cada resultado é o registro do ViaCEP sem alteração, com os nomes de campo do próprio ViaCEP: cep (com máscara, 00000-000), logradouro, complemento, unidade, bairro, localidade, uf, estado, regiao, ibge, gia, ddd e siafi. Um campo que o serviço acrescente depois também é repassado.
  • A função tenta de novo as falhas transitórias de rede.
  • Falha com um erro. O erro distingue UF/município/logradouro ausente ou inválido, um endereço sem resultado e um erro HTTP do serviço.
  • Uma requisição que não chega a ser feita (sem conexão, por exemplo) falha com o erro de rede original, não com um desses erros.
  • params.federalUnit é o código de duas letras da UF, por exemplo SP. Precisa ser string e uma UF conhecida. params.city e params.street são o município e o nome do logradouro (ou parte dele).
  • city e street precisam ser strings com pelo menos 3 caracteres depois de tirar os espaços das pontas e os acentos, o mínimo que o ViaCEP aceita. Um valor em branco, que não é string ou com menos de 3 caracteres falha com o erro de validação antes de qualquer requisição.
  • Um params que não é objeto (omitido, null, string) e um federalUnit que não é string também falham com o erro de validação.
  • O ViaCEP limita a lista a 50 endereços, então um nome de rua curto que corresponde a mais ruas retorna só os 50 primeiros.
Esta função chama um serviço externo.
ParâmetroTipoObrigatório
paramsGetCepInfoByAddressParamssim
params.federalUnitstringsim
params.citystringsim
params.streetstringsim
retornaPromise<CepAddressInfo[]>

Busca os CEPs de um endereço na ViaCEP. Resolve com um array de CepAddressInfo.

  • O argumento (GetCepInfoByAddressParams) traz federalUnit, city e street. federalUnit pode estar em minúsculas; city e street têm os espaços nas pontas removidos e os acentos retirados antes da consulta, e cada um precisa ser uma string com pelo menos 3 caracteres depois disso, o mínimo que a ViaCEP aceita.
  • Rejeita com GetCepInfoByAddressValidationError quando a UF, a cidade ou a rua está ausente ou inválida (um valor em branco, um valor que não é string, ou uma cidade ou rua com menos de 3 caracteres, todos rejeitados antes de qualquer requisição), com GetCepInfoByAddressNotFoundError quando nenhum endereço corresponde à busca, e com GetCepInfoByAddressError quando a ViaCEP responde com um status de erro HTTP.
  • Repete falhas transitórias de rede, como getAddressInfoByCep.
  • Cada item traz a resposta da ViaCEP sem alterações, com os nomes de campo da própria ViaCEP.
  • A ViaCEP limita a lista a 50 endereços, então um nome de rua curto que corresponde a mais ruas retorna só os 50 primeiros.
import { getCepInfoByAddress } from '@brazilian-utils/brazilian-utils';

const ceps = await getCepInfoByAddress({
  federalUnit: 'MG',
  city: 'Ouro Preto',
  street: 'Rua Direita'
});

// [
//   {
//     cep: '35411-152',
//     logradouro: 'Rua Direita',
//     complemento: '',
//     unidade: '',
//     bairro: 'Riacho (Amarantina)',
//     localidade: 'Ouro Preto',
//     uf: 'MG',
//     estado: 'Minas Gerais',
//     regiao: 'Sudeste',
//     ibge: '3146107',
//     gia: '',
//     ddd: '31',
//     siafi: '4921'
//   }
// ]
Código: brazilian-utils/javascript
Teste com JavaScript getCepInfoByAddress
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (0) e o resultado em cada biblioteca cep.getInfoByAddress

Esta função ainda não tem casos de teste compartilhados.

Get state

Retorna o estado dono da faixa de CEP em que o CEP cai. Funciona offline: a resposta vem de uma tabela de faixas, não de uma chamada de rede.

  • value é lido como em cep.isValid: 8 dígitos, como string ou número, com espaços, pontos, hífens e barras ignorados.
  • Um número precisa ser um inteiro não negativo: -20040020 e 2004002.5 retornam null. CEP que começa com 0 deve ser passado como string.
  • O resultado é o mesmo objeto que state.getByIbgeCode e state.list retornam (uma cópia nova a cada chamada).
  • Retorna null para um CEP inválido, um valor que não é string nem número e um CEP fora de qualquer faixa.
  • Dois blocos não pertencem a nenhum estado: 00000-000 a 00999-999, e 78900-000 a 78999-999. No segundo, MT termina em 78899-999.
  • A faixa é o bloco atribuído ao estado. Ela não garante que todo CEP dentro dela esteja em uso. SP é uma faixa única, então 10000-000 retorna SP, embora nenhuma cidade use 10xxx.
  • A tabela é a resposta da "Busca Faixa de CEP" dos Correios quando só o estado é informado.
UFFaixa de CEP
SP01000-000 a 19999-999
RJ20000-000 a 28999-999
ES29000-000 a 29999-999
MG30000-000 a 39999-999
BA40000-000 a 48999-999
SE49000-000 a 49999-999
PE50000-000 a 56999-999
AL57000-000 a 57999-999
PB58000-000 a 58999-999
RN59000-000 a 59999-999
CE60000-000 a 63999-999
PI64000-000 a 64999-999
MA65000-000 a 65999-999
PA66000-000 a 68899-999
AP68900-000 a 68999-999
AM69000-000 a 69299-999 e 69400-000 a 69899-999
RR69300-000 a 69399-999
AC69900-000 a 69999-999
DF70000-000 a 72799-999 e 73000-000 a 73699-999
GO72800-000 a 72999-999 e 73700-000 a 76799-999
RO76800-000 a 76999-999
TO77000-000 a 77999-999
MT78000-000 a 78899-999
MS79000-000 a 79999-999
PR80000-000 a 87999-999
SC88000-000 a 89999-999
RS90000-000 a 99999-999
ParâmetroTipoObrigatório
valuestring | numbersim
retornaState | null

Retorna o estado brasileiro ao qual um CEP pertence, a partir das faixas de CEP que os Correios atribuem a cada UF (a "Faixa de CEP" de cada UF).

  • Funciona offline: nenhuma API de CEP é chamada, então a resposta diz qual estado é dono da faixa, não se o CEP está em uso.
  • Aceita o que o isValidCep aceita: 8 dígitos, como string ou número, ignorando espaços, pontos, hífens e barras. Um CEP que começa com 0 precisa ser uma string, e um número negativo ou fracionário é rejeitado. getAddressInfoByCep e formatCep com pad: true preenchem números com zeros à esquerda (1310100 vira 01310-100).
  • Amazonas, Distrito Federal e Goiás têm duas faixas cada, e nenhuma faixa estadual cobre 00000-000 a 00999-999 nem 78900-000 a 78999-999.
  • A faixa é o bloco que pertence ao estado, não uma garantia de que todo CEP dentro dela está em uso: 10000-000 está sem uso dentro da faixa de São Paulo e ainda assim responde São Paulo.
  • Retorna null para um CEP inválido ou fora de todas as faixas. Exporta o tipo State.
import { getStateByCep } from '@brazilian-utils/brazilian-utils';

getStateByCep('01310-100');
// { code: 'SP', name: 'São Paulo', regionCode: 'SE', regionName: 'Sudeste', ibgeCode: 35 }

getStateByCep(20040020);
// { code: 'RJ', name: 'Rio de Janeiro', regionCode: 'SE', regionName: 'Sudeste', ibgeCode: 33 }

getStateByCep('69300-000')?.code; // 'RR'
getStateByCep('72800-000')?.code; // 'GO'
getStateByCep('00999-999'); // null
getStateByCep('12345'); // null

Fonte: Correios, Busca Faixa de CEP

Código: brazilian-utils/javascript
Teste com JavaScript getStateByCep
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (39) e o resultado em cada biblioteca cep.getState

Guias

Especificação

Resumo

O CEP é um código numérico de oito algarismos. Os Correios atribuem esses códigos a localidades, logradouros, unidades dos Correios, serviços, órgãos públicos, empresas e edifícios. Os códigos orientam e aceleram o encaminhamento, o tratamento e a distribuição de objetos de correspondência.

Regras de validação

  1. A entrada deve conter exatamente 8 dígitos.

Algoritmo

  1. Verificar se a entrada contém exatamente 8 caracteres.
  2. Verificar se todos os caracteres são dígitos.
  3. Se as duas condições forem verdadeiras, retornar válido. Se não, retornar inválido.

Regex

  • CEP sem formatação: ^\d{8}$
  • CEP formatado: ^\d{5}-\d{3}$

Faixas por estado

Os Correios atribuem a cada estado um ou mais blocos de CEP. cep.getState lê o estado desses blocos, offline.

  • Um bloco pertence a um estado, mas nem todo CEP dentro dele está em uso. 10000-000 cai no bloco de SP, embora nenhuma cidade use 10xxx.
  • Dois blocos não pertencem a nenhum estado: 00000-000 a 00999-999 e 78900-000 a 78999-999. MT termina em 78899-999.
  • AM, DF e GO têm dois blocos cada. 72800-000 a 72999-999, entre os dois blocos do DF, pertence a GO.
  • A tabela completa está na descrição de cep.getState.
  • cep.generate sorteia só dentro desses blocos, então o CEP gerado sempre pertence a um estado.

Exemplos

  • Válido: 01310200
  • 01310-200: decisão pendente. A referência (JS) aceita, as outras bibliotecas não.
  • Inválido: 12345 (deve conter exatamente 8 caracteres)
  • Inválido: 123456789 (deve conter exatamente 8 caracteres)
  • Inválido: abcdefgh (deve conter apenas dígitos)

Fontes oficiais

Veja também Estados (UF), Municípios

Atualizado em

Nesta página