Skip to main content

cepx

Fast, offline-capable Brazilian CEP (postal code) lookup for Python, sync and async.

Most CEP libraries are thin HTTP clients: every lookup is a round-trip to Correios/ViaCEP/BrasilAPI, so you inherit their latency, rate limits, and downtime. cepx can resolve CEPs fully offline from a prebuilt database bundled with the package; in microseconds, with no network at all. When you do want the network, it still races the same public providers and returns the first successful answer.

Why cepx

local (offline) network providers
Latency ~12 µs/lookup (~85k/s) one HTTP round-trip (tens–hundreds of ms)
Network none required
Rate limits / outages none subject to both
Works air-gapped
Coverage ~1.14M CEPs (bundled) whatever the live service returns

The offline path is thousands of times faster than any HTTP lookup and depends on nothing but your own process. Numbers above are the full public API (cepx.cep(...)) against the complete national database, reproducible with make bench-local.

Offline lookups (the local provider)

Install the local extra (it pulls in cepx-data), which ships a prebuilt SQLite database of ~1.14M CEPs:

pip install "cepx[local]"
import cepx

cepx.cep("05010000", providers=["local"])
# Address(cep='05010000', state='SP', city='São Paulo',
#         neighborhood='Perdizes', street='Rua Caiubi', provider='local')
  • Zero network. No requests, no rate limits, no third-party availability to depend on. Ideal for batch jobs, air-gapped environments, and hot paths.
  • Auto-discovered. Once cepx-data is installed, the local provider finds the database automatically; set CEPX_DB to point at your own SQLite file.
  • Opt-in. local is not part of the default provider race; request it explicitly with providers=["local"].

The database

cepx[local] adds one dependency, cepx-data, which bundles the CEP database:

  • ~17 MiB download (the wheel), ~42 MiB on disk once installed — a one-time cost, no runtime downloads.
  • ~1.14 million CEPs: every UF, ~5.4k municipalities, ~31k neighborhoods, ~611k streets.
  • Stored as a normalized SQLite database (one row per CEP keyed on the CEP itself, with UF/city/neighborhood/street deduplicated into lookup tables), so a query is a single indexed primary-key join.
  • Data is derived from CEP Aberto under the Open Database License (ODbL); cepx-data ships it and carries the attribution.

A CEP that isn't in the dataset is a clean miss (provider_error); fall back to the network providers for full coverage if you need it.

Offline-first with network fallback

Prefer the local database and only touch the network when a CEP isn't covered:

def lookup(cep):
    try:
        return cepx.cep(cep, providers=["local"])   # ~microseconds on a hit
    except cepx.CepxError:
        return cepx.cep(cep)                        # network only on a miss

Do this rather than passing providers=["local", ...] in a single call: mixing local with network providers forces the concurrent race path, which spins up a thread pool and fires the network requests on every lookup, even the ones local answers instantly (they're just cancelled once local wins). The two-step form keeps hits fully offline at microsecond speed and only touches the network on genuine misses.

Network lookups

Without the extra (or when you don't request local), cepx queries the live providers (Correios, ViaCEP, WideNet, BrasilAPI, and OpenCEP) concurrently, and the first successful response wins. The lookup only fails once every provider fails, aggregating each error.

import cepx

cepx.cep("05010000")
# Address(cep='05010000', ..., provider='brasilapi')

cepx.cep(5010000)                            # ints are left-padded
cepx.cep("05010000", providers=["viacep"])   # restrict providers
cepx.cep("05010000", timeout=5.0)            # per-provider timeout (s)
import asyncio
import cepx

asyncio.run(cepx.acep("05010000"))

Errors

cepx.CepxError is raised with a type of either "validation_error" (bad input, before any request) or "provider_error" (all providers failed). Its errors list holds the underlying cepx.ProviderError entries.

Development

make setup         # create the venv, install deps, install git hooks
make check         # unit tests + coverage + pre-commit (lint, format, types)
make bench-local   # benchmark the local provider against cepx-data

Run make with no target to see everything available.

Credits

cepx began as a Python port of cep-promise and keeps its first-successful-provider model for network lookups.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cepx-0.1.3.tar.gz (61.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cepx-0.1.3-py3-none-any.whl (15.7 kB view details)

Uploaded Python 3

File details

Details for the file cepx-0.1.3.tar.gz.

File metadata

  • Download URL: cepx-0.1.3.tar.gz
  • Upload date:
  • Size: 61.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for cepx-0.1.3.tar.gz
Algorithm Hash digest
SHA256 00541f6a1b535c241b0b7dfe6a0c6ce45727bc2f6ce64618750372f90df7af26
MD5 abde107a40a87d2650d99748074879a4
BLAKE2b-256 326f7bceb9231a76e7aa2e8e45a9c7c5dcce75be217a3a7e2bc5db602cf1f7aa

See more details on using hashes here.

File details

Details for the file cepx-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: cepx-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 15.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for cepx-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 8fad8edd03fdebb00428b8761ecfb4265eed2c9592a28f4bcd82e54c390c3355
MD5 280a78620fcb5d134a3bdd1213d4e53b
BLAKE2b-256 d7289190e08b0b8fc4531de33f3c6d59adc8d083168fabdf446922618702d7aa

See more details on using hashes here.

Release history Release notifications | RSS feed

0.1.5

2 files

0.1.4

2 files

This release

0.1.3 This release

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page