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-ci
| 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 -- Côte d'Ivoire has no postal code system. | 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 | Not populated -- the GeoNames gazetteer dump has no coordinate-accuracy grade. | 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
- 12,076
- Format
- CSV
- File size
- 634 kB
About this dataset
Côte d'Ivoire (CI): 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.
- Issue: pc-28e.8.6
- Commit: see
git log -- datasets/ci(P6 ci commit) - Parity verdict:
format-only(gate: pass), against the live public CSV - Producer:
custom, refresh disabled,postal_code_required: false
Sources
| Input | URL | Notes |
|---|---|---|
| GeoNames gazetteer dump | https://download.geonames.org/export/dump/CI.zip | Member CI.txt; filtered to feature class P |
| GeoNames admin1 reference | https://download.geonames.org/export/dump/admin1CodesASCII.txt | ASCII district name column, keyed CI.<admin1> |
- Both are the files the old
build_postal_codes_product.pyread from its localsources/snapshot (CI_dump.txt,geonames_admin1CodesASCII.txt). - Both are stable "latest" URLs; nothing versioned to resolve.
ci.inputs.jsonrecords bytes and sha256 per run. - GeoNames has no postal export for CI (
export/zip/CI.zipis a 404); Côte d'Ivoire has no postal code system.
Parity against the live public CSV (2026-10-05)
Rows: 12,076 live and 12,076 fresh, none only on one side, 0 changed cells, 0 cell classes. Same row order. The only difference is line endings: live is CRLF (old builder's csv.DictWriter default), fresh is LF. With \r stripped from live, the files are byte-identical.
No discrepancies to trace.
Decisions
| Decision | By | Basis |
|---|---|---|
| Accept the CRLF→LF difference | Standing rule (format-only parity pre-approved) | 0 changed cells, equal rows |
pipeline.postal_code_required: false | Plan (SST plan: needed by the no-postcode free datasets) | build.py otherwise rejects the always-empty postal_code |
latitude/longitude → number | Standing rule (real types, as in ad) | All values numeric in the produced CSV |
accuracy stays string, described as not populated | Agent | Always empty: the gazetteer dump has no postal-style accuracy grade, so the GeoNames-accuracy description doesn't apply |
primaryKey: [place_name, admin_name1, latitude, longitude] | Agent, from the old builder's PK | Checked unique on the produced CSV; the producer checks it too |
| Old minimum-populated-places assert dropped | Brief (no row-count asserts) | Structural checks (14 districts, PK unique, known district names) kept |
Remove the row count from README and descriptor description | Standing doc rule | Rephrased as "populated places across all 14 districts" |
Transforms carried over
From build_postal_codes_product.py (2026-09-04):
- Feature class
Ponly. - admin1 code → admin1CodesASCII ASCII name → ISO 3166-2:CI via the 14-entry name crosswalk (verified against Wikipedia's ISO_3166-2:CI, 2026-09-04); display name drops GeoNames' " District" suffix. An unmapped district name is a
ProducerError. - Places with an admin1 code missing from the reference table ("00"/blank) keep empty
admin_name1/admin_code1. - All other non-coordinate columns empty; sort by (
admin_code1,place_name), ties in dump order. - Asserts →
ProducerError: every dump row is CI, no literal "nan", PK unique, all 14 districts present.
Not ported
- The old builder's generated
datapackage.json/README.md/ATTRIBUTION.txt/zip (build.py and the descriptor own these now), andpublish_r2.py.
Open questions
- None for parity.
.licensing-notes.mdstill quotes a dated row count; left for the pc-hfz sweep.