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.
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
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
postal-codes-ec-sample
| Field | Type | Description | Constraints | Title |
|---|---|---|---|---|
| country_code | string | ISO 3166-1 alpha-2 -- always EC | Country Code | |
| postal_code | string | Ecuadorian CORREOSCODIGO postal code (6 digits) | { "pattern": "^\\d{6}$" } | Postal Code |
| place_name | string | Locality/place name as GeoNames records it | Place Name | |
| admin_name1 | string | Provincia (province) -- 24/24 covered; postal codes 900001-900004 carry no province, see ATTRIBUTION.txt | Administrative Name 1 | |
| admin_code1 | string | ISO 3166-2:EC code | Administrative Code 1 | |
| admin_name2 | string | Cantón (canton) -- 220 distinct values; empty only on the rows with no province | Administrative Name 2 | |
| admin_code2 | string | GeoNames' own internal canton code, not an independently verified official code | Administrative Code 2 | |
| admin_name3 | string | Not available -- source does not carry parroquia (parish) level | Administrative Name 3 | |
| admin_code3 | string | Not available | Administrative Code 3 | |
| latitude | number | GeoNames-estimated latitude (WGS84) | Latitude | |
| longitude | number | GeoNames-estimated longitude (WGS84) | Longitude | |
| accuracy | string | GeoNames accuracy of latitude/longitude. GeoNames documents 1=estimated, 4=geonameid, 6=centroid of addresses or shape; other values (e.g. 3) occur upstream without documentation. Empty where GeoNames gives none. | Accuracy | |
| alternative_city_name | string | Not populated in this release | Alternative City Name |
Download
Download sample CSVAbout
- Last updated
- 2 October 2026
- Total rows
- 100
- Format
- CSV
- File size
- 8.65 kB
About this dataset
Ecuador (EC): migration notes
Internal record of the P5 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.7.18 (closed 2026-10-02)
- Commit:
511572a(worktree commite044fe3, same content), landed in batch 1 - Parity verdict:
format-only(CRLF → LF); passes without sign-off - Producer:
custom, refresh disabled
Sources
| Input | URL | Notes |
|---|---|---|
| GeoNames postal export | https://download.geonames.org/export/zip/EC.zip | The only input the old builder used |
Parity against the live zip (2026-10-02)
Rows: 1,225 live and 1,225 fresh, none only on one side, 0 changed cells. The only difference is line endings: live used CRLF (the old builder's csv.DictWriter default), fresh uses LF. With \r stripped the files are byte-identical.
The informational sample check against https://postal.datahub.io/ec/ec.csv came back unexplained. It is outside the gate and was not traced.
Decisions
| Decision | By | Basis |
|---|---|---|
Land as format-only | No sign-off needed | format-only passes the gate |
Add a check that all 24 provinces are present; drop the exact EXPECTED_ROWS == 1225 assert | Agent, following the brief | Structural checks instead of row counts |
Remove row counts from README and descriptor; reword admin_name1 / admin_name2 descriptions to name postal codes 900001–900004 instead of row fractions | Orchestrator instruction (user's README counts rule) | Admin-unit counts (24 provinces, 220 cantons) kept |
Drop the stale licence_status.decision README sentence; one accuracy wording | Orchestrator, after the user said "Fix the small doc problems you've noticed" (session 2479b1c9-…) | Follow-up commits b7fb93b and 5311ad3 |
Transforms carried over
From build_postal_codes_product.py:
admin_code1→ ISO 3166-2:EC via the 24-province crosswalk from GeoNames' numeric codes (matched by name, verified 2026-08-30), copied verbatim. An unknown code is aProducerError.- The 4 rows with no province in the source (900001–900004, the disputed Manga del Cura area) keep empty admin fields. A province name without a code is an error.
alternative_city_nameempty.- The old asserts are now
ProducerErrors: 12 columns withEC, 6-digit postal codes, no literal "nan", no float-formatted accuracy, unique (postal_code, place_name).
Open questions
- ATTRIBUTION.txt still says "1,225 rows" and "4 rows". It belongs to the end-of-epic README/ATTRIBUTION sweep (pc-hfz).
Provenance
Reconstructed 2026-10-05 from the agent transcript 2479b1c9-c4dd-47e5-be82-34ccf8d49a80/subagents/agent-af449ef796cfc7cd2.jsonl, the orchestrator session 2479b1c9-…, the commit messages and the bd close reason.