- Home
- API
- UK PostCode API
- UK address autocomplete API: U ...

Address autocomplete is one of the highest-ROI UX improvements you can make to a UK checkout or registration form. Replacing a free-text address field with a postcode-driven typeahead reduces form abandonment, eliminates entry errors, and improves delivery success rates.
But while the concept is simple, many implementations fail in subtle ways — missing debounce, poor accessibility, or incorrect data storage. This guide walks through the correct UX patterns and working implementations using a UK address autocomplete API.
Most UK address autocomplete implementations follow a two-step flow — and for good reason.
User enters postcode → API returns all matching addresses.User selects address → form fields auto-fill.| Pattern | Best for | Cost | Completeness |
|---|---|---|---|
| Postcode → Select | Checkout, CRM | Low (1–2 calls) | Full structured data |
| Full typeahead | Search bars | High (per keystroke) | Partial until selected |
| Manual entry | Edge cases | Zero | Unreliable |
👉 For UK use cases, postcode-first is faster, cheaper, and more reliable.
Works in any HTML form.
const API_KEY = "your_apitier_key";
async function lookupPostcode(postcode) {
const clean = postcode.replace(/\s/g, "").toUpperCase();
const res = await fetch(
`https://postcode.apitier.com/v1/postcodes/${clean}?x-api-key=${API_KEY}`
);
if (!res.ok) return [];
const data = await res.json();
return data.addresses || [];
}
async function initAddressAutocomplete({ postcodeInput, dropdown, fields }) {
let debounceTimer;
postcodeInput.addEventListener("input", () => {
clearTimeout(debounceTimer);
const val = postcodeInput.value.trim();
if (val.length < 5) {
dropdown.innerHTML = "";
return;
}
debounceTimer = setTimeout(async () => {
const addresses = await lookupPostcode(val);
renderDropdown(addresses, dropdown, fields);
}, 300);
});
}
function renderDropdown(addresses, dropdown, fields) {
dropdown.innerHTML = "";
if (!addresses.length) return;
addresses.forEach(addr => {
const li = document.createElement("li");
li.textContent = addr.formatted_address;
li.setAttribute("role", "option");
li.addEventListener("click", () => {
fields.line1.value = addr.line_1 || "";
fields.line2.value = addr.line_2 || "";
fields.town.value = addr.town_or_city || "";
fields.county.value = addr.county || "";
dropdown.innerHTML = "";
});
dropdown.appendChild(li);
});
}import { useState, useCallback, useRef } from "react";
const API_KEY = process.env.REACT_APP_APITIER_KEY;
export function useAddressLookup() {
const [addresses, setAddresses] = useState([]);
const [loading, setLoading] = useState(false);
const debounce = useRef(null);
const lookup = useCallback((postcode) => {
clearTimeout(debounce.current);
if (postcode.replace(/\s/g,"").length < 5) {
setAddresses([]);
return;
}
debounce.current = setTimeout(async () => {
setLoading(true);
try {
const clean = postcode.replace(/\s/g,"").toUpperCase();
const res = await fetch(
`https://postcode.apitier.com/v1/postcodes/${clean}?x-api-key=${API_KEY}`
);
const data = await res.json();
setAddresses(data.addresses || []);
} finally {
setLoading(false);
}
}, 300);
}, []);
return { addresses, loading, lookup };
}If your dropdown is not accessible, it can fail compliance — especially for UK public sector or fintech apps.
Required attributes:
role="combobox" (input)role="listbox" (dropdown)role="option" (items)aria-expandedaria-activedescendantKeyboard support:
👉 Also announce results:
“5 addresses found. Use arrow keys to select.”
Calling API on every keystroke = wasted requests
Fix: 300ms debounce
Some postcodes fail
Fix: show “Enter address manually”
Some postcodes return 50+ results
Fix:
Bad for filtering & analytics
Fix: store structured fields:
1 to ~100 (average ~15). Urban areas return more.
Yes — cache for 24 hours to reduce API calls by 60–80%.
Yes — BT postcodes included with townland data.
A properly implemented UK address autocomplete:
And importantly — it takes less than 1 hour to implement correctly.
Free tier available — no credit card required
Most address autocomplete implementations fail not because of the API — but because of poor UX decisions.
If you follow:
You’ll have a production-ready, scalable solution.