Postal Codes Dataset for Ukraine, UA

181
Updated:
Files:1
Size:3.08 MB
Formats:csv
License:CC-BY-4.0

Postal Codes Dataset for Ukraine, UA including name of the city, town, or place, various administrative divisions and alternative city names.

Part of a Data Solution

  • Postal Codes Solution

    Every worldwide postal-code dataset in one bundle — the ultimate global reference for precise postal codes.

    Explore →

Premium

You're viewing a free sample

Get the complete dataset — all rows and files — delivered instantly after checkout, with lifetime access to the latest version.

  • Secure checkout via Stripe
  • Instant download after payment
  • Lifetime access to the latest version
  • Creative Commons Attribution 4.0 International license
10% off
$49.90$44.91
one-time payment

API Access

Access dataset files directly from scripts, code, or AI agents.

Browse dataset files
Dataset Files

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.

/logistics/postal-codes-ua/
https://datahub.io/logistics/postal-codes-ua/_r/-/.licensing-notes.md
https://datahub.io/logistics/postal-codes-ua/_r/-/README.md
https://datahub.io/logistics/postal-codes-ua/_r/-/datapackage.yml
Key Files

Start with these files — they give you everything you need to understand and access the dataset.

datapackage.ymlmetadata & schema
https://datahub.io/logistics/postal-codes-ua/_r/-/datapackage.yml
README.mddocumentation
https://datahub.io/logistics/postal-codes-ua/_r/-/README.md
Typical Usage
  1. 1. Fetch datapackage.yml to inspect schema and resources
  2. 2. Download data resources listed in datapackage.yml
  3. 3. Read README.md for full context

Data Files

Postal Codes Data Resource for Ukraine, UA


About this dataset

Ukraine (UA) — internal licensing notes

Source research, 2026-08-31

Clean GO on GeoNames; no official bulk source exists; real admin-tier recovery is available via the same-source dump-join technique (RS/ZA pattern).

What's currently live

R2's ua/ua.csv (29,571 rows, matches _meta/catalog.json's stale 2026-07-30 entry) is a near-raw GeoNames postal export, corrupted the same way as PL/AL/TH/RS/BG: admin_name3 is the literal string "nan" on every row (verified: 29,571/29,571), and accuracy is float-formatted ("4.0" instead of "4") — both classic pandas round-trip artifacts. admin_code1 is GeoNames' own internal numbering ("01""27"), not ISO 3166-2:UA — using it as-is would ship the wrong codes. datapackage.yml's declared resource (7,465 bytes, dated 2024-11-07) doesn't match the live object (2,373,590 bytes) either — stale metadata on top of the data defect, same pattern as every other legacy placeholder audited this batch.

Source 1 — GeoNames UA postal export (the base)

https://download.geonames.org/export/zip/UA.zip     # 29,571 rows

Licence CC BY 4.0, verified against export/zip/readme.txt on 2026-08-31 — no per-country caveat for Ukraine.

Real limitation, verified directly against the raw file (not the sold copy): the postal export itself has no raion (district) tier at alladmin_name2 simply duplicates admin_name1 (the oblast name) on every row, and admin_code2/admin_name3/admin_code3 are blank. This is a genuine source gap, not something introduced downstream.

Source 2 — GeoNames UA gazetteer dump (admin enrichment, same publisher)

https://download.geonames.org/export/dump/UA.zip    # 45,380 entries

Same licence, same publisher, not a new source. Carries GeoNames' own admin1 (27 codes: 24 oblasts + Crimea + Kyiv City + Sevastopol City) and admin2 (raion-level, 146 codes) fields on 33,505 of its own populated-place entries.

