Skip to main content

Ideal Postcodes Python SDK

Client for every current API operation: address search and lookup, place search, email and phone validation, and key, licensee and configuration management. Requires Python 3.12 or later; tested on 3.12, 3.13 and 3.14.

pip install ideal-postcodes
from ideal_postcodes import IdealPostcodes

with IdealPostcodes("ak_test") as client:
    for address in client.postcodes("BR8 7RE"):
        print(address.line_1, address.post_town)

ak_test is the public test key. The client returns Pydantic models from the API's result field. Read fields as attributes and use model_dump() for a dictionary. Reuse one client and close it with a context manager. Production keys belong in environment variables.

Search and resolve

from ideal_postcodes import IdealPostcodes

with IdealPostcodes("ak_test") as client:
    hits = client.find_address(query="9 Malyons Road", limit=5).hits
    if hits:
        address = client.resolve_address(hits[0].id)
        print(address.postcode)

Resolve the suggestion the user chooses. An empty suggestion list is a normal result.

Methods

Method Purpose
postcodes(postcode, ...) Addresses at a postcode
addresses(query=..., ...) Paginated address search; filters can be used without query text
address_cleanse(query=..., ...) Cleanse a freeform address, with optional postcode and post town
find_address(query=..., ...) Autocomplete suggestions
resolve_address(address, ...) Resolve a suggestion using the spec's GBR endpoint
find_place(query=..., ...) Place search
resolve_place(place, ...) Resolve a place suggestion
email_validation(query=..., ...) Validate an email address
phone_number_validation(query=..., ...) Validate a phone number
key_availability(key) Public availability and licensed contexts
key_details(key, user_token=...) Private settings and remaining lookups
update_key_details(key, user_token=..., ...) Update selected key settings
key_usage(key, user_token=..., ...) Usage totals and daily breakdown
key_logs(key, user_token=..., ...) Paid lookup logs as CSV text
list_licensees, create_licensee, retrieve_licensee, update_licensee, delete_licensee, regenerate_licensee_key Licensee management
list_configs, create_config, retrieve_config, update_config, delete_config Saved configurations
Methods expose every supported input in their signatures. Required keyword arguments must be supplied. Optional None values are omitted, leaving defaults to the server. Dataset lists are comma-joined. String flags use "true" and "false", as declared by the API. Parameter constraints appear in each method's docstring; scalar ranges, lengths and enums are checked before sending.

Use help(IdealPostcodes.find_address) or inspect ideal_postcodes/client.py for parameters. Response definitions live in ideal_postcodes/types.py. examples/ has a runnable script for each method.

Keys

from ideal_postcodes import IdealPostcodes

with IdealPostcodes("ak_test") as client:
    availability = client.key_availability("ak_test")
    print(availability.available)

The key argument identifies the key to inspect or update. Availability and retrieve_config need no Management Key. Other key, licensee and configuration methods require your Management Key as the keyword user_token; the client sends it in the Authorization header, never the URL. Load it from your application's secret storage. Usage and logs accept start and end as UNIX timestamps in milliseconds. key_logs returns CSV text rather than a response model.

Update only the settings you want to change. Nested settings accept typed dictionaries from ideal_postcodes.requests. For example, daily_limit={"limit": None} disables the daily limit, notifications={"enabled": False} disables notifications and allowed_urls=[] clears the URL restriction. Omitted top-level settings remain unchanged. Nested None values are sent as JSON null.

Errors and retries

All SDK request failures derive from ClientError:

  • APIError: unsuccessful HTTP response, with status, code, message, body and raw retry_after
  • AuthenticationError, PaymentRequiredError, NotFoundError, RateLimitError and ServerError: API error subclasses
  • TransportError: connection or timeout failure before a response
  • ProtocolError: unexpected success status, malformed envelope or invalid response fields. When response fields fail validation, result holds the unvalidated result, so except ProtocolError as error: raw = error.result can fall back to it

NotFoundError.suggestions contains postcode suggestions when supplied by the API. HTTP 429 and HTTP 503 with API code 5030 raise RateLimitError. Other 5xx responses raise ServerError. Exception strings include the API's message, for example API request failed (HTTP 404, code 4040): Postcode not found, and omit credentials and request URLs. body may contain caller input.

There are no automatic retries. A timeout may occur after a lookup was processed. Choose retry behaviour in the application and bound attempts; Retry-After can be seconds or an HTTP date. Inputs are checked against the spec before the network call: a missing argument, wrong type or unknown settings key raises TypeError, and an out-of-range number, string length or pattern raises ValueError. Option values the SDK does not list yet pass through to the API.

Testing and limits

Pass transport=httpx.MockTransport(handler) to test without network access, or override base_url. The default timeout is 10 seconds.

Response models validate required fields, types, lists and unions from the checked-in OpenAPI contract, and accept normal API growth: extra fields survive in model_dump(), option fields are plain strings so new values come through, and a native record from a dataset the SDK does not know yet arrives as a dictionary. An explicit filter returns address dictionaries containing the requested fields; paginated address search returns a model whose hits are dictionaries. The client is synchronous; run it in a worker thread when calling from an async application.

Signup is not included.

Development

Run uv sync --frozen, then make ci and make build. make generate rebuilds the client, transport and response types from the shared generator and this brand's spec. make check-generated detects drift without rewriting committed files. make format applies Ruff fixes and formatting; make ci checks both. Run commands from this package directory.

Licence

SEE LICENSE IN LICENSE

Metadata

Release files for ideal-postcodes 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ideal-postcodes 0.1.0
File Size Uploaded
ideal_postcodes-0.1.0.tar.gz 60.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ideal-postcodes 0.1.0
File Interpreter ABI Platform
ideal_postcodes-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 123.7 kB

Release files / ideal_postcodes-0.1.0.tar.gz

Download URL ideal_postcodes-0.1.0.tar.gz
Size 60.7 kB
Tags Source
SHA-256 checksum
How to use checksums
4c440773d4e79d54bda4710ebfdc85edd1d978f7c4d09447c8c54f2dfcbf3a2a
BLAKE2b-256 checksum
How to use checksums
a3a1e2fe2b5e9f0069e0b9da398e20148d96d8d3f7884d456f009dc3ced4e407
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.

Transparency log

Release files / ideal_postcodes-0.1.0-py3-none-any.whl

Download URL ideal_postcodes-0.1.0-py3-none-any.whl
Size 63.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4d4fa45b015767a84df33671b082bba08ef9cf8e029f3cf8d8f1b2f42d87a77e
BLAKE2b-256 checksum
How to use checksums
74581c31ddbbe7c2045b48d9dbd1fce8e98e39707d36d5e675a369490d29104c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page