UK company data & identity

Postcodes.io vs Ideal Postcodes: which UK address lookup should you use?

Choose by the record your product must return: postcode geography, or a complete delivery-point address.

A postcode is not a premises: premises dependency by step, from checkout down to a territory map
By Ritesh AgarwalReviewed Sep 9, 20269 min read

Direct answer

Use Postcodes.io when you need to validate a postcode, locate it, or attach region, constituency and local-authority data. Use Ideal Postcodes when a person must select a complete UK delivery address: flat, building, organisation, post town and postcode. For most service-area products the right architecture is both: postcode geography for eligibility, then an address service only when a full premises record is actually required.

postcode → placePostcodes.ioValidation, coordinates, boundaries, statistical geography
postcode → premisesIdeal PostcodesSelectable, structured delivery-point addresses
eligibility → fulfilmentUse bothEnrich first; pay for address resolution at the point of need

Key takeaways

  1. Postcodes.io resolves a postcode to a place. It never returns the flats, houses or organisations at that postcode.
  2. Ideal Postcodes resolves a postcode to selectable delivery points from Royal Mail PAF. Keyed, metered, 30 requests per second per IP by default.
  3. Both come from the same maintainer. They are not competitors; they answer different questions.
  4. Most service-area products need both: geography for eligibility, premises at the point of need.
  5. In five years of UK lookups we have shipped neither to production. The lessons still apply.

One postcode, two different records

SW1A 2AAone UK postcodePOSTCODE → PLACEPostcodes.ioopen data · no key · freelatitude, longitudepostcode centroidregion, countryLondon · Englandlocal authority codeE09000033constituency, LSOA, MSOAstatistical geographyeligibility · analytics · territories · validationPOSTCODE → PREMISESIdeal PostcodesRoyal Mail PAF · API key · meteredFlat 1, 10 Downing Streetdelivery pointFlat 2, 10 Downing Streetdelivery pointPrime Minister & First Lord…organisation10 Downing Streetdelivery point · UPRNcheckout · installation · contract · CRM · user selects one rowFIG. 01TWO RECORDS, ONE POSTCODE
Fig. 01 The same input, two different outputs. Left resolves to a place; right resolves to the premises a person means.scroll →

Postcodes.io is a free UK postcode lookup API and geocoder, maintained as an open-source project by Ideal Postcodes. It serves the ONS Postcode Directory, Ordnance Survey Open Names and Scottish Postcode Directory, and exposes lookup, autocomplete, bulk lookup, reverse geocoding and terminated-postcode search. A result carries coordinates, country, region, local authority, constituency and statistical codes. That is exactly what territory checks, routing, analytics and public-data joins need. Postcodes.io API docs

Ideal Postcodes is an authenticated, metered service over Royal Mail PAF and other datasets. A postcode lookup returns the structured addresses at that postcode; its two-step address search finds candidates from partial text and resolves the selected one to a full record, with UPRNs where the dataset allows. Three address lines, post town and postcode are the minimum for a deliverable UK address. The default rate limit is 30 requests per second per IP, with a separate limit for autocomplete. Ideal Postcodes API reference

A postcode is not a premises. One postcode covers several delivery points, and the coordinates are a postcode centroid, not a property entrance. ONS assigns a postcode to the administrative area containing its geographical centre, so postcode geography does not always follow boundaries. ONS on postcode directories

Side by side

Decision factorPostcodes.ioIdeal Postcodes
Primary recordPostcode plus geography and administrative codesComplete, structured delivery-point address
Returns flats, houses, organisationsNoYes, where present in the enabled dataset
CoordinatesYes, postcode levelProperty-level data depends on product and dataset
Typical UXEnter postcode, validate or enrichEnter postcode or partial address, then select a premise
Authentication and costNo key; free public API; self-hosting availableAPI key; metered balance or plan
Best forTerritories, analytics, public-data joins, validationCheckout, delivery, installations, contracts, CRM capture
CaveatNot an address database; Northern Ireland commercial use needs a separate licencePaid dependency; key, quota, outage and licence controls are part of the build

Postcodes.io code is MIT-licensed and Great Britain data is under the OS OpenData licence. Commercial use of Northern Ireland postcode data requires a licence from Land & Property Services. A free endpoint does not remove downstream data obligations. Postcodes.io licences

A real boundary: a cover funnel for a top UK home cover provider

