Postcode → polygon.
In one API call.
4.6M+ administrative boundaries across 39 countries. Walk-up hierarchy, walk-down sub-divisions, consolidated cities, three polygon precision tiers.
One call, not two. Most boundary APIs make you geocode the postcode first to get an opaque place_id, then call again to fetch the polygon. Ours bundles polygon + bbox + population + Wikidata ID + parent admin chain into a single nested response. Drop-in compatible with the standard GeoJSON-shaped geocoder format — both lat (flat) and location.lat (nested) on every result.
Four ways to ask the boundary question
All powered by the same Overture-backed boundary collection. All return rich nested metadata in a single response.
Postcode → boundary, in one call
Other APIs make you geocode the postcode first to get an opaque place ID, then make a second call to fetch the polygon. Ours: one GET, postcode in, polygon out, with population and Wikidata baked in.
GET /v1/divisions/by-postcode?code=90210&country=US&include=geometry
Walk up the admin chain
Given any division, return the full ancestor chain — neighborhood → city → county → state → country — with each level's name, population, parent ID, and (optionally) polygon. Cycle-safe, depth-capped.
GET /v1/divisions/ancestors/{id}
Walk down to sub-divisions
Given a parent, return its immediate children. Filter by subtype (county, locality, neighborhood). Polygons inline when you ask, simplified to the precision tier you choose.
GET /v1/divisions/children/{id}?subtype=county
Consolidated cities
NYC is one city to humans but five boroughs in the data. Pass any borough ID and get the canonical NYC record plus all members. Same pattern for Greater London, Greater Tokyo, Paris arrondissements.
GET /v1/divisions/consolidated/{id}
Try it on a live map
Type a postcode, watch the polygon render. No signup, no key — for the first 30 calls a minute. Same response shape your code would get.
Open the live demo →Three lines of code
Same call, three languages. SDKs at version 1.3.0 on PyPI and npm.
# postcode → polygon, one call curl "https://csv2geo.com/api/v1/divisions/by-postcode?code=90210&country=US&include=geometry&precision=med" \ -H "Authorization: Bearer geo_live_..."
from csv2geo import Client c = Client("geo_live_...") r = c.divisions_by_postcode( "90210", "US", include="geometry", precision="med") print(r["result"]["bbox"])
import { Client } from "csv2geo-sdk"; const c = new Client("geo_live_..."); const r = await c.divisionsByPostcode( "90210", "US", { include: "geometry", precision: "med" }); console.log(r.result.bbox);
What people build with it
From customer interviews — the four patterns that show up over and over.
Catchment-area maps
Render delivery zones, sales territories, school catchments — fed straight from postcodes. One call per zone, polygon arrives ready to draw.
Postal-zone analytics
Group customer addresses by postal area, compute spatial stats per zone, render heatmaps of conversion or revenue density.
Jurisdictional checks
"Which county is this address in?" Point-in-polygon against admin boundaries — sales tax, congressional district, school district lookups.
Address enrichment
Walk the admin chain on every CRM record. Population, region code, ISO-3166-2, Wikidata, parent IDs — drop straight into a database row.