Part of a Data Solution
- Explore →
Postal Codes Solution
Every worldwide postal-code dataset in one bundle — the ultimate global reference for precise postal codes.
API Access
Access dataset files directly from scripts, code, or AI agents.
Browse dataset files
API Access
Access dataset files directly from scripts, code, or AI agents.
Each file has a stable URL (r-link) that you can use directly in scripts, apps, or AI agents. These URLs are permanent and safe to hardcode.
Start with these files — they give you everything you need to understand and access the dataset.
- 1. Fetch datapackage.yaml to inspect schema and resources
- 2. Download data resources listed in datapackage.yaml
- 3. Read README.md for full context
Data Files
Explore with AIpostal-codes-gr
| Field | Type | Description | Constraints | Title |
|---|---|---|---|---|
| country_code | string | ISO 3166-1 alpha-2 country code -- always GR. | Country Code | |
| postal_code | string | 5-digit Greek postal code (GISCO POSTCODE). Unique; the producer checks it. | { "pattern": "^\\d{5}$" } | Postal Code |
| place_name | string | Community or pseudo-community name as GISCO spells it (LAU_NAME, without Greek accents). A 'Ψευδοκοινοτητα X' (pseudo-community) label stands for a municipality with no community subdivisions. | Place Name | |
| admin_name1 | string | Region (Περιφέρεια) -- 13 regions, derived from the NUTS2 part of the NUTS3 code. | Administrative Name 1 | |
| admin_code1 | string | ISO 3166-2:GR region letter. | Administrative Code 1 | |
| admin_name2 | string | Regional unit(s) (Περιφερειακή Ενότητα) of the NUTS3 area -- 52 NUTS3 areas. | Administrative Name 2 | |
| admin_code2 | string | NUTS 2024 level-3 code. | Administrative Code 2 | |
| admin_name3 | string | Not populated -- municipality (Δήμος) name not resolved in this release. | Administrative Name 3 | |
| admin_code3 | string | ELSTAT NSI 2021 municipality code as GISCO gives it (some have lost their leading zero); name not resolved. | Administrative Code 3 | |
| latitude | number | Not populated -- the GISCO CSV distribution carries no geometry. | Latitude | |
| longitude | number | Not populated -- the GISCO CSV distribution carries no geometry. | Longitude | |
| accuracy | string | Not populated -- no coordinates in this release. | Accuracy | |
| alternative_city_name | string | Not populated in this release. | Alternative City Name |
Download
Download CSVAbout
- Last updated
- 5 October 2026
- Total rows
- 1,041
- Format
- CSV
- File size
- 103 kB
About this dataset
Greece (GR): migration notes
Internal record of the P6 migration from the old scripts to the producer: the discrepancies found, their causes, and who decided what. This is a dated record, so the numbers are as of the migration and not kept current. It is not shipped in the zip.
- Issue: pc-28e.8.9
- Commit: worktree commit on top of
c51b72a(see the commitP6 gr: SST producer; …) - Parity verdict:
format-only(gate: pass, exit 0) against the live public CSV - Producer:
custom, refresh disabled
Sources
| Input | URL | Notes |
|---|---|---|
| Eurostat GISCO postal code point dataset 2025, CSV distribution | https://gisco-services.ec.europa.eu/distribution/v2/pcode/csv/PCODE_PT_2025_4326.csv | All countries (~136 MB); the producer keeps CNTR_ID == 'EL'. CC BY-SA 4.0 |
- The old
build_postal_codes_product.pyread a localsources/gisco_gr_filtered.csv. Its docstring names this URL as where that snapshot came from, so the producer fetches it. - The URL is year-versioned (
PCODE_PT_2025_…). It stays pinned to 2025, the release live was built from. A newer GISCO year is a new file name, so moving to it is a deliberate change, not a refresh. Fetched 2026-10-05: 136,116,955 bytes, SHA-256459efc82…, the same file as on 2026-10-02. - Python's default CA store fails GISCO's TLS chain on this machine, so the producer fetches with
requests(certifi), as es does.
Parity against the live public CSV (2026-10-05)
Rows: 1,041 live and 1,041 fresh, none only on one side, 0 changed cells. The only difference is line endings: live is CRLF (the old csv.DictWriter default), the producer writes LF. With \r stripped, the fresh CSV is byte-identical to live. Covered by the standing sign-off (CRLF→LF only, equal rows, 0 changed cells).
Decisions
| Decision | By | Basis |
|---|---|---|
| Reconstruct the filter + NUTS lookup step inside the producer | Agent; user accepted as a port (2026-10-05) | The old builder's input was already filtered and enriched, and the step that did it was never committed. Its docstring describes the step ("derived here from NUTS3 code via a hardcoded, verified lookup"), and the source is the one it names, so this is treated as a port, not a new pipeline. The 13-region and 52-NUTS3 name tables were read off the live CSV (every code maps to exactly one name there) and equal the earlier, discarded reconstruction in 2b7224e. Parity confirms them: 0 changed cells. |
Keep the two lookup tables inline in produce.py | Agent: port choice | Small, stable classification; cz keeps its crosswalk inline the same way |
Keep NSI_2021 raw in admin_code3, including 7-digit codes where GISCO dropped a leading zero | Agent: a faithful port | The old builder kept it raw; fixing it would change live data |
| Write LF line endings | Standing rule (CRLF→LF pre-approved) | Same as every other producer |
Old exact row-count assert dropped; structural checks kept as ProducerError | Brief | Unique 5-digit postal codes, known NUTS3, all 13 regions, non-empty LAU_NAME, 7–8 digit NSI_2021 |
Types: latitude/longitude number; accuracy stays string; codes stay string; primaryKey: [postal_code] | Agent, from the produced CSV | All coordinate/accuracy cells are empty (GISCO's CSV has no geometry); unpopulated accuracy is string elsewhere too (au, nz). postal_code is unique and the producer enforces it |
| Counts removed from the descriptor description and README (row count, coverage %, the 27% pseudo-community share) | Brief (doc rules) | Region (13) and NUTS3 (52) counts kept as admin-unit counts |
Transforms carried over
- Keep
CNTR_ID == 'EL';postal_code=POSTCODE;place_name=LAU_NAMEas GISCO spells it (no Greek accents). admin_code2=NUTS3_2024with GISCO's literal quotes stripped;admin_name2= English regional-unit name from the NUTS3 table.admin_code1/admin_name1= ISO 3166-2:GR letter and English region name from the NUTS2 prefix.admin_code3= rawNSI_2021;admin_name3, coordinates, accuracy andalternative_city_nameempty.- Rows sorted by
postal_code.
Not ported
- The old builder's packaging (datapackage.json, README, ATTRIBUTION, zip) and
publish_r2.py: build.py and the shared publisher own those now.
Open questions
- Resolved (user, 2026-10-05): reconstructing the never-committed filter/lookup step counts as a port.
- Resolved (orchestrator, 2026-10-05): removed the false "sample of the first 100 rows… contact sales" note from README.md (gr is free and its full CSV is public).
.licensing-notes.mdandATTRIBUTION-style text in it still carry historical counts (1,041 rows, 83%); left for the pc-hfz sweep.- 148
admin_code3values are 7 digits because GISCO dropped a leading zero (e.g.7010100vsGISCO_2021EL_07010100). Padding to 8 digits would be a data change; not done.