Since 2021 we have built and run the website that sells boiler and home-emergency cover for a top UK home cover provider: a plan configurator, a lead form with postcode lookup, a live plan summary, agreement start date, marketing preferences and CRM sync. This is the live lookup step.

The live postcode lookup step: postcode field, lookup button, manual entry link and address selector
The production lookup step on a top UK home cover provider’s checkout, built and run by Appycodes since 2021.

The boundary is easy to miss. A valid postcode is not enough for a premises-based customer journey. The operations team needs the address the customer selected, while the service-area rule needs only the postcode. Collapse both into one “address lookup” step and you either leave the CRM without a complete address or make every eligibility check depend on a paid premises lookup.

01Configure coverCustomer type, call-out fee, billing period
02Resolve addressPostcode to a customer-selected premises
03Qualify leadPlan summary and start date
04Sync CRMAttribution and operational follow-up

What our production record actually shows

A comparison should say what its author runs. Across our UK client work since 2021, premises-level lookups in production run on Loqate: the Capture Find and Retrieve endpoints on WordPress and WooCommerce checkouts, and the Verify endpoint behind a Node parcel-quoting backend that needs international coverage. Google Places covers two enquiry forms. One survey quote wizard uses a free-tier UK lookup with a daily cap. We have not shipped Postcodes.io or Ideal Postcodes to production.

The one Postcodes.io evaluation, in September 2026, was rejected within a day. A quote wizard captured a postcode and a property value to price a survey, then showed the job address as “to be confirmed”, because a postcode is not a premises. Postcodes.io could not return the list of properties the surveyor needed, so the team moved to a premises-level provider. That is the dependency score in one sentence: the eligibility step scored 2, the booking step scored 9, and the tool chosen for the first could not do the second.

2024 → 2025Lookup returned “one item as a bundle”

The provider sometimes returns the postcode as a container record; a second call with the container ID is needed to list the premises.

Detect a postcode-level response and drill down automatically.
2026Ten unrelated properties for a customer’s own postcode

The site sent the whole stored CRM address string, including county, a plan reference and a postcode with a stray space. The provider fell back to fuzzy matching.

Extract and normalise the postcode before the call. Never send free text you did not intend to be parsed.
2025Checkout postcode finder silently stopped

The prepaid credit pack ran out after a card change ended auto top-up.

Alert on balance and lookup error rate; keep manual entry working when the provider returns nothing.
2023“Lookup is broken”, raised as priority one

The manual-entry toggle was on, which hid the lookup button.

Make lookup and manual modes visibly exclusive.
2025Customers could not find a single-match address

The confirmation dropdown was suppressed when only one property matched.

Always show the selection step. The confirmation is the record, not the lookup.
2024Plans sold in postcodes with no engineer coverage

A 112-prefix exclusion list ran on the lookup path but not on manual entry, was initially case-sensitive, and on one journey checked the wrong address.

Enforce service-area rules server-side, on every entry path, against the address the business acts on.

Two more findings changed how we quote lookups. Cost is a subscription, and it shapes the design: on one commercial provider the Find call with a postcode filter validates without consuming a paid lookup, while Retrieve is charged, so validation can be free and premises resolution paid for only at the point of need. And provider validation is not carrier validation: a parcel-quoting client saw postcodes the address provider accepted and a courier’s rates API rejected. Shipping products must validate against the carrier that will deliver.

The Premises Dependency Score

A ten-point model to stop teams buying an address service for a geography problem, or shipping a postcode API where operations need a real premises. Score the step where the address is captured, not the product.

Premises Dependency Score0–10
+4The transaction, visit, delivery or cover attaches to a specific premises
+2The user must distinguish a flat, unit, building or organisation at one postcode
+2The address goes to a carrier, field team, contract, insurer or CRM workflow
+1A wrong address creates support, refund, travel or redelivery cost
+1Operations need a standardised address rather than free text
0–2 · Postcodes.ioValidate or enrich a postcode. Do not pretend to have the full address.
3–5 · Hybrid or manualUse postcode data for the rule; collect or verify the address only when needed.
6–10 · Address serviceIdeal Postcodes or an equivalent premises-level source, plus manual fallback.

A warehouse territory heatmap is 0–2. A retailer shipping parcels is 8–10. A home-services lead form splits: 2 for “do we cover your area?”, then 9 when the customer chooses the address operations will use. Splitting those stages is usually the cleanest architecture and the best conversion experience.

A provider boundary that survives pricing and API changes

