postal
Python bindings to libpostal for fast international address parsing/normalization
What it is and what it does
postal is a Python wrapper around libpostal, a standalone C library for parsing and normalizing street addresses in any language or format worldwide. It provides two main functions: expand_address() generates normalized variations of an address (useful for fuzzy matching), and parse_address() breaks an address into its semantic components (street, city, country, postal code, etc.).
The package is designed for developers building geocoding pipelines, address validation systems, or search indexing that must handle international addresses. Installation requires compiling libpostal from source with system build tools and allocating disk space for linguistic and geographic data. The bindings are CPython-only and support Python 3.5 and later.
Use it for:
- Normalize and standardize address data from multiple sources before geocoding or database storage
- Extract address components (street, city, postal code) from unstructured text for form validation or data enrichment
- Generate address variations for fuzzy matching in search or deduplication workflows
- Preprocess international addresses in multiple languages for mapping or logistics applications
- Index addresses in search engines by expanding and normalizing variants
Worth the install?
AI-flagged interpretation of the facts on this page — verify before relying
Python bindings to libpostal, a C library for parsing and normalizing street addresses worldwide, supporting address expansion and component extraction.
Yes, if you need robust international address parsing and can handle the compilation overhead. The high install friction (system C library build, platform-specific setup, several GB data) is a real cost, but the package is stable, permissive-licensed, and solves a hard problem well. Not suitable for environments where you cannot compile C libraries or manage system dependencies. Maintenance is aging but not abandoned; last release was recent.
Install
postal on PyPI
pip
pip install postaluv
uv add postalpoetry
poetry add postalInstalling postal
Before you install
High install friction: requires compiling the libpostal C library before the Python bindings can work. Needs system build tools (autoconf, automake, libtool, pkg-config) and several GB of disk space for libpostal's data. Platform-specific setup is required (Ubuntu/Debian, CentOS/RHEL, macOS, or Windows with MSYS2). Last release was 289 days ago; maintenance is aging.
License in practice
MIT License (permissive). You can use, modify, and distribute this package freely in commercial or private projects, with minimal restrictions.
Quickstart
# Install libpostal C library first (see platform-specific instructions in docs)
# Then: pip install postal
from postal.expand import expand_address
expand_address('Quatre vingt douze Ave des Champs-Élysées')
from postal.parser import parse_address
parse_address('The Book Club 100-106 Leonard St, Shoreditch, London')
libpostal C library must be compiled and installed system-wide before pip install postal will work. Requires build tools (autoconf, automake, libtool, pkg-config) and several GB of disk space. CPython only; PyPy not supported.
Verify before relying
- Whether libpostal data files are automatically downloaded during installation or must be manually configured
- Current state of Windows support and whether MSYS2 setup remains the recommended path
- Performance characteristics and typical latency for address parsing operations
- Whether the package works with modern Python versions beyond 3.5 despite unspecified support
Package facts
| License | MIT License (permissive) |
| Python support | not specified |
| Install friction | high — source build required |
| Runtime dependencies | 1 — six |
| Maintenance | aging — 289 days since the last release |
| Last repo commit | |
| First released | |
| Downloads | 84,331/month — #14,007 on PyPI (30-day window, as of 2026-08-14) |
| Known vulnerabilities | none known (OSV.dev, checked 2026-08-14) |
Evidence: postal-1.1.11.tar.gz
Tags
More Python Modules packages
Converts domain names between Unicode and…
permissive · top 100 on PyPI
setuptoolsSetuptools is a Python build backend and…
permissive · top 100 on PyPI
PyYAMLPyYAML parses and emits YAML 1.1 data format,…
permissive · top 100 on PyPI
pydanticPydantic validates Python data structures…
permissive · top 100 on PyPI
annotated-typesProvides reusable metadata objects for use with…
permissive · top 100 on PyPI
typing-inspectionProvides runtime tools to inspect and…
permissive · top 100 on PyPI
lobPython wrapper for the Lob.com API, providing…
permissive · top 15,000 on PyPI
pyap2Pyap2 detects and parses postal addresses from…
permissive · top 15,000 on PyPI
pyapPyap detects and parses postal addresses from…
permissive · top 15,000 on PyPI
usaddress-scourgifyCleans and normalizes US addresses to USPS and…
unclear · top 5,000 on PyPI
usaddressusaddress parses unstructured US address…
permissive · top 5,000 on PyPI
google-i18n-addressValidates, normalizes, and formats postal…
permissive · top 15,000 on PyPI
pypostalcodeLooks up Canadian postal codes to retrieve…
permissive · top 15,000 on PyPI
opencageA Python wrapper for the OpenCage Geocoding API…
permissive · top 15,000 on PyPI
smartystreets-python-sdkA client library for accessing SmartyStreets…
permissive · top 15,000 on PyPI
pgeocodepgeocode queries postal codes to retrieve GPS…
permissive · top 5,000 on PyPI