Real finding, cross-checked against a primary account of Ukraine's own 2020 reform (Verkhovna Rada resolution, 2020-07-17, reported by The Ukrainian Weekly and KyivPost): Ukraine consolidated 490 old raions into 136 new raions (including 10 in Crimea, de facto outside Ukrainian control since 2014). GeoNames' dump carries 146 UA admin2 codes — exactly 136 (the new national raion count) + 10 (Kyiv City's own internal city districts, a separate tier that sits under Kyiv City rather than being one of the 136 national raions). This is strong, specific evidence the dump reflects the post-reform structure, not a stale pre-2020 one — the opposite risk to the one caught for Norway's fylke reform, checked here before trusting the dump at scale.

Join feasibility, checked before committing to a build

The postal export's place names are Cyrillic (Черкаси); the dump's name/asciiname fields are Latin transliterations (Cherkasy) — a naive name-to-name join against name/asciiname alone matches zero rows. The dump's alternatenames column does carry the Cyrillic form as one of several comma-separated aliases. Matching against name ∪ asciiname ∪ alternatenames recovers 22,224/29,571 (75%) exact matches before any coordinate disambiguation or nearest-neighbour fallback (the RS/ZA pattern) — a workable base for a future build, though this needs the fallback pass run and measured (not yet done — this is a research pass, not a build) before a real coverage number can be quoted.

❌ Ukrposhta — no bulk source, not a licensing block

No official Ukrposhta open-data bulk download or API was found (checked 2026-08-31) — same shape as Serbia's Posta Srbije and Poland's situation before its PDF-only book edition: real-world lookup exists (services.ukrposhta.com/postindex_new/) but nothing bulk/open. This is a data-availability gap, not a resale prohibition.

ISO 3166-2:UA — GeoNames' internal numbering is NOT the ISO scheme

Verified against en.wikipedia.org/wiki/ISO_3166-2:UA on 2026-08-31. GeoNames' admin1 codes (0127) are an internal, unrelated numbering. A verified name-based crosswalk (all 27 GeoNames admin1 names match one ISO entry each, zero misses):

GeoNames nameISO codeGeoNames nameISO code
CherkasyUA-71Kyiv OblastUA-32
Chernihiv OblastUA-74LuhanskUA-09
ChernivtsiUA-77LvivUA-46
CrimeaUA-43MykolaivUA-48
DnipropetrovskUA-12OdesaUA-51
DonetskUA-14PoltavaUA-53
Ivano-FrankivskUA-26Rivne OblastUA-56
KharkivUA-63Sevastopol CityUA-40
KhersonUA-65SumyUA-59
KhmelnytskyiUA-68TernopilUA-61
KirovohradUA-35VinnytsiaUA-05
Kyiv CityUA-30VolynUA-07
ZakarpattiaUA-21
ZaporizhzhiaUA-23
Zhytomyr OblastUA-18

Disclosure needed for any future build — factual, not political

Crimea (UA-43) and Sevastopol City (UA-40) are Ukrainian territory under ISO 3166 and under Ukraine's own law, and are included on that basis — same treatment this project already gives other administratively-defined regions. But they have been outside actual Ukrainian civil administration since Russia's 2014 annexation, and parts of Donetsk (UA-14), Luhansk (UA-09), Zaporizhzhia (UA-23) and Kherson (UA-65) oblasts have been under Russian occupation since 2022. This is a real postal-service currency question, not an administrative-boundary question: any rows in occupied territory should be labelled as sourced from GeoNames' (pre-war) postal data rather than implied to reflect current, operating Ukrainian postal service in those areas. Disclose in README/ATTRIBUTION if built — do not omit the regions (that would misrepresent Ukraine's actual administrative structure) and do not silently imply full current postal operability either.

licence_status

{
  "channel": "postal-codes-r2",
  "source_url": "https://download.geonames.org/export/zip/UA.zip",
  "licence_id": "CC-BY-4.0",
  "collected_at": "2026-08-31",
  "decision": "compatible",
  "decided_by": "claude-session-2026-08-31",
  "decided_at": "2026-08-31",
  "note": "No official bulk source exists to consolidate onto GeoNames; admin enrichment is same-publisher/same-licence GeoNames-to-GeoNames (postal export + gazetteer dump), not a second source with its own terms."
}

Proposed tier

B ($49). Single publisher (GeoNames, both exports) normalised in place with real derivation work — same-source raion-tier recovery via the dump join, verified ISO 3166-2:UA crosswalk (GeoNames' numbering is unrelated to ISO's), and fixing the "nan"/float-accuracy corruption — but no independent second-source consolidation, so this doesn't clear tier A's bar per docs/PRICING_TIERS.md. Same shape as RS/ZA/BG.

Moat

Low-Medium. GeoNames is openly downloadable, and the dump-join technique is now standard in this catalogue (RS/ZA). What's not entirely trivial to redo: catching the Cyrillic/Latin naming mismatch that zeroes out a naive join, and independently verifying the dump reflects the post-2020 raion reform (146 = 136 + Kyiv's 10 city districts) rather than assuming it and shipping a stale structure.

Build — 2026-08-31 (local only, not published)

Built via datasets/ua/scripts/build_postal_codes_product.py. Results, measured directly:

value
Final rows29,571
Distinct postal codes26,579
Regions covered26/27 — Sevastopol City (UA-40) has zero rows: GeoNames' postal export has no codes there at all, consistent with Ukraine not administering postal service there since 2014
Raions covered130/136
Exact-name matches (incl. alternatenames)20,304
Fallback nearest-neighbour matches9,267
Unresolved0
Duplicate (postal_code, place_name) pairs0
Literal "nan" strings in output0

Frictionless validation: valid: True.

Status: built and validated locally only. Nothing published to R2, nothing committed to git. datasets/ua/README.md and datapackage.yml updated in place (tier B, premium_source_key: ua/ua.zip, real sources/licenses, replacing the "Multiple sources" placeholder).