User inputforgiving postcodemanual optionServer routenormalise · validatetime out · logGeography modePostcodes.iocache 24h · freePremises modeaddress providerno cache · meteredConfirmuser selectsor types"do we cover your area?" · score 0–2"which door?" · score 6–10stored with provenance: source · id · confirmed at · manual editsFIG. 02SPLIT-STAGE CAPTURE
Fig. 02 One server route, two explicit modes. Geography is cheap and cached; premises resolution is paid for only when the workflow needs a door.scroll →

Keep provider response shapes out of your checkout, onboarding and CRM model. Return a narrow internal contract. That makes it possible to change provider, add a fallback or move a key server-side without rewriting every form.

app/api/address/route.ts — one route, two explicit record typestypescript
import { NextRequest, NextResponse } from "next/server";

const compact = (value: string) => value.trim().toUpperCase().split(" ").join("");

export async function GET(request: NextRequest) {
  const postcode = compact(request.nextUrl.searchParams.get("postcode") ?? "");
  const mode = request.nextUrl.searchParams.get("mode");

  if (!/^[A-Z0-9]{5,7}$/.test(postcode)) {
    return NextResponse.json({ error: "Enter a full UK postcode" }, { status: 400 });
  }

  if (mode === "geography") {
    const res = await fetch(`https://api.postcodes.io/postcodes/${postcode}`, {
      next: { revalidate: 86400 },
    });
    if (!res.ok) return NextResponse.json({ error: "Postcode not found" }, { status: 404 });
    const { result } = await res.json();
    return NextResponse.json({
      postcode: result.postcode,
      latitude: result.latitude,
      longitude: result.longitude,
      region: result.region,
      localAuthorityCode: result.codes.admin_district,
    });
  }

  if (mode === "address") {
    const key = process.env.IDEAL_POSTCODES_API_KEY;
    if (!key) throw new Error("IDEAL_POSTCODES_API_KEY is missing");
    const url = new URL(`https://api.ideal-postcodes.co.uk/v1/postcodes/${postcode}`);
    url.searchParams.set("api_key", key);
    const res = await fetch(url, { cache: "no-store" });
    if (!res.ok) return NextResponse.json({ error: "Address lookup failed" }, { status: 502 });
    const { result } = await res.json();
    return NextResponse.json({
      addresses: result.map((a: Record<string, string>) => ({
        line1: a.line_1, line2: a.line_2, line3: a.line_3,
        postTown: a.post_town, postcode: a.postcode, uprn: a.uprn,
      })),
    });
  }

  return NextResponse.json({ error: "Choose geography or address" }, { status: 400 });
}
  1. The regex is only an early guard. It cannot prove a postcode is allocated; the provider lookup decides. Add an abort timeout, structured error codes and quota alerts.
  2. Valid postcode, no address returned. Offer manual entry immediately and record the lookup outcome, not a fabricated match.
  3. New builds and converted flats go missing. Let the user enter and confirm; store provenance as “manual”.
  4. Follow the GOV.UK address pattern. Accept any case and spacing, do not require county, and keep a manual route for international or unlisted addresses. GOV.UK Design System

Recommendations by business type

UK retailerResolve the delivery point

A full-address service at checkout, manual entry retained, and the customer-confirmed address passed to fulfilment. Postcodes.io separately for regional analytics or restrictions.

UK SaaS or directoryDo not buy precision you do not use

If the product needs region, council or approximate map placement, Postcodes.io is the simpler fit. Ask for a complete address only when the workflow acts on that premises.

Home services and coverSplit eligibility from fulfilment

Check the postcode or territory early. Resolve and confirm the actual property before a contract, appointment or CRM hand-off.

Marketplace or platformStore provenance per address

Keep the selected record, source, identifier where licensed, confirmation time and manual edits. Never let an enrichment job silently overwrite a confirmed address.

Our rulePostcodes.io tells the product where a postcode belongs. Ideal Postcodes tells the user which address they mean.

Frequently asked questions

