Vepler logo
Vepler Boundaries

Geography infrastructure for modern products

Ten levels of UK geography, from output area to country, across all four nations. One call returns everything above an area or inside it. The same code keys the vector tiles and joins onto census, IMD and your own tables.

Read the docs

Starts from an official area code today. Postcode entry and name search are next.

E00067488oa @2021
York · ward tier · 21 areasz 10
York's 21 wards at the geometry Vepler serves, with output area E00067488 marked inside Guildhall ward

Source: Office for National Statistics licensed under the Open Government Licence v.3.0. Contains OS data © Crown copyright and database right 2025.

GET /v1/geography/areas/E00067488/ancestors200
lsoaE01013366York 013AexactmsoaE02002784York 013exactwardE05010318Guildhallbest_fitladE06000014Yorkbest_fitcty_uaE06000014Yorkbest_fitpconE14001604York Centralbest_fitbuaE63007706Yorkbest_fitregionE12000003Yorkshire and The Humberbest_fitcountryE92000001Englandbest_fit
9 areas · 7 ONS source filesrelease 2025.1

OA

235,243

LSOA

46,844

MSOA

9,448

Parish

11,338

Ward

8,485

BUA

7,775

LAD

361

County/UA

153

Region

9

Country

4

What you build

Four things this makes possible

Every area knows what contains it and what sits inside it. That one fact is the area page, the league table, the national map, and a join that survives.

Area pages

Breadcrumbs that are always right

One call turns a code into its full chain: neighbourhood, district, region, country. Hang crime, census or your own stats off each level.

GET /areas/{code}/ancestors

Analytics

Rollups that add up

List every area inside any other. Score at LSOA, rank within the council, report by region, and every total lands on the right parent.

GET /areas/{code}/descendants?descendantType=lsoa

Maps

Maps that redraw at every zoom

Councils zoomed out, wards mid-zoom, LSOAs up close. One layer per tier, and the polygons carry the same codes as your data, so no geometry leaves your warehouse.

vector tiles · one layer per tier · MapLibre

Your stack

One code across every service

Store code, type and vintage instead of names or polygons. Territories, alerts, search facets and cache keys all become one lookup on the same chain.

GET /areas/{codes} · up to 100 per call

Coverage

Ten tiers, four nations

Each area is named as its own publisher names it, at the vintage release 2025.1 declares. A blank cell means the publisher drew nothing there.

TierEnglandWalesScotlandN. IrelandAreas
OAmicrooa @2021oa @2021sct_oa @2022none published235,243
LSOAsmall_arealsoa @2021lsoa @2021sct_dz @2022nir_dz @202146,844
MSOAmid_areamsoa @2021msoa @2021sct_iz @2022nir_sdz @20219,448
Parishparishparish @2025parish @2025none publishednone published11,338
Wardwardward @2025ward @2025ward @2025nir_dea @20148,485
BUAbuabua @2024bua @2024none publishednone published7,775
LADltlalad @2025lad @2025sct_ca @2019nir_lgd @2014361
County/UAutlacty_ua @2025England onlyEngland onlyEngland only153
Regionregionregion @2025England onlyEngland onlyEngland only9
Countrycountrycountry @2025country @2025country @2025country @20254

The API

Six GET endpoints

Everything is a GET against the release your key is pinned to.

GET/v1/geography/release
GET/v1/geography/areas/{codes}
GET/v1/geography/areas/{code}/ancestors
GET/v1/geography/areas/{code}/descendants
GET/v1/geography/areas/{code}/children
GET/v1/geography/areas/{code}/provenance

Current limits

No postcode entry point yet. The graph starts at a GSS code.

Westminster constituencies are registered but not yet in a release.

Northern Ireland has no micro tier: NISRA publishes no correspondence for it.

One call, the whole chain release 2025.1
GET /v1/geography/areas/E01000001/ancestors

{
  "object": "list",
  "data": [
    { "code": "E02000001", "areaType": "msoa",
      "vintage": "2021", "tier": "mid_area",
      "name": "City of London 001",
      "depth": 1, "minFit": "exact" },
    { "code": "E09000001", "areaType": "lad",
      "vintage": "2025", "tier": "ltla",
      "name": "City of London",
      "depth": 2, "minFit": "best_fit" },
    { "code": "E12000007", "areaType": "region",
      "vintage": "2025", "tier": "region",
      "name": "London",
      "depth": 3, "minFit": "best_fit" },
    { "code": "E92000001", "areaType": "country",
      "vintage": "2025", "tier": "country",
      "name": "England",
      "depth": 4, "minFit": "best_fit" }
  ],
  "has_more": false,
  "total_count": 4
}

The guarantees

Built to survive an audit

Licence

Open Government Licence v3.0 throughout. Build and resell on it: no negotiation, no pass-through, and every served polygon passes a code-enforced redistribution gate.

Attribution

Every record returns its required attribution line verbatim, so compliance is a string you print, not a policy you research.

Provenance

Every parent link is stamped with the source whose claim won, back to the publisher's file and its checksum.

Release pinning

Your responses come from one declared release until you move the pin. When publishers merge districts or rename columns, you adopt the change deliberately, with every difference in a change ledger.

Sources: ONS, NRS, NISRA and the Scottish Government · Open Government Licence v3.0

Ready to build on
something you can trust?

View Docs