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-ao
| 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. | 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 | Accuracy level of the latitude and longitude coordinates. | 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
- 326
- Format
- CSV
- File size
- 13.4 kB
About this dataset
Angola (AO): migration notes
Internal record of the P6 migration from the old builder to the producer: the discrepancies found, their causes, and who decided what. This is a dated record (2026-10-05), so the numbers are as of the migration and not kept current. It is not shipped.
- Issue: pc-28e.8.2
- Parity verdict:
format-onlyagainst the live public CSV https://postal.datahub.io/ao/ao.csv (gate: pass) - Producer:
custom, refresh disabled,postal_code_required: false
Sources
| Input | URL | Notes |
|---|---|---|
| Lei n.º 14/24 (Lei da Divisão Político-Administrativa), full text | https://angolex.com/paginas/leis/lei-da-divisao-politico-administrativa-14a-24a.html | The page the old builder and ATTRIBUTION cite. Unversioned: the fetch date and sha256 in ao.inputs.json identify the copy used |
- The old builder read a local snapshot of the FedEx-side
countries/AGO/data/Angola.csv, built byscrape_admin.pyfrom the same law text. That intermediate is gone, so per plan D1 the producer parses the law itself (a port, not a new pipeline). - The FedEx
scrape_admin.pyisn't available locally. The producer's parsing was written against the law text and checked against the live CSV.
Parity against the live public CSV (2026-10-05)
Rows: 326 live and 326 fresh, none only on one side, 0 changed cells. The only difference is line endings (CRLF→LF), pre-approved by the standing sign-off.
Decisions
| Decision | By | Basis |
|---|---|---|
| ao is not licence-restricted; it gets a producer | User, 2026-10-05 (pc-uzp) | Lei 15/14 Art. 24.º excludes laws from copyright |
| Parse each province's composition article ("A Província de X, com sede no Município de Y, compreende os Municípios …"), dropping the leading de/do/da/dos/das | Agent: port choice | Reproduces the live names exactly, e.g. "do Belize" → Belize, "do Lóvua do Zambeze" → Lóvua do Zambeze |
| Accept "Municipio" without the accent | Agent: port choice | The law text spells it both ways (Lunda-Norte, Moxico) |
| Hardcoded ISO 3166-2:AO table for the 17 coded provinces; the 4 new ones are listed as having no code | Agent: port choice | Same values as the old CSV's stateCode; an unknown province stops the build |
licenses: custom:angola-official-text-uncopyrightable | Agent, from the old builder's licence_status.licence_id | build.py requires licenses once a dataset has pipeline: |
Types: latitude/longitude number (all empty); PK [admin_name1, admin_name2] | Agent | Old builder's primary key; unique in the produced CSV |
Fixes and transforms carried over
- place_name = admin_name2 = municipality; admin_name1 = province, spelled as in the law.
- admin_code1 = ISO 3166-2:AO without the "AO-" prefix; empty for Icolo e Bengo, Cuando, Cubango and Moxico Leste (no ISO code yet).
- postal_code, admin_code2, admin tier 3, coordinates, accuracy and alternative_city_name empty, as before.
- Sorted by (admin_name1, admin_name2).
- Old asserts →
ProducerError: unique (province, municipality); the exact 326-row assert is replaced by structural checks (every known province has exactly one article, no unknown province, each seat is in its own roster, names look like names).
Doc changes
- Descriptor
descriptionand README: removed row counts, the "complete dataset (326 rows)" note, the "36 of 326" count,ATTRIBUTION.txtreferences (free datasets ship none), the staledatapackage.ymlusage line and the sales footer. Added that coordinates are empty. Admin-unit counts (21 provinces, ~378 communes) kept.
Not ported
publish_r2.pyand the zip/ATTRIBUTION/datapackage.json generation: build.py and the shared publish path replace them.
Open questions
- Resolved (user, 2026-10-05): README edits confirmed.