19.1.0 (2026-06-10)
- scottish: expose 2025 Scottish Parliament constituency and region (e4b44d1)
19.0.2 (2026-05-29)
- upstream dump now nulls county names for pseudo-county areas (6c6bb34)
19.0.1 (2026-05-28)
- deps: add docusaurus theme dependencies and pin webpackbar (82347d7)
19.0.0 (2026-05-26)
- build(docker)!: Upgrade postgis to 17-3.5 and switch test container to debian slim (34055ba)
- refactor(schema)!: Move canonical tables from pcio.* to public.* (8e10d36)
- Docker: Enable postgis (7e53fda)
- spec,api,docs: Align OpenAPI schemas, API behavior, and documentation for v13 (4561fac)
- openapi: Expand ScottishPostcodes for full SPD coverage (5b04b0a)
- api: Return Senedd Cymru constituency from postcode lookups (7b43570)
- ingest: Remove ingest tooling and support-table models (6d37c16)
- models: Delete the model layer (ab51e11)
- PgDump: Expand exported dataset (ebbf184)
- queries: Introduce api/app/queries/db.ts and migrate utils (5a85bc4)
- queries: Migrate outcodes_controller to api/app/queries/outcodes (5fcdb22)
- queries: Migrate places_controller to api/app/queries/places (52e4abd)
- queries: Migrate postcodes_controller to api/app/queries/postcodes (18a69cb)
- queries: Migrate scottish_postcodes_controller to full SPD shape (e4e077c)
- queries: Migrate terminated_postcodes to api/app/queries (62c1440)
- spec,docs: Add Senedd Cymru constituency fields to Postcode schema (c927d3d)
- test: Replace model-driven seed with dump-based pipeline (364811b)
- DB: Add partial indexes (5d0c2b2)
- db: tune Postgres for read-only workload, add pg_prewarm (971f267)
- outcodes: Read from pcio.outcodes matview instead of aggregating on the fly (466a283)
- queries: Batch bulk postcode + reverse-geo endpoints into one SQL each (7743d9e)
- test: Strip pnpm install from test image build (480da6d)
- All canonical data now lives under the public schema. Existing deployments using the old pcio.* layout must reload from the new dump (or migrate the schema) before pulling this version. The test seed (test/seed/v13.sql.gz) needs regenerating against a public.* source dump.
- Postgres major version upgrade. Existing PG16 data volumes
are not in-place compatible with the PG17 server — operators must drop the
volume (or pg_upgrade) before pulling the new images. The published pg_dump
under
latestmust be regenerated from PG17 to keep the format aligned. - models: api/app/models/* removed. Any external consumer that imported from postcodes.io's compiled output (we don't think there is one) must migrate to api/app/queries/*.
- queries: GET /scotland/postcodes/:postcode now returns the full SPD record. Existing fields (postcode, scottish_parliamentary_constituency, codes.scottish_parliamentary_constituency) preserved at their canonical names.
- ingest: removed CLIs postcodesio-onspd, postcodesio-scotpd, and postcodesio-oson. Ingestion is no longer this package's responsibility - consume a published pg_dump instead.
- openapi: GET /scotland/postcodes/:postcode response shape expands from 3 fields to a full SPD record. Existing fields (postcode, scottish_parliamentary_constituency, codes.scottish_parliamentary_constituency) are preserved under their canonical names.
- test: npm scripts setup_test_db, test:seed and test:clear have been removed. test:create no longer compiles TypeScript; it shells to bin/load_test_seed and expects test/seed/v13.sql.gz to be present (regenerate with bin/generate_test_seed against a fully loaded dev DB).
- PgDump: This update restructures the database into just three tables:
- onspd (ONS Postcode Directory)
- spd (Scottish Postcode Directory)
- osopennames (OS Open Names)
Tables are now fully denormalised for performance
18.0.1 (2026-02-16)
- Release: Trigger fixed DB build (955c43f)
18.0.0 (2025-12-18)
- api: Update LSOA and MSOA to 2021 Census data (fd4426a), closes #1181 #1053 #898
- models: Add lookup table models for new ONSPD fields (b89ec32)
- ONSPD: Add extraction scripts and lookup data for new fields (2cb312a)
- postcode: Add lsoa11 and msoa11 as explicit aliases (326ec47)
- postcode: Add schema, mappings and API response for new fields (afa64cb)
- postcode: Change lsoa/msoa to point to 2021 census data (cfa7cd0)
- setup: Add new ONSPD lookup tables to support tables array (36e9822)
- api: lsoa and msoa fields now return 2021 Census values instead of 2011
- postcode: lsoa and msoa fields now return 2021 census data instead of 2011 census data.
- lsoa/msoa now return 2021 LSOA/MSOA names
- codes.lsoa/codes.msoa now return 2021 GSS codes
- lsoa11/msoa11 added as aliases for 2011 data
- codes.lsoa11/codes.msoa11 added for 2011 codes
- Updated OpenAPI spec and documentation
17.7.0 (2025-12-12)
17.6.2 (2025-12-12)
- places: Strip BOM character from code field during import (d4cae31)
17.6.1 (2025-12-12)
- Places: Fix broken places table (98d2802)
17.6.0 (2025-12-10)
- ONSPD: Update to Nov 2025 (8936a4b)
17.5.0 (2025-09-12)
- import: Update CSV header check for ONSPD AUG 2025 format (da9d96b)
- Seed Data: Update for new labels (cacbc7f)
- data: Update County Electoral Divisions to May 2025 release (0e653bb)
- data: Update Parish/Non-Civil Parish codes to April 2025 v2 (caf17e8)
17.4.1 (2025-06-30)
- ui: Balance vertical padding in homepage features section (c57e6d3)
- ui: Improve footer spacing and resize logo (25ebf07)
- UI: Rebuild docs (7fa434e)
17.4.0 (2025-06-30)
- downgrade escape-string-regexp to v4 for CommonJS compatibility (d898bfa)
- ONSPD: Update to May 2025 (e88a8d7)
17.3.2 (2025-06-18)
- correct path formatting for terminated postcodes endpoint (7762537)
17.3.1 (2025-05-15)
- Scottish Postcodes: Add missing scottish cons (b8f252b), closes #122
- SPD: Update database for scottish constituencies (4dcc573)
17.3.0 (2025-05-08)
- Docs: Rewrite docs (86ac006)
17.2.1 (2025-04-17)
- OpenAPI: Update spec (c9bbda8)
17.2.0 (2025-04-10)
- ONSPD: Bump to Feb 2025 (db8dd65)
17.1.2 (2025-02-05)
- Constituency: Fix encoding issues (dbb5ced)
17.1.1 (2025-01-20)
- Constituencies: Fix encoding for Ynys Môn (d9e48ca)
17.1.0 (2025-01-06)
- ONSPD: Update Nov 2024 (5eaed7c)
17.0.1 (2024-10-09)
17.0.0 (2024-09-30)
- Constituencies: Update Westminster Constituencies (a1d3c1e)
- ONSPD Aug 2024: Update pg_dump (fabc7ee)
- Constituencies: - ONSPD now reports 2024 Westminster Constituencies. 2014 data is no longer available
- Both
parliamentary_constituencyandparliamentary_constituency_2024will now reference the 2024 constituencies
16.0.1 (2024-05-31)
- Support Tables: Rebuild constituency table (ebcfc19)
16.0.0 (2024-05-28)
- Westminster: Add missing Scottish Westminster constituencies (b7b39a3)
- Postgres: Migrates Postgresql from 10 to 16 (postgis/postgis:16-3.4)
15.5.1 (2024-03-06)
- 2024 Constituency: Apply IDs to 2024 field (52fa74e)
- Constituencies: Put 2024 Cons in separate field (871b189)
15.5.0 (2024-03-01)
15.4.1 (2024-02-07)
15.4.0 (2024-01-31)
- CI: Drop test in release step (9c0f2c8)
- Node: Bump to v20 (46d5af2)
- ONSPD Aug 2023: Update CCGs (3191842)
- NUTS/ITL: Update names (837a951)
- ONSPD: Update for Nov 2023 (af1c922)
- Parish: Update for 2023 (c15a1c1)
15.3.0 (2023-08-24)
15.2.0 (2023-06-10)
- App: Load router if URL Prefix not defined (ff7a427)
- URL Prefix: Enable URL Prefixes with URL_PREFIX env flag (c0ee972)
15.1.0 (2023-03-10)
- ONSPD: Bump to ONSPD Feb 2023 (2034e01)
15.0.0 (2023-01-04)
- Wards: Fix for ONSPD Nov (3be07ad)
- CCGs: Migrate CCGs to Sub ICB Locations (0dac18a)
- ONPSD: Bump to Nov (9d159ad)
- Police Force Area: Add PFA model (b3183b4)
- Police Force Areas: Ingest PFA GSS codes (ab37f8c)
- Police Force Areas: Return PFA name on API (64d43f4)
- Postcodes: Return date of creation in YYYYMM format (df36589)
- CCGs: From July 2022, CCGs were replaced by Sub-ICB locations.
14.4.1 (2022-08-25)
- Dockerfile: Fix npm install (92deb67)
14.4.0 (2022-08-25)
14.3.0 (2022-02-23)
- ONSPD: Bump to Feb 2022 (7ef4c17)
14.2.0 (2021-12-13)
- ONSPD: Add missing wards for ONSPD 11/21 (91a0d15)
- ONSPD: Bump to Nov 2021 (5fd8973)
14.1.0 (2021-09-07)
- ONSPD: Update for ONSPD August 2021 (9aad316)
14.0.4 (2021-07-08)
- Districts: Add missing codes for Northamptonshire (1d8d4f8)
14.0.3 (2021-07-05)
- Database: Point to latest pg_dump (9df3bf5)
14.0.2 (2021-07-05)
- ITL: Use level 3 codes (e633daa)
14.0.1 (2021-06-28)
- Rust: Add reference to Rust crate (bd7bb84)
14.0.0 (2021-06-25)
- CCG: Update CCGs for May 2021 (21b2a7c)
- NUTS: Transition NUTS to ITL (4939eac)
- Wards: Update wards for ONSPD May 2021 (ab7fcdb)
- ONSPD: Bump to ONSPD May 2021 (02db17f)
- NUTS: ONSPD has removed NUTS in favour of ITL
As of May 2021. NUTS has changed to International Territorial Levels (ITL). Postcodes.io will report ITL in nuts and codes.nuts to preserve backwards compatibility.
Following the UK’s withdrawal from the EU, a new UK-managed international statistical geography - ITL (International Territorial Levels) - was introduced from 1st January 2021, replacing the former NUTS classification
13.1.0 (2021-03-09)
- Parish: Update Parish dataset (52f74bb)
- Bulk Search: Guarantee results in same order (816214b), closes #675
- ONSPD: Update ONSPD to Feb 2021 (d567664)
13.0.4 (2021-01-24)
13.0.3 (2020-12-21)
- Zenodo: Trigger new release (3d5f561)
13.0.2 (2020-12-17)
- SPD: Add back dual SPD entries (80f2f90)
- SPD: Correct and ingest invalid SPD postcodes (8564f5a), closes #578
13.0.1 (2020-12-11)
13.0.0 (2020-12-09)
- MapBox: Update to latest MapBox lib (1f68e3b)
- Docker: Add readiness check
/ready(890e33b) - GSS Codes: Add LSOA and MSOA data models (4aac8a1)
- GSS Codes: Return MSOA and LSOA in codes (3562e35)
- LAU2: Add LAU2 to codes block (3af2938)
- ONSPD: Update ONSPD and OS Open Names (e820b73)
- Postcodes.io: Port to Typescript (144a566)
- GSS Codes: postcodes relation has been altered to store GSS Codes
for MSOA and LSOA (as
msoa_idandlsoa_id) rather than names
12.1.1 (2020-11-30)
- correct grammar on documentation page (eea9056)
12.1.0 (2020-08-24)
- ONSPD: Bump to ONSP Aug 2020 (64f9831)
12.0.4 (2020-08-23)
- SPD: Correct and ingest invalid SPD postcodes (954469c)
12.0.3 (2020-07-09)
- NUTS: Incorporate NUTS updates into latest dataset (2fb71ae)
12.0.2 (2020-07-09)
- NUTS: Add missing NUTS from ONSPD May 2020 (869e264)
12.0.1 (2020-07-02)
12.0.0 (2020-06-22)
- a11y: add title attributes to iframe elements and structure headings on page (65ca5a3)
- Node: Deprecate node 8, switch to node 12 LTS (e8d211c)
- Data: Update ONSPD, Open Names, SPD (a92a91a)
- Node: Node 8 no longer supported
Any changes, including backwards incompatible changes will be listed here
- Updated ONSPD to Feb 2020
- Updated Open Names to Jan 2020
- Updated GSS codes for missing parishes
- Chore: Refactored static ejs templates
- Fix: codes.cgg incorrectly returning short code rather than GSS code
- Breaking Change CCG Short Code column added to ccgs table
- CCG Short Code returned in
codesobject - Update ONSPD to November 2019
- Update OS Open Names to October 2019
- Updated GSS codes for midding NUTS
- Updated GSS codes for midding wards
- New docker-compose setup for test, dev and s3 pg_dump testing
- Return specific error message if postcode not in SPD but in ONSPD. Thanks to @mashedkeyboard
- Update ONSPD to August 2019
- Update OS Open Names to July 2019
- Updated GSS codes for missing wards
- Integrated Scotland Postcode Directory (SPD) dataset
- Added Scotland postcode lookup (for Scottish Constituencies)
/scotland/postcodes/:postcode
- CI testing on node 12 (instead of 11)
- Deprecated PMX configuration option. Use prom-client for monitoring
- Fix: Prom client uses stricter path matching to reduce cardinaility in
path=label - Update ONSPD to May 2019
- Update OS Names dataset to April 2019
- Rebuild GSS codes
- Enable prometheus endpoint
- .env files loaded upon application start. These are overwritten with explicit ENV variables
- Fix:
npm run setupon ubuntu - Dependency Update: switch from
pmxto@pm2/io - Add abiltiy to define google analytics key with environment variable
- Fix: renamed and moved docker-compose-test.yml as it breaks Docker Hub build
- Updated ONSPD dataset to February 2019
- Updated OS Names dataset to January 2019
- Rebuild GSS codes for NHSHA and NUTS datasets
- Dropped bunyan as dependency. Replaced with pino, a faster and actively maintained logging library
- Log destination can now be assigned via env variable
LOG_DESTINATION"/absolute/path/to/file"logs to file"stdout"logs to stdout"perf"logs to stdout in extreme mode
- Added ability to export prometheus metrics by basic auth protected
/metricsendpoint. To enable includePROMETHEUS_USERNAMEandPROMETHEUS_PASSWORDas environment variables. Those environment variables are required to authenticate using HTTP basic authentication - Updated dependencies
- Added ability to configure application limits using environment variables. See readme
- Amended
npm run setupbash script to accept more configuration arguments
- Fix: default
config.jsfile would fail to load underNODE_ENV=production(thanks to @g-wilson) - Update dependencies
- Added link to new Python lib (thanks to @raigad)
- Clean up documentation
- Breaking Change Install dependencies upgraded. Going forward, only the following minimum versions will be tested:
- Node.js 8
- PostgreSQL 10
- Postcode responses now include County Electoral Districts (ceds)
- Updated documentation (outcodes, installation)
- Updated dependencies
- Updated GSS codes for missing wards
- Updated ONSPD dataset to November 2018
- Updated OS Names dataset to October 2018
Minor updates and fixes. Many related to docker improvements
- Fix: /outcodes endpoint returned a
resultattribute rather than anerrorattribute for a not found response - Docker Related: Application gracefully exits from SIGTERM
- Docker Related: Application writes logs to stdout when
NODE_ENV=production - DockerFile:
- Added healthcheck
- Run application as non-root user (
node) - Reduced image size: delete npm cache, added .dockerignore
- DockerFile.pg:
- New docker file that builds a postgresql container that preloads postcodesio.io dataset
- Updated ONSPD dataset to August 2018
- Updated OS Names dataset to July 2018
- Fixed regression. WGS84 geolocations for points with no assigned geolocation (in
postcodesandterminated_postcodesrelations) returned0and99.9999(ONSPD default identifiers for no geolocation) instead ofnullandnull. - Updated
pg_dumpreleased in 9.0.0 to incorporate above fix - Updated noticeboard
- Breaking Change Updated
postcodeandterminated_postcodemodels for the new schema in ONSPD CSV file. This means>9.0.0will not be able to import ONSPD CSV files produced before May 2018.pg_dumpimports will not be affected - Added package.lock file
- Updated wards, districts, nuts, ccgs GSS Codes
- Updated ONSPD dataset to May 2018
- Updated OS Names dataset to April 2018
- Breaking Change Terminated Postcode schema has been updated to include geolocation attributes:
longitude,latitude,northings,eastingsandlocation - Extended
/terminated_postcodesendpoint to includelongitudeandlatitude - Updated parishes GSS Codes
- Tidy up of ONSPD and Open Names import scripts. Now named
postcodesio-onspdandpostcodesio-osonrespectively. Dropped unmaintained update script - Updated ONSPD dataset to Feb 2018
- Updated OS Names dataset to Jan 2018
- Fixed performance regression on
/placesendpoint where postgresql's unaccent() causing index miss
- Breaking Change Place schema has been amended with additional columns to support better text search for place names. When upgrading,
placeswill need to be rebuilt - Added Dockerfile & Dockerhub Repository (thanks to @jamescun and @billinghamj)
- Fix: Added missing filterable attributes for
?filter= - Updated dependencies
- Updated NUTS, wards, parishes GSS codes
- Added optional rate limiting on bulk lookup endpoints
- Updated ONSPD dataset to Nov 2017
- Updated OS Names dataset to Oct 2017
- Updated dependencies
- [Dev] Run code coverage and linter by default
- Minimum required version of node.js bumped to 6.x
- Added terminated postcodes relation and /terminated_postcodes API
- Postcode responses now include a GSS code for parliamentary constituencies
- Extraction scripts data files (
data/*.json) now stored indata/scripts/and will effectively document how the data files are generated - Mispecified resources (404 errors) now return JSON instead of application/text
- Invalid JSON post requests return 400 errors instead of 500 HTTP response codes
- Updated ONSPD dataset to Aug 2017
- Updated OS Names dataset to July 2017
- Bulk postcode lookups now accept a
filterparameter to restrict the attributes of the returned result set
The extraction process for the key/value (JSON) representation of GSS codes stored in the data/ directory is now formally documented with code in the data/scripts/ directory. See the README.md for more information
Following the formalisation, some data files were rebuilt and the following datasets have been modified:
- Districts: 4 names have been updated
"Eilean Siar" is now "Na h-Eileanan Siar"
"Armagh, Banbridge and Craigavon" is now "Armagh City, Banbridge and Craigavon"
"Derry and Strabane" is now "Derry City and Strabane"
"North Down and Ards" is now "Ards and North Down"
- LSOA: A large number of Scottish LSOAs have been expanded to include more information. E.g. For code
S01013429, "Blackridge" is now "Blackridge, Westfield and Torphichen - 01" - MSOA: A large number of Scottish LSOAs have been expanded to include more information. E.g. For code
S02001501, "Altonhill South" is now "Altonhill South, Longpark and Hillhead" - NHSHA: Dropping codes S08000001 to S08000014 as they appear to no longer feature in ONSPD
- NHSHA: 4 names have been modified
"Health & Social Care Board" => "ZB001"
"Jersey" => "Jersey Health Authority"
"Guernsey (including Sark and Herm)" => "Guernsey Health Authority"
"Alderney " => "Sark Health Authority"
- Parishes: ~60 names have been updated for various reasons. Some have had a preceeding backslash remove, some have been expanded, some are renamed
- PCTS: 7 names have been expanded
"Betsi Cadwaladr University" => "Betsi Cadwaladr University Health Board"
"Powys Teaching" => "Powys Teaching Health Board"
"Hywel Dda" => "Hywel Dda University Health Board"
"Abertawe Bro Morgannwg University" => "Abertawe Bro Morgannwg University Health Board"
"Cwm Taf" => "Cwm Taf University Health Board"
"Aneurin Bevan" => "Aneurin Bevan University Health Board"
"Cardiff and Vale University" => "Cardiff and Vale University Health Board"
- CCG: Naming is more consistent. CCG suffix will always be dropped (previously there were 5 exceptions)
For the exact changes, you can may inspect the most recent commit applied to the file
- Breaking Change Outcode schema has been modified to include country. When upgrading it's sufficient to rebuild support tables with
npm run rebuild_support_tables /outcodes/:outcode,/outcodes/:outcode/nearestand/outcodesnow also return acountryarray in the outcode result
- Breaking Change Postcode schema has been modified to facilitate faster and better quality
- Faster and better quality postcode search and autocomplete
- Add missing wards for ONSPD May 2017
- Update express & body-parser
- Incorporate OS Places dataset
- npm package now points to
app.tswhich exports instance postcodes.io express app - Minimum advised required Postgresql version of 9.5 (due to backwards incompatible pg_dump)
- Updated latest pg_dump for Feb 2017 ONSPD, January 2017 OS Places data
- Updated latest pg_dump for Nov 2016 ONSPD
- Updated NUTS GSS codes
- Added support for Node.js 6.9
- Updated latest pg_dump for Aug 2016 ONSPD
- Added some missing GSS codes. Fix import script for Aug 2016 ONSPD
- Drop support for node.js 0.10 and 0.12
- Expanded accept headers and HTTP methods in CORS preflight requests
- Updated dataset to February 2016