Does Postcodes.io return a full UK address?
No. It resolves a postcode to postcode-level geography and administrative data. It does not return the individual flats, houses or organisations that receive post at that postcode.
Is Ideal Postcodes just a paid version of Postcodes.io?
No. They solve different data problems, although Postcodes.io is an open-source project maintained by Ideal Postcodes. Ideal Postcodes returns structured delivery-point addresses and address search; Postcodes.io serves open postcode and geography datasets.
Can a retailer use Postcodes.io at checkout?
It can validate and enrich a postcode, but it cannot populate a complete delivery address. A retailer still needs manual entry or a delivery-address service such as Ideal Postcodes.
Which address provider does Appycodes actually run in production?
Across our UK client work the premises-level lookups in production run on Loqate, with Google Places on two enquiry forms and a free-tier lookup on one quote wizard. We have not shipped Postcodes.io or Ideal Postcodes to production. The one Postcodes.io evaluation was rejected because the workflow needed a list of properties.
Should an address API key be exposed in browser code?
Only if the provider explicitly supports a browser key restricted to approved origins. Server-side proxying gives tighter control over secrets, quotas, logging and provider changes.

Primary sources

Published 5 Sep 2026Reviewed 9 Sep 2026Reviewer Appycodes Editorial Team

Technical and operational guidance, not legal or licensing advice. Confirm data licensing and retention for your deployment.

Our clients

UK · Europe · Worldwide

Selected case studies

What we built, how it works and the results for our clients.

Creoate product interface01
B2B commerce

Eight years behind a wholesale marketplace

Next.js storefront, Python ingestion pipelines, DynamoDB data layer and AWS infrastructure.

8+ yearsdevelopment and support
Ontick product interface02
Event technology

Ticketing owned by the event team

Multi-organiser commerce, Stripe instalments and two native apps in one connected platform.

£2M+ticket sales processed
Easyship product interface03
Global logistics

Helping shippers compare their options

Rate, tax and duty calculators, server-rendered courier pages and a custom MongoDB CMS.

550+couriers in the calculator
TEFL.ie product interface04
Education & training

Connecting course sales to the classroom

WordPress and WooCommerce, a Moodle LMS, Stripe deposits and Zoho CRM, tied together with Zapier automation.

Since 2017development and support
All White Laser product interface05
Medical aesthetics

From equipment finance to clinic support

A lead-to-billing system on GoCardless Direct Debit, provider certification, and a React Native app for machine owners.

9 yrsdevelopment and support
Decofetch product interface06
Luxury commerce

A custom home for designer furniture

Server-rendered Next.js commerce over a Laravel API, bespoke operations tooling and re-architected AWS infrastructure.

0→livemarketplace development
BA Engine Room product interface07
AI operations

Connecting discovery, contracts and delivery

Discovery briefs, e-signed contracts, Stripe deposits, delivery milestones and time tracking in one operational system.

0→1custom platform development
PlusHeat product interface08
Home services

Helping customers choose their boiler cover

Custom plan configuration, postcode-qualified lead journeys, CRM synchronisation and campaign landing pages.

5 yrswebsite development and support
Léonia product interface09
Beauty commerce

Shopify shaped around a beauty brand

Custom theme, customer accounts, loyalty rewards, referrals and gift-with-purchase offers.

5 yrsShopify development and support
Shutters 365 product interface10
Home improvement

From window measurements to a priced order

A seven-step product builder with live previews, sample orders and supplier tools.

7-stepproduct configurator
Bloc Ads Manager product interface11
Advertising

From targeted ads to venue check-ins

Campaign creation, audience targeting, in-app ads and reporting linked to venue check-ins.

check-inscampaign attribution
Bloc product interface12
Social events

Four years across the app and operations

Mobile app, backend, advertising tools, a digital marketplace and website.

4+ yrssupport across five codebases
Zonely product interface13
Social mobile

Two apps, one real-time conversation marketplace

Customer and buddy apps with per-minute billing, wallets, moderation and admin tools.

2 appsfor iOS and Android
Player Profile Hub product interface14
Grassroots football

Helping grassroots players get discovered

Verified profiles, video highlights, coach discovery and safeguarding on web and mobile.

0→1custom platform development
DeepSpatial product interface15
Geospatial AI

Connecting clients, investors and emerging talent

Corporate and investor pages, the Xploor talent platform and ongoing releases on AWS Amplify.

2 yrsdevelopment and support
Yippee Malta product interface16
Travel

A booking journey the tour team owns

A multilingual website connected to the booking API, with deposits, coupons and affiliate tracking.

6languages across the booking journey
Professional Energy product interface17
Energy brokerage

Tenders, contracts and accounts brought together

Supplier tenders, contract management, brokerage accounting and client records.

100+suppliers per tender

Tell us what you are trying to build.

A thirty-minute call with the engineer who would run it.

Discuss your project