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-mt
| 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 | integer | 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 | Alternative name(s) for the city or place. | Alternative City Name |
Download
Download CSVAbout
- Last updated
- 5 October 2026
- Total rows
- 73
- Format
- CSV
- File size
- 4 kB
About this dataset
Malta (MT) — internal licensing notes
Source research, 2026-09-11 — tier-1 check done before considering GeoNames
Checked MaltaPost (the official national postal operator) first: a real
official postcode finder exists at maltapost.com/PostCode/, but it is a
one-address-at-a-time lookup tool — no bulk export, CSV, or API found.
Why GeoNames is NOT a usable fallback here (unlike most other countries)
Fetched GeoNames MT directly (download.geonames.org/export/zip/MT.zip) to
check: only 73 rows, and GeoNames' own readme.txt states explicitly:
"For Malta we have only the first letters of the full postal codes (for
copyright reasons)" — confirmed directly (rows look like ATD, BZN,
BRG, locality-level prefixes only, not the real AAA 9999 format).
Malta's real postal codes are alphanumeric, AAA 9999 (3 letters + 4
digits), introduced 1991, revised 2007. Independent estimate: ~27,426 real
postal codes across ~74 localities (GeoPostcodes' public figure, not
independently verified here, cited only for scale). GeoNames' 73-row
truncated file represents a ~99.7% coverage loss versus that scale — the
same class of unusable-fallback finding as Jersey's GeoNames export
earlier in this project.
What this means
Unlike JP/CZ/etc. in this batch, GeoNames is not even a viable fallback for Malta — it's deliberately truncated at the source for copyright reasons, not just incomplete. The only real official source (MaltaPost's lookup tool) is not bulk-fetchable with what was checked in this pass.
Verdict
No build in this pass. A real bulk source was not found — official
(MaltaPost, lookup-only) and fallback (GeoNames, deliberately truncated)
both fail. Options for a future pass: contact MaltaPost directly for a
bulk export, or investigate whether the site's lookup tool has an
underlying API that could be queried systematically (would need a
separate ToS/systematic-extraction check before attempting, same
diligence as the OSM/Nominatim gate elsewhere in this project).
data_available unchanged (false).
Re-check, 2026-09-15 — fresh search, conclusion unchanged
Re-ran source discovery from scratch (not just re-reading the above) per a request to conclusively confirm or overturn the 2026-09-11 verdict. Checked, this pass:
- MaltaPost (maltapost.com/postcode/) — fetched directly again. The page is a JS-rendered SPA with an empty static body (no server-rendered content, no exposed API endpoint found in the static HTML). Still no bulk export, open-data page, or documented API. Unchanged from the prior pass.
- NSO Malta (nso.gov.mt) — site blocks automated fetches (Cloudflare 403 to both WebFetch and curl). Web search around it surfaced nothing suggesting NSO publishes postal codes; NSO's own publications are census/economic/demographic, not postal geography.
- data.gov.mt / portal.data.gov.mt — also Cloudflare-blocked to
automated tools (confirmed via curl: literal Cloudflare "Attention
Required" block page).
site:portal.data.gov.mtweb search for postal/postcode/localities returned nothing relevant. - Malta GeoHub (geohub.gov.mt), run by the Planning Authority —
this one IS reachable and has a real public DCAT-US API
(
/api/feed/dcat-us/1.1.json). Pulled the full catalog: 63 real datasets (schools, bus stops, health centres, protected areas, local council boundaries, etc.). No postal-code or address-point dataset of any kind. Malta's INSPIRE "Addresses" (AD) theme, which EU member states are formally obligated to publish, was searched for specifically (MSDI portal, INSPIRE Malta ArcGIS hubinspire-catalogue-planningmt.hub.arcgis.com) — MSDI's public offering is environmental/INSPIRE themes only (terrain, protected areas, water bodies); no Addresses theme dataset was found exposed through either portal's public catalog/API. - GitHub — searched again for a complete
AAA 9999-format Malta postcode repo. Found none; only Malaysia postcode repos surface for generic "postcode" GitHub searches. - Re-verified the aggregators are all the same GeoNames file —
fetched
postal.datahub.io/mt/mt.csv(the live resource behinddatasets/mt/datapackage.ymlin this repo, i.e. our own existing legacy listing) directly: 73 data rows, locality-prefix codes (ATD,BZN,BRG, …), identical in shape and content to the GeoNames MT.zip export checked in the prior pass.postalcodes.infoindependently advertises "73 geocoded records" for Malta — same number, confirming it's the same underlying GeoNames extract resold, not an independent or more-complete source. GeoPostcodes.com advertises 27,426 Malta codes but is a paid commercial product with no accessible sample large enough to verify, and buying/relicensing a competitor's commercial extract is out of scope for a source- discovery pass.
No new source clears the bar (order-of-thousands rows, official or
clearly-licensed, distinguishable from the deliberately-truncated GeoNames
extract). Conclusion from 2026-09-11 stands unchanged: do not build.
data_available remains false. datasets/mt/datapackage.yml was not
touched.
Note for a future pass, sharper than the prior one: the one lead that hasn't been run to ground is whether MaltaPost's postcode-finder page calls an internal JSON API per-lookup that could — separately from this pass, and only after an explicit ToS/systematic-extraction review like the Nominatim gate elsewhere in this project — be queried address-by- address rather than scraped in bulk. Not attempted here: no ToS permission was found for systematic querying, and the page's JS bundle was not decompiled to find the endpoint.
Build — EXECUTED 2026-09-15, per explicit instruction to build from GeoNames anyway
The 2026-09-11/15 verdict above was that GeoNames is NOT a usable fallback because it's deliberately truncated to locality-prefix level. On explicit instruction, this was reversed: build it anyway, with the truncation disclosed prominently rather than treated as disqualifying.
Result: 73 rows, all 68/68 ISO 3166-2:MT local councils covered.
postal_code = the 3-letter GeoNames locality prefix (e.g. ATD) —
explicitly NOT a complete deliverable Malta postcode (real codes are
AAA 9999; the 4-digit suffix does not exist in this source at all).
This is disclosed in the dataset title, description, README, and
ATTRIBUTION, not silently shipped as if complete.
admin_code1 required a genuinely careful crosswalk, not a numeric
prepend: GeoNames' own admin_code1 ("01".."68") does NOT match ISO
3166-2:MT order past code 10 (e.g. GeoNames codes Mdina "20", ISO
assigns Mdina MT-29). Two real island-disambiguation traps were resolved
by name + latitude, not guessed: GeoNames' "Rabat" (Malta mainland) =
ISO's "Rabat Malta" (MT-46); GeoNames' "Victoria" (Gozo) = ISO's "Rabat
Għawdex" (MT-45, Victoria being the modern common name for the same
place). GeoNames' two "Żebbuġ" entries (Malta mainland vs Gozo) were
resolved the same way. Two English-name variants required care, not
swapping: "Saint Julians" = ISO's "San Ġiljan" (MT-48); "Saint Paul's
Bay" = ISO's "San Pawl il-Baħar" (MT-51). Also found and fixed a
build-script bug mid-pass: GeoNames' own admin_name1 field turned out
to be a Maltese-language restatement of place_name (not a real council-
grouping field) — the actual stable grouping key is GeoNames' own numeric
admin_code1, verified unambiguous by grouping every raw row by it before
building the crosswalk.
Frictionless: valid: True. licence_status.decision: compatible (clean
CC BY 4.0, no licence ambiguity here — the issue was always completeness,
never rights).
Tier decision: NOT premium. Per docs/PRICING_TIERS.md's own rule
("is_premium is a separate flag… only when the full version is
genuinely larger than the published 100-row sample… PR #24 stripped
this from 41 datasets of 1–99 rows"), Malta's 73-row full dataset is
smaller than a 100-row sample would be — the sample IS the whole
dataset. is_premium left unset, no premium_tier.
Published: git (datasets/mt/{datapackage.yml,scripts/}), main R2
bucket (mt/{mt.csv,datapackage.json,README.md,ATTRIBUTION.txt,mt.zip},
byte-verified), samples bucket (full 73-row file, mt/mt.csv), and
_meta/catalog.json (backed up, mutated, re-verified at 248 entries).