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-et
| Field | Type | Description | Title |
|---|---|---|---|
| country_code | string | ISO 3166-1 alpha-2 code for the country. | Country Code |
| postal_code | string | Postal code for the location. Always empty -- Ethiopia has no deployed national postal code system (trial-only, Addis Ababa only). | Postal Code |
| place_name | string | Name of the city, town, or place. | Place Name |
| admin_name1 | string | Primary administrative division (e.g., state, region). | Administrative Name 1 |
| admin_code1 | string | Code for the primary administrative division. | Administrative Code 1 |
| admin_name2 | string | Secondary administrative division (e.g., county, district). | Administrative Name 2 |
| admin_code2 | string | Code for the secondary administrative division. | Administrative Code 2 |
| admin_name3 | string | Tertiary administrative division (e.g., municipality, borough). | Administrative Name 3 |
| admin_code3 | string | Code for the tertiary administrative division. | Administrative Code 3 |
| latitude | number | Latitude coordinate of the place. | Latitude |
| longitude | number | Longitude coordinate of the place. | Longitude |
| accuracy | string | Always empty -- GeoNames' gazetteer dump carries no coordinate accuracy value. | Accuracy |
| alternative_city_name | string | Alternative name(s) for the city or place. | Alternative City Name |
Download
Download CSVAbout
- Last updated
- 6 October 2026
- Total rows
- 11,114
- Format
- CSV
- File size
- 535 kB
About this dataset
Ethiopia (ET): 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 data.
- Issue: pc-28e.8.8
- Commit: see
git log -- datasets/et/(worktree commit, basec51b72a) - Parity verdict:
unexplained(exit 1; the gate blocks on any row only on one side); accepted as upstream drift under the standing rule - Producer:
custom, refresh disabled,postal_code_required: false
Sources
| Input | URL | Notes |
|---|---|---|
| GeoNames gazetteer dump | https://download.geonames.org/export/dump/ET.zip | Member ET.txt. The main dump, not the postal export (export/zip/ET.zip is a 404) |
| GeoNames admin1 reference | https://download.geonames.org/export/dump/admin1CodesASCII.txt | Region names for the ET.<code> keys (ASCII-name column, as the old builder read it) |
- Both are the URLs the old
build_postal_codes_product.pydocstring names for its local snapshots (sources/ET_dump.txt,sources/geonames_admin1CodesASCII.txt). - Neither URL is versioned: each always serves the current GeoNames build. The producer records bytes and sha256 in
et.inputs.json.
Parity against the live public CSV (2026-10-05)
Rows: 11,113 live and 11,114 fresh. 1 row only in live, 2 only in fresh, 0 changed cells (keyed on the new primary key). Ignoring CRLF→LF (live is CRLF), a line diff shows the same row order and only these three lines.
Cause: edits to the GeoNames dump after the live build (2026-09-04), i.e. upstream drift.
| Row | Change | Cause |
|---|---|---|
| Jimma Rare (no admin1) | coordinates 9.16667, 37.3333 → 9.17, 37.331 | geonameid 8643787 modified upstream 2026-09-21 |
| Dedebit, Tigray (ET-TI) | new row 14.06997, 37.76265 | new geonameid 13712885, modified 2026-09-25 |
Decisions
| Decision | By | Basis |
|---|---|---|
| Accept the 3 drift rows | Standing rule (upstream drift traced to source) | Both geonameids carry modification dates after the 2026-09-04 build |
| Accept CRLF→LF | Standing rule | Format-only |
primaryKey: [place_name, latitude, longitude] | Agent | The old builder checked (place_name, admin_name1, latitude, longitude); admin_name1 is empty on unresolved rows, and the produced CSV is unique on the shorter key, so the producer checks that one instead (stricter) |
latitude/longitude → number; accuracy stays string | Agent, per the P6 type rule | accuracy is empty on every row (the gazetteer dump has no accuracy value), so it is not numeric. Its description now says it is always empty |
postal_code_required: false | Agent | Ethiopia has no postal code system; build.py would otherwise reject the empty column |
Removed the place count from the descriptor description and README | Standing doc rule | Region counts kept |
Transforms carried over
From build_postal_codes_product.py (2026-09-04):
- Feature class
Ponly. - admin1 name crosswalk to display name + ISO 3166-2:ET (12 coded regions); Central Ethiopia and South Ethiopia (2023 reform) keep their name with
admin_code1empty. - Unresolved admin1 codes (
00/blank) ship with empty admin_name1/admin_code1. - All other non-coordinate columns empty; coordinates verbatim.
- Sort by (admin_code1, place_name), stable on dump order.
- Old asserts are now
ProducerErrors: country is ET, every ET region in the reference table is in the crosswalk, every ISO region has places, no literal "nan", PK unique. The>= 9000places floor was dropped (no hardcoded counts).
Not ported
- The old builder's own datapackage.json/README/ATTRIBUTION/zip output (build.py's job; free datasets get no zip).
publish_r2.py(deleted).
Open questions
- None needing the user beyond the standing-rule drift above.
.licensing-notes.mdstill holds dated historical counts; left alone for the pc-hfz sweep.