Official Python client for Addresso UK address lookups. Zero dependencies, typed frozen dataclasses, and full IDE autocomplete.
Requires Python 3.9 or later. No external dependencies.
pip install addresso
Create a Client with your API key. All methods return typed frozen dataclasses.
from addresso import Client
client = Client("ak_your_api_key")
# Postcode lookup
result = client.lookup_postcode("SW1A 1AA")
for address in result.addresses:
print(f"{address.building_number} {address.street}, {address.town}")
# Address search
result = client.search_addresses(q="10 Downing Street")
# Account info
account = client.account()
print(f"Credits: {account.credits_balance}")api_keystrrequiredYour Addresso API key (begins with ak_).
base_urlstrOverride the API base URL. Defaults to https://addresso.co.uk.
Look up all addresses at a UK postcode. Returns a PostcodeLookupResult.
result = client.lookup_postcode("SW1A 1AA")
result.postcode # "SW1A 1AA"
len(result.addresses) # number of addresses
result.credits_remaining # credits left
for address in result.addresses:
print(address.building_name)
print(address.street)
print(address.town)Search using keyword arguments. Returns an AddressSearchResult.
# Free-text search
result = client.search_addresses(q="10 Downing Street")
# Structured search
result = client.search_addresses(
town="London",
street="Downing Street",
building_number="10",
limit=5,
)
result.count # total matches
result.credits_remaining # credits leftqstrFree-text query across all fields.
postcodestrFilter by postcode.
townstrFilter by town.
streetstrFilter by street name.
building_namestrFilter by building name.
building_numberstrFilter by building number.
organisationstrFilter by organisation.
limitintMax results to return (default 50).
Check your account status and remaining credits.
account = client.account() account.company_name # your company name account.credits_balance # credits remaining account.earliest_expiry # earliest credit expiry date (or None)
All responses are frozen dataclasses. The Address class contains these fields:
postcodestrFull postcode.
townstrPost town.
localitystrLocality name.
sub_localitystrSub-locality.
streetstrPrimary street name.
secondary_streetstrSecondary street.
building_numberstrBuilding number.
building_namestrBuilding name.
sub_buildingstrSub-building (flat, unit, etc.).
po_boxstrPO box number.
departmentstrDepartment name.
organisationstrOrganisation name.
udprnintUnique Delivery Point Reference Number.
postcode_typestrPostcode type (S or L).
delivery_point_suffixstrRoyal Mail delivery point suffix.
latitudefloat | NoneWGS84 latitude, or None.
longitudefloat | NoneWGS84 longitude, or None.
All API errors raise AddressoException with a status_code attribute.
from addresso import AddressoException
try:
result = client.lookup_postcode("INVALID")
except AddressoException as e:
print(e) # "Invalid postcode"
print(e.status_code) # 400